Workspaces
List & Create Workspaces
List the workspaces a user belongs to, and create a new workspace.
List workspaces
GET
/io/workspacesReturns every workspace the acting user belongs to — those they own plus those where they hold an active membership — deduplicated into a single list.
Query parameters
user_idstringqueryRequired when using service-key auth. Must be a valid UUID.
{
"data": [
{
"id": "6f1e9c2a-1b3d-4c5e-8f90-a1b2c3d4e5f6",
"name": "Acme Agency",
"slug": "acme-agency-k3n8xq",
"owner_id": "usr-owner-uuid",
"created_at": "2026-07-01T10:00:00Z",
"updated_at": "2026-07-01T10:00:00Z"
}
]
}Create a workspace
POST
/io/workspacesCreates a workspace. The acting user becomes the owner, and an owner membership row is created automatically. A URL-safe slug is generated from the name with a short random suffix to keep it unique.
Request body
namestringbodyrequiredDisplay name for the workspace. Trimmed; max 100 characters.
{ "name": "Acme Agency" }{
"data": {
"id": "6f1e9c2a-1b3d-4c5e-8f90-a1b2c3d4e5f6",
"name": "Acme Agency",
"slug": "acme-agency-k3n8xq",
"owner_id": "usr-owner-uuid",
"created_at": "2026-07-01T10:00:00Z",
"updated_at": "2026-07-01T10:00:00Z"
}
}Error cases
| Code | Error |
|---|---|
| 400 | A workspace name is required |
| 400 | name must be 100 characters or fewer |
| 400 | Invalid JSON body |
| 401 | Unauthorized |