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)
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
Response 200: 18 fields
| Name | Type | Required |
|---|---|---|
items | array of object | Yes |
items[].id | string (uuid) | Yes |
items[].kind | "slack" | "discord" | Yes |
items[].name | string | Yes |
items[].install_mode | "paste" | "oauth" | Yes |
items[].url_hint | string | Yes |
items[].events | array of string | Yes |
items[].board_ids | array of string (uuid) | Yes |
items[].templates | object | Yes |
items[].active | boolean | Yes |
items[].disabled_reason | "consecutive_failures" | "endpoint_gone" | null | Yes |
items[].disabled_at | string (date-time) | null | Yes |
items[].consecutive_failures | integervalue ≥ 0 | Yes |
items[].last_success_at | string (date-time) | null | Yes |
items[].last_failure_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/integrations' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID"const data = await upvoiced.get('/v1/integrations');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)
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
idempotency-key | stringpattern ^[A-Za-z0-9_.:-]{8,128}$ | No |
| Name | Type | Required |
|---|---|---|
kind | "slack" | "discord" | Yes |
url | stringlength 1–2048 | Yes |
name | stringlength ≤ 80default "" | No |
events | array of "post.created" | "comment.created" | "post.status_changed" | "changelog.published"items 1–4 | Yes |
board_ids | array of string (uuid)items ≤ 50default [] | No |
templates | objectdefault {} | No |
templates.post.created | stringlength 1–300 | No |
templates.comment.created | stringlength 1–300 | No |
templates.post.status_changed | stringlength 1–300 | No |
templates.changelog.published | stringlength 1–300 | No |
active | booleandefault true | No |
Response 201: 16 fields
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
kind | "slack" | "discord" | Yes |
name | string | Yes |
install_mode | "paste" | "oauth" | Yes |
url_hint | string | Yes |
events | array of string | Yes |
board_ids | array of string (uuid) | Yes |
templates | object | Yes |
active | boolean | Yes |
disabled_reason | "consecutive_failures" | "endpoint_gone" | null | Yes |
disabled_at | string (date-time) | null | Yes |
consecutive_failures | integervalue ≥ 0 | Yes |
last_success_at | string (date-time) | null | Yes |
last_failure_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/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"
]
}'const data = await upvoiced.post('/v1/integrations', {
body: {
kind: 'slack',
url: 'https://example.com/upvoiced',
events: ['post.created'],
},
});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)
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
Response 200: 16 fields
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
kind | "slack" | "discord" | Yes |
name | string | Yes |
install_mode | "paste" | "oauth" | Yes |
url_hint | string | Yes |
events | array of string | Yes |
board_ids | array of string (uuid) | Yes |
templates | object | Yes |
active | boolean | Yes |
disabled_reason | "consecutive_failures" | "endpoint_gone" | null | Yes |
disabled_at | string (date-time) | null | Yes |
consecutive_failures | integervalue ≥ 0 | Yes |
last_success_at | string (date-time) | null | Yes |
last_failure_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/integrations/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID"const data = await upvoiced.get('/v1/integrations/{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/integrations/{id}
Change URL, name, events, boards, templates or active; active=true re-enables a disabled connection
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
url | stringlength 1–2048 | No |
name | stringlength ≤ 80 | No |
events | array of "post.created" | "comment.created" | "post.status_changed" | "changelog.published"items 1–4 | No |
board_ids | array of string (uuid)items ≤ 50 | No |
templates | object | No |
templates.post.created | stringlength 1–300 | No |
templates.comment.created | stringlength 1–300 | No |
templates.post.status_changed | stringlength 1–300 | No |
templates.changelog.published | stringlength 1–300 | No |
active | boolean | No |
Response 200: 16 fields
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
kind | "slack" | "discord" | Yes |
name | string | Yes |
install_mode | "paste" | "oauth" | Yes |
url_hint | string | Yes |
events | array of string | Yes |
board_ids | array of string (uuid) | Yes |
templates | object | Yes |
active | boolean | Yes |
disabled_reason | "consecutive_failures" | "endpoint_gone" | null | Yes |
disabled_at | string (date-time) | null | Yes |
consecutive_failures | integervalue ≥ 0 | Yes |
last_success_at | string (date-time) | null | Yes |
last_failure_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/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"
}'const data = await upvoiced.patch('/v1/integrations/{id}', {
path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
body: { url: 'https://example.com/upvoiced' },
});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
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
Response 200: 1 fields
| Name | Type | Required |
|---|---|---|
ok | true | 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/integrations/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID"const data = await upvoiced.delete('/v1/integrations/{id}', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });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
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
| Name | Type | Required |
|---|---|---|
status | "pending" | "sending" | "succeeded" | "failed" | "canceled" | No |
cursor | stringlength 1–512 | No |
limit | integervalue 1–100default 25 | No |
| Name | Type | Required |
|---|---|---|
x-workspace | string (uuid) | Yes |
Response 200: 17 fields
| Name | Type | Required |
|---|---|---|
items | array of objectitems ≤ 100 | Yes |
items[].id | string (uuid) | Yes |
items[].event_id | string | null | Yes |
items[].event_type | string | Yes |
items[].kind | "event" | "test" | "redelivery" | Yes |
items[].status | "pending" | "sending" | "succeeded" | "failed" | "canceled" | Yes |
items[].attempt | integervalue ≥ 0 | Yes |
items[].next_attempt_at | string (date-time) | null | Yes |
items[].status_code | integer | nullvalue 100–599 | Yes |
items[].response_ms | integer | nullvalue ≥ 0 | Yes |
items[].error | string | null | Yes |
items[].response_snippet | string | null | Yes |
items[].payload | object | Yes |
items[].created_at | string (date-time) | Yes |
items[].completed_at | string (date-time) | null | Yes |
items[].integration_id | string (uuid) | Yes |
next_cursor | string | 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/integrations/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d/deliveries' \
-H "Authorization: Bearer $UPVOICED_API_KEY" \
-H "X-Workspace: $UPVOICED_WORKSPACE_ID"const data = await upvoiced.get('/v1/integrations/{id}/deliveries', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });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)
| 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 |
| Name | Type | Required |
|---|---|---|
event_type | "post.created" | "comment.created" | "post.status_changed" | "changelog.published" | No |
Response 202: 15 fields
| Name | Type | Required |
|---|---|---|
id | string (uuid) | Yes |
event_id | string | null | Yes |
event_type | string | Yes |
kind | "event" | "test" | "redelivery" | Yes |
status | "pending" | "sending" | "succeeded" | "failed" | "canceled" | Yes |
attempt | integervalue ≥ 0 | Yes |
next_attempt_at | string (date-time) | null | Yes |
status_code | integer | nullvalue 100–599 | Yes |
response_ms | integer | nullvalue ≥ 0 | Yes |
error | string | null | Yes |
response_snippet | string | null | Yes |
payload | object | Yes |
created_at | string (date-time) | Yes |
completed_at | string (date-time) | null | Yes |
integration_id | 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/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"
}'const data = await upvoiced.post('/v1/integrations/{id}/test', {
path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' },
body: { event_type: 'post.created' },
});No MCP tool for this operation. The MCP server covers the everyday reads and writes.