Skip to content
Select themeSelect language

PATCH /api/me/active-workspace — persist the user's active-workspace choice (#838 C6). Same platform-neutral upsert the chat surfaces use, so switching anywhere switches everywhere. The service floor enforces membership (fail-closed) — a workspace the user does not belong to is a 403, exactly as on the chat path.

PATCH
/api/me/active-workspace
curl --request PATCH \
--url https://example.com/api/me/active-workspace \
--header 'Content-Type: application/json' \
--cookie supacloud_session=<supacloud_session> \
--data '{ "workspace_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" }'
Media typeapplication/json

Body of PATCH /api/me/active-workspace (#838 C6): set (or clear) the current user’s ACTIVE workspace — the ONE server-side truth every surface shares (web switcher, web terminal, Telegram, Discord). workspace_id = null clears the explicit choice; resolution then falls back to the first membership.

object
workspace_id
required

The workspace to activate, or null to clear the explicit choice.

string | null format: uuid
Examplegenerated
{
"workspace_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"
}

Active workspace updated

Media typeapplication/json

{"ok": true} — a bare success acknowledgement.

object
ok
required

Always true on success.

boolean
Examplegenerated
{
"ok": true
}

Authentication required

Media typeapplication/json

The canonical JSON body of every error response — the single source of truth the frontend binds to. Every AppError serializes as this exact shape, and the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is what the frontend error schema is generated from, so there is no hand-written error schema on either end.

object
code
required

Machine-readable, stable error code.

string
Allowed values: not_found unauthorized forbidden license_required license_expired bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited too_many_requests quota_exceeded database_error docker_error vault_error internal_error
details
One of:
null
error
required

Human-readable message (the server’s English text; the client may localize by code).

string
Example
{
"code": "not_found"
}

Not a member of the requested workspace

Media typeapplication/json

The canonical JSON body of every error response — the single source of truth the frontend binds to. Every AppError serializes as this exact shape, and the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is what the frontend error schema is generated from, so there is no hand-written error schema on either end.

object
code
required

Machine-readable, stable error code.

string
Allowed values: not_found unauthorized forbidden license_required license_expired bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited too_many_requests quota_exceeded database_error docker_error vault_error internal_error
details
One of:
null
error
required

Human-readable message (the server’s English text; the client may localize by code).

string
Example
{
"code": "not_found"
}

Structured server error

Media typeapplication/json

The canonical JSON body of every error response — the single source of truth the frontend binds to. Every AppError serializes as this exact shape, and the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is what the frontend error schema is generated from, so there is no hand-written error schema on either end.

object
code
required

Machine-readable, stable error code.

string
Allowed values: not_found unauthorized forbidden license_required license_expired bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited too_many_requests quota_exceeded database_error docker_error vault_error internal_error
details
One of:
null
error
required

Human-readable message (the server’s English text; the client may localize by code).

string
Example
{
"code": "not_found"
}