Boards
Feedback boards, their visibility and order.
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/boards
List boards, including private, unlisted and archived ones (any member)
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
Response 200: 16 fields
| Name | Type | Required |
|---|---|---|
items | array of object | Yes |
items[].id | string (uuid) | Yes |
items[].workspace_id | string (uuid) | Yes |
items[].name | stringlength 1–100 | Yes |
items[].slug | stringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$ | Yes |
items[].description | stringlength ≤ 2000 | Yes |
items[].visibility | "public" | "private" | "unlisted" | Yes |
items[].require_approval | boolean | Yes |
items[].anonymous_voting | boolean | Yes |
items[].multi_vote | boolean | Yes |
items[].show_on_roadmap | boolean | Yes |
items[].position | integervalue ≥ 0 | Yes |
items[].archived_at | string (date-time) | null | Yes |
items[].created_at | string (date-time) | Yes |
items[].updated_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/boards' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID"const data = await upvoiced.get('/v1/boards');{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_boards",
"arguments": {
"workspace": "0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d"
}
}
}Tool list_boards.
POST/v1/boards
Create a board; boards.max and private_boards entitlements (owner/admin)
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
idempotency-key | stringpattern ^[A-Za-z0-9_.:-]{8,128}$ | No |
| Name | Type | Required |
|---|---|---|
name | stringlength 1–100 | Yes |
slug | stringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$ | Yes |
description | stringlength ≤ 2000default "" | No |
visibility | "public" | "private" | "unlisted"default "public" | No |
require_approval | booleandefault false | No |
anonymous_voting | booleandefault false | No |
multi_vote | booleandefault false | No |
show_on_roadmap | booleandefault true | No |
Response 201: 14 fields
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
workspace_id | string (uuid) | Yes |
name | stringlength 1–100 | Yes |
slug | stringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$ | Yes |
description | stringlength ≤ 2000 | Yes |
visibility | "public" | "private" | "unlisted" | Yes |
require_approval | boolean | Yes |
anonymous_voting | boolean | Yes |
multi_vote | boolean | Yes |
show_on_roadmap | boolean | Yes |
position | integervalue ≥ 0 | Yes |
archived_at | string (date-time) | null | Yes |
created_at | string (date-time) | Yes |
updated_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/boards' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "Example",
"slug": "dark-mode"
}'const data = await upvoiced.post('/v1/boards', { body: { name: 'Example', slug: 'dark-mode' } });No MCP tool for this operation. The MCP server covers the everyday reads and writes.
POST/v1/boards/reorder
Set the board order; ids must list every board exactly once (owner/admin)
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
idempotency-key | stringpattern ^[A-Za-z0-9_.:-]{8,128}$ | No |
| Name | Type | Required |
|---|---|---|
ids | array of string (uuid)items 1–200 | Yes |
Response 200: 16 fields
| Name | Type | Required |
|---|---|---|
items | array of object | Yes |
items[].id | string (uuid) | Yes |
items[].workspace_id | string (uuid) | Yes |
items[].name | stringlength 1–100 | Yes |
items[].slug | stringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$ | Yes |
items[].description | stringlength ≤ 2000 | Yes |
items[].visibility | "public" | "private" | "unlisted" | Yes |
items[].require_approval | boolean | Yes |
items[].anonymous_voting | boolean | Yes |
items[].multi_vote | boolean | Yes |
items[].show_on_roadmap | boolean | Yes |
items[].position | integervalue ≥ 0 | Yes |
items[].archived_at | string (date-time) | null | Yes |
items[].created_at | string (date-time) | Yes |
items[].updated_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 -X POST 'https://api.upvoiced.com/v1/boards/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"
]
}'const data = await upvoiced.post('/v1/boards/reorder', { body: { ids: ['0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d'] } });No MCP tool for this operation. The MCP server covers the everyday reads and writes.
POST/v1/boards/plan-selection
Choose which active boards stay active within boards.max; the rest are read-only and hidden from public surfaces (owner/admin)
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
idempotency-key | stringpattern ^[A-Za-z0-9_.:-]{8,128}$ | No |
| Name | Type | Required |
|---|---|---|
board_ids | array of string (uuid)items 1–100 | Yes |
Response 200: 2 fields
| Name | Type | Required |
|---|---|---|
active_board_ids | array of string (uuid) | Yes |
read_only_board_ids | array of string (uuid) | 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/boards/plan-selection' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"board_ids": [
"0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d"
]
}'const data = await upvoiced.post('/v1/boards/plan-selection', {
body: { board_ids: ['0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d'] },
});No MCP tool for this operation. The MCP server covers the everyday reads and writes.
GET/v1/boards/{id}
Get a board (any member)
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
Response 200: 14 fields
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
workspace_id | string (uuid) | Yes |
name | stringlength 1–100 | Yes |
slug | stringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$ | Yes |
description | stringlength ≤ 2000 | Yes |
visibility | "public" | "private" | "unlisted" | Yes |
require_approval | boolean | Yes |
anonymous_voting | boolean | Yes |
multi_vote | boolean | Yes |
show_on_roadmap | boolean | Yes |
position | integervalue ≥ 0 | Yes |
archived_at | string (date-time) | null | Yes |
created_at | string (date-time) | Yes |
updated_at | string (date-time) | Yes |
Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.
curl 'https://api.upvoiced.com/v1/boards/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID"const data = await upvoiced.get('/v1/boards/{id}', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });No MCP tool for this operation. The MCP server covers the everyday reads and writes.
PATCH/v1/boards/{id}
Update board settings and visibility; purges cache tags (owner/admin)
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
name | stringlength 1–100 | No |
slug | stringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$ | No |
description | stringlength ≤ 2000 | No |
visibility | "public" | "private" | "unlisted" | No |
require_approval | boolean | No |
anonymous_voting | boolean | No |
multi_vote | boolean | No |
show_on_roadmap | boolean | No |
Response 200: 14 fields
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
workspace_id | string (uuid) | Yes |
name | stringlength 1–100 | Yes |
slug | stringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$ | Yes |
description | stringlength ≤ 2000 | Yes |
visibility | "public" | "private" | "unlisted" | Yes |
require_approval | boolean | Yes |
anonymous_voting | boolean | Yes |
multi_vote | boolean | Yes |
show_on_roadmap | boolean | Yes |
position | integervalue ≥ 0 | Yes |
archived_at | string (date-time) | null | Yes |
created_at | string (date-time) | Yes |
updated_at | string (date-time) | 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/boards/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"
}'const data = await upvoiced.patch('/v1/boards/{id}', {
path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
body: { name: 'Example' },
});No MCP tool for this operation. The MCP server covers the everyday reads and writes.
DELETE/v1/boards/{id}
Archive a board (reversible, keeps posts); never the last active board (owner/admin)
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
Response 200: 14 fields
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
workspace_id | string (uuid) | Yes |
name | stringlength 1–100 | Yes |
slug | stringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$ | Yes |
description | stringlength ≤ 2000 | Yes |
visibility | "public" | "private" | "unlisted" | Yes |
require_approval | boolean | Yes |
anonymous_voting | boolean | Yes |
multi_vote | boolean | Yes |
show_on_roadmap | boolean | Yes |
position | integervalue ≥ 0 | Yes |
archived_at | string (date-time) | null | Yes |
created_at | string (date-time) | Yes |
updated_at | string (date-time) | 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/boards/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID"const data = await upvoiced.delete('/v1/boards/{id}', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });No MCP tool for this operation. The MCP server covers the everyday reads and writes.
POST/v1/boards/{id}/restore
Restore an archived board within boards.max (owner/admin)
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
idempotency-key | stringpattern ^[A-Za-z0-9_.:-]{8,128}$ | No |
Response 200: 14 fields
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
workspace_id | string (uuid) | Yes |
name | stringlength 1–100 | Yes |
slug | stringlength 3–32pattern ^[a-z0-9][a-z0-9-]*[a-z0-9]$ | Yes |
description | stringlength ≤ 2000 | Yes |
visibility | "public" | "private" | "unlisted" | Yes |
require_approval | boolean | Yes |
anonymous_voting | boolean | Yes |
multi_vote | boolean | Yes |
show_on_roadmap | boolean | Yes |
position | integervalue ≥ 0 | Yes |
archived_at | string (date-time) | null | Yes |
created_at | string (date-time) | Yes |
updated_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/boards/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d/restore' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{}'const data = await upvoiced.post('/v1/boards/{id}/restore', {
path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
body: {},
});No MCP tool for this operation. The MCP server covers the everyday reads and writes.