Skip to content
UpVoiced Docs

API reference

Custom fields

Typed fields on posts (text, number, currency, select), operator-only or public, optionally filled from SSO attributes.

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/custom-fields

List the custom post field definitions in display order (any member)

Authentication
API key or Dashboard session; API key scope read
Operation id
listCustomFields
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 16 fields
Response 200 (application/json)
NameTypeRequired
itemsarray of objectitems ≤ 20Yes
items[].idstring (uuid)Yes
items[].keystringpattern ^[a-z][a-z0-9_]{0,39}$Yes
items[].namestringYes
items[].descriptionstringYes
items[].type"text" | "number" | "currency" | "select"Yes
items[].currencystring | nullpattern ^[A-Z]{3}$Yes
items[].optionsarray of objectYes
items[].options[].valuestringpattern ^[a-z0-9][a-z0-9_-]{0,63}$Yes
items[].options[].labelstringlength 1–100Yes
items[].visibility"operator" | "public"Yes
items[].sso_attributestring | nullpattern ^[A-Za-z][A-Za-z0-9_.-]{0,63}$Yes
items[].positionintegerYes
items[].weightablebooleanYes
items[].created_atstring (date-time)Yes
items[].updated_atstring (date-time)Yes

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

curl
curl 'https://api.upvoiced.com/v1/custom-fields' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/custom-fields');
MCP

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

POST/v1/custom-fields

Define a custom post field: text, number, currency or select; at most 20 per workspace; optionally filled from an SSO attribute (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
createCustomField
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
keystringpattern ^[a-z][a-z0-9_]{0,39}$Yes
namestringlength 1–60Yes
descriptionstringlength ≤ 280default ""No
type"text" | "number" | "currency" | "select"Yes
currencystringpattern ^[A-Z]{3}$No
optionsarray of objectitems 1–50No
options[].valuestringpattern ^[a-z0-9][a-z0-9_-]{0,63}$Yes
options[].labelstringlength 1–100Yes
visibility"operator" | "public"default "operator"No
sso_attributestring | nullpattern ^[A-Za-z][A-Za-z0-9_.-]{0,63}$default nullNo
positionintegervalue 0–1000default 0No
Response 201: 15 fields
Response 201 (application/json)
NameTypeRequired
idstring (uuid)Yes
keystringpattern ^[a-z][a-z0-9_]{0,39}$Yes
namestringYes
descriptionstringYes
type"text" | "number" | "currency" | "select"Yes
currencystring | nullpattern ^[A-Z]{3}$Yes
optionsarray of objectYes
options[].valuestringpattern ^[a-z0-9][a-z0-9_-]{0,63}$Yes
options[].labelstringlength 1–100Yes
visibility"operator" | "public"Yes
sso_attributestring | nullpattern ^[A-Za-z][A-Za-z0-9_.-]{0,63}$Yes
positionintegerYes
weightablebooleanYes
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/custom-fields' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "key": "acme",
  "name": "Example",
  "type": "text"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/custom-fields', { body: { key: 'acme', name: 'Example', type: 'text' } });
MCP

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

GET/v1/custom-fields/{id}

Get one custom post field definition (any member)

Authentication
API key or Dashboard session; API key scope read
Operation id
getCustomField
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 15 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
keystringpattern ^[a-z][a-z0-9_]{0,39}$Yes
namestringYes
descriptionstringYes
type"text" | "number" | "currency" | "select"Yes
currencystring | nullpattern ^[A-Z]{3}$Yes
optionsarray of objectYes
options[].valuestringpattern ^[a-z0-9][a-z0-9_-]{0,63}$Yes
options[].labelstringlength 1–100Yes
visibility"operator" | "public"Yes
sso_attributestring | nullpattern ^[A-Za-z][A-Za-z0-9_.-]{0,63}$Yes
positionintegerYes
weightablebooleanYes
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 'https://api.upvoiced.com/v1/custom-fields/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/custom-fields/{id}', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });
MCP

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

PATCH/v1/custom-fields/{id}

Rename, re-describe, reorder, change visibility, options (select) or the SSO attribute of a custom field; removed options are cleared from posts (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
updateCustomField
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Request body (JSON)
NameTypeRequired
namestringlength 1–60No
descriptionstringlength ≤ 280No
optionsarray of objectitems 1–50No
options[].valuestringpattern ^[a-z0-9][a-z0-9_-]{0,63}$Yes
options[].labelstringlength 1–100Yes
visibility"operator" | "public"No
sso_attributestring | nullpattern ^[A-Za-z][A-Za-z0-9_.-]{0,63}$No
positionintegervalue 0–1000No
Response 200: 15 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
keystringpattern ^[a-z][a-z0-9_]{0,39}$Yes
namestringYes
descriptionstringYes
type"text" | "number" | "currency" | "select"Yes
currencystring | nullpattern ^[A-Z]{3}$Yes
optionsarray of objectYes
options[].valuestringpattern ^[a-z0-9][a-z0-9_-]{0,63}$Yes
options[].labelstringlength 1–100Yes
visibility"operator" | "public"Yes
sso_attributestring | nullpattern ^[A-Za-z][A-Za-z0-9_.-]{0,63}$Yes
positionintegerYes
weightablebooleanYes
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/custom-fields/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/custom-fields/{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/custom-fields/{id}

Delete a custom field and clear its value from every post (owner/admin)

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

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