Skip to content
UpVoiced Docs

API reference

Statuses

The workflow statuses posts move through, and their categories.

Set up the SDK client used in the examples

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/statuses

List statuses in order (any member)

Authentication
API key or Dashboard session; API key scope read
Operation id
listStatuses
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 12 fields
Response 200 (application/json)
NameTypeRequired
itemsarray of objectYes
items[].idstring (uuid)Yes
items[].namestringlength 1–100Yes
items[].colorstringpattern ^#[0-9a-fA-F]{6}$Yes
items[].category"open" | "active" | "done" | "closed"Yes
items[].shown_on_roadmapbooleanYes
items[].is_defaultbooleanYes
items[].is_done_targetbooleanYes
items[].positionintegervalue ≥ 0Yes
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/statuses' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/statuses');
MCP
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_statuses",
    "arguments": {
      "workspace": "0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d"
    }
  }
}

Tool list_statuses.

POST/v1/statuses

Create a status; colour passes the theme contrast guard (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
createStatus
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
namestringlength 1–100Yes
colorstringpattern ^#[0-9a-fA-F]{6}$Yes
category"open" | "active" | "done" | "closed"Yes
shown_on_roadmapbooleandefault falseNo
is_defaultbooleandefault falseNo
is_done_targetbooleandefault falseNo
Response 201: 10 fields
Response 201 (application/json)
NameTypeRequired
idstring (uuid)Yes
namestringlength 1–100Yes
colorstringpattern ^#[0-9a-fA-F]{6}$Yes
category"open" | "active" | "done" | "closed"Yes
shown_on_roadmapbooleanYes
is_defaultbooleanYes
is_done_targetbooleanYes
positionintegervalue ≥ 0Yes
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/statuses' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Example",
  "color": "#2f63c4",
  "category": "open"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/statuses', {
  body: { name: 'Example', color: '#2f63c4', category: 'open' },
});
MCP

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

POST/v1/statuses/reorder

Set the status order; ids must list every status exactly once (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
reorderStatuses
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
idsarray of string (uuid)items 1–200Yes
Response 200: 12 fields
Response 200 (application/json)
NameTypeRequired
itemsarray of objectYes
items[].idstring (uuid)Yes
items[].namestringlength 1–100Yes
items[].colorstringpattern ^#[0-9a-fA-F]{6}$Yes
items[].category"open" | "active" | "done" | "closed"Yes
items[].shown_on_roadmapbooleanYes
items[].is_defaultbooleanYes
items[].is_done_targetbooleanYes
items[].positionintegervalue ≥ 0Yes
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 -X POST 'https://api.upvoiced.com/v1/statuses/reorder' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "ids": [
    "0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d"
  ]
}'
TypeScript SDK
const data = await upvoiced.post('/v1/statuses/reorder', { body: { ids: ['0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d'] } });
MCP

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

PATCH/v1/statuses/{id}

Update a status; default/done-target flags move atomically (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
updateStatus
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Request body (JSON)
NameTypeRequired
namestringlength 1–100No
colorstringpattern ^#[0-9a-fA-F]{6}$No
category"open" | "active" | "done" | "closed"No
shown_on_roadmapbooleanNo
is_defaultbooleanNo
is_done_targetbooleanNo
Response 200: 10 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
namestringlength 1–100Yes
colorstringpattern ^#[0-9a-fA-F]{6}$Yes
category"open" | "active" | "done" | "closed"Yes
shown_on_roadmapbooleanYes
is_defaultbooleanYes
is_done_targetbooleanYes
positionintegervalue ≥ 0Yes
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/statuses/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
  -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/statuses/{id}', {
  path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
  body: { name: 'Example' },
});
MCP

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

DELETE/v1/statuses/{id}

Delete a status, moving its posts to replacement_status_id in one transaction (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
deleteStatus
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Request body (JSON)
NameTypeRequired
replacement_status_idstring (uuid)No
Response 200: 3 fields
Response 200 (application/json)
NameTypeRequired
oktrueYes
replacement_status_idstring (uuid) | nullYes
moved_postsintegervalue ≥ 0Yes

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

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