Skip to content
UpVoiced Docs

API reference

Comments

Public replies on posts, including official team answers and pinned comments.

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/posts/{id}/comments

Comments oldest first; one reply level; deleted ones as tombstones

Authentication
API key or Dashboard session; API key scope read
Operation id
listComments
Path parameters
NameTypeRequired
idstring (uuid)Yes
Query parameters
NameTypeRequired
cursorstringlength 1–512No
limitintegervalue 1–100default 50No
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 16 fields
Response 200 (application/json)
NameTypeRequired
itemsarray of objectYes
items[].idstring (uuid)Yes
items[].post_idstring (uuid)Yes
items[].parent_idstring (uuid) | nullYes
items[].authorobjectYes
items[].author.kind"operator" | "end_user" | "deleted"Yes
items[].author.idstring (uuid) | nullYes
items[].author.namestring | nulllength ≤ 200Yes
items[].body_mdstringYes
items[].is_officialbooleanYes
items[].pinnedbooleanYes
items[].edited_atstring (date-time) | nullYes
items[].deleted_atstring (date-time) | nullYes
items[].created_atstring (date-time)Yes
items[].updated_atstring (date-time)Yes
next_cursorstring | 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/posts/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d/comments' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/posts/{id}/comments', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });
MCP

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

POST/v1/posts/{id}/comments

Reply as the team (optionally official); markdown sanitized

Authentication
API key or Dashboard session; API key scope write
Operation id
createComment
Idempotency
Send an Idempotency-Key to make retries safe.
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Request body (JSON)
NameTypeRequired
body_mdstringlength ≤ 10000Yes
parent_idstring (uuid)No
officialbooleandefault falseNo
Response 201: 14 fields
Response 201 (application/json)
NameTypeRequired
idstring (uuid)Yes
post_idstring (uuid)Yes
parent_idstring (uuid) | nullYes
authorobjectYes
author.kind"operator" | "end_user" | "deleted"Yes
author.idstring (uuid) | nullYes
author.namestring | nulllength ≤ 200Yes
body_mdstringYes
is_officialbooleanYes
pinnedbooleanYes
edited_atstring (date-time) | nullYes
deleted_atstring (date-time) | nullYes
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/posts/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d/comments' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "body_md": "It would help our night shift."
}'
TypeScript SDK
const data = await upvoiced.post('/v1/posts/{id}/comments', {
  path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
  body: { body_md: 'It would help our night shift.' },
});
MCP
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reply_to_post",
    "arguments": {
      "body_md": "It would help our night shift.",
      "id": "0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d"
    }
  }
}

Tool reply_to_post.

PATCH/v1/comments/{id}

Edit your own comment

Authentication
API key or Dashboard session; API key scope write
Operation id
updateComment
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Request body (JSON)
NameTypeRequired
body_mdstringlength ≤ 10000Yes
Response 200: 14 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
post_idstring (uuid)Yes
parent_idstring (uuid) | nullYes
authorobjectYes
author.kind"operator" | "end_user" | "deleted"Yes
author.idstring (uuid) | nullYes
author.namestring | nulllength ≤ 200Yes
body_mdstringYes
is_officialbooleanYes
pinnedbooleanYes
edited_atstring (date-time) | nullYes
deleted_atstring (date-time) | nullYes
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/comments/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
  "body_md": "It would help our night shift."
}'
TypeScript SDK
const data = await upvoiced.patch('/v1/comments/{id}', {
  path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
  body: { body_md: 'It would help our night shift.' },
});
MCP

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

DELETE/v1/comments/{id}

Moderate: soft-delete any comment of the workspace (any member)

Authentication
API key or Dashboard session; API key scope write
Operation id
deleteComment
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/comments/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/comments/{id}', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });
MCP

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

POST/v1/comments/{id}/pin

Pin (or unpin with pinned=false) the official reply of its post

Authentication
API key or Dashboard session; API key scope write
Operation id
pinComment
Idempotency
Send an Idempotency-Key to make retries safe.
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Request body (JSON)
NameTypeRequired
pinnedbooleandefault trueNo
Response 200: 14 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
post_idstring (uuid)Yes
parent_idstring (uuid) | nullYes
authorobjectYes
author.kind"operator" | "end_user" | "deleted"Yes
author.idstring (uuid) | nullYes
author.namestring | nulllength ≤ 200Yes
body_mdstringYes
is_officialbooleanYes
pinnedbooleanYes
edited_atstring (date-time) | nullYes
deleted_atstring (date-time) | nullYes
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/comments/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d/pin' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "pinned": true
}'
TypeScript SDK
const data = await upvoiced.post('/v1/comments/{id}/pin', {
  path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
  body: { pinned: true },
});
MCP

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