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
| Name | Type | Required |
|---|---|---|
idempotency-key | stringpattern ^[A-Za-z0-9_.:-]{8,128}$ | No |
| Name | Type | Required |
|---|---|---|
token | stringpattern ^[A-Za-z0-9_-]{43}$ | Yes |
Response 200: 9 fields
| Name | Type | Required |
|---|---|---|
workspace | object | Yes |
workspace.id | string (uuid) | Yes |
workspace.name | stringlength 1–100 | Yes |
workspace.slug | stringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$ | Yes |
workspace.portal_locale | "en" | "pt-BR" | "es" | "de" | "fr" | Yes |
workspace.created_at | string (date-time) | Yes |
workspace.updated_at | string (date-time) | Yes |
role | "owner" | "admin" | "member" | Yes |
operator_id | string (uuid) | No |
Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.
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"
}'const data = await upvoiced.post('/v1/invitations/accept', {
body: { token: 'example-token-00000000000000000000000000000' },
});No MCP tool for this operation. The MCP server covers the everyday reads and writes.
GET/v1/members
List active members
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
Response 200: 7 fields
| Name | Type | Required |
|---|---|---|
items | array of object | Yes |
items[].id | string (uuid) | Yes |
items[].name | string | Yes |
items[].email | string (email)length ≤ 254 | Yes |
items[].role | "owner" | "admin" | "member" | Yes |
items[].status | "active" | "revoked" | Yes |
next_cursor | null | Yes |
Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.
curl 'https://api.upvoiced.com/v1/members' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID"const data = await upvoiced.get('/v1/members');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)
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
role | "admin" | "member" | Yes |
Response 200: 1 fields
| Name | Type | Required |
|---|---|---|
ok | true | Yes |
Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.
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"
}'const data = await upvoiced.patch('/v1/members/{id}', {
path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
body: { role: 'admin' },
});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)
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
Response 200: 1 fields
| Name | Type | Required |
|---|---|---|
ok | true | Yes |
Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.
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"const data = await upvoiced.delete('/v1/members/{id}', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });No MCP tool for this operation. The MCP server covers the everyday reads and writes.
GET/v1/invitations
List pending invitations (owner/admin)
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
Response 200: 6 fields
| Name | Type | Required |
|---|---|---|
items | array of object | Yes |
items[].id | string (uuid) | Yes |
items[].email | string (email)length ≤ 254 | Yes |
items[].role | "admin" | "member" | Yes |
items[].expires_at | string (date-time) | Yes |
next_cursor | null | Yes |
Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.
curl 'https://api.upvoiced.com/v1/invitations' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID"const data = await upvoiced.get('/v1/invitations');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
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
idempotency-key | stringpattern ^[A-Za-z0-9_.:-]{8,128}$ | No |
| Name | Type | Required |
|---|---|---|
email | string (email)length ≤ 254 | Yes |
role | "admin" | "member"default "member" | No |
Response 201: 4 fields
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
email | string (email)length ≤ 254 | Yes |
role | "admin" | "member" | Yes |
expires_at | string (date-time) | Yes |
Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.
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"
}'const data = await upvoiced.post('/v1/invitations', { body: { email: 'ada@example.com' } });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)
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
Response 200: 1 fields
| Name | Type | Required |
|---|---|---|
ok | true | Yes |
Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.
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"const data = await upvoiced.delete('/v1/invitations/{id}', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });No MCP tool for this operation. The MCP server covers the everyday reads and writes.