Workspaces API
Workspaces group related channels together and provide a shared view. Workspace operations require user authentication (dashboard session) — they are not available via API key from external automations.
List Workspaces
GET /api/workspaces
Returns all workspaces owned by the authenticated user.
Response
[
{
"id": "9e4d5f6a-...",
"name": "Production Alerts",
"slug": "production-alerts",
"custom_slug": "prod",
"icon": "🚨",
"visibility": "private",
"layout": "sidebar",
"show_search": true,
"created_at": "2025-01-01T00:00:00Z"
}
]
Create Workspace
POST /api/workspaces
Creates a new workspace. Limited to 3 workspaces per user.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Display name |
icon |
string | No | Single emoji, default "🏢" |
A URL slug is auto-generated from the name (e.g. "My Workspace" → "my-workspace"). If the slug already exists, a number is appended.
Response `201 Created`
{
"id": "9e4d5f6a-...",
"name": "Production Alerts",
"slug": "production-alerts",
"icon": "🚨",
"user_id": "user-uuid",
"visibility": "private",
"layout": "sidebar",
"show_search": true,
"created_at": "2025-01-15T10:00:00Z"
}
Get Workspace
GET /api/workspaces/{id}
Returns a workspace by ID.
Update Workspace
PATCH /api/workspaces/{id}
Updates workspace settings. Only include fields you want to change.
Request Body
| Field | Type | Constraints | Default |
|---|---|---|---|
name |
string | Any | — |
icon |
string | Single emoji | "🏢" |
visibility |
string | "private", "protected", "public" |
"private" |
password |
string | Required if visibility="protected" |
— |
layout |
string | "list", "sidebar", "tabs", "grid" |
"sidebar" |
show_search |
boolean | true or false |
true |
custom_slug |
string | 3–48 chars, lowercase alphanumeric + hyphens, globally unique | null |
Layouts
| Value | Description |
|---|---|
"list" |
Simple vertical list of channels |
"sidebar" |
Sidebar navigation with channel feed |
"tabs" |
Tab bar across the top for each channel |
"grid" |
Card grid showing channel previews |
Visibility
| Value | Access |
|---|---|
"private" |
Only accessible when logged in as the owner |
"protected" |
Accessible with a password (/api/channel-unlock) |
"public" |
Accessible by anyone with the URL |
Custom Slug
Set a custom slug to give your workspace a memorable URL:
{ "custom_slug": "my-team" }
The workspace will be accessible at /w/by-slug/my-team.
Rules:
- 3–48 characters
- Lowercase letters, numbers, and hyphens only
- Must be globally unique
- Set to
nullto remove
Example
curl -X PATCH /api/workspaces/9e4d5f6a-... \
-H "Content-Type: application/json" \
-d '{
"visibility": "public",
"layout": "grid",
"custom_slug": "my-alerts",
"show_search": true
}'
Delete Workspace
DELETE /api/workspaces/{id}
Deletes a workspace and all its channels, cards, and associated data. You cannot delete your last workspace.
Response
{ "success": true }
Attribute Settings
Workspace attribute settings control how channel attributes (key/value metadata) are displayed across the workspace — whether they show up as sidebar labels and/or filter options.
Get Attribute Settings
GET /api/workspaces/{id}/attribute-settings
Returns all attribute keys discovered across channels in this workspace, with their display settings.
[
{
"key": "environment",
"use_as_filter": true,
"show_in_sidebar": true
},
{
"key": "team",
"use_as_filter": false,
"show_in_sidebar": true
}
]
Update Attribute Setting
PUT /api/workspaces/{id}/attribute-settings
Upserts the display settings for an attribute key.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
key |
string | Yes | Attribute key name |
use_as_filter |
boolean | No | Show as filter option in the workspace sidebar |
show_in_sidebar |
boolean | No | Show the value in the channel list/sidebar |
{
"key": "environment",
"use_as_filter": true,
"show_in_sidebar": true
}