Skip to content
UpVoiced Docs

API reference

Workspace

The workspace itself: settings, single sign-on, widget settings, deletion and restore.

Set up the SDK client used in the examples

Dashboard session only (API keys get 403 session_required):

import { UpVoiced } from '@upvoiced/sdk';

// Dashboard-session operations: the Clerk session token of a signed-in operator.
const upvoiced = new UpVoiced({
  headers: { authorization: `Bearer ${sessionToken}` },
  workspace: workspaceId,
});

API key or Dashboard session:

import { UpVoiced } from '@upvoiced/sdk';

const apiKey = process.env['UPVOICED_API_KEY']; // uv_live_… (Settings → API keys)
const workspace = process.env['UPVOICED_WORKSPACE_ID']; // sent as X-Workspace
if (!apiKey || !workspace) throw new Error('Set UPVOICED_API_KEY and UPVOICED_WORKSPACE_ID.');
const upvoiced = new UpVoiced({ apiKey, workspace });

curl examples read $UPVOICED_API_KEY and $UPVOICED_WORKSPACE_IDfrom your shell. MCP examples are the tools/call request an MCP client sends to the MCP server with the same API key.

GET/v1/workspaces

List the caller's active workspaces

Authentication
Dashboard session only (API keys get 403 session_required)
Operation id
listWorkspaces
Response 200: 8 fields
Response 200 (application/json)
NameTypeRequired
itemsarray of objectYes
items[].idstring (uuid)Yes
items[].namestringlength 1–100Yes
items[].slugstringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$Yes
items[].portal_locale"en" | "pt-BR" | "es" | "de" | "fr"Yes
items[].created_atstring (date-time)Yes
items[].updated_atstring (date-time)Yes
next_cursornullYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl 'https://api.upvoiced.com/v1/workspaces' \
  -H "Authorization: Bearer $UPVOICED_SESSION_TOKEN"
TypeScript SDK
const data = await upvoiced.get('/v1/workspaces');
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

POST/v1/workspaces

Create a workspace owned by the caller

Authentication
Dashboard session only (API keys get 403 session_required)
Operation id
createWorkspace
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Request body (JSON)
NameTypeRequired
namestringlength 1–100Yes
slugstringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$Yes
portal_locale"en" | "pt-BR" | "es" | "de" | "fr"default "en"No
accentstringpattern ^#[0-9a-fA-F]{6}$No
attributionobjectNo
attribution.utm_sourcestring | nulllength ≤ 100pattern ^[\w.-]+$Yes
attribution.utm_mediumstring | nulllength ≤ 100pattern ^[\w.-]+$Yes
attribution.utm_campaignstring | nulllength ≤ 100pattern ^[\w.-]+$Yes
attribution.utm_termstring | nulllength ≤ 100pattern ^[\w.-]+$No
attribution.utm_contentstring | nulllength ≤ 100pattern ^[\w.-]+$No
attribution.referrer_domainstring | nulllength ≤ 253pattern ^[a-z0-9.-]*$Yes
attribution.landing_pathstring | nulllength ≤ 512pattern ^\/[^?#\s]*$Yes
Response 201: 6 fields
Response 201 (application/json)
NameTypeRequired
idstring (uuid)Yes
namestringlength 1–100Yes
slugstringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$Yes
portal_locale"en" | "pt-BR" | "es" | "de" | "fr"Yes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X POST 'https://api.upvoiced.com/v1/workspaces' \
  -H "Authorization: Bearer $UPVOICED_SESSION_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Example",
  "slug": "dark-mode"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/workspaces', { body: { name: 'Example', slug: 'dark-mode' } });
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

GET/v1/workspace

Get the selected workspace

Authentication
API key or Dashboard session; API key scope read
Operation id
getWorkspace
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 6 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
namestringlength 1–100Yes
slugstringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$Yes
portal_locale"en" | "pt-BR" | "es" | "de" | "fr"Yes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl 'https://api.upvoiced.com/v1/workspace' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/workspace');
MCP
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_workspaces",
    "arguments": {}
  }
}

Tool list_workspaces.

PATCH/v1/workspace

Update workspace settings (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
updateWorkspace
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Request body (JSON)
NameTypeRequired
namestringlength 1–100No
slugstringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$No
portal_locale"en" | "pt-BR" | "es" | "de" | "fr"No
Response 200: 6 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
namestringlength 1–100Yes
slugstringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$Yes
portal_locale"en" | "pt-BR" | "es" | "de" | "fr"Yes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X PATCH 'https://api.upvoiced.com/v1/workspace' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Example"
}'
TypeScript SDK
const data = await upvoiced.patch('/v1/workspace', { body: { name: 'Example' } });
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

POST/v1/workspace/switch

Verify membership and return the workspace and role to switch to

Authentication
Dashboard session only (API keys get 403 session_required)
Operation id
switchWorkspace
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Response 200: 9 fields
Response 200 (application/json)
NameTypeRequired
workspaceobjectYes
workspace.idstring (uuid)Yes
workspace.namestringlength 1–100Yes
workspace.slugstringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$Yes
workspace.portal_locale"en" | "pt-BR" | "es" | "de" | "fr"Yes
workspace.created_atstring (date-time)Yes
workspace.updated_atstring (date-time)Yes
role"owner" | "admin" | "member"Yes
operator_idstring (uuid)No

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X POST 'https://api.upvoiced.com/v1/workspace/switch' \
  -H "Authorization: Bearer $UPVOICED_SESSION_TOKEN" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{}'
