REST API
Workspaces
On this page
Workspaces can be created through two paths, which differ in identifier type and request shape.
| Endpoint | Org identified by | Body fields | Role |
|---|---|---|---|
POST /v1/orgs/{org_id}/workspaces | UUID in path | name, optional slug | admin |
POST /v1/observ/orgs/{org}/workspaces | slug in path | slug and name, both required | admin |
Create a workspace
HTTP
POST /v1/orgs/{org_id}/workspaces
Auth: any credential · Role: admin
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | ✅ | Display name |
slug | string | null | ➖ | URL slug. Derived from name when omitted. |
Examples
ws = evigauge.post(f"/v1/orgs/{org_id}/workspaces",
json={"name": "Staging", "slug": "staging"})
print(ws)
const ws = await evigauge.post(`/v1/orgs/${orgId}/workspaces`,
{ name: "Staging", slug: "staging" });
console.log(ws);
Errors
| Status | Cause |
|---|---|
409 | Slug already taken within the organization |
Create a workspace (observ path)
HTTP
POST /v1/observ/orgs/{org}/workspaces
Auth: any credential · Role: admin
Request body — WorkspaceCreate
| Field | Type | Required | Description |
|---|---|---|---|
slug | string | ✅ | URL slug — required here, unlike the UUID-path variant |
name | string | ✅ | Display name |
Examples
evigauge.post("/v1/observ/orgs/{org}/workspaces",
json={"slug": "staging", "name": "Staging"})
await evigauge.post("/v1/observ/orgs/{org}/workspaces",
{ slug: "staging", name: "Staging" });
List workspaces
HTTP
GET /v1/orgs/{org_id}/workspaces
Auth: any credential · Role: dev
Examples
# Resolve a slug to the UUID that /v1/workspaces/* needs.
wss = evigauge.get(f"/v1/orgs/{org_id}/workspaces")
by_slug = {w["slug"]: w["id"] for w in wss}
print(by_slug["prod"])
// Resolve a slug to the UUID that /v1/workspaces/* needs.
const wss = await evigauge.get(`/v1/orgs/${orgId}/workspaces`);
const bySlug = Object.fromEntries(wss.map((w: any) => [w.slug, w.id]));
console.log(bySlug.prod);
Get a workspace
HTTP
GET /v1/workspaces/{ws_id}
Auth: any credential · Role: dev
Examples
print(evigauge.get(f"/v1/workspaces/{ws_id}"))
console.log(await evigauge.get(`/v1/workspaces/${wsId}`));
Update a workspace
HTTP
PATCH /v1/workspaces/{ws_id}
Auth: any credential · Role: admin
Request body — WorkspacePatchBody
| Field | Type | Required | Description |
|---|---|---|---|
name | string | null | ➖ | New display name |
slug | string | null | ➖ | New URL slug |
Examples
evigauge.patch(f"/v1/workspaces/{ws_id}", json={"name": "Production (EU)"})
await evigauge.patch(`/v1/workspaces/${wsId}`, { name: "Production (EU)" });
Changing
slugbreaks every hard-coded/v1/observ/orgs/{org}/workspaces/{ws}/…URL in your integrations and dashboards. Rename deliberately.
Delete a workspace
HTTP
DELETE /v1/workspaces/{ws_id}
Soft-deletes the workspace.
Auth: any credential · Role: admin
Examples
evigauge.delete(f"/v1/workspaces/{ws_id}")
await evigauge.del(`/v1/workspaces/${wsId}`);
The workspace disappears from listings and its API keys stop working immediately. Deletion is soft, but there is no self-serve undelete endpoint.