Skip to content
UpVoiced Docs

API reference

Slack and Discord integrations

Slack and Discord connections from an incoming-webhook URL: per-event templates, board filters, test messages and the delivery log.

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

Slack and Discord connections with masked URLs and delivery health (all members)

Authentication
API key or Dashboard session; API key scope read
Operation id
listIntegrations
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 18 fields
Response 200 (application/json)
NameTypeRequired
itemsarray of objectYes
items[].idstring (uuid)Yes
items[].kind"slack" | "discord"Yes
items[].namestringYes
items[].install_mode"paste" | "oauth"Yes
items[].url_hintstringYes
items[].eventsarray of stringYes
items[].board_idsarray of string (uuid)Yes
items[].templatesobjectYes
items[].activebooleanYes
items[].disabled_reason"consecutive_failures" | "endpoint_gone" | nullYes
items[].disabled_atstring (date-time) | nullYes
items[].consecutive_failuresintegervalue ≥ 0Yes
items[].last_success_atstring (date-time) | nullYes
items[].last_failure_atstring (date-time) | nullYes
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/integrations' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/integrations');
MCP

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

POST/v1/integrations

Connect a Slack or Discord channel by its incoming-webhook URL, with events, boards and message templates (integrations.slack_discord)

Authentication
API key or Dashboard session; API key scope admin
Operation id
createIntegration
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
kind"slack" | "discord"Yes
urlstringlength 1–2048Yes
namestringlength ≤ 80default ""No
eventsarray of "post.created" | "comment.created" | "post.status_changed" | "changelog.published"items 1–4Yes
board_idsarray of string (uuid)items ≤ 50default []No
templatesobjectdefault {}No
templates.post.createdstringlength 1–300No
templates.comment.createdstringlength 1–300No
templates.post.status_changedstringlength 1–300No
templates.changelog.publishedstringlength 1–300No
activebooleandefault trueNo
Response 201: 16 fields
Response 201 (application/json)
NameTypeRequired
idstring (uuid)Yes
kind"slack" | "discord"Yes
namestringYes
install_mode"paste" | "oauth"Yes
url_hintstringYes
eventsarray of stringYes
board_idsarray of string (uuid)Yes
templatesobjectYes
activebooleanYes
disabled_reason"consecutive_failures" | "endpoint_gone" | nullYes
disabled_atstring (date-time) | nullYes
consecutive_failuresintegervalue ≥ 0Yes
last_success_atstring (date-time) | nullYes
last_failure_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/integrations' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "kind": "slack",
  "url": "https://example.com/upvoiced",
  "events": [
    "post.created"
  ]
}'
TypeScript SDK
const data = await upvoiced.post('/v1/integrations', {
  body: {
    kind: 'slack',
    url: 'https://example.com/upvoiced',
    events: ['post.created'],
  },
});
MCP

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

GET/v1/integrations/{id}

One Slack or Discord connection (all members)

Authentication
API key or Dashboard session; API key scope read
Operation id
getIntegration
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 16 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
kind"slack" | "discord"Yes
namestringYes
install_mode"paste" | "oauth"Yes
url_hintstringYes
eventsarray of stringYes
board_idsarray of string (uuid)Yes
templatesobjectYes
activebooleanYes
disabled_reason"consecutive_failures" | "endpoint_gone" | nullYes
disabled_atstring (date-time) | nullYes
consecutive_failuresintegervalue ≥ 0Yes
last_success_atstring (date-time) | nullYes
last_failure_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 'https://api.upvoiced.com/v1/integrations/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/integrations/{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/integrations/{id}

Change URL, name, events, boards, templates or active; active=true re-enables a disabled connection

Authentication
API key or Dashboard session; API key scope admin
Operation id
updateIntegration
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Request body (JSON)
NameTypeRequired
urlstringlength 1–2048No
namestringlength ≤ 80No
eventsarray of "post.created" | "comment.created" | "post.status_changed" | "changelog.published"items 1–4No
board_idsarray of string (uuid)items ≤ 50No
templatesobjectNo
templates.post.createdstringlength 1–300No
templates.comment.createdstringlength 1–300No
templates.post.status_changedstringlength 1–300No
templates.changelog.publishedstringlength 1–300No
activebooleanNo
Response 200: 16 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
kind"slack" | "discord"Yes
namestringYes
install_mode"paste" | "oauth"Yes
url_hintstringYes
eventsarray of stringYes
board_idsarray of string (uuid)Yes
templatesobjectYes
activebooleanYes
disabled_reason"consecutive_failures" | "endpoint_gone" | nullYes
disabled_atstring (date-time) | nullYes
consecutive_failuresintegervalue ≥ 0Yes
last_success_atstring (date-time) | nullYes
last_failure_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/integrations/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://example.com/upvoiced"
}'
TypeScript SDK
const data = await upvoiced.patch('/v1/integrations/{id}', {
  path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
  body: { url: 'https://example.com/upvoiced' },
});
MCP

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

DELETE/v1/integrations/{id}

Remove a connection and its delivery log

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

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

GET/v1/integrations/{id}/deliveries

Message delivery log, newest first (14-day retention): attempts, status code, duration, error

Authentication
API key or Dashboard session; API key scope read
Operation id
listIntegrationDeliveries
Path parameters
NameTypeRequired
idstring (uuid)Yes
Query parameters
NameTypeRequired
status"pending" | "sending" | "succeeded" | "failed" | "canceled"No
cursorstringlength 1–512No
limitintegervalue 1–100default 25No
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 17 fields
Response 200 (application/json)
NameTypeRequired
itemsarray of objectitems ≤ 100Yes
items[].idstring (uuid)Yes
items[].event_idstring | nullYes
items[].event_typestringYes
items[].kind"event" | "test" | "redelivery"Yes
items[].status"pending" | "sending" | "succeeded" | "failed" | "canceled"Yes
items[].attemptintegervalue ≥ 0Yes
items[].next_attempt_atstring (date-time) | nullYes
items[].status_codeinteger | nullvalue 100–599Yes
items[].response_msinteger | nullvalue ≥ 0Yes
items[].errorstring | nullYes
items[].response_snippetstring | nullYes
items[].payloadobjectYes
items[].created_atstring (date-time)Yes
items[].completed_atstring (date-time) | nullYes
items[].integration_idstring (uuid)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/integrations/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d/deliveries' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/integrations/{id}/deliveries', { 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/integrations/{id}/test

Queue a sample message for one event with the connection template (attempted once; 30/hour)

Authentication
API key or Dashboard session; API key scope admin
Operation id
testIntegration
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
event_type"post.created" | "comment.created" | "post.status_changed" | "changelog.published"No
Response 202: 15 fields
Response 202 (application/json)
NameTypeRequired
idstring (uuid)Yes
event_idstring | nullYes
event_typestringYes
kind"event" | "test" | "redelivery"Yes
status"pending" | "sending" | "succeeded" | "failed" | "canceled"Yes
attemptintegervalue ≥ 0Yes
next_attempt_atstring (date-time) | nullYes
status_codeinteger | nullvalue 100–599Yes
response_msinteger | nullvalue ≥ 0Yes
errorstring | nullYes
response_snippetstring | nullYes
payloadobjectYes
created_atstring (date-time)Yes
completed_atstring (date-time) | nullYes
integration_idstring (uuid)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/integrations/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d/test' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "event_type": "post.created"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/integrations/{id}/test', {
  path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
  body: { event_type: 'post.created' },
});
MCP

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