Workspaces Live
Read and update the workspace bound to the current token. The workspace is the top-level container for everything: agents, departments, sites, conversations, the knowledge base, billing.
One business equals one workspace. Multi-brand and agency operators run several workspaces and switch in the dashboard. See Concept: workspace.
Get current workspace
Returns the workspace record for the token-bound agent. There is no /workspaces/:id endpoint by design: every request is implicitly scoped to one workspace via the bearer token, so a list endpoint would be misleading.
Response shape
{
"id": "uuid",
"version": 12,
"name": "Acme Support",
"subdomain": "acme-support",
"primaryColor": "#FF4D1F",
"logoUrl": "https://...",
"channels": ["chat", "ticket", "call"],
"businessHours": {
"timezone": "America/New_York",
"rules": [
{ "day": "mon", "open": "09:00", "close": "18:00" }
]
},
"ai": {
"smartHoldEnabled": false,
"agentAssistEnabled": true
},
"createdAt": "2026-01-04T12:00:00Z",
"updatedAt": "2026-05-13T15:30:00Z"
}Code samples
curl 'https://app.message.com/api/v1/workspaces/me' \
-H 'Authorization: Bearer YOUR_WORKSPACE_JWT'const res = await fetch('https://app.message.com/api/v1/workspaces/me', {
headers: { Authorization: 'Bearer ' + token }
});
const workspace = await res.json();import requests
r = requests.get(
"https://app.message.com/api/v1/workspaces/me",
headers={"Authorization": f"Bearer {token}"},
)
workspace = r.json()require "net/http"
require "json"
uri = URI("https://app.message.com/api/v1/workspaces/me")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{token}"
http.request(req)
end
workspace = JSON.parse(res.body)<?php
$ctx = stream_context_create([
"http" => ["method" => "GET", "header" => "Authorization: Bearer $token"]
]);
$workspace = json_decode(file_get_contents("https://app.message.com/api/v1/workspaces/me", false, $ctx), true);Update workspace
Updates one or more workspace fields. Optimistic locking via expectedVersion is required.
Body
| Field | Type | Description |
|---|---|---|
| nameoptional | string | Display name shown in dashboard top bar. |
| primaryColoroptional | string | Hex colour used by the widget launcher and dashboard accents. |
| logoUrloptional | string | Public URL of the workspace logo. Use the Uploads API to host it on our CDN. |
| channelsoptional | string[] | Subset of chat, ticket, call. Disabling a channel hides it from inboxes. |
| businessHoursoptional | object | Per-day open/close ranges plus timezone. |
| aioptional | object | Feature flags for AI surfaces (Smart Hold, agent assist, AI receptionist). |
| expectedVersionrequired | integer | Optimistic-lock version. Stale versions return 409. |
{
"name": "Acme Support",
"primaryColor": "#FF4D1F",
"expectedVersion": 12
}Audit log
Cursor-paginated list of admin actions on the workspace: invites, role changes, settings updates, suppression edits. Admin-only. See Audit log API.
Delete workspace
Schedules the workspace for deletion. Requires the admin password as a confirmation step (passed in the body). Hard-delete runs after a 30-day grace period; until then you can cancel by logging back in.
Errors
| Code | When |
|---|---|
400 invalid_body | Body failed validation. |
401 unauthorized | Missing or invalid bearer token. |
403 forbidden | Agent role is not admin. |
409 stale_version | expectedVersion mismatch. |
Common pitfalls
- Looking for
/workspaces/:id. Does not exist. Every token is workspace-scoped; use/workspaces/me. - Editing
channelscasually. Disabling a channel hides existing conversations from the inbox; they are not deleted, but agents stop seeing them. Re-enabling restores visibility. - Forgetting
expectedVersion. The workspace settings page in the dashboard is the single most concurrently-edited resource in the product. Optimistic locks exist for a reason.