API reference
Missived API 1.24.0: 231 operations, generated from the OpenAPI 3.1 document every server serves at GET /v1/openapi.json (no token needed). Load that document into Postman, Insomnia or a code generator. The app draws the same document, with a filter, at /developers.
About this API
Missived's public REST API. Use it from scripts, automations (n8n, Zapier, Make) and bots.
Authentication. Send Authorization: Bearer <token>: a personal access token (msv_pat_…, Settings → Developer) acts as you, within your permissions and the scopes you gave it; an app token (msv_bot_…, Org Settings → Integrations → API tokens) acts as that app's bot user in one org; an OAuth access token (msv_oat_…, from the /oauth provider — "Add to Missived" acts as the installed bot, "Sign in with Missived" as the person) works the same way. Each operation names the scope it needs (x-scope).
Slash commands and interactions. An app registers commands with its token (PUT /v1/orgs/{orgId}/commands); people run them from the composer's / picker in channels the app is in. Each invocation is one signed POST to the app's interactions URL (Org Settings → Integrations → Apps & bots): JSON { id, type: 2, token, application_id, org_id, channel, member, user, data: { name, version, options, resolved }, timestamp }, headers X-Signature-Ed25519 (hex) and X-Signature-Timestamp over timestamp + body — Discord's scheme, so discord-interactions' verifyKey(body, signature, timestamp, publicKey) works with the app's public key. Answer within 3 seconds: { "type": 4, "data": { "content", "embeds" } } posts a reply as the bot; { "type": 5 } posts a “thinking…” placeholder you then edit with PATCH /v1/interactions/{token}/messages/@original; a ping (type: 1, sent when the URL is saved) is answered with { "type": 1 }. The token is valid 15 minutes for follow-ups.
Components, modals and private replies. An app's messages may carry components (Discord's v1 action rows: buttons and string / user / role / channel selects; see ActionRow). A click is a signed POST like a command's with type: 3, the app's own message (flags: 64 when it was a private reply) and data: { custom_id, component_type, values?, resolved? }; a modal submission is type: 5 with data: { custom_id, components: [{ type: 1, components: [{ type: 4, custom_id, value }] }] }. Answers: type: 4 a new message, 5 “thinking…”, either private to the clicker with data.flags: 64; 6 acknowledge now and edit @original later; 7 update the message the component is on (content, embeds, components; a field left out keeps its value); 9 open a modal (data: { custom_id, title ≤ 45, components: 1–5 rows of one text input — style 1 short or 2 paragraph, label ≤ 45, required, min_length / max_length ≤ 4000, placeholder, value }) — not in answer to a modal. A bot only ever changes its own messages. Private replies (flags: 64) are shown only to the person who ran the command or clicked, kept 15 minutes so a reload shows them, never in search, events or exports.
Conventions. JSON with snake_case keys; ids are strings; times are ISO 8601 in UTC. Lists answer { "data": [...], "next_cursor": "…" } — pass cursor to get the next page. Errors answer { "error": { "code", "message" } }. POSTs that create accept an Idempotency-Key header. GETs return an ETag; send If-None-Match to get 304 Not Modified.
Privacy. An app never reads direct messages or group chats; a personal token reads its owner's only when “Include my direct messages” was ticked. An app reads message content only in channels its token names, unless an admin gave it messages:read:all. Resources in other orgs, or not visible to you, answer 404.
Rate limits. 300 requests a minute per token (per person for a session), reported in X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a 429 carries Retry-After. Posting, editing and reacting also spend the chat budget everyone has.
Versioning. Within v1 changes are additive only (new routes, new optional inputs, new fields — ignore fields you don't know). Anything breaking ships as /v2. A deprecated route answers with a Deprecation header and is listed in the changelog before it goes.
Identity
Who this credential is
GET /v1/me
Needs: identify (every token has it)
The person or bot, the orgs it may act in (with roles) and its scopes. Needs no scope.
Your local date and time context
GET /v1/me/context
Needs: identify (every token has it)
People only. Uses the last remembered browser zone from flash-card or portal reminder preferences; no saved zone means null local fields, not a guessed UTC zone. time_zone may supply a zone the person gave, without saving it. Week start comes from the selected workspace's scheduling settings (Monday when unset); without an org and with several reachable orgs it is the Monday default. Responses are not cached.
| Name | In | Type | Description |
|---|---|---|---|
org_id | query | string | Optional reachable org for its week start; selected automatically when only one is reachable. |
time_zone | query | string | IANA zone explicitly supplied by the person. At most 100 characters. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | MyContext (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Your activity line
GET /v1/me/activity
Needs: identify (every token has it)
The opt-in status line next to your name ("Playing …", "Live on …"; INTEGRATIONS_PLAN §4.15). Null when none is set or it expired. Bots have none (403).
| Status | Meaning | Body |
|---|---|---|
200 | OK | MyActivity (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
Set your activity line
POST /v1/me/activity
Needs: presence:write
Replaces the line. It lapses after ttl_seconds (default five minutes), so a desktop app posts again while the game runs and deletes it when it stops. Shown to others only while Settings → Connections → "Share my activity" is on; the answer's visible says whether it is. Rate limit: 60 a minute.
Request body (application/json, required): ActivityInput.
| Field | Type | Description |
|---|---|---|
kind required | string | One of live, playing, listening, watching, custom. One of: live, playing, listening, watching, custom. |
name required | string | The service or game, up to 80 characters. At most 80 characters. |
detail | string | null | Optional second line, up to 120 characters. At most 120 characters. |
url | string | null | Optional https link. |
started_at | string (date-time) | null | Optional: when it began (clamped to now). |
ttl_seconds | integer | How long the line stays without another POST: 10–86400, default 300. Post again before it lapses while the activity continues. From 10 to 86400. Default 300. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | MyActivity (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Clear your activity line
DELETE /v1/me/activity
Needs: presence:write
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
cleared required | boolean | Whether there was a line to clear. |
Orgs
Orgs this credential may act in
GET /v1/orgs
Needs: identify (every token has it)
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Org | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
One org
GET /v1/orgs/{orgId}
Needs: identify (every token has it)
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Org (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Change the word filter
PATCH /v1/orgs/{orgId}/word-filter
Needs: admin:write
Owners only, as Org Settings → Word filter: add or take off blocked words and allowed words (each up to 40 characters, up to 200 a list), or switch the profanity list. The lists are never read back — the answer is counts. The platform list always applies. Listed in the person's Activity with Undo while nobody has changed it since. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
add_words | array of string | |
remove_words | array of string | |
add_allowed | array of string | |
remove_allowed | array of string | |
profanity | boolean |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
org_id required | string | |
profanity required | boolean | |
blocked_words required | integer | |
allowed_words required | integer | |
added required | integer | |
removed required | integer | |
allowed_added required | integer | |
allowed_removed required | integer |
Hand a category to someone for a while
POST /v1/orgs/{orgId}/handoffs
Needs: admin:write
The app's category hand-off: whoever manages the category gives someone a role they may grant, until ends_at (within 90 days; default 14). Both are told. The note passes the word filter. Listed in the person's Activity with Undo (the hand-off ends). People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
category_id required | string | |
user_id required | string | |
role_id required | string | |
ends_at | string | ISO 8601. |
note | string | At most 500 characters. |
| Status | Meaning | Body |
|---|---|---|
201 | Handed off | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
category_id required | string | |
role_id required | string | |
user_id required | string | |
starts_at required | string (date-time) | |
ends_at required | string (date-time) |
Categories shared with other workspaces
GET /v1/orgs/{orgId}/category-shares
Needs: admin:read
Owners and Admins: the shares this workspace hosts or takes part in (pending, active, paused) — which side, the other workspace's name, the channels that cross and a waiting request's check words. Never a person or an email address. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of object | |
data[].id required | string | |
data[].status required | string | |
data[].role required | string | host or partner. |
data[].category_name required | string | |
data[].local_category_id required | string | null | |
data[].other_org required | object | |
data[].since required | string (date-time) | |
data[].paused_reason required | string | null | |
data[].request required | object | |
data[].channels required | array of object | |
data[].channels[].id required | string | |
data[].channels[].name required | string |
Ask to share a category with another workspace
POST /v1/orgs/{orgId}/category-shares
Needs: invites:write
Owners and Admins, where the plan includes synced categories. With the outward scope a personal token creates the invitation directly (201), unless the Owner enabled assistant ask-first (202, password confirmation in Missived). The partner Admin must still accept with step-up. Supply partner_name (full name) and company_name (workspace display name) exactly as the person provided them; these recorded labels form the Activity notice and result summary. Never guessed or resolved through an account directory. Undo cancels a pending invitation or ends an accepted share through the normal step-up/reason flow. By email, or code: true for a one-time code returned directly (ask-first: shown only on the confirm screen). People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
category_id required | string | |
why required | string | 10–500 characters; the other side sees it. |
partner_name required | string | Full name supplied by the person, 1–200 characters. |
company_name required | string | Partner workspace display name supplied by the person, 1–200 characters. |
email | string | |
code | boolean |
| Status | Meaning | Body |
|---|---|---|
201 | Invitation created; partner acceptance still required. | object (application/json) |
202 | Ask-first: waits for the person to confirm in Missived. | PendingConfirmation (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
status required | string | One of: invitation_created. |
share_id required | string | |
summary required | string | |
fingerprint required | string | |
code | string | One-time code, present for a code invitation only. |
What became of a request that waited
GET /v1/pending-actions/{id}
Needs: invites:write
A request answered with pending_confirmation: pending, confirmed, declined, expired or failed. The credential's own person's requests only. There is no way to confirm one over the API. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
kind required | string | |
status required | string | |
summary required | string | |
step_up required | boolean | |
created_at required | string (date-time) | |
expires_at required | string (date-time) | |
decided_at required | string (date-time) | |
confirm_url required | string | While pending. |
What the workspace has on
GET /v1/orgs/{orgId}/features
Needs: identify (every token has it)
Each optional feature: whether the plan includes it, whether an Owner or Admin switched it off, and so whether it is on. Switching is PATCH (admin:write).
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of object | |
data[].key required | string | |
data[].name required | string | |
data[].group required | string | |
data[].in_plan required | boolean | |
data[].switched_off required | boolean | |
data[].on required | boolean | |
data[].plans required | array of string |
Switch features on or off
PATCH /v1/orgs/{orgId}/features
Needs: admin:write
Owners and Admins, as Org Settings → Features: switching off hides, nothing is deleted. Unknown keys are refused. Made with a personal token or a person's connection, it is listed in the person's Activity with Undo. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
features required | object | Feature key → true (on) or false (off). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
changed required | array of object | |
changed[].key required | string | |
changed[].on required | boolean | |
data required | array of object | |
data[].key required | string | |
data[].name required | string | |
data[].in_plan required | boolean | |
data[].switched_off required | boolean | |
data[].on required | boolean |
Channels
Channels visible to this credential
GET /v1/orgs/{orgId}/channels
Needs: channels:read
Everything the person can see in the app (DMs and group chats only for a session, or a personal token with “Include my direct messages”). An app sees the org's public text channels plus any its token names. Returned in one page (next_cursor is null).
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Channel | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Create a text channel
POST /v1/orgs/{orgId}/channels
Needs: channels:write
The same rules as the app's create card: Owners and admins (or a member of a workspace category that lets its members create channels), a person's session or personal token. The name and topic pass the workspace's word filter; kind makes a prayer, flash-card, Table, forum, looking-for-group or Bible study channel when the plan includes it and the workspace hasn't switched it off. Apps can't create channels yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): NewChannel.
| Field | Type | Description |
|---|---|---|
name required | string | Lowercase letters, numbers and hyphens. |
topic | string | |
category_id | string | |
kind | string | The channel type (default chat). Each type needs the plan feature and the workspace switch that the app's create card asks for. One of: chat, prayer, flashcards, table, forum, lfg, bible_study. |
| Status | Meaning | Body |
|---|---|---|
201 | Created | Channel (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked (the word filter), plan_required, feature_off, limit_reached (a per-org cap), or the usual scope / org refusals. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
One channel
GET /v1/channels/{channelId}
Needs: channels:read
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Channel (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Rename a channel or set its topic
PATCH /v1/channels/{channelId}
Needs: channels:write
The app's rules (lib/channels/update.ts): a rename by the channel's creator, its managers or the org's admins (lowercase letters, numbers, hyphens); the topic by owners and admins (empty or null clears it). Both pass the word filter. Never a DM, group chat or personal channel. People only.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name | string | |
topic | string | null |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Channel (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Delete a channel
DELETE /v1/channels/{channelId}
Needs: admin:write
The app's delete (lib/channels/delete.ts): its creator, an Owner / Admin or Manage channel; never a DM, group chat, personal channel or #general (400), never a shared channel (409 shared_channel). Messages, threads and files go; everyone who wrote there is told. Fires channel.deleted. Not reversible. Made with a personal token or a person's connection, it is listed in the person's Activity. People only.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
| Status | Meaning | Body |
|---|---|---|
204 | Deleted | No body |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | shared_channel. | Error (application/json) |
Who can see a channel
GET /v1/channels/{channelId}/members
Needs: members:read
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
limit | query | integer | Page size, 1–100. From 1 to 100. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of ChannelMember | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
The sidebar's categories and groups
GET /v1/orgs/{orgId}/categories
Needs: channels:read
The categories this person sees (a category whose every channel is hidden from them is left out; a Guest sees only their own workspace categories), each with the ids of its channels they see. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | CategoryList (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
Create a category
POST /v1/orgs/{orgId}/categories
Needs: channels:write
At the end of the sidebar. Owners and admins; the name passes the word filter. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name required | string |
| Status | Meaning | Body |
|---|---|---|
201 | Created | Category (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, or the usual scope / org refusals. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Delete a category
DELETE /v1/orgs/{orgId}/categories/{categoryId}
Needs: admin:write
Its creator or an Owner / Admin. Its channels stay, uncategorised; its Guests lose it and are told. Never a client portal's (409 portal_category) or a shared one (409 shared_category). Made with a personal token or a person's connection, it is listed in the person's Activity. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
categoryId required | path | string | A category id. |
| Status | Meaning | Body |
|---|---|---|
204 | Deleted | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | portal_category, shared_category. | Error (application/json) |
Group categories in the sidebar
POST /v1/orgs/{orgId}/category-groups
Needs: channels:write
Owners, admins and people with Manage channels. A category moves out of any group it was in. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name required | string | |
category_ids | array of string |
| Status | Meaning | Body |
|---|---|---|
201 | Created | CategoryGroup (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, or the usual scope / org refusals. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | limit_reached: the workspace has the most groups it can. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Apps
The org's installed apps
GET /v1/orgs/{orgId}/apps
Needs: identify (every token has it)
A person sees every installed app; an app token sees only its own install. Needs no scope.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of AppInstall | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
One installed app
GET /v1/orgs/{orgId}/apps/{installId}
Needs: identify (every token has it)
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
installId required | path | string | An app install id (from GET /v1/orgs/{orgId}/apps). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | AppInstall (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
The channels an app was added to
GET /v1/orgs/{orgId}/apps/{installId}/channels
Needs: channels:read
Only the ones this credential may view.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
installId required | path | string | An app install id (from GET /v1/orgs/{orgId}/apps). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Channel | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Add an app to a channel
PUT /v1/channels/{channelId}/apps/{installId}
Needs: channels:write
Owner decision D4: an app reads message content only in channels it was added to. A person who manages the channel (or the org's integrations) adds it; an app token can't. Never a DM, group chat, personal channel or meal train (D3). 201 when added, 200 when it was already there.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
installId required | path | string | An app install id (from GET /v1/orgs/{orgId}/apps). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | AppInstall (application/json) |
201 | Added | AppInstall (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Remove an app from a channel
DELETE /v1/channels/{channelId}/apps/{installId}
Needs: channels:write
A person who manages the channel, or the app itself leaving. Its token stops reading the channel at once; its event subscriptions no longer receive the channel's events.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
installId required | path | string | An app install id (from GET /v1/orgs/{orgId}/apps). |
| Status | Meaning | Body |
|---|---|---|
204 | Removed | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Slash commands
The slash commands apps registered in an org
GET /v1/orgs/{orgId}/commands
Needs: identify (every token has it)
An app token sees its own; a person sees every installed app's. People run them from the composer's / picker in channels the app is in (D4), subject to each command's permission.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Command | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Register a slash command
POST /v1/orgs/{orgId}/commands
Needs: commands:write
App tokens only (commands:write). At most 50 per app. 409 when the app already has that name in that scope.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): CommandDraft.
| Field | Type | Description |
|---|---|---|
name required | string | ^[a-z0-9_-]{1,32}$. The built-in names (shrug, tableflip, unflip, me, gif, poll) are reserved. |
description required | string | 1–100 characters, shown in the picker. |
options | array of CommandOption | |
permission | string | Who may run it: anyone who can view the channel (default), people who manage the channel, or owners and admins. One of: everyone, manage_channel, admin. |
channel_id | string | null | Offer it in one channel only (the app must be in it); null = everywhere the app is. |
| Status | Meaning | Body |
|---|---|---|
201 | Registered | Command (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
Replace all of the app's commands
PUT /v1/orgs/{orgId}/commands
Needs: commands:write
Bulk overwrite, as Discord's: the list becomes the app's whole set (rows with the same name and scope are updated in place, the rest deleted, new ones created). App tokens only. Changes take effect at once; the web refreshes its picker.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): array of CommandDraft.
| Field | Type | Description |
|---|---|---|
[].name required | string | ^[a-z0-9_-]{1,32}$. The built-in names (shrug, tableflip, unflip, me, gif, poll) are reserved. |
[].description required | string | 1–100 characters, shown in the picker. |
[].options | array of CommandOption | |
[].permission | string | Who may run it: anyone who can view the channel (default), people who manage the channel, or owners and admins. One of: everyone, manage_channel, admin. |
[].channel_id | string | null | Offer it in one channel only (the app must be in it); null = everywhere the app is. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Command | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
One command
GET /v1/orgs/{orgId}/commands/{commandId}
Needs: identify (every token has it)
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
commandId required | path | string | A slash command id (from GET /v1/orgs/{orgId}/commands). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Command (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Change a command
PATCH /v1/orgs/{orgId}/commands/{commandId}
Needs: commands:write
Fields left out keep their value; the version bumps. App tokens only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
commandId required | path | string | A slash command id (from GET /v1/orgs/{orgId}/commands). |
Request body (application/json, optional): CommandDraft.
| Field | Type | Description |
|---|---|---|
name required | string | ^[a-z0-9_-]{1,32}$. The built-in names (shrug, tableflip, unflip, me, gif, poll) are reserved. |
description required | string | 1–100 characters, shown in the picker. |
options | array of CommandOption | |
permission | string | Who may run it: anyone who can view the channel (default), people who manage the channel, or owners and admins. One of: everyone, manage_channel, admin. |
channel_id | string | null | Offer it in one channel only (the app must be in it); null = everywhere the app is. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Command (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
Remove a command
DELETE /v1/orgs/{orgId}/commands/{commandId}
Needs: commands:write
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
commandId required | path | string | A slash command id (from GET /v1/orgs/{orgId}/commands). |
| Status | Meaning | Body |
|---|---|---|
204 | Removed | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Send a follow-up message
POST /v1/interactions/{token}/messages
Needs: No bearer token
Posted in the channel as the app's bot, within 15 minutes of the interaction (at most 20). With flags: 64 it is a private reply only the invoker sees (an EphemeralMessage, delivered to their screens and kept 15 minutes, never in search or events). Send Idempotency-Key to deduplicate retries. Authenticated by the token in the path; exempt from the app's chat budget.
| Name | In | Type | Description |
|---|---|---|---|
token required | path | string | The interaction token from the interaction payload (valid 15 minutes). It is the credential: no bearer token is needed. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): InteractionReply.
| Field | Type | Description |
|---|---|---|
content | string | null | The message text (at most 20,000 characters). |
embeds | array of object | |
components | array of ActionRow | |
flags | integer | 64 (ephemeral) sends a follow-up privately to the person who invoked the interaction. |
| Status | Meaning | Body |
|---|---|---|
201 | Posted | Message | EphemeralMessage (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Edit the original reply
PATCH /v1/interactions/{token}/messages/@original
Needs: No bearer token
Replaces the app's reply — after a deferred answer (type: 5) the “thinking…” placeholder, after a component update (type: 6 / 7) the message the component is on, after a private reply that reply — with this content, embeds and/or components (a field left out keeps its value).
| Name | In | Type | Description |
|---|---|---|---|
token required | path | string | The interaction token from the interaction payload (valid 15 minutes). It is the credential: no bearer token is needed. |
Request body (application/json, required): InteractionReply.
| Field | Type | Description |
|---|---|---|
content | string | null | The message text (at most 20,000 characters). |
embeds | array of object | |
components | array of ActionRow | |
flags | integer | 64 (ephemeral) sends a follow-up privately to the person who invoked the interaction. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Message | EphemeralMessage (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Delete the original reply
DELETE /v1/interactions/{token}/messages/@original
Needs: No bearer token
| Name | In | Type | Description |
|---|---|---|---|
token required | path | string | The interaction token from the interaction payload (valid 15 minutes). It is the credential: no bearer token is needed. |
| Status | Meaning | Body |
|---|---|---|
204 | Deleted | No body |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Messages
Upload a file to attach to a message
POST /v1/orgs/{orgId}/files
Needs: files:write
multipart/form-data with one part named file (its filename and Content-Type are kept). The file is stored encrypted at rest and counts against the org's storage; it is pending until you post it with attachment_ids, and only this credential can attach it. At most 25 MB through the API; the composer's file types only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (multipart/form-data, required): object.
| Field | Type | Description |
|---|---|---|
file required | string (binary) |
| Status | Meaning | Body |
|---|---|---|
201 | Stored, pending. | Upload (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
413 | payload_too_large (over 25 MB) or storage_full (the org's storage). | Error (application/json) |
415 | unsupported_media_type: not multipart, or a file type that can't be uploaded. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Download an attachment
GET /v1/attachments/{attachmentId}/content
Needs: messages:read
The bytes, decrypted, as Content-Disposition: attachment. An attached file is readable by whoever may read its channel's messages (apps: channels they were added to, or messages:read:all; never DMs); a pending upload only by its uploader. Anything else is 404.
| Name | In | Type | Description |
|---|---|---|---|
attachmentId required | path | string | An attachment id (from a message's attachments, or an upload). |
| Status | Meaning | Body |
|---|---|---|
200 | The file. | string (binary) (application/octet-stream) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
A channel's messages
GET /v1/channels/{channelId}/messages
Needs: messages:read
Newest first by default. To follow a channel, use order=oldest: every non-empty page returns a next_cursor to resume from later. Apps read only channels their token names, unless they hold messages:read:all.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
limit | query | integer | Page size, 1–100. From 1 to 100. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
order | query | string | One of: newest, oldest. Default "newest". |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Message | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Post a message
POST /v1/channels/{channelId}/messages
Needs: messages:write
Posts as the person (their permissions, slow mode and AutoMod apply) or as the app's bot user (marked BOT; @mentions inert unless allowed_mentions allows them; may send embeds). Spends the chat budget: 20 posts per 10 seconds per person or bot.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): NewMessage.
| Field | Type | Description |
|---|---|---|
content | string | 1–20000 characters. Required unless the message has files, or an app sends embeds or components. At most 20000 characters. |
reply_to | string | Reply in the thread of this message (same channel). |
attachment_ids | array of string | Up to 10 files this same credential uploaded with POST /v1/orgs/{orgId}/files to this org and hasn't attached yet. At most 10 items. |
embeds | array of Embed | |
components | array of ActionRow | |
allowed_mentions | object | Apps only. Which @mentions notify anyone (Discord's rules). Absent: @user mentions count; @everyone, @here and roles don't. |
allowed_mentions.parse | array of string | One of: users, roles, everyone. |
allowed_mentions.users | array of string | |
allowed_mentions.roles | array of string |
| Status | Meaning | Body |
|---|---|---|
201 | Created | Message (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
One message
GET /v1/channels/{channelId}/messages/{messageId}
Needs: messages:read
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
messageId required | path | string | A message id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Message (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Edit your own message
PATCH /v1/channels/{channelId}/messages/{messageId}
Needs: messages:write
Only the author edits. An app may replace its embeds and components ([] removes them; a field left out keeps its value); link previews follow the new links.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
messageId required | path | string | A message id. |
Request body (application/json, required): MessageEdit.
| Field | Type | Description |
|---|---|---|
content | string | At most 20000 characters. |
embeds | array of Embed | |
components | array of ActionRow |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Message (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Delete a message
DELETE /v1/channels/{channelId}/messages/{messageId}
Needs: messages:write
Your own, or — for a person with Manage messages there — anyone's (they're told). An app deletes only its own. Made with a personal token or a person's connection, it is listed in the person's Activity.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
messageId required | path | string | A message id. |
| Status | Meaning | Body |
|---|---|---|
204 | Deleted | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Search messages
GET /v1/orgs/{orgId}/messages/search
Needs: messages:read
Full-text search over the messages this credential may read in the org (the same rules as reading each channel: D3 for DMs, D4 for apps), best matches first. Sealed messages are matched through the workspace's encrypted index (every word, the last also as a prefix; no exact phrases). Pages by cursor up to 1,000 results deep.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
q required | query | string | The words to find. At least 2 characters. At most 200 characters. |
channel_id | query | string | Only this channel. |
limit | query | integer | Page size, 1–50. From 1 to 50. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of SearchHit | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
A message's thread replies
GET /v1/channels/{channelId}/messages/{messageId}/replies
Needs: messages:read
Oldest first by default.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
messageId required | path | string | A message id. |
limit | query | integer | Page size, 1–100. From 1 to 100. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
order | query | string | One of: newest, oldest. Default "oldest". |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Message | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
React to a message
PUT /v1/channels/{channelId}/messages/{messageId}/reactions/{emoji}
Needs: reactions:write
201 when added, 200 when you had already reacted with it.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
messageId required | path | string | A message id. |
emoji required | path | string | The emoji, URL-encoded (a Unicode emoji or a custom emoji's name). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Reactions (application/json) |
201 | Added | Reactions (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Remove your reaction
DELETE /v1/channels/{channelId}/messages/{messageId}/reactions/{emoji}
Needs: reactions:write
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
messageId required | path | string | A message id. |
emoji required | path | string | The emoji, URL-encoded (a Unicode emoji or a custom emoji's name). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Reactions (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Members
An org's members
GET /v1/orgs/{orgId}/members
Needs: members:read
In joining order.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
limit | query | integer | Page size, 1–100. From 1 to 100. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Member | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
One member
GET /v1/orgs/{orgId}/members/{userId}
Needs: members:read
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
userId required | path | string | A user id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Member (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Make a member an Admin or a Member
PATCH /v1/orgs/{orgId}/members/{userId}
Needs: admin:write
The app's role change: Owners only; never ownership, never the Owner's own role, and Guest is set in the app. Made with a personal token or a person's connection, it is listed in the person's Activity with Undo. Fires member.role_changed. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
userId required | path | string | A user id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
role required | string | admin or member. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
user_id required | string | |
name required | string | |
role required | string | |
previous_role required | string |
Remove someone from the org
DELETE /v1/orgs/{orgId}/members/{userId}
Needs: admin:write
The app's removal: Owners and Admins (an Admin never an Owner or another Admin; the only Owner can't be removed). Access ends at once; their messages and files stay. Fires member.left. To bring them back, invite them again. Made with a personal token or a person's connection, it is listed in the person's Activity. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
userId required | path | string | A user id. |
| Status | Meaning | Body |
|---|---|---|
204 | Removed | No body |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
Email someone an invitation
POST /v1/orgs/{orgId}/invites
Needs: invites:write
The app's email invite: Owners and Admins invite Members (Owners also Admins); a Guest is invited into one workspace category by an Owner, an Admin or the category's creator with Publish views, within the plan's guest seats. Single use, three days. The link goes only to the invitee by email and is never in the answer. Made with a personal token or a person's connection, it is listed in the person's Activity with Undo. Where the workspace's Owner asked, it waits for the person instead (202). People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
email required | string | |
role | string | member (default), admin or guest. |
category_id | string | guest: the workspace category. |
| Status | Meaning | Body |
|---|---|---|
201 | Sent | object (application/json) |
202 | Waits for the person to confirm in Missived (the workspace asks first). | PendingConfirmation (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, member_limit, guest seat refusals. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
sent_to required | string | |
role required | string | |
category_id required | string | null | |
delivered required | boolean | Whether the email was handed to the mail service. |
expires_in_days required | integer |
Give a member a custom role
PUT /v1/orgs/{orgId}/members/{userId}/roles/{roleId}
Needs: roles:write
Custom roles only — never the org role (Owner, Admin, Member, Guest). A person must be an Owner or Admin of the org. An app needs roles:write granted by an Owner or Admin, works only while the person who set it up is still one, and can't give a role that manages integrations. Giving a role the member already has changes nothing (200). Fires member.role_assigned.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
userId required | path | string | A user id. |
roleId required | path | string | A custom role id (from GET /v1/orgs/{orgId}/roles). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Member (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Take a custom role away
DELETE /v1/orgs/{orgId}/members/{userId}/roles/{roleId}
Needs: roles:write
The same rules as giving it. A role the member doesn't have changes nothing (200). Fires member.role_removed. A linked-role rule may give it back on its next check.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
userId required | path | string | A user id. |
roleId required | path | string | A custom role id (from GET /v1/orgs/{orgId}/roles). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Member (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
An org's custom roles
GET /v1/orgs/{orgId}/roles
Needs: members:read
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Role | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
A person who shares an org with this credential
GET /v1/users/{userId}
Needs: members:read
| Name | In | Type | Description |
|---|---|---|---|
userId required | path | string | A user id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | User (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Meetings
Your meetings in an org
GET /v1/orgs/{orgId}/meetings
Needs: meetings:read
Meetings you organise, are invited to or approve. Upcoming ones soonest first; past ones latest first. Empty for an app.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
scope | query | string | One of: upcoming, past. Default "upcoming". |
limit | query | integer | Page size, 1–50. From 1 to 50. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Meeting | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Schedule a meeting
POST /v1/orgs/{orgId}/meetings
Needs: meetings:write
As the person the credential belongs to, who becomes its organiser (apps have no calendar: 403). The same rules as the app: invites go out by email with an .ics unless send_invites is false, outside guests only where the org allows them (external_not_allowed, 403), and meeting.scheduled fires. Errors carry the meeting's own codes: invalid_time, invalid_settings, too_many_invitees, invalid_request.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): NewMeeting.
| Field | Type | Description |
|---|---|---|
title required | string | At most 200 characters. |
agenda | string | At most 5000 characters. |
start_time required | string | ISO 8601 with a time zone; at most five minutes in the past, two years ahead. |
duration_minutes required | integer | 5–1440. From 5 to 1440. |
time_zone required | string | IANA zone, e.g. America/New_York (how invites show the time). |
room_type | string | general (its own room) or personal_office (members only). One of: general, personal_office. Default "general". |
invitees | array of MeetingInviteeInput | At most 200 items. |
send_invites | boolean | Email invites (with an .ics) now. false: add them quietly. Default true. |
| Status | Meaning | Body |
|---|---|---|
201 | Scheduled | Meeting (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
One of your meetings
GET /v1/meetings/{meetingId}
Needs: meetings:read
| Name | In | Type | Description |
|---|---|---|---|
meetingId required | path | string | A meeting id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Meeting (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Change or reschedule a meeting
PATCH /v1/meetings/{meetingId}
Needs: meetings:write
Its organiser only (a personal token or a person's connection; 403 for apps and for anyone else who can see it). Fields left out keep their value. Moving it is allowed only before it starts. Invitees get an update email unless notify is false. Errors carry the meeting's own codes: invalid_time, invalid_settings, invalid_request.
| Name | In | Type | Description |
|---|---|---|---|
meetingId required | path | string | A meeting id. |
Request body (application/json, optional): MeetingPatch.
| Field | Type | Description |
|---|---|---|
title | string | At most 200 characters. |
agenda | string | null | At most 5000 characters. |
start_time | string | ISO 8601. Only before the meeting starts. |
duration_minutes | integer | From 5 to 1440. |
time_zone | string | |
room_type | string | One of: general, personal_office. |
notify | boolean | Email invitees an update (or reschedule) and fire meeting.updated. false: change quietly. Default true. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Meeting (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
410 | The meeting is cancelled, archived or over (meeting_cancelled, meeting_archived, meeting_ended). | Error (application/json) |
Set who is invited
PUT /v1/meetings/{meetingId}/invitees
Needs: meetings:write
Its organiser only. The list replaces the current one: new people are invited (by email, with an .ics), people left out are sent a cancellation, and a changed role is applied. Outside guests need the org's permission (external_not_allowed, 403).
| Name | In | Type | Description |
|---|---|---|---|
meetingId required | path | string | A meeting id. |
Request body (application/json, required): MeetingInviteesReplace.
| Field | Type | Description |
|---|---|---|
invitees required | array of MeetingInviteeInput | The whole list: people left out are uninvited (and sent a cancellation). At most 200 items. |
notify | boolean | Default true. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
410 | The meeting is cancelled, archived or over (meeting_cancelled, meeting_archived, meeting_ended). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
meeting required | Meeting | |
invitees required | array of MeetingInvitee |
Cancel a meeting
POST /v1/meetings/{meetingId}/cancel
Needs: meetings:write
Its organiser only, before it starts (409 once it is live: end it in the app). Invitees get a cancellation unless notify is false; meeting.cancelled fires.
| Name | In | Type | Description |
|---|---|---|---|
meetingId required | path | string | A meeting id. |
Request body (application/json, optional): MeetingCancel.
| Field | Type | Description |
|---|---|---|
reason | string | null | At most 500 characters. |
notify | boolean | Default true. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Meeting (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
410 | The meeting is cancelled, archived or over (meeting_cancelled, meeting_archived, meeting_ended). | Error (application/json) |
Shifts and events
Your published shifts
GET /v1/orgs/{orgId}/schedule/shifts
Needs: shifts:read
Overlapping the window, earliest first. Empty for an app.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
from | query | string | Window start, ISO 8601 date or date-time (default: a day ago). |
to | query | string | Window end (default: 60 days after now). At most 366 days per request. |
limit | query | integer | Page size, 1–100. From 1 to 100. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Shift | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
The org's published events
GET /v1/orgs/{orgId}/schedule/events
Needs: shifts:read
Overlapping the window, earliest first.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
from | query | string | Window start, ISO 8601 date or date-time (default: a day ago). |
to | query | string | Window end (default: 60 days after now). At most 366 days per request. |
limit | query | integer | Page size, 1–100. From 1 to 100. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of ScheduleEvent | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Tasks
Add a task to your list
POST /v1/me/tasks
Needs: tasks:write
A personal task, with an optional reminder the app delivers. Personal tokens and sessions only.
| Name | In | Type | Description |
|---|---|---|---|
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): NewTask.
| Field | Type | Description |
|---|---|---|
title required | string | At most 500 characters. |
notes | string | At most 5000 characters. |
due_at | string | ISO 8601. |
remind_at | string | ISO 8601: a reminder in the app then. |
| Status | Meaning | Body |
|---|---|---|
201 | Created | Task (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
Audit log
The org's audit log (OCSF)
GET /v1/orgs/{orgId}/audit-events
Needs: admin:read
Owners and admins: a session, or a personal token with admin:read. Newest first. Errors here are { "error": "…" }.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
limit | query | integer | From 1 to 1000. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
since | query | string | |
until | query | string | |
action | query | string | |
actor_id | query | string |
| Status | Meaning | Body |
|---|---|---|
200 | OK | AuditEventPage (application/json) |
400 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
The audit log's action names
GET /v1/audit-events/actions
Needs: Any credential
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
The audit event shape
GET /v1/audit-events/schemas
Needs: Any credential
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Integrations management
Audit-log destinations
GET /v1/orgs/{orgId}/log-destinations
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Add an audit-log destination
POST /v1/orgs/{orgId}/log-destinations
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
201 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
One audit-log destination
GET /v1/orgs/{orgId}/log-destinations/{id}
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Change an audit-log destination
PATCH /v1/orgs/{orgId}/log-destinations/{id}
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Remove an audit-log destination
DELETE /v1/orgs/{orgId}/log-destinations/{id}
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Send a test delivery
POST /v1/orgs/{orgId}/log-destinations/{id}/test
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Re-send dead-lettered deliveries
POST /v1/orgs/{orgId}/log-destinations/{id}/replay
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
A destination's recent deliveries
GET /v1/orgs/{orgId}/log-destinations/{id}/deliveries
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Replay one delivery from the log
POST /v1/orgs/{orgId}/log-destinations/{id}/deliveries/{deliveryId}/redeliver
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
deliveryId required | path | string | A delivery id (from the delivery log). |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
202 | Queued. | object (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
409 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
| Field | Type | Description |
|---|---|---|
queued required | boolean | |
deliveryId required | string |
Incoming webhooks
GET /v1/orgs/{orgId}/incoming-webhooks
Needs: webhooks:write
Org Settings → Integrations uses this route with a session. A token works too, with webhooks:write: a personal token whose owner has Manage integrations sees and changes every webhook in the org, as the page does; an app token points webhooks only at channels its app was added to, and sees only the webhooks its install made (recorded as made by the person who set the app up, whose permissions gate @everyone). Errors are { "error": "…" } (with a code for a token). The URL token and GitHub secret are returned only by create, rotate and github-secret.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | IncomingWebhookList (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Make an incoming webhook (its URL is shown once)
POST /v1/orgs/{orgId}/incoming-webhooks
Needs: webhooks:write
Org Settings → Integrations uses this route with a session. A token works too, with webhooks:write: a personal token whose owner has Manage integrations sees and changes every webhook in the org, as the page does; an app token points webhooks only at channels its app was added to, and sees only the webhooks its install made (recorded as made by the person who set the app up, whose permissions gate @everyone). Errors are { "error": "…" } (with a code for a token). The URL token and GitHub secret are returned only by create, rotate and github-secret.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): IncomingWebhookDraft.
| Field | Type | Description |
|---|---|---|
name required | string | 1–80 characters; also the bot's name. At most 80 characters. |
channelId required | string | A text channel of this org (an app: one it was added to). |
avatarUrl | string | null | An https:// image URL. |
source | string | null | What it's made for: discord, slack, github, gitlab, sentry, linear, stripe or pagerduty (BN31). |
| Status | Meaning | Body |
|---|---|---|
201 | Created; url / path and githubSecret are shown only here. | IncomingWebhookCreated (application/json) |
400 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Rename, move, pause or resume a webhook
PATCH /v1/orgs/{orgId}/incoming-webhooks/{id}
Needs: webhooks:write
Org Settings → Integrations uses this route with a session. A token works too, with webhooks:write: a personal token whose owner has Manage integrations sees and changes every webhook in the org, as the page does; an app token points webhooks only at channels its app was added to, and sees only the webhooks its install made (recorded as made by the person who set the app up, whose permissions gate @everyone). Errors are { "error": "…" } (with a code for a token). The URL token and GitHub secret are returned only by create, rotate and github-secret.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, optional): IncomingWebhookPatch.
| Field | Type | Description |
|---|---|---|
name | string | At most 80 characters. |
channelId | string | |
avatarUrl | string | null | |
paused | boolean |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
| Field | Type | Description |
|---|---|---|
webhook required | IncomingWebhook |
Delete a webhook (its old posts keep their APP badge)
DELETE /v1/orgs/{orgId}/incoming-webhooks/{id}
Needs: webhooks:write
Org Settings → Integrations uses this route with a session. A token works too, with webhooks:write: a personal token whose owner has Manage integrations sees and changes every webhook in the org, as the page does; an app token points webhooks only at channels its app was added to, and sees only the webhooks its install made (recorded as made by the person who set the app up, whose permissions gate @everyone). Errors are { "error": "…" } (with a code for a token). The URL token and GitHub secret are returned only by create, rotate and github-secret.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
| Field | Type | Description |
|---|---|---|
deleted required | boolean |
Issue a new URL (the old one stops working)
POST /v1/orgs/{orgId}/incoming-webhooks/{id}/rotate
Needs: webhooks:write
Org Settings → Integrations uses this route with a session. A token works too, with webhooks:write: a personal token whose owner has Manage integrations sees and changes every webhook in the org, as the page does; an app token points webhooks only at channels its app was added to, and sees only the webhooks its install made (recorded as made by the person who set the app up, whose permissions gate @everyone). Errors are { "error": "…" } (with a code for a token). The URL token and GitHub secret are returned only by create, rotate and github-secret.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
| Field | Type | Description |
|---|---|---|
webhook required | IncomingWebhook | |
path required | string | |
url required | string |
Issue a new GitHub signing secret
POST /v1/orgs/{orgId}/incoming-webhooks/{id}/github-secret
Needs: webhooks:write
Org Settings → Integrations uses this route with a session. A token works too, with webhooks:write: a personal token whose owner has Manage integrations sees and changes every webhook in the org, as the page does; an app token points webhooks only at channels its app was added to, and sees only the webhooks its install made (recorded as made by the person who set the app up, whose permissions gate @everyone). Errors are { "error": "…" } (with a code for a token). The URL token and GitHub secret are returned only by create, rotate and github-secret.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
503 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
| Field | Type | Description |
|---|---|---|
webhook required | IncomingWebhook | |
githubSecret required | string |
A webhook's recent posts and refusals
GET /v1/orgs/{orgId}/incoming-webhooks/{id}/deliveries
Needs: webhooks:write
Org Settings → Integrations uses this route with a session. A token works too, with webhooks:write: a personal token whose owner has Manage integrations sees and changes every webhook in the org, as the page does; an app token points webhooks only at channels its app was added to, and sees only the webhooks its install made (recorded as made by the person who set the app up, whose permissions gate @everyone). Errors are { "error": "…" } (with a code for a token). The URL token and GitHub secret are returned only by create, rotate and github-secret.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Paste a service's signing secret (GitLab, Sentry, Linear, Stripe, PagerDuty)
PUT /v1/orgs/{orgId}/incoming-webhooks/{id}/providers/{provider}
Needs: webhooks:write
Org Settings → Integrations uses this route with a session. A token works too, with webhooks:write: a personal token whose owner has Manage integrations sees and changes every webhook in the org, as the page does; an app token points webhooks only at channels its app was added to, and sees only the webhooks its install made (recorded as made by the person who set the app up, whose permissions gate @everyone). Errors are { "error": "…" } (with a code for a token). The URL token and GitHub secret are returned only by create, rotate and github-secret.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
provider required | path | string | The service: gitlab, sentry, linear, stripe or pagerduty. |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
503 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
| Field | Type | Description |
|---|---|---|
webhook required | IncomingWebhook |
Forget a service's signing secret
DELETE /v1/orgs/{orgId}/incoming-webhooks/{id}/providers/{provider}
Needs: webhooks:write
Org Settings → Integrations uses this route with a session. A token works too, with webhooks:write: a personal token whose owner has Manage integrations sees and changes every webhook in the org, as the page does; an app token points webhooks only at channels its app was added to, and sees only the webhooks its install made (recorded as made by the person who set the app up, whose permissions gate @everyone). Errors are { "error": "…" } (with a code for a token). The URL token and GitHub secret are returned only by create, rotate and github-secret.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
provider required | path | string | The service: gitlab, sentry, linear, stripe or pagerduty. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
| Field | Type | Description |
|---|---|---|
webhook required | IncomingWebhook |
Feeds the org's channels follow
GET /v1/orgs/{orgId}/feeds
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Follow a feed in a channel (its newest item posts at once)
POST /v1/orgs/{orgId}/feeds
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
201 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
What an address would follow, and its newest item as a card
POST /v1/orgs/{orgId}/feeds/preview
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
422 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Rename, move, pause or resume a feed
PATCH /v1/orgs/{orgId}/feeds/{id}
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Stop following a feed (its posts stay)
DELETE /v1/orgs/{orgId}/feeds/{id}
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Check a feed now
POST /v1/orgs/{orgId}/feeds/{id}/check
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
409 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
A feed's recent checks and posted items
GET /v1/orgs/{orgId}/feeds/{id}/runs
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Bible verse settings, translations and daily verses
GET /v1/orgs/{orgId}/bible
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Default translation, API.Bible key and its translations
PATCH /v1/orgs/{orgId}/bible
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
The translations the API.Bible key offers
GET /v1/orgs/{orgId}/bible/api-translations
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
409 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
502 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
The card /verse would post
GET /v1/orgs/{orgId}/bible/preview
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
ref required | query | string | A reference, e.g. John 3:16-18. |
translation | query | string | kjv, web, or api:<bibleId>; blank = the org's default. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
400 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
A verse of the day in a channel
POST /v1/orgs/{orgId}/bible/daily
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
201 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Change, pause or resume a daily verse
PATCH /v1/orgs/{orgId}/bible/daily/{id}
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Stop a daily verse (its posts stay)
DELETE /v1/orgs/{orgId}/bible/daily/{id}
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Post today's verse now (once a day)
POST /v1/orgs/{orgId}/bible/daily/{id}/post-now
Needs: A signed-in session (not a token)
Org Settings → Integrations uses this route. It takes a signed-in session of someone who may manage the org's integrations (Owner, Admin, or a custom role with Manage integrations); API tokens are not accepted yet.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, optional): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
403 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
404 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
409 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
502 | An error: { "error": "…" } (these management routes predate the v1 error shape). | object (application/json) |
Outgoing events
Event subscriptions
GET /v1/orgs/{orgId}/event-subscriptions
Needs: events:subscribe
Takes a signed-in person or a personal token holding events:subscribe who has Manage integrations in the org, or an app token holding the scope (its channel list, when it has one, bounds the subscription's).
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | EventSubscriptionPage (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
Subscribe a URL to events (the secret is shown once)
POST /v1/orgs/{orgId}/event-subscriptions
Needs: events:subscribe
Takes a signed-in person or a personal token holding events:subscribe who has Manage integrations in the org, or an app token holding the scope (its channel list, when it has one, bounds the subscription's). This is a REST hook's subscribe: Zapier's and n8n's instant triggers call it and DELETE to unsubscribe. The delivery format is in docs/OUTGOING_EVENTS.md.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): EventSubscriptionDraft.
| Field | Type | Description |
|---|---|---|
url required | string | https only, on the public internet. |
name | string | null | |
event_types | array of string | |
channel_ids | array of string | null | |
payload_mode | string | null | One of: thin, full, null. |
asymmetric | boolean | Also sign with Ed25519; the public key is returned once. |
static_header | object | null | An extra header on every delivery; the value is stored sealed and never shown again. |
static_header.name required | string | |
static_header.value required | string |
| Status | Meaning | Body |
|---|---|---|
201 | Created; secret is shown only here. | EventSubscriptionCreated (application/json) |
400 | Invalid input (invalid_url, invalid_event_types, invalid_channel_ids, invalid_payload_mode). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | insufficient_scope, org_not_allowed, forbidden (no Manage integrations), or cap_reached (the plan's event subscriptions are all in use). | Error (application/json) |
One event subscription
GET /v1/orgs/{orgId}/event-subscriptions/{id}
Needs: events:subscribe
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | EventSubscription |
Change, pause, resume or rotate a subscription
PATCH /v1/orgs/{orgId}/event-subscriptions/{id}
Needs: events:subscribe
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, required): EventSubscriptionPatch.
| Field | Type | Description |
|---|---|---|
url | string | |
name | string | null | |
event_types | array of string | |
channel_ids | array of string | null | |
payload_mode | string | null | One of: thin, full, null. |
enabled | boolean | Pause / resume (resuming clears the circuit breaker). |
rotate_secret | boolean | Issue a new signing secret; the old one keeps verifying until the next rotation. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | EventSubscriptionResult (application/json) |
400 | Invalid input, or nothing to change (nothing_to_change). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Unsubscribe
DELETE /v1/orgs/{orgId}/event-subscriptions/{id}
Needs: events:subscribe
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
204 | Gone. | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Send a signed synthetic event now
POST /v1/orgs/{orgId}/event-subscriptions/{id}/test
Needs: events:subscribe
Type webhook.test; the answer shows what was sent (an extra header's value masked) and the receiver's response.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | WebhookTestResult (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | The signing secrets can't be opened (secrets_unopenable). | Error (application/json) |
Re-send a window of events
POST /v1/orgs/{orgId}/event-subscriptions/{id}/replay
Needs: events:subscribe
Queues the stored events in [since, until) that this subscription takes, with their original webhook-ids (a receiver that remembers ids skips duplicates). ISO 8601 UTC; default the last 24 hours; at most 1 000 per call.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
Request body (application/json, optional): object.
| Field | Type | Description |
|---|---|---|
since | string | |
until | string |
| Status | Meaning | Body |
|---|---|---|
200 | OK | ReplayResult (application/json) |
400 | invalid_range. | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
A subscription's delivery log
GET /v1/orgs/{orgId}/event-subscriptions/{id}/deliveries
Needs: events:subscribe
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
limit | query | integer | Page size, 1–500. From 1 to 500. Default 100. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of EventDelivery | |
next_cursor required | string | null |
Replay one delivery from the log
POST /v1/orgs/{orgId}/event-subscriptions/{id}/deliveries/{deliveryId}/redeliver
Needs: events:subscribe
Queues a fresh copy of a delivered or dead delivery with its original webhook-id; the content part is merged at send time under the org's current rule. The subscription must be enabled.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
id required | path | string | The resource id. |
deliveryId required | path | string | A delivery id (from the delivery log). |
| Status | Meaning | Body |
|---|---|---|
202 | Queued. | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | in_flight (still being sent) or paused (resume the subscription first). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
queued required | boolean | |
delivery_id required | string |
The stored events (poll fallback)
GET /v1/orgs/{orgId}/events
Needs: events:subscribe
Takes a signed-in person or a personal token holding events:subscribe who has Manage integrations in the org, or an app token holding the scope (its channel list, when it has one, bounds the subscription's). Events are kept for 7 days, and only for orgs with at least one event subscription. Ordered by sequence; content only with messages:read (a Table row's values: tables:read) and as the org's rule allows; an app token sees the channels it was added to.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
limit | query | integer | Page size, 1–200. From 1 to 200. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
types | query | string | Comma-separated catalogue names or globs. |
channel_id | query | string | |
since | query | string | ISO 8601 (default 7 days ago). |
until | query | string |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | invalid_cursor, invalid_range, invalid_event_types. | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of EventEnvelope | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
One stored event
GET /v1/orgs/{orgId}/events/{eventId}
Needs: events:subscribe
Takes a signed-in person or a personal token holding events:subscribe who has Manage integrations in the org, or an app token holding the scope (its channel list, when it has one, bounds the subscription's). The same visibility and content rules as the list. A receiver that can't check the signature over the raw body (Make's webhooks see only the parsed body) confirms a delivery by reading its id back here; a 404 means it isn't one of this org's stored events, or not one this token may see. Events are kept for 7 days.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
eventId required | path | string | An event id: a delivery's id, also its webhook-id header. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | EventEnvelope |
Whether outgoing events carry message content (D5)
GET /v1/orgs/{orgId}/events/settings
Needs: events:subscribe
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | EventsSettings |
Owner: include message content, ids only, or the default
PATCH /v1/orgs/{orgId}/events/settings
Needs: events:subscribe
An org with per-org content keys sends ids only unless its Owner opts in; every other org sends content unless its Owner opts out. Audited.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
include_content required | boolean | null |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | invalid_setting. | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | owner_only, or the usual scope / org refusals. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | EventsSettings |
The event types
GET /v1/events/catalog
Needs: identify (every token has it)
Every domain.verb the API emits, which carry a content part, and the globs a filter may use. Needs no scope.
| Status | Meaning | Body |
|---|---|---|
200 | OK | EventCatalog (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
Bot gateway
The bot gateway: where to connect, or connect
GET /v1/gateway
Needs: identify (every token has it)
Two answers at one URL. A WebSocket upgrade (Upgrade: websocket, with Authorization: Bearer msv_bot_… — or the token in the identify frame for a client that can't set headers) opens a bot's gateway connection: hello, then identify with intents (or resume with a session id and seq), then event frames in sequence and heartbeat / heartbeat_ack. Events are the outgoing-event catalogue with its payload rules: never direct messages or group chats; message and reaction events only from channels the app was added to (or every channel it can see with messages:read:all); the text only for messages that @mention the bot, its own, or with the message_content intent, and only when the org's content rule is full. A bad token on the upgrade is a 401 here, before any socket; close codes, frames and limits are in the developer guide (docs/GATEWAY.md). A plain GET answers the URL, the clock, the intents and which of them this install's scopes allow. App tokens only.
| Status | Meaning | Body |
|---|---|---|
200 | OK | GatewayInfo (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | app_token_required: a person or a personal token. | Error (application/json) |
Tables
The Tables you can open
GET /v1/orgs/{orgId}/tables
Needs: tables:read
Tables and shared views this credential may open, with their columns. A person sees what the app shows them (a guest, the Tables in their workspaces); an app sees only Tables and views in channels it was added to. A view lists as a Table of its own (kind: view) — its columns, its rows — and never names the Table behind it.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
limit | query | integer | Page size, 1–100. From 1 to 100. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Table | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Make a Table channel with its columns
POST /v1/orgs/{orgId}/tables
Needs: channels:write
The app's create card for a Table (who may, the word filter, the plan's Tables and cap), and its columns through the grid's own column changes. The name and every column name and choice are checked before anything is made, so a refusal leaves nothing behind. Every Table starts with a Name column; the given columns follow it. Needs tables:manage as well. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name required | string | Lowercase letters, numbers and hyphens. |
topic | string | |
category_id | string | |
columns required | array of object | |
columns[].name required | string | 1–100 characters. |
columns[].type required | string | text, number, currency, percent, date, datetime, checkbox, select, multi_select, person, attachment, link, duration, auto_number, created_at, created_by, updated_at, updated_by or formula. |
columns[].options | object | |
columns[].options.choices | array of object | |
columns[].options.choices[].label required | string | |
columns[].options.precision | integer | 0–10. |
columns[].options.currency | string | ISO 4217. |
columns[].options.unit | string | |
columns[].options.duration_format | string | |
columns[].options.formula | string | =… |
columns[].after_column_id | string | The first new column goes after this one (default: last). |
columns[].width | integer | 40–1200 px. |
| Status | Meaning | Body |
|---|---|---|
201 | Made. | Table (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | insufficient_scope, forbidden, content_blocked, plan_required, feature_off, limit_reached. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Add columns
POST /v1/tables/{tableId}/columns
Needs: tables:manage
For people who manage the Table (its channel's Manage channel), never through a shared view. 1–20 columns, after after_column_id or last; names and choices pass the word filter. Deleting a column and changing its type stay in the app. People only.
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
columns required | array of object | |
columns[].name required | string | 1–100 characters. |
columns[].type required | string | text, number, currency, percent, date, datetime, checkbox, select, multi_select, person, attachment, link, duration, auto_number, created_at, created_by, updated_at, updated_by or formula. |
columns[].options | object | |
columns[].options.choices | array of object | |
columns[].options.choices[].label required | string | |
columns[].options.precision | integer | 0–10. |
columns[].options.currency | string | ISO 4217. |
columns[].options.unit | string | |
columns[].options.duration_format | string | |
columns[].options.formula | string | =… |
columns[].after_column_id | string | The first new column goes after this one (default: last). |
columns[].width | integer | 40–1200 px. |
| Status | Meaning | Body |
|---|---|---|
201 | Added. | Table (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, limit_reached, plan_required. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Publish a shared view
POST /v1/tables/{tableId}/views
Needs: tables:manage
Needs invites:write as well as tables:manage. The app's Publish view (SH7): people who manage the Table and hold Publish views. A view is its own channel showing only columns (by id or name; editable per column) and the rows row_filter keeps (the grid's filter shape: {and|or: [...]} of {col, op, v}), seen by member_ids (and the publisher), in category_id or a new workspace category new_category_name. Listed in the person's Activity with Undo (the view is withdrawn); waits for the person where the workspace's Owner asked (202). People only.
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name required | string | |
columns required | array of object | |
columns[].column_id required | string | A column's id or name. |
columns[].editable | boolean | |
row_filter | object | |
member_ids | array of string | |
channel_name | string | |
category_id | string | |
new_category_name | string | |
allow_add_rows | boolean | |
allow_delete_rows | boolean |
| Status | Meaning | Body |
|---|---|---|
201 | Published | object (application/json) |
202 | Waits for the person to confirm in Missived (the workspace asks first). | PendingConfirmation (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, insufficient_scope, limit_reached, plan_required. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
410 | The meeting is cancelled, archived or over (meeting_cancelled, meeting_archived, meeting_ended). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
table_id required | string | |
name required | string | |
channel_id required | string | |
channel_name required | string | |
category_id required | string | null | |
columns required | array of object | |
columns[].column_id required | string | |
columns[].editable required | boolean | |
allow_add_rows required | boolean | |
allow_delete_rows required | boolean | |
published_at required | string (date-time) |
Rename, reorder or set a column's choices
PATCH /v1/tables/{tableId}/columns/{columnId}
Needs: tables:manage
name, options, width, after_column_id (null = first). A column's type is never changed here (it can rewrite values). People who manage the Table only.
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
columnId required | path | string | A column id (from GET /v1/tables/{tableId}). |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name | string | |
options | object | |
options.choices | array of object | |
options.choices[].label required | string | |
options.precision | integer | 0–10. |
options.currency | string | ISO 4217. |
options.unit | string | |
options.duration_format | string | |
options.formula | string | =… |
after_column_id | string | null | |
width | integer |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Table (application/json) |
400 | invalid_request, invalid_value. | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, locked. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
A Table and its columns
GET /v1/tables/{tableId}
Needs: tables:read
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Table (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
410 | The shared view was withdrawn (view_withdrawn). | Error (application/json) |
Rows, a page at a time (or the ones whose column equals a value)
GET /v1/tables/{tableId}/rows
Needs: tables:read
In the Table's order. Only the rows and columns this credential sees: a view's rows and columns, never formula text. With column and equals, only rows whose cell in that column equals the value, compared like an upsert's key (text ignores case and surrounding space; "12" equals 12 in a number column) — Zapier's and Make's "Find row".
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
limit | query | integer | Page size, 1–200. From 1 to 200. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
column | query | string | A column id or name to match on (one people type into). |
equals | query | string | The value to match, as text the column reads. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | invalid_request, invalid_cursor, unknown_column, invalid_value. | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
410 | view_withdrawn. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of TableRow | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Add a row
POST /v1/tables/{tableId}/rows
Needs: tables:write
At the end of the Table, with the cells given (by column id or name). Through a view, the view's filter values are filled in and the row must match it. Formulas recalculate, open grids update live, sheet.row_created fires, and the row's history says it came through the API.
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): TableRowInput.
| Field | Type | Description |
|---|---|---|
cells required | object | Values by column id or name. Leave a column out to leave it as it is; null clears it. Computed and locked columns refuse writes. |
| Status | Meaning | Body |
|---|---|---|
201 | Added. | TableRow (application/json) |
400 | invalid_request, unknown_column, invalid_value. | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | insufficient_scope, forbidden (no edit right, or the view doesn't allow adding rows), locked, limit_reached (the Table is at its size), plan_required. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
410 | view_withdrawn. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Add or update a row by a key column (upsert)
PUT /v1/tables/{tableId}/rows
Needs: tables:write
Finds the one row whose key column equals the value in cells (compared as equals does) and sets the other cells — only those that differ, so an unchanged upsert writes nothing; with no such row, adds one with every cell. Decided with the Table locked, so two upserts of one key never both add. More than one row with that key is 409 conflict. Through a view, rows the view doesn't show are not considered. If-Match applies to the update as on PATCH. 201 when added, 200 when updated (created says which; also X-Upsert).
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
key required | query | string | The key column's id or name; cells must hold its value. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
If-Match | header | string | A row version: refuse (409 row_changed) if a cell being set changed since. |
Request body (application/json, required): TableRowInput.
| Field | Type | Description |
|---|---|---|
cells required | object | Values by column id or name. Leave a column out to leave it as it is; null clears it. Computed and locked columns refuse writes. |
| Status | Meaning | Body |
|---|---|---|
200 | Updated (or already as asked). | UpsertedTableRow (application/json) |
201 | Added. | UpsertedTableRow (application/json) |
204 | Done, but the row no longer shows in the view it was written through. | No body |
400 | invalid_request, unknown_column, invalid_value (including a key column the Table fills in, or an empty key). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | conflict (more than one row has that key), row_changed (If-Match), idempotency_in_progress. | Error (application/json) |
410 | view_withdrawn. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
One row
GET /v1/tables/{tableId}/rows/{rowId}
Needs: tables:read
Its ETag is the row's version (the Table's version when read).
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
rowId required | path | string | A row id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | TableRow (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
410 | view_withdrawn. | Error (application/json) |
Change cells of a row
PATCH /v1/tables/{tableId}/rows/{rowId}
Needs: tables:write
Sets the cells given; leaves the rest. With If-Match: "<version>" (a row's version or its ETag) the whole change is refused with 409 row_changed when any of those cells changed since that version; without it the last writer wins, as in the grid. sheet.row_updated fires with the changed columns.
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
rowId required | path | string | A row id. |
If-Match | header | string | A row version. |
Request body (application/json, required): TableRowInput.
| Field | Type | Description |
|---|---|---|
cells required | object | Values by column id or name. Leave a column out to leave it as it is; null clears it. Computed and locked columns refuse writes. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | TableRow (application/json) |
204 | Done, but the row no longer shows in the view it was written through. | No body |
400 | invalid_request, unknown_column, invalid_value. | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | row_changed: a cell changed since the If-Match version; read the row again. | Error (application/json) |
410 | view_withdrawn. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Delete a row
DELETE /v1/tables/{tableId}/rows/{rowId}
Needs: tables:write
It can be restored from the Table for 30 days. Through a view, only when the view allows deleting rows. sheet.row_deleted fires.
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
rowId required | path | string | A row id. |
| Status | Meaning | Body |
|---|---|---|
204 | Deleted. | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
410 | view_withdrawn. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Delete several rows at once
POST /v1/tables/{tableId}/rows/delete
Needs: tables:write
One batch through the grid's own path: all or none. Needs admin:write as well as tables:write; edit rights on the Table (a view only when it allows deleting rows). Rows already deleted are skipped and counted. Listed in the person's Activity with Undo for 30 days (the rows come back). People only.
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
row_ids required | array of string | At most 500 items. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
deleted required | integer | |
skipped required | integer | Already deleted. |
Everything you see, as CSV
GET /v1/tables/{tableId}/export.csv
Needs: tables:read
The rows and columns this credential sees (a view's, for a view), the way the app's export writes them: choice labels, ISO dates, people as emails (as names for an app), formula results never formulas. Audited as an export.
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
| Status | Meaning | Body |
|---|---|---|
200 | The CSV. | string (binary) (text/csv) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
410 | view_withdrawn. | Error (application/json) |
Everything you see, as an Excel workbook
GET /v1/tables/{tableId}/export.xlsx
Needs: tables:read
Typed values, as the app's XLSX export. Audited as an export.
| Name | In | Type | Description |
|---|---|---|---|
tableId required | path | string | A Table's id, or a shared view's id (a view reads as a Table of its own: only its columns and rows). From GET /v1/orgs/{orgId}/tables. |
| Status | Meaning | Body |
|---|---|---|
200 | The workbook. | string (binary) (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
410 | view_withdrawn. | Error (application/json) |
Forums
Posts in a forum channel
GET /v1/channels/{channelId}/posts
Needs: messages:read
Pinned guides first (on the first page), then posts in the order asked. A post is the forum's opening message and its thread: reply through POST /v1/channels/{channelId}/messages with reply_to = the post's message_id. A person sees forums they can open; an app, forums in channels it was added to.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
sort | query | string | One of: activity, newest, helpful, unanswered, unsolved. |
status | query | string | One of: all, open, solved, closed. |
tags | query | string | Comma-separated tag ids: posts with any of them. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of ForumPostSummary | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Start a post
POST /v1/channels/{channelId}/posts
Needs: messages:write
Through the same path as the app: AutoMod reads the title and question, the forum's required tag, slow mode and new-member limits apply, followers of its tags hear about it, and forum.post_created fires. Files go on replies.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): ForumPostInput.
| Field | Type | Description |
|---|---|---|
title required | string | Required, 3–120 characters. At most 120 characters. |
content required | string | The question (markdown). At most 8000 characters. |
tag_ids | array of string |
| Status | Meaning | Body |
|---|---|---|
201 | Started. | ForumPost (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | insufficient_scope, forbidden (can't post here, a new member's limit), plan_required. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Find posts by words
GET /v1/channels/{channelId}/posts/search
Needs: messages:read
Titles first, then questions, then replies; match.snippet marks the matched words «like this». Sealed posts are matched through the workspace's encrypted index (every word, the last also as a prefix; no exact phrases). searchable: false (no results) only while the workspace's key can't be opened.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
q required | query | string | At least two letters. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
searchable required | boolean | |
data required | array of object | |
data[].post required | ForumPostSummary | |
data[].match required | object | |
data[].match.kind required | string | One of: title, body, reply. |
data[].match.message_id required | string | |
data[].match.snippet required | string |
A post: its question and answer
GET /v1/posts/{postId}
Needs: messages:read
| Name | In | Type | Description |
|---|---|---|---|
postId required | path | string | A forum post id (from GET /v1/channels/{channelId}/posts). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | ForumPost (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Change a post's title or tags, or mark it solved
PATCH /v1/posts/{postId}
Needs: messages:write
The post's author or a moderator (an app: posts its bot started). forum.post_updated / forum.post_solved fire.
| Name | In | Type | Description |
|---|---|---|---|
postId required | path | string | A forum post id (from GET /v1/channels/{channelId}/posts). |
Request body (application/json, required): ForumPostPatch.
| Field | Type | Description |
|---|---|---|
title | string | At most 120 characters. |
tag_ids | array of string | |
solved | boolean | Solved without an answer, or back to open. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | ForumPost (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Mark a reply as the answer
PUT /v1/posts/{postId}/answer
Needs: messages:write
The post's author or a moderator. The post becomes solved; the reply's writer hears about it; forum.post_solved fires.
| Name | In | Type | Description |
|---|---|---|---|
postId required | path | string | A forum post id (from GET /v1/channels/{channelId}/posts). |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
message_id required | string | A reply in this post. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | ForumPost (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Study
A flash-card channel's decks
GET /v1/channels/{channelId}/flashcards/decks
Needs: study:read
People only. One page (next_cursor is null).
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of FlashcardDeck | |
can_edit required | boolean | |
next_cursor required | null |
Make a deck (with its first cards)
POST /v1/channels/{channelId}/flashcards/decks
Needs: study:write
In a flash-card channel where the person may edit decks. Up to 200 cards in the same call; the name, description and cards pass the word filter. Counts toward the plan's flashcardDecks. People only.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name required | string | |
description | string | |
new_per_day | integer | New cards a person sees a day (default 20). |
cards | array of FlashcardCardInput |
| Status | Meaning | Body |
|---|---|---|
201 | Created | FlashcardDeck (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off, limit_reached. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
A deck and a page of its cards
GET /v1/flashcards/decks/{id}
Needs: study:read
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
limit | query | integer | Page size, 1–100. From 1 to 100. Default 50. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
q | query | string | Only cards whose front or back holds this text. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | any (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Rename a deck or change its daily new cards
PATCH /v1/flashcards/decks/{id}
Needs: study:write
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name | string | |
description | string | null | |
new_per_day | integer |
| Status | Meaning | Body |
|---|---|---|
200 | OK | FlashcardDeck (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Delete a deck
DELETE /v1/flashcards/decks/{id}
Needs: admin:write
Its cards, everyone's progress and its images go. Whoever may edit the channel's decks. Not reversible. Made with a personal token or a person's connection, it is listed in the person's Activity. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
204 | Deleted | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Add cards: a list, or CSV text
POST /v1/flashcards/decks/{id}/cards
Needs: study:write
Either cards (up to 500) or csv (front,back[,tags] lines — the app's CSV import: a card already in the deck with the same front and back is skipped as a duplicate). Everything passes the word filter. A deck holds up to 10,000 notes. Nobody's review history changes.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
cards | array of FlashcardCardInput | |
csv | string |
| Status | Meaning | Body |
|---|---|---|
201 | Added | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
deck_id required | string | |
added | integer | |
updated | integer | |
skipped | integer | |
duplicates | integer | |
warnings | array of string | |
cards required | integer |
The org's live quizzes
GET /v1/orgs/{orgId}/quizzes
Needs: study:read
Owners and admins (the quiz builder's people). People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of object | |
data[].id required | string | |
data[].title required | string | |
data[].questions required | integer | |
data[].updated_at required | string (date-time) | |
next_cursor required | null |
Build a quiz
POST /v1/orgs/{orgId}/quizzes
Needs: study:write
Owners and admins, when the plan includes live quizzes. Up to 100 questions of 2–6 answers; the title, prompts and answers pass the word filter. Hosting it live stays in the app (host_url).
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
title required | string | |
questions | array of QuizQuestion |
| Status | Meaning | Body |
|---|---|---|
201 | Created | Quiz (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
A quiz with its answers
GET /v1/quizzes/{id}
Needs: study:read
Owners and admins only — players never see the answers.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Quiz (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Save a quiz's questions (all of them)
PUT /v1/quizzes/{id}
Needs: study:write
Like the builder's save: the questions given replace the old ones, in order; a title, when given, renames it.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
title | string | |
questions required | array of QuizQuestion |
| Status | Meaning | Body |
|---|---|---|
200 | OK | Quiz (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Delete a quiz
DELETE /v1/quizzes/{id}
Needs: admin:write
Owners and admins. Its questions and past games go. Not reversible. Made with a personal token or a person's connection, it is listed in the person's Activity. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
204 | Deleted | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
A Bible study channel: settings and plans
GET /v1/channels/{channelId}/bible-study
Needs: study:read
Group counts only — never who has read. People only.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | BibleStudy (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Start a reading plan
POST /v1/channels/{channelId}/bible-study/plans
Needs: study:write
Leaders (Manage channel). front_to_back or chronological over days, or focused over ranges of books at pace chapters a day; up to the channel's open-plan limit. The title passes the word filter.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
kind required | string | One of: front_to_back, chronological, focused. |
days | integer | |
pace | integer | |
ranges | array of object | |
ranges[].book required | string | A book code, e.g. JHN. |
ranges[].from | integer | |
ranges[].to | integer | |
title | string | |
start_date | string | YYYY-MM-DD, within a year of today (default today). |
time_zone | string | The channel's time zone, set by its first plan. |
| Status | Meaning | Body |
|---|---|---|
201 | Started | BiblePlan (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | limit: the channel runs the most plans it can. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Pause or resume a plan
PATCH /v1/channels/{channelId}/bible-study/plans/{id}
Needs: study:write
Leaders. Ending a plan is POST …/end (admin:write).
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
id required | path | string | The resource id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
status required | string | One of: active, paused. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | BiblePlan (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
End a plan for good
POST /v1/channels/{channelId}/bible-study/plans/{id}/end
Needs: admin:write
Leaders. Day cards and reminders stop; an ended plan can't be restarted. Made with a personal token or a person's connection, it is listed in the person's Activity. People only.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | BiblePlan (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Translation, time zone, day cards
PATCH /v1/channels/{channelId}/bible-study/settings
Needs: study:write
Leaders. Who leaders may see reading (names_for_leaders) is an Owner's or Admin's choice in Missived and is refused here.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
translation | string | null | |
time_zone | string | |
post_time | string | HH:MM in the channel's time zone. |
post_cards | boolean |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
settings required | object |
Look up a Bible passage
GET /v1/orgs/{orgId}/bible/verses
Needs: identify (every token has it)
In the org's translations (bundled, or API.Bible when the org set a key); the copyright line always comes with the text.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
ref required | query | string | A reference, like John 3:16-18 or Ps 23. |
translation | query | string | A translation id (default: the org's). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | VerseText (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
Events page
Make an event (a draft)
POST /v1/orgs/{orgId}/calendar-events
Needs: calendar:write
Owners, admins and people with Manage events, when the plan includes the Events page. It starts as a draft: only its managers see it until it is published. Counts toward upcomingEvents when published. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): EventInput.
| Field | Type | Description |
|---|---|---|
title | string | |
starts_at | string (date-time) | |
ends_at | string (date-time) | |
all_day | boolean | |
time_zone | string | null | An IANA name, like America/Chicago. |
summary | string | null | |
description | string | null | Markdown (sealed at rest in encrypted workspaces). |
location | string | null | |
online_url | string | null | https only. |
listed | boolean | Shown in the Events page list (default true). |
category_id | string | null | |
place_id | string | null | |
department_id | string | null | |
audience | string | One of: everyone, chosen. |
audience_department_ids | array of string | |
audience_role_ids | array of string | |
organiser_ids | array of string | |
signup | object | Sign-up settings: mode (none | form | external), external_url, capacity, max_party_size, waitlist, opens_at, closes_at, cancel_until, min_age, show_attendees, reminder_hours, form (the questions). Missived never takes payments. |
| Status | Meaning | Body |
|---|---|---|
201 | Created | OrgEvent (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off, limit_reached. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
One event
GET /v1/calendar-events/{id}
Needs: shifts:read
As the person sees it (who may see an event is the Events page's rule). Never the roster, the names of people going, anyone's answers or the payment link. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | OrgEvent (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Change an event
PATCH /v1/calendar-events/{id}
Needs: calendar:write
Its organisers, its maker and event managers. Sign-up settings go in signup. Moving a published event's times tells the people signed up, as the editor does. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Request body (application/json, required): EventInput.
| Field | Type | Description |
|---|---|---|
title | string | |
starts_at | string (date-time) | |
ends_at | string (date-time) | |
all_day | boolean | |
time_zone | string | null | An IANA name, like America/Chicago. |
summary | string | null | |
description | string | null | Markdown (sealed at rest in encrypted workspaces). |
location | string | null | |
online_url | string | null | https only. |
listed | boolean | Shown in the Events page list (default true). |
category_id | string | null | |
place_id | string | null | |
department_id | string | null | |
audience | string | One of: everyone, chosen. |
audience_department_ids | array of string | |
audience_role_ids | array of string | |
organiser_ids | array of string | |
signup | object | Sign-up settings: mode (none | form | external), external_url, capacity, max_party_size, waitlist, opens_at, closes_at, cancel_until, min_age, show_attendees, reminder_hours, form (the questions). Missived never takes payments. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | OrgEvent (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off, limit_reached. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Delete an event
DELETE /v1/calendar-events/{id}
Needs: admin:write
Event managers. Refused while it has Shifts positions (409 has_shifts). Its sign-ups go; everyone signed up is told. Not reversible. Made with a personal token or a person's connection, it is listed in the person's Activity. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
204 | Deleted | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
Publish an event
POST /v1/calendar-events/{id}/publish
Needs: calendar:write
Puts it on the Events page for its audience (and publishes its serving slots). Cancelling is done in Missived: it tells everyone signed up.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | OrgEvent (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, plan_required, feature_off, limit_reached. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Message everyone signed up
POST /v1/calendar-events/{id}/message
Needs: calendar:write
Needs invites:write as well as calendar:write. The organiser tools' message: the event's organisers write to those going (default), all signed up, the waitlist or the unpaid; they get it in Missived (and by email with email: true), and going sign-ups see it in the event chat. The text passes the word filter and is sealed at rest. Listed in the person's Activity; waits for the person where the workspace's Owner asked (202). People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
text required | string | At most 2000 characters. |
audience | string | going (default), all, waitlist or unpaid. |
email | boolean |
| Status | Meaning | Body |
|---|---|---|
201 | Sent | object (application/json) |
202 | Waits for the person to confirm in Missived (the workspace asks first). | PendingConfirmation (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, insufficient_scope, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | conflict: nobody signed up matches. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
org_id required | string | |
event_id required | string | |
recipients required | integer | |
posted required | boolean | Also posted in the event chat. |
Take an event back to a draft
POST /v1/calendar-events/{id}/unpublish
Needs: calendar:write
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | OrgEvent (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Polls, prayer and later posts
Run a poll
POST /v1/channels/{channelId}/polls
Needs: messages:write
Where the person may send messages. 2–10 options, which pass the word filter. In a workspace channel the card is posted by the system author for the person (they can delete it); in a DM or group chat it is theirs. People only.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
question required | string | |
options required | array of string | |
max_votes | integer | 1–10 (default 1). |
is_secret | boolean | Hide who voted for what. |
duration_hours | number | Close after this long (default: open). |
| Status | Meaning | Body |
|---|---|---|
201 | Created | Poll (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Post a message later
POST /v1/channels/{channelId}/scheduled-messages
Needs: messages:write
Posted as the person at scheduled_at (up to 366 days ahead), with their rules at that moment. The text passes the word filter now and is sealed at rest in encrypted workspaces. People only.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
content required | string | |
scheduled_at required | string (date-time) | |
reply_to | string | A message in this channel whose thread it goes in. |
| Status | Meaning | Body |
|---|---|---|
201 | Scheduled | ScheduledMessage (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Add a prayer request
POST /v1/channels/{channelId}/prayer-requests
Needs: messages:write
In a prayer channel where the person may post, when the plan includes prayer requests. Who it's for, the request and the contact line pass the word filter. anonymous hides the person from everyone, everywhere (follow-ups included). People only.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
who required | string | |
request required | string | |
contact | string | |
anonymous | boolean |
| Status | Meaning | Body |
|---|---|---|
201 | Created | PrayerRequest (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
Knowledge
A channel's Knowledge pages
GET /v1/channels/{channelId}/knowledge
Needs: knowledge:read
Titles and review state, in the editor's order (page text stays in the app). People only.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
channel_id required | string | |
can_edit required | boolean | |
data required | array of KnowledgePage |
Start a page as a draft
POST /v1/channels/{channelId}/knowledge
Needs: knowledge:write
Where the person may edit the channel's Knowledge. text becomes plain paragraphs (blank lines split them; never HTML); the title and text pass the word filter. It is never published here: the person submits it and the channel's approvers publish it in Missived. People only.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
title required | string | |
text | string |
| Status | Meaning | Body |
|---|---|---|
201 | Drafted | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
id required | string | |
channel_id required | string | |
title required | string | |
status required | string | Always draft. |
Client portals
The portals you're staff on
GET /v1/orgs/{orgId}/portals
Needs: portals:read
People who aren't Guests (a client contact's token gets 404 here and on every portal route).
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of ClientPortal |
Set up a client portal
POST /v1/orgs/{orgId}/portals
Needs: portals:write
The app's createPortal: Owners, Admins and Manage client portals; a new category with Messages and Firm only channels, or category_id made into one. Inviting the client stays in the app. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name required | string | |
kind | string | person, household or business. |
lead_user_id | string | |
staff_ids | array of string | |
category_id | string |
| Status | Meaning | Body |
|---|---|---|
201 | Created | ClientPortal (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
The name and accents clients see
PATCH /v1/orgs/{orgId}/portal-branding
Needs: portals:write
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
display_name | string | null | |
accent_light | string | null | #rrggbb or null. |
accent_dark | string | null | #rrggbb or null. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
One portal
GET /v1/portals/{portalId}
Needs: portals:read
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id (from GET /v1/orgs/{orgId}/portals). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | ClientPortal (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Change a portal
PATCH /v1/portals/{portalId}
Needs: portals:write
name, kind, lead_user_id, welcome, show_progress, reminders (the schedule new requests start with), require_2fa: true. Turning 2FA off, who may invite, what reminder emails say and closing stay in the app (other fields are refused).
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name | string | |
kind | string | |
lead_user_id | string | |
welcome | string | |
show_progress | boolean | |
reminders | object | |
require_2fa | boolean | One of: true. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | ClientPortal (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
The portal's stages, in order
PUT /v1/portals/{portalId}/stages
Needs: portals:write
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
names required | array of string |
| Status | Meaning | Body |
|---|---|---|
200 | OK | ClientPortal (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Move to a stage
POST /v1/portals/{portalId}/stage
Needs: portals:write
position 0-based, or null to clear. The client sees it on their timeline.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
position required | integer | null |
| Status | Meaning | Body |
|---|---|---|
200 | OK | ClientPortal (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
What happened in a portal
GET /v1/portals/{portalId}/timeline
Needs: portals:read
Newest first, for the portal's staff: id, kind, at, text (worded now, from the rows as they are) and firm_only (a line the client never sees). limit 1–200, default 100.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
limit | query | integer | From 1 to 200. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of object |
The file library
GET /v1/portals/{portalId}/files
Needs: portals:read
Folders (with visibility and whether the client sees them) and files, for staff.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | LegacyObject (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Add a folder
POST /v1/portals/{portalId}/folders
Needs: portals:write
Firm only unless visibility: shared (the client sees it only when every folder above is shared). The name passes the word filter.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name required | string | |
parent_id | string | |
visibility | string | firm (default) or shared. |
| Status | Meaning | Body |
|---|---|---|
201 | Created | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
id required | string | |
portal_id required | string | |
visibility required | string |
Requests to the client
GET /v1/portals/{portalId}/requests
Needs: portals:read
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of PortalRequest |
Send the client a request
POST /v1/portals/{portalId}/requests
Needs: portals:write
The app's createRequest: the client is told by email and in their portal (PD6: the firm, how many items and when; titles only when the firm chose that), with reminders on the schedule. Title, notes and labels pass the word filter.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
title required | string | |
note | string | |
internal_note | string | |
due_on | string | YYYY-MM-DD. |
assignees | array of string | |
reminders | object | |
items required | array of object |
| Status | Meaning | Body |
|---|---|---|
201 | Sent | PortalRequest (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
One request
GET /v1/portals/{portalId}/requests/{requestId}
Needs: portals:read
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
requestId required | path | string | A request id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | PortalRequest (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Change a request
PATCH /v1/portals/{portalId}/requests/{requestId}
Needs: portals:write
Cancelling it stays in the app.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
requestId required | path | string | A request id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
title | string | |
note | string | |
internal_note | string | |
due_on | string | null | |
assignees | array of string | |
reminders | object | |
items | array of object |
| Status | Meaning | Body |
|---|---|---|
200 | OK | PortalRequest (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
Invite a client
POST /v1/portals/{portalId}/contacts
Needs: invites:write
The app's inviteContact: the portal's lead (or its staff, when the portal lets staff invite), while it is open and within the plan's portal contact seats. The invitation is emailed to them (never in the answer). Made with a personal token or a person's connection, it is listed in the person's Activity with Undo. People only.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
email required | string | |
name | string |
| Status | Meaning | Body |
|---|---|---|
201 | Sent | object (application/json) |
202 | Waits for the person to confirm in Missived (the workspace asks first). | PendingConfirmation (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, plan_required, feature_off, portal contact seat refusals. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
invite_id required | string | |
org_id required | string | |
delivered required | boolean | |
expires_at required | string (date-time) |
Remind the client now
POST /v1/portals/{portalId}/requests/{requestId}/remind
Needs: invites:write
The app's Remind now: each client on an open request is reminded in their portal (and by email unless they had one today), at most once a day. Listed in the person's Activity. People only.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
requestId required | path | string | A request id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
202 | Waits for the person to confirm in Missived (the workspace asks first). | PendingConfirmation (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
org_id required | string | |
sent required | integer | |
skipped required | integer | Already reminded today. |
Close a portal
POST /v1/portals/{portalId}/close
Needs: admin:write
Its managers. The client can't sign in to it any more, except to download during the firm's download window; nothing is deleted. Listed in the person's Activity with Undo (it reopens). People only.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
| Status | Meaning | Body |
|---|---|---|
204 | Closed | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Take a client out of the portal
DELETE /v1/portals/{portalId}/contacts/{userId}
Needs: admin:write
Its managers. They lose access at once and are told; what they uploaded stays. Made with a personal token or a person's connection, it is listed in the person's Activity. People only.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
userId required | path | string | A user id. |
| Status | Meaning | Body |
|---|---|---|
204 | Removed | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Cancel a request
POST /v1/portals/{portalId}/requests/{requestId}/cancel
Needs: admin:write
Its staff. Reminders stop; it shows as cancelled. Made with a personal token or a person's connection, it is listed in the person's Activity. People only.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
requestId required | path | string | A request id. |
| Status | Meaning | Body |
|---|---|---|
204 | Cancelled | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
Delete an empty folder
DELETE /v1/portals/{portalId}/folders/{folderId}
Needs: admin:write
Its staff. A folder holding files or folders (409 not_empty) and Client uploads (409 system_folder) can't be deleted. Made with a personal token or a person's connection, it is listed in the person's Activity. People only.
| Name | In | Type | Description |
|---|---|---|---|
portalId required | path | string | A portal id. |
folderId required | path | string | A folder id. |
| Status | Meaning | Body |
|---|---|---|
204 | Deleted | No body |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
Call recordings
Call recordings you can see
GET /v1/recordings
Needs: recordings:read
Newest first: the recordings of voice channels you can open now and meetings you hosted, were invited to or were let into (Owners and Admins: all of their workspace's). Never Guests or under-18s, never the other side of a shared category. People only: recordings:read is never given to an app, and an assistant gets it only when the person ticks it on its own.
| Name | In | Type | Description |
|---|---|---|---|
org_id | query | string | Only this workspace. |
channel_id | query | string | Only this voice channel. |
meeting_id | query | string | Only this meeting. |
limit | query | integer | Page size, 1–100. From 1 to 100. Default 25. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Recording | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
One call recording
GET /v1/recordings/{id}
Needs: recordings:read
With download links signed for you (30 minutes). Anything you can't see is 404. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | Recording |
Booking links
Booking pages
GET /v1/orgs/{orgId}/booking-pages
Needs: bookings:read
Your own booking page in the workspace (Owners and Admins: every page in it). People only: bookings:read is never given to an app.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
mine | query | boolean | Only your own page (an Owner or Admin otherwise sees every page). Default false. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of BookingPage | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
A booking page's event types
GET /v1/booking-pages/{id}/event-types
Needs: bookings:read
In the page's order, with each one's link. Your own page, or any page for an Owner or Admin; anything else is 404. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of BookingEventType | |
page required | BookingPage | |
next_cursor required | string | null |
Free times on a booking page
GET /v1/booking-pages/{id}/event-types/{typeId}/slots
Needs: bookings:read
The starts a visitor would be offered for the days from–to (at most 14) in time_zone: your availability, busy times, buffers, notice and limits. Works before the page is published. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
typeId required | path | string | An event type id (from the page's event types). |
from required | query | string | First day, YYYY-MM-DD in time_zone. |
to required | query | string | Last day, YYYY-MM-DD. |
time_zone required | query | string | An IANA zone, e.g. America/Chicago. |
length | query | integer | Minutes; one of the event type's lengths (default: its first). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.length_minutes required | integer | |
data.time_zone required | string | |
data.slots required | array of string (date-time) |
Bookings
GET /v1/orgs/{orgId}/bookings
Needs: bookings:read
Bookings on your page (scope=all: everyone's, for Owners and Admins), soonest first for upcoming, newest first for past, a page at a time (limit 1–200, default 50; follow next_cursor). The fields match the booking.* events' data.booking. The booker's email only when the workspace's Owner allows it. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
when | query | string | One of: upcoming, past. Default "upcoming". |
scope | query | string | One of: mine, all. Default "mine". |
limit | query | integer | From 1 to 200. Default 50. |
cursor | query | string | next_cursor from the previous page. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Booking | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Cancel a booking
POST /v1/bookings/{id}/cancel
Needs: bookings:write
Your own booking (Owners and Admins: any in the workspace). The booker is emailed with the reason, the time frees up, and a booking.cancelled event is sent. 409 already_cancelled when it is. When the workspace's Owner switched on "ask first" for assistants and tokens, it answers 202 pending_confirmation and waits for you to confirm in Missived. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
reason | string | Optional; passes the word filter and is shown to the booker. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
202 | Waits for the person to confirm in Missived (the workspace asks first). | PendingConfirmation (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.status required | string |
Tickets
Queues you can open
GET /v1/orgs/{orgId}/ticket-queues
Needs: tickets:read
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of TicketQueue | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Find tickets in a queue
GET /v1/channels/{channelId}/tickets
Needs: tickets:read
Personal connections only. Same filters and permissions as the queue; never requester addresses. Follow next_cursor for subsequent pages.
| Name | In | Type | Description |
|---|---|---|---|
channelId required | path | string | A channel id. |
cursor | query | string | The next_cursor of the previous page. Opaque: don't build one. |
view | query | string | |
priority | query | string | |
assignee | query | string | |
tag | query | string | |
q | query | string | |
sla | query | string | |
source | query | string | |
createdFrom | query | string | |
createdTo | query | string | |
updatedFrom | query | string | |
updatedTo | query | string |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Ticket | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Queue counts
GET /v1/orgs/{orgId}/tickets/summary
Needs: tickets:read
Counts only across queues you may open. Weekly figures only from queues you manage. No addresses or per-agent statistics.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
channel_id | query | string |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | TicketSummaryCounts |
Read a ticket and internal notes
GET /v1/tickets/{id}
Needs: tickets:read
Personal connections only. Requester name only by default. An agent may explicitly include requester_email; apps cannot use Tickets.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
include | query | string | One of: requester_email. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | Ticket |
Change ticket properties
PATCH /v1/tickets/{id}
Needs: tickets:write
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Request body (application/json, required): TicketChange.
| Field | Type | Description |
|---|---|---|
status | string | One of: open, waiting, solved, closed. |
priority | string | One of: low, normal, high, urgent. |
tags | array of string | |
assignee_id | string | null |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string |
Add an internal note
POST /v1/tickets/{id}/notes
Needs: tickets:write
Never sends email or reaches the requester. Personal connections only, with permission to write notes in this queue.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
content required | string |
| Status | Meaning | Body |
|---|---|---|
201 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string |
Draft a reply for the agent
PUT /v1/tickets/{id}/draft
Needs: tickets:write
Stores a sealed draft in this agent's Reply composer. Never sends or puts anything in the outbox.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
content required | string |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.drafted required | boolean | |
data.sent required | boolean |
Ask the agent to send a reply
POST /v1/tickets/{id}/replies
Needs: tickets:write
A token or assistant ALWAYS receives 202 pending_confirmation, regardless of the workspace ask-first switch (TK13). The agent reviews the exact text and confirms in their signed-in session at confirm_url. Tokens cannot confirm. At confirmation, permissions and the ticket are checked again.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): TicketReply.
| Field | Type | Description |
|---|---|---|
content required | string | Plain reply text; always reviewed by the agent before a token sends. |
then | string | Status after sending (default waiting). One of: open, waiting, solved. |
seq | integer | Sequence from getTicket; rejects stale sends. |
confirm_address | boolean | An agent's explicit confirmation of an unconfirmed requester address. |
| Status | Meaning | Body |
|---|---|---|
201 | OK | object (application/json) |
202 | OK | PendingConfirmation (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.undo_until required | string (date-time) | null |
Dashboards
Widget types
GET /v1/widget-types
Needs: dashboards:read
Every native widget kind (what it shows, its settings and defaults, its size, the plan switch it needs), the connected sources (api, push, pull, connector — all need Manage integrations; push and pull wait for the person when a token asks), the six shapes with a JSON schema and a sample each, and the limits. With org_id, whether each kind is available on that workspace's plan. People with dashboards:read, or an app with dashboards:push.
| Name | In | Type | Description |
|---|---|---|---|
org_id | query | string | Say which kinds this workspace's plan has. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object |
Check a widget without saving it
POST /v1/widget-types/validate
Needs: dashboards:read
A dry run: a native kind's settings, an API widget's shape, a push / pull set-up, and/or a sample payload in a shape. Answers { valid, problems, widget, payload } — the cleaned widget and payload as they would be kept. With org_id, a watched address's interval is checked against that workspace's plan. Nothing is saved and nothing is fetched.
| Name | In | Type | Description |
|---|---|---|---|
org_id | query | string | Check against this workspace's plan. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
kind | string | |
source | string | |
title | string | null | |
settings | object | |
shape | string | |
url | string | |
connector_id | string | |
payload | WidgetShape |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.valid required | boolean | |
data.problems required | array of string | |
data.widget required | object | null | |
data.payload required | object | null |
Dashboards you can open
GET /v1/orgs/{orgId}/dashboards
Needs: dashboards:read
The workspace's dashboard channels you can see, with whether you arrange each. People only: dashboards:read is never given to an app.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of DashboardSummary | |
next_cursor required | string | null | Pass as cursor for the next page; null when there is none. |
Make a dashboard
POST /v1/orgs/{orgId}/dashboards
Needs: dashboards:write
A new dashboard channel, through the same path as the Create card (name rules, word filter, plan cap dashboardChannels). Made through a token it starts private: members and Guests can't see it, you can (and arrange it); open it to others in Missived. Listed in your Activity with Undo. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name required | string | 1–80 characters; passes the word filter. |
topic | string | |
category_id | string | |
private | boolean | Default true. Only a signed-in session may make one open to everyone. |
| Status | Meaning | Body |
|---|---|---|
201 | Made | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off, limit_reached. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | DashboardSummary |
A dashboard and its data
GET /v1/dashboards/{id}
Needs: dashboards:read
The layout, each widget and what it shows you — your own slice: every widget is answered by its feature's own access rule, so two people can see different numbers on the same dashboard. A dashboard you can't open is 404. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | Dashboard |
Add a widget
POST /v1/dashboards/{id}/widgets
Needs: dashboards:write
A person who arranges the dashboard (dashboards:write): a native kind with its settings (each choice must be something you can open), or a connected widget (source; needs Manage integrations). source: push and source: pull from a token answer 202 pending_confirmation: the person confirms in Missived and sees the webhook address there — it is never answered to a token. An app (dashboards:push, added to the dashboard) adds only source: api widgets it feeds itself, and never reads the dashboard. Counts toward dashboardWidgets; API and webhook widgets toward dashboardPushWidgets.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): WidgetInput.
| Field | Type | Description |
|---|---|---|
kind | string | A native kind from GET /v1/widget-types (leave source out). |
source | string | api (fed by POST /v1/widgets/{id}/data), push (a webhook address — waits for the person when a token asks), pull (a watched https address — waits too) or connector. One of: api, push, pull, connector. |
shape | string | For source: api: stat, status, list, bars, table or card. |
title | string | null | At most 60 characters. |
settings | object | The kind's settings (native), { format, shape? } (push) or { source, every, … } (pull). |
note | string | null | A Notes widget's text (markdown, at most 2,000 characters; passes the word filter). |
secret | string | push: the sending service's signing secret, when its format needs one. |
url | string | pull: the https address to watch. |
connector_id | string | connector: a connector the workspace already runs. |
| Status | Meaning | Body |
|---|---|---|
201 | Added | object (application/json) |
202 | Waits for the person to confirm in Missived (a webhook address or a watched address). | PendingConfirmation (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off, limit_reached, read_only. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.dashboard_id required | string | |
data.org_id | string | |
data.source required | string | |
data.kind required | string | null | |
data.layout_rev required | integer | |
data.address | string | A signed-in session's webhook widget only: its address, shown once. |
Change a widget
PATCH /v1/dashboards/{id}/widgets/{widgetId}
Needs: dashboards:write
Title, settings and (Notes) note — a connected widget only its title. An app may rename only its own API widget. Listed in your Activity with Undo.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
widgetId required | path | string | A widget id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
title | string | null | |
settings | object | |
note | string | null |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.org_id required | string | |
data.settings_rev required | integer |
Remove a widget
DELETE /v1/dashboards/{id}/widgets/{widgetId}
Needs: dashboards:write
An arranger removes any widget; an app only its own API widget. A removed native widget can be put back from your Activity.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
widgetId required | path | string | A widget id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.org_id required | string | |
data.deleted required | boolean | |
data.layout_rev required | integer |
A webhook widget's new address
POST /v1/dashboards/{id}/widgets/{widgetId}/address
Needs: dashboards:write
The old address stops working. From a token this always waits for the person (202 pending_confirmation), who sees the new address in Missived. People only, with Manage integrations.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
widgetId required | path | string | A widget id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
202 | Waits for the person to confirm in Missived. | PendingConfirmation (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.address | string | A signed-in session only. |
Arrange a dashboard
PUT /v1/dashboards/{id}/layout
Needs: dashboards:write
The whole order and every size, against the layout you read: send If-Match: <layout_rev> (or layout_rev in the body). Every widget exactly once. A newer layout answers 409 stale with the current layout_rev and items — merge and send again. The layout this replaces is kept 7 days (Restore in Missived, Undo in your Activity). People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
If-Match | header | string | The layout_rev you arranged from. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
items required | array of DashboardLayoutItem | |
layout_rev | integer |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | stale: the body also carries layout_rev and items, the current ones. | Error (application/json) |
428 | precondition_required: send If-Match. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.org_id required | string | |
data.layout_rev required | integer | |
data.items required | array of DashboardLayoutItem |
Send an API widget its value
POST /v1/widgets/{widgetId}/data
Needs: dashboards:push
Only the credential that made the widget may feed it: the app's install (dashboards:push, still added to the dashboard) or the person's own token / assistant / session (dashboards:write). The body is the widget's shape (shape may be left out); unknown fields are refused, text passes the workspace's word filter (422 content_blocked, nothing shown), 60 updates a minute per widget. A stat without series keeps its own trend of the last values. Answers whether what the widget shows changed.
| Name | In | Type | Description |
|---|---|---|---|
widgetId required | path | string | An API widget's id. |
Request body (application/json, required): a JSON object, as the description says.
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
422 | content_blocked: the word filter refused something in it. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.changed required | boolean | |
data.received_at required | string (date-time) |
Workflows
Workflow node types
GET /v1/workflow-node-types
Needs: workflows:read
Every trigger and step this engine runs: its fields, ports and outputs, whether it writes or reaches outside, the plan switch it needs and the words publishing will show; every event a trigger can listen to with its outputs; the actions "Run an action" may call; the limits. With org_id, whether each is on there. Start every build here — never invent a node type, port or field. People only.
| Name | In | Type | Description |
|---|---|---|---|
org_id | query | string | Say which node types this workspace has. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object |
The workflow JSON Schema
GET /v1/workflow-schema
Needs: workflows:read
The JSON Schema (2020-12) for a missived.workflow/v1 document — the same one published at https://missived.com/schemas/workflow/v1.json. The schema checks shape; validateWorkflow checks everything else (references, ports, limits, this workspace's addresses and secrets). People only.
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object |
Check a workflow without saving it
POST /v1/orgs/{orgId}/workflows/validate
Needs: workflows:read
The full problem list (the one validator the editor and publishing use): the graph, every {{…}} reference, the limits, steps not available yet, this workspace's allowed addresses and secrets, and any secret value pasted in (secret_value). Nothing is saved. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
document required | object |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.valid required | boolean | |
data.problems required | array of WorkflowProblem |
Workflows you can see
GET /v1/orgs/{orgId}/workflows
Needs: workflows:read
Builders (Owners, Admins, Manage workflows) see every workflow; anyone else the run-by-hand ones shared with them. With this month's run count against the plan's limit. People only: workflows:read is never given to an app.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of Workflow | |
usage required | object | |
usage.month required | string | |
usage.runs required | integer | |
usage.skipped required | integer | |
usage.limit required | integer | |
next_cursor required | null |
Make a workflow draft
POST /v1/orgs/{orgId}/workflows
Needs: workflows:write
A name (an empty manual workflow) or a whole document. Always a draft — it never runs until the person publishes it in Missived. A document carrying a secret's value is refused (secret_value). Names pass the word filter. Listed in your Activity with Undo (the draft is deleted). Builders only; people only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Idempotency-Key | header | string | Retry-safe creation: the same key from the same caller within 24 hours returns the first result (with Idempotent-Replayed: true) instead of creating again. At most 255 characters. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
name | string | 1–80 characters. |
description | string | |
document | object |
| Status | Meaning | Body |
|---|---|---|
201 | Drafted | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | forbidden, content_blocked, plan_required, feature_off. | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
422 | The Idempotency-Key was used for a different request (idempotency_key_reused). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | WorkflowDetail |
A workflow
GET /v1/workflows/{id}
Needs: workflows:read
Its JSON (the draft when there is one, else the live version; secrets only as references), its versions and its current problems. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | WorkflowDetail |
Save a workflow's draft
PUT /v1/workflows/{id}/draft
Needs: workflows:write
The whole document against the rev you read (409 stale with the current rev when someone else saved since). Never publishes: a live workflow keeps running its published version. Listed in your Activity with Undo (the previous draft comes back). People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
document required | object | |
rev required | integer |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | stale: the body also carries the current rev. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.rev required | integer | |
data.problems required | array of WorkflowProblem |
Test a workflow
POST /v1/workflows/{id}/test
Needs: workflows:write
Runs the draft (else the live version) once against your sample trigger, with your rights. Reads are real; nothing is written — every write step answers simulated with the plain words of what it would do (planned). Answers the run and its trace. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
trigger | object | A realistic sample of what the trigger hands the first step. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | problems: fix them first (the body carries them). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | WorkflowRunDetail |
What publishing would allow
GET /v1/workflows/{id}/publish
Needs: workflows:read
The permission summary — every place it may post, every Table it may change, every outside address it may call — checked with your rights, the problems that block publishing, and the rev to publish. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.rev required | integer | null | |
data.take_over required | boolean | Publishing makes you its owner (it then runs with your rights). |
data.summary required | array of object | |
data.summary[].scope required | string | |
data.summary[].words required | string | |
data.summary[].places required | array of string | |
data.problems required | array of WorkflowProblem |
Publish a workflow
POST /v1/workflows/{id}/publish
Needs: workflows:write
From a token or an assistant this always answers 202 pending_confirmation: the person opens confirm_url, reads the permission summary and confirms in Missived — publishing makes them the owner, and it runs with their rights. A signed-in session publishes directly. Refused with 422 problems before anyone is asked. A webhook trigger's address is shown once, only to the person.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
rev required | integer | The draft's rev (from getWorkflow or checkWorkflowPublish). |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
202 | Waits for the person to confirm in Missived. | PendingConfirmation (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
422 | problems. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.version required | integer | |
data.status required | string | |
data.hook_url | string | A signed-in session only, at a webhook trigger's first publish. |
Pause a workflow
POST /v1/workflows/{id}/pause
Needs: workflows:write
Stops new runs at once (runs in progress finish). Acts directly. Listed in your Activity with Undo. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.status required | string |
Turn a workflow back on
POST /v1/workflows/{id}/resume
Needs: workflows:write
From a token or an assistant this always answers 202 pending_confirmation (it turns automation back on); the person confirms in Missived. A workflow paused because its owner lost a right answers 409 publish_again. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
202 | Waits for the person to confirm in Missived. | PendingConfirmation (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.status required | string |
Run a workflow by hand
POST /v1/workflows/{id}/run
Needs: workflows:run
A live manual or form workflow you may run (its sharing decides), with the form's answers by field id. Queued; read the run with listWorkflowRuns. Counts toward the plan's runs a month. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
form | object | Answers by field id. |
| Status | Meaning | Body |
|---|---|---|
202 | Queued | object (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.queued required | boolean |
Workflow runs
GET /v1/orgs/{orgId}/workflow-runs
Needs: workflows:read
Newest first, 100 at a time (pass next_cursor as cursor for the next page; before = a time, for a window): every run for Owners and Admins, the runs of workflows you own, and the runs you started. People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
workflow_id | query | string | |
status | query | string | |
before | query | string (date-time) | |
cursor | query | string |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | array of WorkflowRun | |
next_cursor required | string | null | Pass as cursor; null on the last page. |
A workflow run
GET /v1/workflow-runs/{id}
Needs: workflows:read
The run and, for its workflow's owner, Owners and Admins, its trace: each step's settings (secrets masked), output and error — exactly what the run page shows. Quote it; don't guess why a run failed. People only.
| Name | In | Type | Description |
|---|---|---|---|
id required | path | string | The resource id. |
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | WorkflowRunDetail |
Allow an outside address
POST /v1/orgs/{orgId}/workflow-addresses
Needs: workflows:write
An https address workflows may call ("Call an outside address" steps go only to allowed addresses, and to paths under them). From a token or an assistant this always answers 202 pending_confirmation and the person confirms it in Missived; the token's person must be an Owner, Admin or have Manage integrations (else 403 forbidden, before anything waits). People only.
| Name | In | Type | Description |
|---|---|---|---|
orgId required | path | string | An org id (from GET /v1/orgs). |
Request body (application/json, required): object.
| Field | Type | Description |
|---|---|---|
url required | string | https://… |
| Status | Meaning | Body |
|---|---|---|
201 | Allowed | object (application/json) |
202 | Waits for the person to confirm in Missived. | PendingConfirmation (application/json) |
400 | The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components). | Error (application/json) |
401 | No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended). | Error (application/json) |
403 | The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden). | Error (application/json) |
404 | Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found. | Error (application/json) |
409 | A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress). | Error (application/json) |
429 | Too many requests (rate_limited). Wait Retry-After seconds. | Error (application/json) |
| Field | Type | Description |
|---|---|---|
data required | object | |
data.id required | string | |
data.url required | string | |
data.host required | string | |
data.created_at required | string (date-time) |
Reference
This document
GET /v1/openapi.json
Needs: No bearer token
| Status | Meaning | Body |
|---|---|---|
200 | OK | object (application/json) |
Schemas
The named shapes the operations refer to.
Ticket
| Field | Type | Description |
|---|---|---|
id required | string | |
number required | integer | |
channel_id required | string | |
subject required | string | |
status required | string | One of: new, open, waiting, solved, closed. |
priority required | string | One of: low, normal, high, urgent. |
requester required | object | null | |
requester.name | string | null | |
requester.email | string | Only with include=requester_email, for an agent in this queue. |
assignee required | object | null | |
assignee.id | string | |
assignee.name | string | |
tags required | array of string | |
source required | string | |
due_at required | string (date-time) | null | |
created_at required | string (date-time) | |
updated_at required | string (date-time) | |
seq | integer | |
conversation | array of object | |
can | object |
TicketQueue
| Field | Type | Description |
|---|---|---|
channelId required | string | |
name required | string | |
counts required | object | |
counts.mine required | integer | |
counts.unassigned required | integer | |
counts.open required | integer | |
work required | boolean |
TicketChange
| Field | Type | Description |
|---|---|---|
status | string | One of: open, waiting, solved, closed. |
priority | string | One of: low, normal, high, urgent. |
tags | array of string | |
assignee_id | string | null |
TicketReply
| Field | Type | Description |
|---|---|---|
content required | string | Plain reply text; always reviewed by the agent before a token sends. |
then | string | Status after sending (default waiting). One of: open, waiting, solved. |
seq | integer | Sequence from getTicket; rejects stale sends. |
confirm_address | boolean | An agent's explicit confirmation of an unconfirmed requester address. |
TicketSummaryCounts
| Field | Type | Description |
|---|---|---|
waiting_on_me required | integer | |
overdue required | integer | |
unassigned required | integer | |
this_week required | object | null | |
this_week.created | integer | |
this_week.solved | integer | |
this_week.medianFirstResponseSeconds | number | null |
GatewayInfo
| Field | Type | Description |
|---|---|---|
url required | string | The WebSocket URL to connect to (wss:// in production). |
gateway_version required | integer | The frame format's version (1). |
heartbeat_interval required | integer | Send a heartbeat this often (ms). |
resume_window_ms required | integer | A dropped session can be resumed for this long. |
max_sessions required | integer | Connections one install may hold at once. |
intents required | array of object | |
intents[].id required | string | An intent to ask for in identify. One of: messages, message_content, reactions, members, channels, meetings, shifts, tables. |
intents[].scope required | string | null | The scope it needs; null = none beyond the install. |
intents[].events required | array of string | |
intents[].granted required | boolean | This install's scopes allow it. |
sessions required | object | |
sessions.connected required | integer | This install's connections now. |
Error
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | A stable, machine-readable code (snake_case). |
error.message required | string | A sentence for a person. |
CommandOption
| Field | Type | Description |
|---|---|---|
name required | string | ^[a-z0-9_-]{1,32}$, unique within the command. |
description required | string | 1–100 characters; the field's label when a person is prompted. |
type required | string | The value's type. One of: string, integer, number, boolean, user, channel, role. |
required required | boolean | Required options come before optional ones. |
choices | array of object | |
choices[].name required | string | |
choices[].value required | string | number | |
min_value | number | null | |
max_value | number | null | |
min_length | integer | null | |
max_length | integer | null | At most 2000. |
CommandDraft
| Field | Type | Description |
|---|---|---|
name required | string | ^[a-z0-9_-]{1,32}$. The built-in names (shrug, tableflip, unflip, me, gif, poll) are reserved. |
description required | string | 1–100 characters, shown in the picker. |
options | array of CommandOption | |
permission | string | Who may run it: anyone who can view the channel (default), people who manage the channel, or owners and admins. One of: everyone, manage_channel, admin. |
channel_id | string | null | Offer it in one channel only (the app must be in it); null = everywhere the app is. |
Command
| Field | Type | Description |
|---|---|---|
id required | string | |
install_id required | string | |
app_id required | string | |
org_id required | string | |
channel_id required | string | null | |
name required | string | |
description required | string | |
options required | array of CommandOption | |
permission required | string | One of: everyone, manage_channel, admin. |
version required | integer | Bumped on every change; the interaction payload's data.version says which definition the person used. |
created_at required | string (date-time) | |
updated_at required | string (date-time) |
InteractionReply
| Field | Type | Description |
|---|---|---|
content | string | null | The message text (at most 20,000 characters). |
embeds | array of object | |
components | array of ActionRow | |
flags | integer | 64 (ephemeral) sends a follow-up privately to the person who invoked the interaction. |
EphemeralMessage
| Field | Type | Description |
|---|---|---|
id required | string | |
channel_id required | string | |
flags required | integer | Always 64. |
ephemeral required | boolean | Always true: only the person who invoked the interaction sees it. |
author required | object | |
author.id required | string | The app's bot user. |
author.kind required | string | One of: bot. |
content required | string | |
embeds required | array of Embed | |
components required | array of ActionRow | |
created_at required | string (date-time) | |
edited_at required | string (date-time) | null | |
expires_at required | string (date-time) | Private replies are kept 15 minutes, then dropped. |
Activity
| Field | Type | Description |
|---|---|---|
kind required | string | What the person is doing. One of: live, playing, listening, watching, custom. |
name required | string | The service or game ("Twitch", "Elden Ring"). |
detail required | string | null | A second line: the stream's title, the song. |
url required | string | null | An https link (the stream). |
started_at required | string (date-time) | null | When it began. |
expires_at required | string (date-time) | When the line disappears unless it is posted again. |
source required | string | api for a line set through this API; otherwise the provider that set it (twitch). |
ActivityInput
| Field | Type | Description |
|---|---|---|
kind required | string | One of live, playing, listening, watching, custom. One of: live, playing, listening, watching, custom. |
name required | string | The service or game, up to 80 characters. At most 80 characters. |
detail | string | null | Optional second line, up to 120 characters. At most 120 characters. |
url | string | null | Optional https link. |
started_at | string (date-time) | null | Optional: when it began (clamped to now). |
ttl_seconds | integer | How long the line stays without another POST: 10–86400, default 300. Post again before it lapses while the activity continues. From 10 to 86400. Default 300. |
MyActivity
| Field | Type | Description |
|---|---|---|
activity required | Activity | null | The current line, or null. |
visible required | boolean | Whether others see it: the person's Settings → Connections → "Share my activity" switch. |
MyContext
| Field | Type | Description |
|---|---|---|
current_time required | string (date-time) | Current UTC instant; never infer the person's zone from this. |
time_zone required | string | null | IANA zone from the query or last saved browser preference; null when unknown. |
time_zone_source required | string | One of: provided, saved_preference, unknown. |
local_date required | string | null | Calendar date YYYY-MM-DD in time_zone; null when unknown. |
local_time required | string | null | Wall-clock time HH:mm:ss in time_zone; null when unknown. |
weekday required | string | null | Lowercase English weekday in time_zone; null when unknown. |
week_start required | string | One of: monday, sunday. |
week_start_source required | string | One of: workspace, default. |
org_id required | string | null | Selected org, or the only reachable org; null when no org was selected. |
Me
| Field | Type | Description |
|---|---|---|
kind required | string | What the credential is. One of: user, pat, app. |
user required | User | |
orgs required | array of Org | |
scopes required | array of string | |
token required | null | object | |
token.id required | string | |
token.name required | string | |
token.hint required | string | e.g. msv_pat_…a1b2 |
token.expires_at required | string (date-time) | null | |
token.include_dms required | boolean | D3: may read its owner's direct messages. |
app required | null | object | For an installed app's token: its install and where it was added. Null for people and for tokens made before apps existed. |
app.install_id required | string | |
app.app_id required | string | null | |
app.channel_ids required | array of string |
Org
| Field | Type | Description |
|---|---|---|
id required | string | |
name required | string | |
role required | string | null | Your role there: owner, admin, member or guest; null for an app. |
User
| Field | Type | Description |
|---|---|---|
id required | string | |
name required | string | null | |
email required | string | null | Shown to people, as the app shows a fellow member's; never to apps, and null for bots. |
kind required | string | human, bot or system. One of: human, bot, system. |
badge required | string | null | BOT, APP or SYSTEM for a non-human author; null for a person. |
Channel
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
type required | string | text, private, voice, dm, group or meal_train. One of: text, private, voice, dm, group, meal_train. |
name required | string | |
display_name required | string | null | |
topic required | string | null | |
category_id required | string | null | |
kind required | string | What the channel holds: chat, voice, prayer, flashcards, table, table_view, forum, lfg or bible_study. One of: chat, voice, prayer, flashcards, table, table_view, forum, lfg, bible_study. |
archived required | boolean | |
can_send required | boolean | Whether this credential may post here. |
created_at required | string (date-time) |
ChannelMember
| Field | Type | Description |
|---|---|---|
user required | User | |
role required | string | null |
AppInstall
| Field | Type | Description |
|---|---|---|
id required | string | The install id (an app in an org). |
org_id required | string | |
app required | object | |
app.id required | string | |
app.name required | string | |
app.description required | string | null | |
app.icon_url required | string | null | |
app.homepage_url required | string | null | |
app.origin required | string | custom: made in this org; directory: from a listing (Phase 3). One of: custom, directory. |
bot_user required | User | |
bot_handle required | string | What people @mention it by. |
scopes required | array of string | |
status required | string | [object Object] |
installed_at required | string (date-time) | |
installed_by required | null | User | |
channel_ids required | array of string |
Member
RoleRef
| Field | Type | Description |
|---|---|---|
id required | string | |
name required | string | |
color required | string | null |
Role
| Field | Type | Description |
|---|---|---|
id required | string | |
name required | string | |
color required | string | null | |
position required | integer | |
member_count required | integer |
Attachment
| Field | Type | Description |
|---|---|---|
id required | string | |
file_name required | string | |
content_type required | string | |
size required | integer | Bytes. |
url required | string | null | A short-lived download path signed for this credential (relative to the API host); null for apps. |
download_url required | string | The file with this credential's own bearer token: GET /v1/attachments/{id}/content (needs messages:read). Apps download this way. |
Upload
| Field | Type | Description |
|---|---|---|
id required | string | Pass in attachment_ids when posting a message. |
file_name required | string | |
content_type required | string | |
size required | integer | Bytes. |
created_at required | string (date-time) | |
download_url required | string | Readable by the uploader until it is attached; then by whoever may read the channel. |
Reaction
| Field | Type | Description |
|---|---|---|
emoji required | string | |
count required | integer | |
me required | boolean | You reacted with this. |
user_ids required | array of string |
ActionRow
Discord's v1 action row (type: 1) holding up to five buttons (type: 2; styles 1 primary, 2 secondary, 3 success, 4 danger, 5 link with an https url) or exactly one select menu (type 3 string with options, 5 users, 6 roles, 8 channels; min_values 0–25, max_values 1–25). At most five rows; every custom_id 1–100 characters and unique in the message; labels at most 80 characters; disabled: true greys a component out. Apps only. A click is a signed interaction (type: 3) to the app's interactions URL; components of an app that left the channel, is paused or was uninstalled read disabled.
| Field | Type | Description |
|---|---|---|
type required | integer | One of: 1. |
components required | array of object | At most 5 items. |
Embed
A card under a message (Discord's embed subset: title, description, url, color, author, fields, image, thumbnail, footer, timestamp). Link previews have kind: "link"; images carry a proxy_url.
A JSON object; the operation that uses it describes its fields.
Message
| Field | Type | Description |
|---|---|---|
id required | string | |
channel_id required | string | |
author required | any | |
webhook_id required | string | null | Set when an incoming webhook posted it. |
acting_user_id required | string | null | A post by the org's system author made for a person (their poll, their crosspost): that person's id. Null otherwise. |
content required | string | The text (Markdown). |
embeds required | array of Embed | |
components required | array of ActionRow | |
attachments required | array of Attachment | |
reactions required | array of Reaction | |
reply_to required | string | null | The message this one replies to (a thread). |
reply_count required | integer | |
pinned required | boolean | |
created_at required | string (date-time) | |
edited_at required | string (date-time) | null |
NewMessage
| Field | Type | Description |
|---|---|---|
content | string | 1–20000 characters. Required unless the message has files, or an app sends embeds or components. At most 20000 characters. |
reply_to | string | Reply in the thread of this message (same channel). |
attachment_ids | array of string | Up to 10 files this same credential uploaded with POST /v1/orgs/{orgId}/files to this org and hasn't attached yet. At most 10 items. |
embeds | array of Embed | |
components | array of ActionRow | |
allowed_mentions | object | Apps only. Which @mentions notify anyone (Discord's rules). Absent: @user mentions count; @everyone, @here and roles don't. |
allowed_mentions.parse | array of string | One of: users, roles, everyone. |
allowed_mentions.users | array of string | |
allowed_mentions.roles | array of string |
SearchHit
| Field | Type | Description |
|---|---|---|
channel required | object | |
channel.id required | string | |
channel.name required | string | |
channel.type required | string | text, private, voice, dm, group or meal_train. |
snippet required | string | The matching words in context, marked «like this». |
message required | Message |
MessageEdit
Reactions
| Field | Type | Description |
|---|---|---|
reactions required | array of Reaction |
NewChannel
| Field | Type | Description |
|---|---|---|
name required | string | Lowercase letters, numbers and hyphens. |
topic | string | |
category_id | string | |
kind | string | The channel type (default chat). Each type needs the plan feature and the workspace switch that the app's create card asks for. One of: chat, prayer, flashcards, table, forum, lfg, bible_study. |
Category
| Field | Type | Description |
|---|---|---|
id required | string | |
name required | string | |
position required | integer | |
workspace_kind required | string | null | A workspace category's kind (an outside party's workspace, a client portal), or null. |
portal_id required | string | null | The client portal over this category, if any. |
group_id required | string | null | The sidebar group holding it, if any. |
channel_ids required | array of string |
CategoryList
| Field | Type | Description |
|---|---|---|
data required | array of Category | |
groups required | array of object | |
groups[].id required | string | |
groups[].name required | string | |
groups[].position required | integer | |
can_organise required | boolean | Whether this person may group and order categories. |
next_cursor required | null |
CategoryGroup
| Field | Type | Description |
|---|---|---|
id required | string | |
name required | string | |
position required | integer | |
category_ids required | array of string |
FlashcardCardInput
| Field | Type | Description |
|---|---|---|
kind | string | basic (front / back) or cloze (front holds {{c1::…}} gaps; back is extra notes). One of: basic, cloze. |
front required | string | |
back | string | |
tags | array of string | |
reversed | boolean | A basic card also asked back to front. |
FlashcardCard
| Field | Type | Description |
|---|---|---|
id required | string | |
kind required | string | |
front required | string | |
back required | string | |
tags required | array of string | |
reversed required | boolean | |
created_at required | string (date-time) |
FlashcardDeck
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
channel_id required | string | |
name required | string | |
description required | string | null | |
new_per_day required | integer | |
cards required | integer | How many notes the deck holds. |
created_at required | string (date-time) | |
updated_at required | string (date-time) |
QuizQuestion
| Field | Type | Description |
|---|---|---|
prompt required | string | |
options required | array of string | |
correct_index required | integer | Which option is right (0-based). |
time_limit_seconds | integer | 5–300 (default 20). |
points | integer | 10–10,000 (default 1,000). |
Quiz
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
title required | string | |
created_at required | string (date-time) | |
updated_at required | string (date-time) | |
questions required | array of any | |
host_url required | string | Where an Owner or Admin hosts it live (hosting stays in the app). |
BibleStudy
The channel's settings, its plans (each with today's reading and group counts), can_manage. Counts only: never who has read.
A JSON object; the operation that uses it describes its fields.
BiblePlan
One reading plan: id, title, kind, status, start date, total days, today's day and reading, group counts.
A JSON object; the operation that uses it describes its fields.
VerseText
The passage: reference, translation, verses and the copyright line (always shown).
A JSON object; the operation that uses it describes its fields.
EventInput
An Events-page event, as the editor takes it (a create needs title, starts_at and ends_at; an update any of them). The title, summary, description and location pass the word filter.
| Field | Type | Description |
|---|---|---|
title | string | |
starts_at | string (date-time) | |
ends_at | string (date-time) | |
all_day | boolean | |
time_zone | string | null | An IANA name, like America/Chicago. |
summary | string | null | |
description | string | null | Markdown (sealed at rest in encrypted workspaces). |
location | string | null | |
online_url | string | null | https only. |
listed | boolean | Shown in the Events page list (default true). |
category_id | string | null | |
place_id | string | null | |
department_id | string | null | |
audience | string | One of: everyone, chosen. |
audience_department_ids | array of string | |
audience_role_ids | array of string | |
organiser_ids | array of string | |
signup | object | Sign-up settings: mode (none | form | external), external_url, capacity, max_party_size, waitlist, opens_at, closes_at, cancel_until, min_age, show_attendees, reminder_hours, form (the questions). Missived never takes payments. |
OrgEvent
An Events-page event as the caller sees it: id, org_id, title, times, place, published / cancelled, audience, can_manage, sign-up counts (never who signed up or anyone's answers), and for its organisers signup_settings.
A JSON object; the operation that uses it describes its fields.
Poll
| Field | Type | Description |
|---|---|---|
id required | string | |
channel_id required | string | |
message_id required | string | The poll's card in the channel. |
question required | string | |
options required | array of string | |
max_votes required | integer | |
is_secret required | boolean | |
ends_at required | string (date-time) | null |
ScheduledMessage
| Field | Type | Description |
|---|---|---|
id required | string | |
channel_id required | string | |
content required | string | Only in the create answer. |
scheduled_at required | string (date-time) | |
reply_to required | string | null | |
status required | string | scheduled, sent, failed or cancelled. |
PrayerRequest
| Field | Type | Description |
|---|---|---|
id required | string | |
channel_id required | string | |
who required | string | |
request required | string | |
anonymous required | boolean | Never named, to anyone. |
status required | string | |
created_at required | string (date-time) |
PendingConfirmation
§DY C2b: the request waits for the person to confirm in Missived (signed in, on confirm_url) — the workspace's Owner asked for that, or it shares a category. Nothing has happened yet; no credential can confirm it. 24 hours.
| Field | Type | Description |
|---|---|---|
status required | string | One of: pending_confirmation. |
action_id required | string | |
org_id | string | |
confirm_url required | string | |
expires_at required | string (date-time) | |
summary required | string | What will happen, in words. |
step_up | boolean | Confirming asks for the person's password. |
ClientPortal
A portal as the firm sees it: id, org_id, category_id, name, kind, status, lead_user_id, lead_name, messages_channel_id, internal_channel_id (Firm only), contacts, pending_invites, manage; on one portal also settings, staff (names), contact_list and invites (names and dates — never an email address).
A JSON object; the operation that uses it describes its fields.
Recording
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
kind required | string | voice (a voice channel or Stage) or meeting. |
channel_id required | string | null | |
meeting_id required | string | null | |
where required | string | The channel's or meeting's name as it is now. |
status required | string | recording, sealing (being saved) or ready. |
video required | boolean | Video was recorded as well as sound. |
started_at required | string (date-time) | |
ended_at required | string (date-time) | null | |
duration_seconds required | integer | null | |
bytes required | integer | |
started_by_name required | string | null | Who started it (a name, never an email). |
expires_at required | string (date-time) | null | When the workspace's retention deletes it; null when kept (pinned) or not ready. |
pinned required | boolean | Kept past the retention period. |
download_url required | string | null | The sound (Ogg Opus), signed for you; null until ready. Works until download_expires_at; access is checked again when fetched. |
video_download_url required | string | null | The video (MP4) when there is one, signed like download_url. |
download_expires_at required | string (date-time) | null | When the download links stop working (30 minutes at most). |
PortalRequest
id, portal_id, title, note, internal_note (staff only), due_on, status, assignees, reminders, items (id, kind, label, required, config, status, answer), created_at, completed_at.
A JSON object; the operation that uses it describes its fields.
BookingPage
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
host_user_id required | string | |
handle required | string | The last part of the page's link. |
display_name required | string | |
time_zone required | string | The host's IANA zone. |
published required | boolean | |
url required | string | null | The public link; null until the workspace has a link name. |
BookingEventType
| Field | Type | Description |
|---|---|---|
id required | string | |
page_id required | string | |
name required | string | |
slug required | string | |
description required | string | null | |
lengths_minutes required | array of integer | |
location_kind required | string | missived (a Missived meeting), phone_booker, phone_host, in_person or link. |
active required | boolean | |
offered_to_client_portals required | boolean | |
url required | string | null | The event type's public link. |
Booking
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
event_type_id required | string | null | Null once the event type was deleted. |
event_type_name required | string | |
host_user_id required | string | |
host_name required | string | The host's workspace name. |
start required | string (date-time) | |
end required | string (date-time) | |
status required | string | confirmed or cancelled. |
location_kind required | string | |
source required | string | page, portal or assistant. |
portal_id required | string | null | |
cancelled_by required | string | null | booker or host. |
meeting_id required | string | |
created_at required | string (date-time) | |
booker required | object | null | Null after the booker asked to be forgotten. email only when the workspace's Owner turned on "Include bookers' email addresses in events and the API". |
booker.name required | string | null | |
booker.time_zone required | string | null | |
booker.email | string | null | |
booker.answers required | array of object | |
booker.answers[].question_id required | string | |
booker.answers[].label required | string | |
booker.answers[].value required | string |
KnowledgePage
| Field | Type | Description |
|---|---|---|
id required | string | |
title required | string | |
published required | boolean | |
open_status required | string | null | draft, submitted or null. |
pending_review required | boolean | |
updated_at required | string (date-time) |
Meeting
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
title required | string | |
agenda required | string | null | |
status required | string | scheduled, live, ended or cancelled. |
room_type required | string | |
start_time required | string (date-time) | |
end_time required | string (date-time) | |
time_zone required | string | null | |
organizer required | null | object | |
organizer.id required | string | |
organizer.name required | string | null | |
my_role required | string | organizer, invitee or approver. One of: organizer, invitee, approver. |
rsvp required | string | null | Your answer as an invitee. |
join_url required | string | null | The meeting's page in the web app. |
created_at required | string (date-time) | |
updated_at required | string (date-time) |
Shift
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
schedule required | object | |
schedule.id required | string | |
schedule.name required | string | |
label required | string | null | |
notes required | string | null | |
starts_at required | string (date-time) | |
ends_at required | string (date-time) | |
break_minutes required | integer | |
position required | string | null | |
event required | null | object | |
event.id required | string | |
event.name required | string | |
published_at required | string (date-time) | null |
ScheduleEvent
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
name required | string | |
location required | string | null | |
notes required | string | null | |
starts_at required | string (date-time) | |
ends_at required | string (date-time) | |
published_at required | string (date-time) | null | |
updated_at required | string (date-time) |
MeetingInviteeInput
Give user_id or email. The organiser is never an invitee.
| Field | Type | Description |
|---|---|---|
user_id | string | A member of this org. |
email | string | Anyone's address. A member's address becomes that member; anyone else is an outside guest (the org's meeting settings decide who may invite them). |
name | string | A display name for an outside guest. At most 100 characters. |
role | string | One of: participant, co_host. Default "participant". |
NewMeeting
| Field | Type | Description |
|---|---|---|
title required | string | At most 200 characters. |
agenda | string | At most 5000 characters. |
start_time required | string | ISO 8601 with a time zone; at most five minutes in the past, two years ahead. |
duration_minutes required | integer | 5–1440. From 5 to 1440. |
time_zone required | string | IANA zone, e.g. America/New_York (how invites show the time). |
room_type | string | general (its own room) or personal_office (members only). One of: general, personal_office. Default "general". |
invitees | array of MeetingInviteeInput | At most 200 items. |
send_invites | boolean | Email invites (with an .ics) now. false: add them quietly. Default true. |
MeetingPatch
| Field | Type | Description |
|---|---|---|
title | string | At most 200 characters. |
agenda | string | null | At most 5000 characters. |
start_time | string | ISO 8601. Only before the meeting starts. |
duration_minutes | integer | From 5 to 1440. |
time_zone | string | |
room_type | string | One of: general, personal_office. |
notify | boolean | Email invitees an update (or reschedule) and fire meeting.updated. false: change quietly. Default true. |
MeetingInviteesReplace
| Field | Type | Description |
|---|---|---|
invitees required | array of MeetingInviteeInput | The whole list: people left out are uninvited (and sent a cancellation). At most 200 items. |
notify | boolean | Default true. |
MeetingInvitee
| Field | Type | Description |
|---|---|---|
id required | string | |
user_id required | string | null | |
email required | string | |
name required | string | |
external required | boolean | |
role required | string | One of: participant, co_host. |
rsvp required | string | needs_action, accepted, declined or tentative. |
MeetingCancel
| Field | Type | Description |
|---|---|---|
reason | string | null | At most 500 characters. |
notify | boolean | Default true. |
NewTask
| Field | Type | Description |
|---|---|---|
title required | string | At most 500 characters. |
notes | string | At most 5000 characters. |
due_at | string | ISO 8601. |
remind_at | string | ISO 8601: a reminder in the app then. |
Task
| Field | Type | Description |
|---|---|---|
id required | string | |
title required | string | |
notes required | string | null | |
status required | string | |
due_at required | string (date-time) | null | |
remind_at required | string (date-time) | null | |
completed_at required | string (date-time) | null | |
created_at required | string (date-time) |
AuditEventPage
| Field | Type | Description |
|---|---|---|
data required | array of object | |
next_cursor required | string | null | |
has_more required | boolean |
LegacyObject
A JSON object; the operation that uses it describes its fields.
IncomingWebhook
| Field | Type | Description |
|---|---|---|
id required | string | |
name required | string | |
avatar_url required | string | null | |
avatar_proxy_url required | string | null | |
channel required | object | |
channel.id required | string | |
channel.name required | string | null | |
token_last_four required | string | null | The URL token's last four characters (the URL itself is shown once). |
github_secret_set required | boolean | |
source required | null | string | What it was made for (BN31). Every URL works whichever it is. |
providers required | array of object | Services with a pasted signing secret. |
providers[].provider required | string | gitlab, sentry, linear, stripe or pagerduty |
providers[].signing_hint required | string | null | The pasted secret's last four characters. |
providers[].legacy_hint required | string | null | GitLab's older secret token, last four. |
providers[].updated_at required | string (date-time) | |
paused required | boolean | |
paused_at required | string (date-time) | null | |
paused_reason required | string | null | |
last_used_at required | string (date-time) | null | |
post_count required | integer | |
created_at required | string (date-time) | |
rotated_at required | string (date-time) | null | |
created_by required | null | object | |
created_by.id required | string | |
created_by.label required | string | |
created_by.is_member required | boolean | |
created_by_token required | null | object | Set when an API token made it. |
created_by_token.id required | string |
IncomingWebhookList
| Field | Type | Description |
|---|---|---|
webhooks required | array of IncomingWebhook | |
cap required | integer | The plan's limit. |
githubAvailable required | boolean | This server can store GitHub secrets. |
providersAvailable required | boolean | This server can store the services' signing secrets (BN31). |
formatters required | array of string | The services with their own URL suffix. |
IncomingWebhookDraft
| Field | Type | Description |
|---|---|---|
name required | string | 1–80 characters; also the bot's name. At most 80 characters. |
channelId required | string | A text channel of this org (an app: one it was added to). |
avatarUrl | string | null | An https:// image URL. |
source | string | null | What it's made for: discord, slack, github, gitlab, sentry, linear, stripe or pagerduty (BN31). |
IncomingWebhookPatch
| Field | Type | Description |
|---|---|---|
name | string | At most 80 characters. |
channelId | string | |
avatarUrl | string | null | |
paused | boolean |
IncomingWebhookCreated
| Field | Type | Description |
|---|---|---|
webhook required | IncomingWebhook | |
url required | string | The full URL to post to (Discord's execute-webhook format; /slack and /github after it for those formats). Shown once. |
path required | string | The same, without the API's origin. |
githubSecret required | string | null | The secret for GitHub's webhook settings; null when this server can't store one. |
EventSubscription
| Field | Type | Description |
|---|---|---|
id required | string | |
name required | string | null | |
url required | string | Where deliveries go (https, public internet). |
secret required | string | Masked: the last four characters. The secret is shown once, on create and rotate. |
ed25519_public_key required | string | null | Set when the subscription also signs with Ed25519 (v1a). |
static_header required | object | null | |
static_header.name required | string | |
event_types required | array of string | |
channel_ids required | array of string | null | null = every channel the subscriber may see; a private channel's events only reach a subscription listing it. |
payload_mode required | string | null | This subscription's choice (thin | full); null = the org's default. One of: thin, full, null. |
effective_payload_mode required | string | What deliveries carry after the org's rule (D5). One of: thin, full. |
enabled required | boolean | |
paused_reason required | string | null | Why it is off: the circuit breaker, unopenable secrets, or the receiver's 410 Gone. |
dropped_count required | integer | Events skipped because the subscription was over its per-minute budget. |
created_at required | string (date-time) | |
updated_at required | string (date-time) | |
created_by required | object | null | |
created_by.id required | string | |
created_by.label required | string | |
created_by.is_member required | boolean | |
created_by_token required | object | null | Set when an API token made it (a REST hook). |
created_by_token.id required | string | |
created_by_token.name required | string | |
deliveries | object | Present on reads. |
deliveries.last_delivered_at required | string (date-time) | null | |
deliveries.last_attempt_at required | string (date-time) | null | |
deliveries.delivered_24h required | integer | |
deliveries.failed_24h required | integer | |
deliveries.pending required | integer |
EventSubscriptionDraft
| Field | Type | Description |
|---|---|---|
url required | string | https only, on the public internet. |
name | string | null | |
event_types | array of string | |
channel_ids | array of string | null | |
payload_mode | string | null | One of: thin, full, null. |
asymmetric | boolean | Also sign with Ed25519; the public key is returned once. |
static_header | object | null | An extra header on every delivery; the value is stored sealed and never shown again. |
static_header.name required | string | |
static_header.value required | string |
EventSubscriptionPatch
| Field | Type | Description |
|---|---|---|
url | string | |
name | string | null | |
event_types | array of string | |
channel_ids | array of string | null | |
payload_mode | string | null | One of: thin, full, null. |
enabled | boolean | Pause / resume (resuming clears the circuit breaker). |
rotate_secret | boolean | Issue a new signing secret; the old one keeps verifying until the next rotation. |
EventSubscriptionCreated
| Field | Type | Description |
|---|---|---|
data required | EventSubscription | |
secret required | string | The whsec_ signing secret, shown only here. |
ed25519_public_key | string |
EventSubscriptionPage
| Field | Type | Description |
|---|---|---|
data required | array of EventSubscription | |
cap required | integer | The plan's cap on event subscriptions. |
next_cursor required | string | null |
EventSubscriptionResult
| Field | Type | Description |
|---|---|---|
data required | EventSubscription | |
secret | string | Only after rotate_secret. |
EventDelivery
| Field | Type | Description |
|---|---|---|
id required | string | |
event_id required | string | The event's id, also the webhook-id header. |
event_type required | string | null | |
status required | string | One of: pending, retrying, delivered, dead. |
attempts required | integer | |
last_status_code required | integer | null | |
last_error required | string | null | |
next_attempt_at required | string (date-time) | null | |
created_at required | string (date-time) | |
delivered_at required | string (date-time) | null |
EventEnvelope
| Field | Type | Description |
|---|---|---|
id required | string | The event id (webhook-id). |
type required | string | A catalogue name, domain.verb. |
timestamp required | string (date-time) | |
org_id required | string | |
payload required | string | full carries the content part; thin leaves it out (D5). One of: thin, full. |
data required | object | Per type; see docs/OUTGOING_EVENTS.md. |
EventsSettings
| Field | Type | Description |
|---|---|---|
encrypted required | boolean | The org's content is encrypted at rest (every org since decision 85). Payloads are thin by default only where an Owner chose encryption before then. |
include_content required | boolean | null | The Owner's explicit choice; null = the default rule. |
effective required | string | One of: thin, full. |
can_change required | boolean | Only an Owner may change it. |
EventCatalog
| Field | Type | Description |
|---|---|---|
data required | array of object | |
data[].id required | string | |
data[].group required | string | |
data[].has_content required | boolean | |
globs required | array of string | |
payload required | string |
ReplayResult
| Field | Type | Description |
|---|---|---|
queued required | integer | |
truncated required | boolean | The window had more than 1 000 events; narrow it. |
window required | object | |
window.since required | string (date-time) | |
window.until required | string (date-time) |
Table
| Field | Type | Description |
|---|---|---|
id required | string | The handle: a Table's id, or a shared view's (then kind is view and everything here is the view's). |
org_id required | string | |
channel_id required | string | The channel that draws it (a view has its own channel). |
name required | string | |
kind required | string | A Table, or a shared view of one. One of: table, view. |
version required | integer | Bumped on every change to the Table; rows read at this version carry it. |
row_count required | integer | Rows this credential sees. |
can_edit required | boolean | This credential may change cells. |
can_add_rows required | boolean | |
can_delete_rows required | boolean | |
updated_at required | string (date-time) | |
columns required | array of TableColumn |
TableColumn
| Field | Type | Description |
|---|---|---|
id required | string | Stable across renames; rows' cells are keyed by it. |
name required | string | Unique within the Table (case-insensitive); rows' fields are keyed by it, and a write may name a column by it. |
type required | string | What the column holds; see TableValue for each type's JSON. One of: text, number, currency, percent, date, datetime, checkbox, select, multi_select, person, attachment, link, duration, auto_number, created_at, created_by, updated_at, updated_by, formula. |
primary required | boolean | The row's title column. |
computed required | boolean | A formula or system column: filled in by the Table, never written. |
writable required | boolean | This credential may write it (not computed, not locked for it, editable in a view). |
choices required | array of object | null | select / multi_select: the choices. Write a choice by its label (or id). |
choices[].id required | string | |
choices[].label required | string | |
currency required | string | null | currency: the ISO 4217 code. |
precision required | integer | null | Decimals shown. |
unit required | string | null | number: a unit suffix. |
TableValue
A cell in plain JSON, null when empty. text / link: string. number / currency / auto_number: number. percent: a fraction (0.45 = 45 %). duration: seconds. date: "YYYY-MM-DD". datetime, created_at, updated_at: ISO 8601 UTC. checkbox: boolean. select: the choice's label; multi_select: an array of labels. person, created_by, updated_by: an array of { id, name, email } (email null for apps). attachment: an array of { id, file_name, file_type, file_size, download_url }. formula: its result in the shape above, or { "error": "#DIV/0!" }. Writing takes the same shapes, or text the column reads ("12", "45%", "3/4/2026", "yes", a choice's label, "1h 30m"); a person by id, { id } or (people's credentials only) email.
Type: any.
TableRow
| Field | Type | Description |
|---|---|---|
id required | string | |
table_id required | string | The handle the row was read through. |
version required | integer | The Table's version when this row was read. Send it as If-Match: "<version>" on a change: if any cell you send changed since, the answer is 409 row_changed and nothing is written. |
created_at required | string (date-time) | |
updated_at required | string (date-time) | |
created_by required | string | null | A user id. |
updated_by required | string | null | A user id. |
cells required | object | Every column this credential sees, by column id. |
fields required | object | The same values by column name (handy in no-code tools). |
ForumAuthor
| Field | Type | Description |
|---|---|---|
id required | string | null | A user id (null once the account is gone). |
name required | string | |
kind required | string | One of: human, bot, system. |
ForumPostSummary
| Field | Type | Description |
|---|---|---|
id required | string | |
channel_id required | string | |
message_id required | string | The opening message: reply with reply_to set to it; read replies at …/messages/{message_id}/replies. |
title required | string | |
excerpt required | string | The question's first words, plain text. |
author required | ForumAuthor | |
tag_ids required | array of string | |
status required | string | One of: open, solved, closed. |
replies_locked required | boolean | |
pinned required | boolean | A guide, shown above the list. |
reply_count required | integer | |
helpful_count required | integer | |
has_answer required | boolean | |
created_at required | string (date-time) | |
last_activity_at required | string (date-time) |
ForumMessageBrief
| Field | Type | Description |
|---|---|---|
message_id required | string | |
author required | ForumAuthor | |
content required | string | |
created_at required | string (date-time) | |
edited_at required | string (date-time) | null | |
attachment_count required | integer | Read the files from the message itself (GET /v1/channels/{channelId}/messages/{messageId}). |
helpful_count required | integer |
ForumPost
Type: any.
ForumPostInput
| Field | Type | Description |
|---|---|---|
title required | string | Required, 3–120 characters. At most 120 characters. |
content required | string | The question (markdown). At most 8000 characters. |
tag_ids | array of string |
ForumPostPatch
| Field | Type | Description |
|---|---|---|
title | string | At most 120 characters. |
tag_ids | array of string | |
solved | boolean | Solved without an answer, or back to open. |
UpsertedTableRow
Type: any.
TableRowInput
| Field | Type | Description |
|---|---|---|
cells required | object | Values by column id or name. Leave a column out to leave it as it is; null clears it. Computed and locked columns refuse writes. |
Workflow
| Field | Type | Description |
|---|---|---|
id required | string | |
name required | string | |
description required | string | null | |
status required | string | One of: draft, live, paused. |
paused_reason required | string | null | Why it stopped: person, failing, owner_lost_access, owner_left, plan, feature_off, billing or shared_channel. |
trigger_kind required | string | manual, form, event, schedule or webhook. |
owner required | object | null | |
owner.id | string | |
owner.name | string | |
live_version required | integer | null | |
draft_rev required | integer | Send it back when you save or publish. |
has_draft_changes required | boolean | |
runs_this_month required | integer | |
last_run required | object | null | |
last_run.status | string | |
last_run.at | string (date-time) | |
may_edit required | boolean | |
may_run required | boolean | You may run it by hand (a live manual or form workflow shared with you). |
updated_at required | string (date-time) |
WorkflowProblem
| Field | Type | Description |
|---|---|---|
code required | string | |
message required | string | |
node | string | The node it's about. |
path | string | Where in the node. |
WorkflowDetail
Type: any.
WorkflowRun
| Field | Type | Description |
|---|---|---|
id required | string | |
workflow_id required | string | |
workflow_name required | string | |
version required | integer | null | |
status required | string | One of: queued, running, waiting, succeeded, failed, cancelled, timed_out, skipped. |
test required | boolean | A test run: writes were simulated. |
trigger_kind required | string | |
trigger_summary required | string | |
started_by required | object | null | |
started_by.id | string | |
started_by.name | string | |
step_count required | integer | |
started_at required | string (date-time) | |
finished_at required | string (date-time) | null | |
error_code required | string | null |
WorkflowRunDetail
Type: any.
DashboardSummary
| Field | Type | Description |
|---|---|---|
id required | string | The dashboard's channel id. |
org_id required | string | |
name required | string | |
topic required | string | null | |
category_id required | string | null | |
widgets required | integer | |
layout_rev required | integer | Send it as If-Match when you arrange. |
arrange required | boolean | You may add, change, remove and arrange widgets. |
read_only required | boolean | The dashboards feature is off here, or the plan no longer has it: you can still read and remove. |
DashboardWidget
| Field | Type | Description |
|---|---|---|
id required | string | |
kind required | string | A native kind (portal_waiting, bookings, …), or push / pull / connector / app for connected widgets. |
source required | string | native, api, push, pull or connector. One of: native, api, push, pull, connector. |
title required | string | null | Null = the kind's own name. |
settings_rev required | integer | Changes with each title / settings change. |
settings | object | Arrangers only: the widget's settings. |
note | string | null | Arrangers only, for a Notes widget. |
push | object | Arrangers only, a webhook widget: format, shape, last received. Never the address. |
pull | object | Arrangers only, a watched address: host, source, every, last checked. Never the full address. |
api | object | Arrangers only, an API widget: its shape and who feeds it (app, assistant, token or session). |
data required | object | What the widget shows YOU: status ok / empty / hidden / locked / error, and the rows or shape payload. Every number is from what you can open yourself. |
Dashboard
| Field | Type | Description |
|---|---|---|
id required | string | |
org_id required | string | |
name required | string | null | |
topic required | string | null | |
layout_rev required | integer | |
arrange required | boolean | |
read_only required | boolean | |
widget_cap required | integer | How many widgets the plan allows on one dashboard. |
items required | array of DashboardLayoutItem | |
widgets required | array of DashboardWidget |
DashboardLayoutItem
| Field | Type | Description |
|---|---|---|
widget_id required | string | |
w required | integer | Columns of 12: 3, 4, 6, 8 or 12. |
h required | integer | Rows: 1, 2 or 3. |
WidgetShape
One of the fixed shapes — stat, status, list, bars, table or card — each with its own fields only (see GET /v1/widget-types for each shape's JSON schema and limits). Unknown fields such as html, script or style are refused: widgets draw no markup.
A JSON object; the operation that uses it describes its fields.
WidgetInput
| Field | Type | Description |
|---|---|---|
kind | string | A native kind from GET /v1/widget-types (leave source out). |
source | string | api (fed by POST /v1/widgets/{id}/data), push (a webhook address — waits for the person when a token asks), pull (a watched https address — waits too) or connector. One of: api, push, pull, connector. |
shape | string | For source: api: stat, status, list, bars, table or card. |
title | string | null | At most 60 characters. |
settings | object | The kind's settings (native), { format, shape? } (push) or { source, every, … } (pull). |
note | string | null | A Notes widget's text (markdown, at most 2,000 characters; passes the word filter). |
secret | string | push: the sending service's signing secret, when its format needs one. |
url | string | pull: the https address to watch. |
connector_id | string | connector: a connector the workspace already runs. |
WebhookTestResult
| Field | Type | Description |
|---|---|---|
request required | object | |
request.url required | string | |
request.headers required | object | |
request.body required | object | |
response required | object | { status, body } from the receiver, or { status: null, error }. |