Skip to content
UpVoiced Docs

API reference

Members and invitations

The team: members, their roles, and pending invitations.

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.

POST/v1/invitations/accept

Accept an invitation with the verified primary email

Authentication
Dashboard session only (API keys get 403 session_required)
Operation id
acceptInvitation
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Request body (JSON)
NameTypeRequired
tokenstringpattern ^[A-Za-z0-9_-]{43}$Yes
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/invitations/accept' \
  -H "Authorization: Bearer $UPVOICED_SESSION_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "token": "example-token-00000000000000000000000000000"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/invitations/accept', {
  body: { token: 'example-token-00000000000000000000000000000' },
});
MCP

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

GET/v1/members

List active members

Authentication
API key or Dashboard session; API key scope read
Operation id
listMembers
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 7 fields
Response 200 (application/json)
NameTypeRequired
itemsarray of objectYes
items[].idstring (uuid)Yes
items[].namestringYes
items[].emailstring (email)length ≤ 254Yes
items[].role"owner" | "admin" | "member"Yes
items[].status"active" | "revoked"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/members' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/members');
MCP

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

PATCH/v1/members/{id}

Change a non-owner member role (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
updateMember
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Request body (JSON)
NameTypeRequired
role"admin" | "member"Yes
Response 200: 1 fields
Response 200 (application/json)
NameTypeRequired
oktrueYes

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/members/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
  "role": "admin"
}'
TypeScript SDK
const data = await upvoiced.patch('/v1/members/{id}', {
  path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
  body: { role: 'admin' },
});
MCP

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

DELETE/v1/members/{id}

Revoke a membership, keeping history (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
revokeMember
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 1 fields
Response 200 (application/json)
NameTypeRequired
oktrueYes

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

curl
curl -X DELETE 'https://api.upvoiced.com/v1/members/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.delete('/v1/members/{id}', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });
MCP

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

GET/v1/invitations

List pending invitations (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
listInvitations
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 6 fields
Response 200 (application/json)
NameTypeRequired
itemsarray of objectYes
items[].idstring (uuid)Yes
items[].emailstring (email)length ≤ 254Yes
items[].role"admin" | "member"Yes
items[].expires_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/invitations' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/invitations');
MCP

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

POST/v1/invitations

Invite by email; 7-day expiry; plan seat limit

Authentication
API key or Dashboard session; API key scope admin
Operation id
inviteMember
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
emailstring (email)length ≤ 254Yes
role"admin" | "member"default "member"No
Response 201: 4 fields
Response 201 (application/json)
NameTypeRequired
idstring (uuid)Yes
emailstring (email)length ≤ 254Yes
role"admin" | "member"Yes
expires_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/invitations' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "ada@example.com"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/invitations', { body: { email: 'ada@example.com' } });
MCP

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

DELETE/v1/invitations/{id}

Cancel a pending invitation (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
cancelInvitation
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 1 fields
Response 200 (application/json)
NameTypeRequired
oktrueYes

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

curl
curl -X DELETE 'https://api.upvoiced.com/v1/invitations/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.delete('/v1/invitations/{id}', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });
MCP

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