TypeScript SDK
const data = await upvoiced.post('/v1/workspace/switch', { body: {} });
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

GET/v1/workspace/sso

End-user SSO state: enabled, audience, secret dates; never the secret (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
getSsoSettings
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 5 fields
Response 200 (application/json)
NameTypeRequired
enabledbooleanYes
configuredbooleanYes
audiencestring (uuid)Yes
secret_created_atstring (date-time) | nullYes
previous_secret_expires_atstring (date-time) | nullYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl 'https://api.upvoiced.com/v1/workspace/sso' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/workspace/sso');
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

PATCH/v1/workspace/sso

Accept or stop accepting SSO tokens; needs a secret to enable (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
updateSsoSettings
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Request body (JSON)
NameTypeRequired
enabledbooleanYes
Response 200: 5 fields
Response 200 (application/json)
NameTypeRequired
enabledbooleanYes
configuredbooleanYes
audiencestring (uuid)Yes
secret_created_atstring (date-time) | nullYes
previous_secret_expires_atstring (date-time) | nullYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X PATCH 'https://api.upvoiced.com/v1/workspace/sso' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
  "enabled": true
}'
TypeScript SDK
const data = await upvoiced.patch('/v1/workspace/sso', { body: { enabled: true } });
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

POST/v1/workspace/sso/rotate

Create or rotate the SSO secret, shown once; the old one verifies for grace_hours (owner/admin, re-auth ≤ 10 min)

Authentication
Dashboard session only (API keys get 403 session_required)
Operation id
rotateSsoSecret
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Request body (JSON)
NameTypeRequired
grace_hoursintegervalue 0–168default 24No
Response 200: 6 fields
Response 200 (application/json)
NameTypeRequired
enabledbooleanYes
configuredbooleanYes
audiencestring (uuid)Yes
secret_created_atstring (date-time) | nullYes
previous_secret_expires_atstring (date-time) | nullYes
secretstringpattern ^uvsso_[A-Za-z0-9_-]{43}$Yes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X POST 'https://api.upvoiced.com/v1/workspace/sso/rotate' \
  -H "Authorization: Bearer $UPVOICED_SESSION_TOKEN" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "grace_hours": 24
}'
TypeScript SDK
const data = await upvoiced.post('/v1/workspace/sso/rotate', { body: { grace_hours: 24 } });
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

GET/v1/workspace/widget

Widget settings: allowed origins, the always-allowed portal origin, enabled tabs, install date (any member)

Authentication
API key or Dashboard session; API key scope read
Operation id
getWidgetSettings
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 4 fields
Response 200 (application/json)
NameTypeRequired
allowed_originsarray of stringitems ≤ 50Yes
first_party_originsarray of stringitems ≤ 4Yes
tabsarray of "feedback" | "roadmap" | "whats-new"items 1–3Yes
installed_atstring (date-time) | nullYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl 'https://api.upvoiced.com/v1/workspace/widget' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/workspace/widget');
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

PATCH/v1/workspace/widget

Set the exact browser origins allowed on the end-user API and the enabled widget tabs (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
updateWidgetSettings
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Request body (JSON)
NameTypeRequired
allowed_originsarray of stringitems ≤ 50No
tabsarray of "feedback" | "roadmap" | "whats-new"items 1–3No
Response 200: 4 fields
Response 200 (application/json)
NameTypeRequired
allowed_originsarray of stringitems ≤ 50Yes
first_party_originsarray of stringitems ≤ 4Yes
tabsarray of "feedback" | "roadmap" | "whats-new"items 1–3Yes
installed_atstring (date-time) | nullYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X PATCH 'https://api.upvoiced.com/v1/workspace/widget' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
  "allowed_origins": [
    "Example allowed origins"
  ]
}'
TypeScript SDK
const data = await upvoiced.patch('/v1/workspace/widget', { body: { allowed_origins: ['Example allowed origins'] } });
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

GET/v1/workspace/deletion

Deletion state, purge date and whether a restore is possible (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
getWorkspaceDeletion
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 4 fields
Response 200 (application/json)
NameTypeRequired
state"active" | "scheduled" | "purging"Yes
deleted_atstring (date-time) | nullYes
purge_afterstring (date-time) | nullYes
restorablebooleanYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl 'https://api.upvoiced.com/v1/workspace/deletion' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/workspace/deletion');
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

POST/v1/workspace/deletion

Owner-only, re-authenticated soft deletion with typed slug

Authentication
Dashboard session only (API keys get 403 session_required)
Operation id
deleteWorkspace
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Request body (JSON)
NameTypeRequired
confirmation_slugstringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$Yes
Response 202: 2 fields
Response 202 (application/json)
NameTypeRequired
deleted_atstring (date-time)Yes
purge_afterstring (date-time)Yes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X POST 'https://api.upvoiced.com/v1/workspace/deletion' \
  -H "Authorization: Bearer $UPVOICED_SESSION_TOKEN" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "confirmation_slug": "acme"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/workspace/deletion', { body: { confirmation_slug: 'acme' } });
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

POST/v1/workspace/restore

Restore a soft-deleted workspace within 30 days, before purge starts (owner)

Authentication
API key or Dashboard session; API key scope admin
Operation id
restoreWorkspace
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Response 200: 6 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
namestringlength 1–100Yes
slugstringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$Yes
portal_locale"en" | "pt-BR" | "es" | "de" | "fr"Yes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X POST 'https://api.upvoiced.com/v1/workspace/restore' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{}'
TypeScript SDK
const data = await upvoiced.post('/v1/workspace/restore', { body: {} });
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.