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.

Responses
StatusMeaningBody
200OKMe (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)

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.

Parameters
NameInTypeDescription
org_idquerystringOptional reachable org for its week start; selected automatically when only one is reachable.
time_zonequerystringIANA zone explicitly supplied by the person. At most 100 characters.
Responses
StatusMeaningBody
200OKMyContext (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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).

Responses
StatusMeaningBody
200OKMyActivity (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The 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.

Request body fields
FieldTypeDescription
kind requiredstringOne of live, playing, listening, watching, custom. One of: live, playing, listening, watching, custom.
name requiredstringThe service or game, up to 80 characters. At most 80 characters.
detailstring | nullOptional second line, up to 120 characters. At most 120 characters.
urlstring | nullOptional https link.
started_atstring (date-time) | nullOptional: when it began (clamped to now).
ttl_secondsintegerHow 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.
Responses
StatusMeaningBody
200OKMyActivity (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)

Clear your activity line

DELETE /v1/me/activity

Needs: presence:write

Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
cleared requiredbooleanWhether there was a line to clear.

Orgs

Orgs this credential may act in

GET /v1/orgs

Needs: identify (every token has it)

Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Org
next_cursor requiredstring | nullPass as cursor for the next page; null when there is none.

One org

GET /v1/orgs/{orgId}

Needs: identify (every token has it)

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKOrg (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
add_wordsarray of string
remove_wordsarray of string
add_allowedarray of string
remove_allowedarray of string
profanityboolean
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
org_id requiredstring
profanity requiredboolean
blocked_words requiredinteger
allowed_words requiredinteger
added requiredinteger
removed requiredinteger
allowed_added requiredinteger
allowed_removed requiredinteger

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
category_id requiredstring
user_id requiredstring
role_id requiredstring
ends_atstringISO 8601.
notestringAt most 500 characters.
Responses
StatusMeaningBody
201Handed offobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (201)
FieldTypeDescription
id requiredstring
org_id requiredstring
category_id requiredstring
role_id requiredstring
user_id requiredstring
starts_at requiredstring (date-time)
ends_at requiredstring (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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of object
data[].id requiredstring
data[].status requiredstring
data[].role requiredstringhost or partner.
data[].category_name requiredstring
data[].local_category_id requiredstring | null
data[].other_org requiredobject
data[].since requiredstring (date-time)
data[].paused_reason requiredstring | null
data[].request requiredobject
data[].channels requiredarray of object
data[].channels[].id requiredstring
data[].channels[].name requiredstring

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
category_id requiredstring
why requiredstring10–500 characters; the other side sees it.
partner_name requiredstringFull name supplied by the person, 1–200 characters.
company_name requiredstringPartner workspace display name supplied by the person, 1–200 characters.
emailstring
codeboolean
Responses
StatusMeaningBody
201Invitation created; partner acceptance still required.object (application/json)
202Ask-first: waits for the person to confirm in Missived.PendingConfirmation (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (201)
FieldTypeDescription
status requiredstringOne of: invitation_created.
share_id requiredstring
summary requiredstring
fingerprint requiredstring
codestringOne-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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
id requiredstring
org_id requiredstring
kind requiredstring
status requiredstring
summary requiredstring
step_up requiredboolean
created_at requiredstring (date-time)
expires_at requiredstring (date-time)
decided_at requiredstring (date-time)
confirm_url requiredstringWhile 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).

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of object
data[].key requiredstring
data[].name requiredstring
data[].group requiredstring
data[].in_plan requiredboolean
data[].switched_off requiredboolean
data[].on requiredboolean
data[].plans requiredarray 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
features requiredobjectFeature key → true (on) or false (off).
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
changed requiredarray of object
changed[].key requiredstring
changed[].on requiredboolean
data requiredarray of object
data[].key requiredstring
data[].name requiredstring
data[].in_plan requiredboolean
data[].switched_off requiredboolean
data[].on requiredboolean

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).

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Channel
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
name requiredstringLowercase letters, numbers and hyphens.
topicstring
category_idstring
kindstringThe 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.
Responses
StatusMeaningBody
201CreatedChannel (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked (the word filter), plan_required, feature_off, limit_reached (a per-org cap), or the usual scope / org refusals.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)

One channel

GET /v1/channels/{channelId}

Needs: channels:read

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Responses
StatusMeaningBody
200OKChannel (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
namestring
topicstring | null
Responses
StatusMeaningBody
200OKChannel (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Responses
StatusMeaningBody
204DeletedNo body
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409shared_channel.Error (application/json)

Who can see a channel

GET /v1/channels/{channelId}/members

Needs: members:read

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
limitqueryintegerPage size, 1–100. From 1 to 100. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of ChannelMember
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKCategoryList (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
name requiredstring
Responses
StatusMeaningBody
201CreatedCategory (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, or the usual scope / org refusals.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
categoryId requiredpathstringA category id.
Responses
StatusMeaningBody
204DeletedNo body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409portal_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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
name requiredstring
category_idsarray of string
Responses
StatusMeaningBody
201CreatedCategoryGroup (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, or the usual scope / org refusals.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409limit_reached: the workspace has the most groups it can.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of AppInstall
next_cursor requiredstring | nullPass 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)

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
installId requiredpathstringAn app install id (from GET /v1/orgs/{orgId}/apps).
Responses
StatusMeaningBody
200OKAppInstall (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
installId requiredpathstringAn app install id (from GET /v1/orgs/{orgId}/apps).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Channel
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
installId requiredpathstringAn app install id (from GET /v1/orgs/{orgId}/apps).
Responses
StatusMeaningBody
200OKAppInstall (application/json)
201AddedAppInstall (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
installId requiredpathstringAn app install id (from GET /v1/orgs/{orgId}/apps).
Responses
StatusMeaningBody
204RemovedNo body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Command
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): CommandDraft.

Request body fields
FieldTypeDescription
name requiredstring^[a-z0-9_-]{1,32}$. The built-in names (shrug, tableflip, unflip, me, gif, poll) are reserved.
description requiredstring1–100 characters, shown in the picker.
optionsarray of CommandOption
permissionstringWho 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_idstring | nullOffer it in one channel only (the app must be in it); null = everywhere the app is.
Responses
StatusMeaningBody
201RegisteredCommand (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): array of CommandDraft.

Request body fields
FieldTypeDescription
[].name requiredstring^[a-z0-9_-]{1,32}$. The built-in names (shrug, tableflip, unflip, me, gif, poll) are reserved.
[].description requiredstring1–100 characters, shown in the picker.
[].optionsarray of CommandOption
[].permissionstringWho 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_idstring | nullOffer it in one channel only (the app must be in it); null = everywhere the app is.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Command
next_cursor requiredstring | nullPass 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)

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
commandId requiredpathstringA slash command id (from GET /v1/orgs/{orgId}/commands).
Responses
StatusMeaningBody
200OKCommand (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
commandId requiredpathstringA slash command id (from GET /v1/orgs/{orgId}/commands).

Request body (application/json, optional): CommandDraft.

Request body fields
FieldTypeDescription
name requiredstring^[a-z0-9_-]{1,32}$. The built-in names (shrug, tableflip, unflip, me, gif, poll) are reserved.
description requiredstring1–100 characters, shown in the picker.
optionsarray of CommandOption
permissionstringWho 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_idstring | nullOffer it in one channel only (the app must be in it); null = everywhere the app is.
Responses
StatusMeaningBody
200OKCommand (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A 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

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
commandId requiredpathstringA slash command id (from GET /v1/orgs/{orgId}/commands).
Responses
StatusMeaningBody
204RemovedNo body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
token requiredpathstringThe interaction token from the interaction payload (valid 15 minutes). It is the credential: no bearer token is needed.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
contentstring | nullThe message text (at most 20,000 characters).
embedsarray of object
componentsarray of ActionRow
flagsinteger64 (ephemeral) sends a follow-up privately to the person who invoked the interaction.
Responses
StatusMeaningBody
201PostedMessage | EphemeralMessage (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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).

Parameters
NameInTypeDescription
token requiredpathstringThe interaction token from the interaction payload (valid 15 minutes). It is the credential: no bearer token is needed.

Request body (application/json, required): InteractionReply.

Request body fields
FieldTypeDescription
contentstring | nullThe message text (at most 20,000 characters).
embedsarray of object
componentsarray of ActionRow
flagsinteger64 (ephemeral) sends a follow-up privately to the person who invoked the interaction.
Responses
StatusMeaningBody
200OKMessage | EphemeralMessage (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
404Not 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

Parameters
NameInTypeDescription
token requiredpathstringThe interaction token from the interaction payload (valid 15 minutes). It is the credential: no bearer token is needed.
Responses
StatusMeaningBody
204DeletedNo body
404Not 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (multipart/form-data, required): object.

Request body fields
FieldTypeDescription
file requiredstring (binary)
Responses
StatusMeaningBody
201Stored, pending.Upload (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
413payload_too_large (over 25 MB) or storage_full (the org's storage).Error (application/json)
415unsupported_media_type: not multipart, or a file type that can't be uploaded.Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
attachmentId requiredpathstringAn attachment id (from a message's attachments, or an upload).
Responses
StatusMeaningBody
200The file.string (binary) (application/octet-stream)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
limitqueryintegerPage size, 1–100. From 1 to 100. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
orderquerystringOne of: newest, oldest. Default "newest".
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Message
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
contentstring1–20000 characters. Required unless the message has files, or an app sends embeds or components. At most 20000 characters.
reply_tostringReply in the thread of this message (same channel).
attachment_idsarray of stringUp 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.
embedsarray of Embed
componentsarray of ActionRow
allowed_mentionsobjectApps only. Which @mentions notify anyone (Discord's rules). Absent: @user mentions count; @everyone, @here and roles don't.
allowed_mentions.parsearray of stringOne of: users, roles, everyone.
allowed_mentions.usersarray of string
allowed_mentions.rolesarray of string
Responses
StatusMeaningBody
201CreatedMessage (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)

One message

GET /v1/channels/{channelId}/messages/{messageId}

Needs: messages:read

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
messageId requiredpathstringA message id.
Responses
StatusMeaningBody
200OKMessage (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
messageId requiredpathstringA message id.

Request body (application/json, required): MessageEdit.

Request body fields
FieldTypeDescription
contentstringAt most 20000 characters.
embedsarray of Embed
componentsarray of ActionRow
Responses
StatusMeaningBody
200OKMessage (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
messageId requiredpathstringA message id.
Responses
StatusMeaningBody
204DeletedNo body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
q requiredquerystringThe words to find. At least 2 characters. At most 200 characters.
channel_idquerystringOnly this channel.
limitqueryintegerPage size, 1–50. From 1 to 50. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of SearchHit
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
messageId requiredpathstringA message id.
limitqueryintegerPage size, 1–100. From 1 to 100. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
orderquerystringOne of: newest, oldest. Default "oldest".
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Message
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
messageId requiredpathstringA message id.
emoji requiredpathstringThe emoji, URL-encoded (a Unicode emoji or a custom emoji's name).
Responses
StatusMeaningBody
200OKReactions (application/json)
201AddedReactions (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too 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

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
messageId requiredpathstringA message id.
emoji requiredpathstringThe emoji, URL-encoded (a Unicode emoji or a custom emoji's name).
Responses
StatusMeaningBody
200OKReactions (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
limitqueryintegerPage size, 1–100. From 1 to 100. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Member
next_cursor requiredstring | nullPass as cursor for the next page; null when there is none.

One member

GET /v1/orgs/{orgId}/members/{userId}

Needs: members:read

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
userId requiredpathstringA user id.
Responses
StatusMeaningBody
200OKMember (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
userId requiredpathstringA user id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
role requiredstringadmin or member.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
user_id requiredstring
name requiredstring
role requiredstring
previous_role requiredstring

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
userId requiredpathstringA user id.
Responses
StatusMeaningBody
204RemovedNo body
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
email requiredstring
rolestringmember (default), admin or guest.
category_idstringguest: the workspace category.
Responses
StatusMeaningBody
201Sentobject (application/json)
202Waits for the person to confirm in Missived (the workspace asks first).PendingConfirmation (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, member_limit, guest seat refusals.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (201)
FieldTypeDescription
sent_to requiredstring
role requiredstring
category_id requiredstring | null
delivered requiredbooleanWhether the email was handed to the mail service.
expires_in_days requiredinteger

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
userId requiredpathstringA user id.
roleId requiredpathstringA custom role id (from GET /v1/orgs/{orgId}/roles).
Responses
StatusMeaningBody
200OKMember (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
userId requiredpathstringA user id.
roleId requiredpathstringA custom role id (from GET /v1/orgs/{orgId}/roles).
Responses
StatusMeaningBody
200OKMember (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Role
next_cursor requiredstring | nullPass 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

Parameters
NameInTypeDescription
userId requiredpathstringA user id.
Responses
StatusMeaningBody
200OKUser (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
scopequerystringOne of: upcoming, past. Default "upcoming".
limitqueryintegerPage size, 1–50. From 1 to 50. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Meeting
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
title requiredstringAt most 200 characters.
agendastringAt most 5000 characters.
start_time requiredstringISO 8601 with a time zone; at most five minutes in the past, two years ahead.
duration_minutes requiredinteger5–1440. From 5 to 1440.
time_zone requiredstringIANA zone, e.g. America/New_York (how invites show the time).
room_typestringgeneral (its own room) or personal_office (members only). One of: general, personal_office. Default "general".
inviteesarray of MeetingInviteeInputAt most 200 items.
send_invitesbooleanEmail invites (with an .ics) now. false: add them quietly. Default true.
Responses
StatusMeaningBody
201ScheduledMeeting (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The 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

Parameters
NameInTypeDescription
meetingId requiredpathstringA meeting id.
Responses
StatusMeaningBody
200OKMeeting (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
meetingId requiredpathstringA meeting id.

Request body (application/json, optional): MeetingPatch.

Request body fields
FieldTypeDescription
titlestringAt most 200 characters.
agendastring | nullAt most 5000 characters.
start_timestringISO 8601. Only before the meeting starts.
duration_minutesintegerFrom 5 to 1440.
time_zonestring
room_typestringOne of: general, personal_office.
notifybooleanEmail invitees an update (or reschedule) and fire meeting.updated. false: change quietly. Default true.
Responses
StatusMeaningBody
200OKMeeting (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
410The 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).

Parameters
NameInTypeDescription
meetingId requiredpathstringA meeting id.

Request body (application/json, required): MeetingInviteesReplace.

Request body fields
FieldTypeDescription
invitees requiredarray of MeetingInviteeInputThe whole list: people left out are uninvited (and sent a cancellation). At most 200 items.
notifybooleanDefault true.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
410The meeting is cancelled, archived or over (meeting_cancelled, meeting_archived, meeting_ended).Error (application/json)
Response fields (200)
FieldTypeDescription
meeting requiredMeeting
invitees requiredarray 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.

Parameters
NameInTypeDescription
meetingId requiredpathstringA meeting id.

Request body (application/json, optional): MeetingCancel.

Request body fields
FieldTypeDescription
reasonstring | nullAt most 500 characters.
notifybooleanDefault true.
Responses
StatusMeaningBody
200OKMeeting (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
410The 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
fromquerystringWindow start, ISO 8601 date or date-time (default: a day ago).
toquerystringWindow end (default: 60 days after now). At most 366 days per request.
limitqueryintegerPage size, 1–100. From 1 to 100. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Shift
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
fromquerystringWindow start, ISO 8601 date or date-time (default: a day ago).
toquerystringWindow end (default: 60 days after now). At most 366 days per request.
limitqueryintegerPage size, 1–100. From 1 to 100. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of ScheduleEvent
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
title requiredstringAt most 500 characters.
notesstringAt most 5000 characters.
due_atstringISO 8601.
remind_atstringISO 8601: a reminder in the app then.
Responses
StatusMeaningBody
201CreatedTask (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The 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": "…" }.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
limitqueryintegerFrom 1 to 1000.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
sincequerystring
untilquerystring
actionquerystring
actor_idquerystring
Responses
StatusMeaningBody
200OKAuditEventPage (application/json)
400An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An 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

Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An 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

Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
201OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
deliveryId requiredpathstringA delivery id (from the delivery log).

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
202Queued.object (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
409An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
Response fields (202)
FieldTypeDescription
queued requiredboolean
deliveryId requiredstring

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKIncomingWebhookList (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): IncomingWebhookDraft.

Request body fields
FieldTypeDescription
name requiredstring1–80 characters; also the bot's name. At most 80 characters.
channelId requiredstringA text channel of this org (an app: one it was added to).
avatarUrlstring | nullAn https:// image URL.
sourcestring | nullWhat it's made for: discord, slack, github, gitlab, sentry, linear, stripe or pagerduty (BN31).
Responses
StatusMeaningBody
201Created; url / path and githubSecret are shown only here.IncomingWebhookCreated (application/json)
400An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, optional): IncomingWebhookPatch.

Request body fields
FieldTypeDescription
namestringAt most 80 characters.
channelIdstring
avatarUrlstring | null
pausedboolean
Responses
StatusMeaningBody
200OKobject (application/json)
400An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
Response fields (200)
FieldTypeDescription
webhook requiredIncomingWebhook

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKobject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
Response fields (200)
FieldTypeDescription
deleted requiredboolean

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKobject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
Response fields (200)
FieldTypeDescription
webhook requiredIncomingWebhook
path requiredstring
url requiredstring

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKobject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
503An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
Response fields (200)
FieldTypeDescription
webhook requiredIncomingWebhook
githubSecret requiredstring

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
provider requiredpathstringThe service: gitlab, sentry, linear, stripe or pagerduty.

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKobject (application/json)
400An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
503An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
Response fields (200)
FieldTypeDescription
webhook requiredIncomingWebhook

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
provider requiredpathstringThe service: gitlab, sentry, linear, stripe or pagerduty.
Responses
StatusMeaningBody
200OKobject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
Response fields (200)
FieldTypeDescription
webhook requiredIncomingWebhook

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
201OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
422An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
409An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
409An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
502An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
ref requiredquerystringA reference, e.g. John 3:16-18.
translationquerystringkjv, web, or api:<bibleId>; blank = the org's default.
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
400An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
201OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, optional): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
403An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
404An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
409An error: { "error": "…" } (these management routes predate the v1 error shape).object (application/json)
502An 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).

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKEventSubscriptionPage (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): EventSubscriptionDraft.

Request body fields
FieldTypeDescription
url requiredstringhttps only, on the public internet.
namestring | null
event_typesarray of string
channel_idsarray of string | null
payload_modestring | nullOne of: thin, full, null.
asymmetricbooleanAlso sign with Ed25519; the public key is returned once.
static_headerobject | nullAn extra header on every delivery; the value is stored sealed and never shown again.
static_header.name requiredstring
static_header.value requiredstring
Responses
StatusMeaningBody
201Created; secret is shown only here.EventSubscriptionCreated (application/json)
400Invalid input (invalid_url, invalid_event_types, invalid_channel_ids, invalid_payload_mode).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403insufficient_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

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredEventSubscription

Change, pause, resume or rotate a subscription

PATCH /v1/orgs/{orgId}/event-subscriptions/{id}

Needs: events:subscribe

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, required): EventSubscriptionPatch.

Request body fields
FieldTypeDescription
urlstring
namestring | null
event_typesarray of string
channel_idsarray of string | null
payload_modestring | nullOne of: thin, full, null.
enabledbooleanPause / resume (resuming clears the circuit breaker).
rotate_secretbooleanIssue a new signing secret; the old one keeps verifying until the next rotation.
Responses
StatusMeaningBody
200OKEventSubscriptionResult (application/json)
400Invalid input, or nothing to change (nothing_to_change).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
204Gone.No body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKWebhookTestResult (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409The 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.

Request body (application/json, optional): object.

Request body fields
FieldTypeDescription
sincestring
untilstring
Responses
StatusMeaningBody
200OKReplayResult (application/json)
400invalid_range.Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
limitqueryintegerPage size, 1–500. From 1 to 500. Default 100.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of EventDelivery
next_cursor requiredstring | 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
id requiredpathstringThe resource id.
deliveryId requiredpathstringA delivery id (from the delivery log).
Responses
StatusMeaningBody
202Queued.object (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409in_flight (still being sent) or paused (resume the subscription first).Error (application/json)
Response fields (202)
FieldTypeDescription
queued requiredboolean
delivery_id requiredstring

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
limitqueryintegerPage size, 1–200. From 1 to 200. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
typesquerystringComma-separated catalogue names or globs.
channel_idquerystring
sincequerystringISO 8601 (default 7 days ago).
untilquerystring
Responses
StatusMeaningBody
200OKobject (application/json)
400invalid_cursor, invalid_range, invalid_event_types.Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of EventEnvelope
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
eventId requiredpathstringAn event id: a delivery's id, also its webhook-id header.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredEventEnvelope

Whether outgoing events carry message content (D5)

GET /v1/orgs/{orgId}/events/settings

Needs: events:subscribe

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredEventsSettings

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
include_content requiredboolean | null
Responses
StatusMeaningBody
200OKobject (application/json)
400invalid_setting.Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403owner_only, or the usual scope / org refusals.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredEventsSettings

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.

Responses
StatusMeaningBody
200OKEventCatalog (application/json)
401No 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.

Responses
StatusMeaningBody
200OKGatewayInfo (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403app_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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
limitqueryintegerPage size, 1–100. From 1 to 100. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Table
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
name requiredstringLowercase letters, numbers and hyphens.
topicstring
category_idstring
columns requiredarray of object
columns[].name requiredstring1–100 characters.
columns[].type requiredstringtext, 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[].optionsobject
columns[].options.choicesarray of object
columns[].options.choices[].label requiredstring
columns[].options.precisioninteger0–10.
columns[].options.currencystringISO 4217.
columns[].options.unitstring
columns[].options.duration_formatstring
columns[].options.formulastring=…
columns[].after_column_idstringThe first new column goes after this one (default: last).
columns[].widthinteger40–1200 px.
Responses
StatusMeaningBody
201Made.Table (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403insufficient_scope, forbidden, content_blocked, plan_required, feature_off, limit_reached.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
tableId requiredpathstringA 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-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
columns requiredarray of object
columns[].name requiredstring1–100 characters.
columns[].type requiredstringtext, 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[].optionsobject
columns[].options.choicesarray of object
columns[].options.choices[].label requiredstring
columns[].options.precisioninteger0–10.
columns[].options.currencystringISO 4217.
columns[].options.unitstring
columns[].options.duration_formatstring
columns[].options.formulastring=…
columns[].after_column_idstringThe first new column goes after this one (default: last).
columns[].widthinteger40–1200 px.
Responses
StatusMeaningBody
201Added.Table (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, limit_reached, plan_required.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
tableId requiredpathstringA 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-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
name requiredstring
columns requiredarray of object
columns[].column_id requiredstringA column's id or name.
columns[].editableboolean
row_filterobject
member_idsarray of string
channel_namestring
category_idstring
new_category_namestring
allow_add_rowsboolean
allow_delete_rowsboolean
Responses
StatusMeaningBody
201Publishedobject (application/json)
202Waits for the person to confirm in Missived (the workspace asks first).PendingConfirmation (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, insufficient_scope, limit_reached, plan_required.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
410The meeting is cancelled, archived or over (meeting_cancelled, meeting_archived, meeting_ended).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (201)
FieldTypeDescription
id requiredstring
org_id requiredstring
table_id requiredstring
name requiredstring
channel_id requiredstring
channel_name requiredstring
category_id requiredstring | null
columns requiredarray of object
columns[].column_id requiredstring
columns[].editable requiredboolean
allow_add_rows requiredboolean
allow_delete_rows requiredboolean
published_at requiredstring (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.

Parameters
NameInTypeDescription
tableId requiredpathstringA 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 requiredpathstringA column id (from GET /v1/tables/{tableId}).

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
namestring
optionsobject
options.choicesarray of object
options.choices[].label requiredstring
options.precisioninteger0–10.
options.currencystringISO 4217.
options.unitstring
options.duration_formatstring
options.formulastring=…
after_column_idstring | null
widthinteger
Responses
StatusMeaningBody
200OKTable (application/json)
400invalid_request, invalid_value.Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, locked.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)

A Table and its columns

GET /v1/tables/{tableId}

Needs: tables:read

Parameters
NameInTypeDescription
tableId requiredpathstringA 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.
Responses
StatusMeaningBody
200OKTable (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
410The 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".

Parameters
NameInTypeDescription
tableId requiredpathstringA 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.
limitqueryintegerPage size, 1–200. From 1 to 200. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
columnquerystringA column id or name to match on (one people type into).
equalsquerystringThe value to match, as text the column reads.
Responses
StatusMeaningBody
200OKobject (application/json)
400invalid_request, invalid_cursor, unknown_column, invalid_value.Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
410view_withdrawn.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of TableRow
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
tableId requiredpathstringA 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-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
cells requiredobjectValues by column id or name. Leave a column out to leave it as it is; null clears it. Computed and locked columns refuse writes.
Responses
StatusMeaningBody
201Added.TableRow (application/json)
400invalid_request, unknown_column, invalid_value.Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403insufficient_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)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
410view_withdrawn.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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).

Parameters
NameInTypeDescription
tableId requiredpathstringA 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 requiredquerystringThe key column's id or name; cells must hold its value.
Idempotency-KeyheaderstringRetry-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-MatchheaderstringA row version: refuse (409 row_changed) if a cell being set changed since.

Request body (application/json, required): TableRowInput.

Request body fields
FieldTypeDescription
cells requiredobjectValues by column id or name. Leave a column out to leave it as it is; null clears it. Computed and locked columns refuse writes.
Responses
StatusMeaningBody
200Updated (or already as asked).UpsertedTableRow (application/json)
201Added.UpsertedTableRow (application/json)
204Done, but the row no longer shows in the view it was written through.No body
400invalid_request, unknown_column, invalid_value (including a key column the Table fills in, or an empty key).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409conflict (more than one row has that key), row_changed (If-Match), idempotency_in_progress.Error (application/json)
410view_withdrawn.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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).

Parameters
NameInTypeDescription
tableId requiredpathstringA 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 requiredpathstringA row id.
Responses
StatusMeaningBody
200OKTableRow (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
410view_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.

Parameters
NameInTypeDescription
tableId requiredpathstringA 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 requiredpathstringA row id.
If-MatchheaderstringA row version.

Request body (application/json, required): TableRowInput.

Request body fields
FieldTypeDescription
cells requiredobjectValues by column id or name. Leave a column out to leave it as it is; null clears it. Computed and locked columns refuse writes.
Responses
StatusMeaningBody
200OKTableRow (application/json)
204Done, but the row no longer shows in the view it was written through.No body
400invalid_request, unknown_column, invalid_value.Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409row_changed: a cell changed since the If-Match version; read the row again.Error (application/json)
410view_withdrawn.Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
tableId requiredpathstringA 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 requiredpathstringA row id.
Responses
StatusMeaningBody
204Deleted.No body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
410view_withdrawn.Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
tableId requiredpathstringA 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.

Request body fields
FieldTypeDescription
row_ids requiredarray of stringAt most 500 items.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
deleted requiredinteger
skipped requiredintegerAlready 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.

Parameters
NameInTypeDescription
tableId requiredpathstringA 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.
Responses
StatusMeaningBody
200The CSV.string (binary) (text/csv)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
410view_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.

Parameters
NameInTypeDescription
tableId requiredpathstringA 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.
Responses
StatusMeaningBody
200The workbook.string (binary) (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
410view_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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
sortquerystringOne of: activity, newest, helpful, unanswered, unsolved.
statusquerystringOne of: all, open, solved, closed.
tagsquerystringComma-separated tag ids: posts with any of them.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of ForumPostSummary
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
title requiredstringRequired, 3–120 characters. At most 120 characters.
content requiredstringThe question (markdown). At most 8000 characters.
tag_idsarray of string
Responses
StatusMeaningBody
201Started.ForumPost (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403insufficient_scope, forbidden (can't post here, a new member's limit), plan_required.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
q requiredquerystringAt least two letters.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
searchable requiredboolean
data requiredarray of object
data[].post requiredForumPostSummary
data[].match requiredobject
data[].match.kind requiredstringOne of: title, body, reply.
data[].match.message_id requiredstring
data[].match.snippet requiredstring

A post: its question and answer

GET /v1/posts/{postId}

Needs: messages:read

Parameters
NameInTypeDescription
postId requiredpathstringA forum post id (from GET /v1/channels/{channelId}/posts).
Responses
StatusMeaningBody
200OKForumPost (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
postId requiredpathstringA forum post id (from GET /v1/channels/{channelId}/posts).

Request body (application/json, required): ForumPostPatch.

Request body fields
FieldTypeDescription
titlestringAt most 120 characters.
tag_idsarray of string
solvedbooleanSolved without an answer, or back to open.
Responses
StatusMeaningBody
200OKForumPost (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
postId requiredpathstringA forum post id (from GET /v1/channels/{channelId}/posts).

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
message_id requiredstringA reply in this post.
Responses
StatusMeaningBody
200OKForumPost (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too 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).

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of FlashcardDeck
can_edit requiredboolean
next_cursor requirednull

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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
name requiredstring
descriptionstring
new_per_dayintegerNew cards a person sees a day (default 20).
cardsarray of FlashcardCardInput
Responses
StatusMeaningBody
201CreatedFlashcardDeck (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off, limit_reached.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
limitqueryintegerPage size, 1–100. From 1 to 100. Default 50.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
qquerystringOnly cards whose front or back holds this text.
Responses
StatusMeaningBody
200OKany (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
namestring
descriptionstring | null
new_per_dayinteger
Responses
StatusMeaningBody
200OKFlashcardDeck (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
204DeletedNo body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
cardsarray of FlashcardCardInput
csvstring
Responses
StatusMeaningBody
201Addedobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (201)
FieldTypeDescription
deck_id requiredstring
addedinteger
updatedinteger
skippedinteger
duplicatesinteger
warningsarray of string
cards requiredinteger

The org's live quizzes

GET /v1/orgs/{orgId}/quizzes

Needs: study:read

Owners and admins (the quiz builder's people). People only.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of object
data[].id requiredstring
data[].title requiredstring
data[].questions requiredinteger
data[].updated_at requiredstring (date-time)
next_cursor requirednull

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).

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
title requiredstring
questionsarray of QuizQuestion
Responses
StatusMeaningBody
201CreatedQuiz (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKQuiz (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
titlestring
questions requiredarray of QuizQuestion
Responses
StatusMeaningBody
200OKQuiz (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
204DeletedNo body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Responses
StatusMeaningBody
200OKBibleStudy (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
kind requiredstringOne of: front_to_back, chronological, focused.
daysinteger
paceinteger
rangesarray of object
ranges[].book requiredstringA book code, e.g. JHN.
ranges[].frominteger
ranges[].tointeger
titlestring
start_datestringYYYY-MM-DD, within a year of today (default today).
time_zonestringThe channel's time zone, set by its first plan.
Responses
StatusMeaningBody
201StartedBiblePlan (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409limit: the channel runs the most plans it can.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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).

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
id requiredpathstringThe resource id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
status requiredstringOne of: active, paused.
Responses
StatusMeaningBody
200OKBiblePlan (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKBiblePlan (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
translationstring | null
time_zonestring
post_timestringHH:MM in the channel's time zone.
post_cardsboolean
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
settings requiredobject

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
ref requiredquerystringA reference, like John 3:16-18 or Ps 23.
translationquerystringA translation id (default: the org's).
Responses
StatusMeaningBody
200OKVerseText (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
titlestring
starts_atstring (date-time)
ends_atstring (date-time)
all_dayboolean
time_zonestring | nullAn IANA name, like America/Chicago.
summarystring | null
descriptionstring | nullMarkdown (sealed at rest in encrypted workspaces).
locationstring | null
online_urlstring | nullhttps only.
listedbooleanShown in the Events page list (default true).
category_idstring | null
place_idstring | null
department_idstring | null
audiencestringOne of: everyone, chosen.
audience_department_idsarray of string
audience_role_idsarray of string
organiser_idsarray of string
signupobjectSign-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.
Responses
StatusMeaningBody
201CreatedOrgEvent (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off, limit_reached.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKOrgEvent (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.

Request body (application/json, required): EventInput.

Request body fields
FieldTypeDescription
titlestring
starts_atstring (date-time)
ends_atstring (date-time)
all_dayboolean
time_zonestring | nullAn IANA name, like America/Chicago.
summarystring | null
descriptionstring | nullMarkdown (sealed at rest in encrypted workspaces).
locationstring | null
online_urlstring | nullhttps only.
listedbooleanShown in the Events page list (default true).
category_idstring | null
place_idstring | null
department_idstring | null
audiencestringOne of: everyone, chosen.
audience_department_idsarray of string
audience_role_idsarray of string
organiser_idsarray of string
signupobjectSign-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.
Responses
StatusMeaningBody
200OKOrgEvent (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off, limit_reached.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
204DeletedNo body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKOrgEvent (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, plan_required, feature_off, limit_reached.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
text requiredstringAt most 2000 characters.
audiencestringgoing (default), all, waitlist or unpaid.
emailboolean
Responses
StatusMeaningBody
201Sentobject (application/json)
202Waits for the person to confirm in Missived (the workspace asks first).PendingConfirmation (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, insufficient_scope, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409conflict: nobody signed up matches.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (201)
FieldTypeDescription
org_id requiredstring
event_id requiredstring
recipients requiredinteger
posted requiredbooleanAlso posted in the event chat.

Take an event back to a draft

POST /v1/calendar-events/{id}/unpublish

Needs: calendar:write

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKOrgEvent (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
question requiredstring
options requiredarray of string
max_votesinteger1–10 (default 1).
is_secretbooleanHide who voted for what.
duration_hoursnumberClose after this long (default: open).
Responses
StatusMeaningBody
201CreatedPoll (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
content requiredstring
scheduled_at requiredstring (date-time)
reply_tostringA message in this channel whose thread it goes in.
Responses
StatusMeaningBody
201ScheduledScheduledMessage (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
who requiredstring
request requiredstring
contactstring
anonymousboolean
Responses
StatusMeaningBody
201CreatedPrayerRequest (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
channel_id requiredstring
can_edit requiredboolean
data requiredarray 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
title requiredstring
textstring
Responses
StatusMeaningBody
201Draftedobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (201)
FieldTypeDescription
id requiredstring
channel_id requiredstring
title requiredstring
status requiredstringAlways 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).

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
name requiredstring
kindstringperson, household or business.
lead_user_idstring
staff_idsarray of string
category_idstring
Responses
StatusMeaningBody
201CreatedClientPortal (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too 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

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
display_namestring | null
accent_lightstring | null#rrggbb or null.
accent_darkstring | null#rrggbb or null.
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required.Error (application/json)
404Not 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

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id (from GET /v1/orgs/{orgId}/portals).
Responses
StatusMeaningBody
200OKClientPortal (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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).

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
namestring
kindstring
lead_user_idstring
welcomestring
show_progressboolean
remindersobject
require_2fabooleanOne of: true.
Responses
StatusMeaningBody
200OKClientPortal (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A 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

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
names requiredarray of string
Responses
StatusMeaningBody
200OKClientPortal (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
position requiredinteger | null
Responses
StatusMeaningBody
200OKClientPortal (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
limitqueryintegerFrom 1 to 200.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray 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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
Responses
StatusMeaningBody
200OKLegacyObject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
name requiredstring
parent_idstring
visibilitystringfirm (default) or shared.
Responses
StatusMeaningBody
201Createdobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
Response fields (201)
FieldTypeDescription
id requiredstring
portal_id requiredstring
visibility requiredstring

Requests to the client

GET /v1/portals/{portalId}/requests

Needs: portals:read

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray 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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
title requiredstring
notestring
internal_notestring
due_onstringYYYY-MM-DD.
assigneesarray of string
remindersobject
items requiredarray of object
Responses
StatusMeaningBody
201SentPortalRequest (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The 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

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
requestId requiredpathstringA request id.
Responses
StatusMeaningBody
200OKPortalRequest (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
requestId requiredpathstringA request id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
titlestring
notestring
internal_notestring
due_onstring | null
assigneesarray of string
remindersobject
itemsarray of object
Responses
StatusMeaningBody
200OKPortalRequest (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A 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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
email requiredstring
namestring
Responses
StatusMeaningBody
201Sentobject (application/json)
202Waits for the person to confirm in Missived (the workspace asks first).PendingConfirmation (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, plan_required, feature_off, portal contact seat refusals.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
Response fields (201)
FieldTypeDescription
invite_id requiredstring
org_id requiredstring
delivered requiredboolean
expires_at requiredstring (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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
requestId requiredpathstringA request id.
Responses
StatusMeaningBody
200OKobject (application/json)
202Waits for the person to confirm in Missived (the workspace asks first).PendingConfirmation (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
Response fields (200)
FieldTypeDescription
org_id requiredstring
sent requiredinteger
skipped requiredintegerAlready 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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
Responses
StatusMeaningBody
204ClosedNo body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
userId requiredpathstringA user id.
Responses
StatusMeaningBody
204RemovedNo body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
requestId requiredpathstringA request id.
Responses
StatusMeaningBody
204CancelledNo body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not 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.

Parameters
NameInTypeDescription
portalId requiredpathstringA portal id.
folderId requiredpathstringA folder id.
Responses
StatusMeaningBody
204DeletedNo body
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A 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.

Parameters
NameInTypeDescription
org_idquerystringOnly this workspace.
channel_idquerystringOnly this voice channel.
meeting_idquerystringOnly this meeting.
limitqueryintegerPage size, 1–100. From 1 to 100. Default 25.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Recording
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredRecording

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
minequerybooleanOnly your own page (an Owner or Admin otherwise sees every page). Default false.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of BookingPage
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of BookingEventType
page requiredBookingPage
next_cursor requiredstring | 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
typeId requiredpathstringAn event type id (from the page's event types).
from requiredquerystringFirst day, YYYY-MM-DD in time_zone.
to requiredquerystringLast day, YYYY-MM-DD.
time_zone requiredquerystringAn IANA zone, e.g. America/Chicago.
lengthqueryintegerMinutes; one of the event type's lengths (default: its first).
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.length_minutes requiredinteger
data.time_zone requiredstring
data.slots requiredarray 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
whenquerystringOne of: upcoming, past. Default "upcoming".
scopequerystringOne of: mine, all. Default "mine".
limitqueryintegerFrom 1 to 200. Default 50.
cursorquerystringnext_cursor from the previous page.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Booking
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
reasonstringOptional; passes the word filter and is shown to the booker.
Responses
StatusMeaningBody
200OKobject (application/json)
202Waits for the person to confirm in Missived (the workspace asks first).PendingConfirmation (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.status requiredstring

Tickets

Queues you can open

GET /v1/orgs/{orgId}/ticket-queues

Needs: tickets:read

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of TicketQueue
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
channelId requiredpathstringA channel id.
cursorquerystringThe next_cursor of the previous page. Opaque: don't build one.
viewquerystring
priorityquerystring
assigneequerystring
tagquerystring
qquerystring
slaquerystring
sourcequerystring
createdFromquerystring
createdToquerystring
updatedFromquerystring
updatedToquerystring
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Ticket
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
channel_idquerystring
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredTicketSummaryCounts

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
includequerystringOne of: requester_email.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredTicket

Change ticket properties

PATCH /v1/tickets/{id}

Needs: tickets:write

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.

Request body (application/json, required): TicketChange.

Request body fields
FieldTypeDescription
statusstringOne of: open, waiting, solved, closed.
prioritystringOne of: low, normal, high, urgent.
tagsarray of string
assignee_idstring | null
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
content requiredstring
Responses
StatusMeaningBody
201OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
Response fields (201)
FieldTypeDescription
data requiredobject
data.id requiredstring

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
content requiredstring
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.drafted requiredboolean
data.sent requiredboolean

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
content requiredstringPlain reply text; always reviewed by the agent before a token sends.
thenstringStatus after sending (default waiting). One of: open, waiting, solved.
seqintegerSequence from getTicket; rejects stale sends.
confirm_addressbooleanAn agent's explicit confirmation of an unconfirmed requester address.
Responses
StatusMeaningBody
201OKobject (application/json)
202OKPendingConfirmation (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (201)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.undo_until requiredstring (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.

Parameters
NameInTypeDescription
org_idquerystringSay which kinds this workspace's plan has.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject

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.

Parameters
NameInTypeDescription
org_idquerystringCheck against this workspace's plan.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
kindstring
sourcestring
titlestring | null
settingsobject
shapestring
urlstring
connector_idstring
payloadWidgetShape
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.valid requiredboolean
data.problems requiredarray of string
data.widget requiredobject | null
data.payload requiredobject | 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of DashboardSummary
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
name requiredstring1–80 characters; passes the word filter.
topicstring
category_idstring
privatebooleanDefault true. Only a signed-in session may make one open to everyone.
Responses
StatusMeaningBody
201Madeobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off, limit_reached.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (201)
FieldTypeDescription
data requiredDashboardSummary

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredDashboard

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
kindstringA native kind from GET /v1/widget-types (leave source out).
sourcestringapi (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.
shapestringFor source: api: stat, status, list, bars, table or card.
titlestring | nullAt most 60 characters.
settingsobjectThe kind's settings (native), { format, shape? } (push) or { source, every, … } (pull).
notestring | nullA Notes widget's text (markdown, at most 2,000 characters; passes the word filter).
secretstringpush: the sending service's signing secret, when its format needs one.
urlstringpull: the https address to watch.
connector_idstringconnector: a connector the workspace already runs.
Responses
StatusMeaningBody
201Addedobject (application/json)
202Waits for the person to confirm in Missived (a webhook address or a watched address).PendingConfirmation (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off, limit_reached, read_only.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (201)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.dashboard_id requiredstring
data.org_idstring
data.source requiredstring
data.kind requiredstring | null
data.layout_rev requiredinteger
data.addressstringA 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
widgetId requiredpathstringA widget id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
titlestring | null
settingsobject
notestring | null
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.org_id requiredstring
data.settings_rev requiredinteger

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
widgetId requiredpathstringA widget id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.org_id requiredstring
data.deleted requiredboolean
data.layout_rev requiredinteger

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
widgetId requiredpathstringA widget id.
Responses
StatusMeaningBody
200OKobject (application/json)
202Waits for the person to confirm in Missived.PendingConfirmation (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.addressstringA 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
If-MatchheaderstringThe layout_rev you arranged from.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
items requiredarray of DashboardLayoutItem
layout_revinteger
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409stale: the body also carries layout_rev and items, the current ones.Error (application/json)
428precondition_required: send If-Match.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.org_id requiredstring
data.layout_rev requiredinteger
data.items requiredarray 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.

Parameters
NameInTypeDescription
widgetId requiredpathstringAn API widget's id.

Request body (application/json, required): a JSON object, as the description says.

Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
422content_blocked: the word filter refused something in it.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.changed requiredboolean
data.received_at requiredstring (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.

Parameters
NameInTypeDescription
org_idquerystringSay which node types this workspace has.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject

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.

Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
document requiredobject
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.valid requiredboolean
data.problems requiredarray 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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of Workflow
usage requiredobject
usage.month requiredstring
usage.runs requiredinteger
usage.skipped requiredinteger
usage.limit requiredinteger
next_cursor requirednull

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
Idempotency-KeyheaderstringRetry-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.

Request body fields
FieldTypeDescription
namestring1–80 characters.
descriptionstring
documentobject
Responses
StatusMeaningBody
201Draftedobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403forbidden, content_blocked, plan_required, feature_off.Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
422The Idempotency-Key was used for a different request (idempotency_key_reused).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (201)
FieldTypeDescription
data requiredWorkflowDetail

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredWorkflowDetail

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
document requiredobject
rev requiredinteger
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409stale: the body also carries the current rev.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.rev requiredinteger
data.problems requiredarray 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
triggerobjectA realistic sample of what the trigger hands the first step.
Responses
StatusMeaningBody
200OKobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422problems: fix them first (the body carries them).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredWorkflowRunDetail

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.rev requiredinteger | null
data.take_over requiredbooleanPublishing makes you its owner (it then runs with your rights).
data.summary requiredarray of object
data.summary[].scope requiredstring
data.summary[].words requiredstring
data.summary[].places requiredarray of string
data.problems requiredarray 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
rev requiredintegerThe draft's rev (from getWorkflow or checkWorkflowPublish).
Responses
StatusMeaningBody
200OKobject (application/json)
202Waits for the person to confirm in Missived.PendingConfirmation (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
422problems.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.version requiredinteger
data.status requiredstring
data.hook_urlstringA 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.status requiredstring

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKobject (application/json)
202Waits for the person to confirm in Missived.PendingConfirmation (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.status requiredstring

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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
formobjectAnswers by field id.
Responses
StatusMeaningBody
202Queuedobject (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (202)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.queued requiredboolean

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).
workflow_idquerystring
statusquerystring
beforequerystring (date-time)
cursorquerystring
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredarray of WorkflowRun
next_cursor requiredstring | nullPass 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.

Parameters
NameInTypeDescription
id requiredpathstringThe resource id.
Responses
StatusMeaningBody
200OKobject (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (200)
FieldTypeDescription
data requiredWorkflowRunDetail

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.

Parameters
NameInTypeDescription
orgId requiredpathstringAn org id (from GET /v1/orgs).

Request body (application/json, required): object.

Request body fields
FieldTypeDescription
url requiredstringhttps://…
Responses
StatusMeaningBody
201Allowedobject (application/json)
202Waits for the person to confirm in Missived.PendingConfirmation (application/json)
400The request isn't valid (invalid_request, invalid_cursor, embeds_not_allowed, invalid_embeds, components_not_allowed, invalid_components).Error (application/json)
401No credential, or it is invalid, revoked or expired (unauthenticated, token_invalid, token_revoked, token_expired, account_suspended).Error (application/json)
403The credential lacks the scope (insufficient_scope), may not act in that org (org_not_allowed), or may not do this (forbidden).Error (application/json)
404Not found, or not visible to this credential (not_found). Other orgs' resources always read as not found.Error (application/json)
409A conflict (conflict), or the same Idempotency-Key is still in flight (idempotency_in_progress).Error (application/json)
429Too many requests (rate_limited). Wait Retry-After seconds.Error (application/json)
Response fields (201)
FieldTypeDescription
data requiredobject
data.id requiredstring
data.url requiredstring
data.host requiredstring
data.created_at requiredstring (date-time)

Reference

This document

GET /v1/openapi.json

Needs: No bearer token

Responses
StatusMeaningBody
200OKobject (application/json)

Schemas

The named shapes the operations refer to.

Ticket

Ticket fields
FieldTypeDescription
id requiredstring
number requiredinteger
channel_id requiredstring
subject requiredstring
status requiredstringOne of: new, open, waiting, solved, closed.
priority requiredstringOne of: low, normal, high, urgent.
requester requiredobject | null
requester.namestring | null
requester.emailstringOnly with include=requester_email, for an agent in this queue.
assignee requiredobject | null
assignee.idstring
assignee.namestring
tags requiredarray of string
source requiredstring
due_at requiredstring (date-time) | null
created_at requiredstring (date-time)
updated_at requiredstring (date-time)
seqinteger
conversationarray of object
canobject

TicketQueue

TicketQueue fields
FieldTypeDescription
channelId requiredstring
name requiredstring
counts requiredobject
counts.mine requiredinteger
counts.unassigned requiredinteger
counts.open requiredinteger
work requiredboolean

TicketChange

TicketChange fields
FieldTypeDescription
statusstringOne of: open, waiting, solved, closed.
prioritystringOne of: low, normal, high, urgent.
tagsarray of string
assignee_idstring | null

TicketReply

TicketReply fields
FieldTypeDescription
content requiredstringPlain reply text; always reviewed by the agent before a token sends.
thenstringStatus after sending (default waiting). One of: open, waiting, solved.
seqintegerSequence from getTicket; rejects stale sends.
confirm_addressbooleanAn agent's explicit confirmation of an unconfirmed requester address.

TicketSummaryCounts

TicketSummaryCounts fields
FieldTypeDescription
waiting_on_me requiredinteger
overdue requiredinteger
unassigned requiredinteger
this_week requiredobject | null
this_week.createdinteger
this_week.solvedinteger
this_week.medianFirstResponseSecondsnumber | null

GatewayInfo

GatewayInfo fields
FieldTypeDescription
url requiredstringThe WebSocket URL to connect to (wss:// in production).
gateway_version requiredintegerThe frame format's version (1).
heartbeat_interval requiredintegerSend a heartbeat this often (ms).
resume_window_ms requiredintegerA dropped session can be resumed for this long.
max_sessions requiredintegerConnections one install may hold at once.
intents requiredarray of object
intents[].id requiredstringAn intent to ask for in identify. One of: messages, message_content, reactions, members, channels, meetings, shifts, tables.
intents[].scope requiredstring | nullThe scope it needs; null = none beyond the install.
intents[].events requiredarray of string
intents[].granted requiredbooleanThis install's scopes allow it.
sessions requiredobject
sessions.connected requiredintegerThis install's connections now.

Error

Error fields
FieldTypeDescription
error requiredobject
error.code requiredstringA stable, machine-readable code (snake_case).
error.message requiredstringA sentence for a person.

CommandOption

CommandOption fields
FieldTypeDescription
name requiredstring^[a-z0-9_-]{1,32}$, unique within the command.
description requiredstring1–100 characters; the field's label when a person is prompted.
type requiredstringThe value's type. One of: string, integer, number, boolean, user, channel, role.
required requiredbooleanRequired options come before optional ones.
choicesarray of object
choices[].name requiredstring
choices[].value requiredstring | number
min_valuenumber | null
max_valuenumber | null
min_lengthinteger | null
max_lengthinteger | nullAt most 2000.

CommandDraft

CommandDraft fields
FieldTypeDescription
name requiredstring^[a-z0-9_-]{1,32}$. The built-in names (shrug, tableflip, unflip, me, gif, poll) are reserved.
description requiredstring1–100 characters, shown in the picker.
optionsarray of CommandOption
permissionstringWho 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_idstring | nullOffer it in one channel only (the app must be in it); null = everywhere the app is.

Command

Command fields
FieldTypeDescription
id requiredstring
install_id requiredstring
app_id requiredstring
org_id requiredstring
channel_id requiredstring | null
name requiredstring
description requiredstring
options requiredarray of CommandOption
permission requiredstringOne of: everyone, manage_channel, admin.
version requiredintegerBumped on every change; the interaction payload's data.version says which definition the person used.
created_at requiredstring (date-time)
updated_at requiredstring (date-time)

InteractionReply

InteractionReply fields
FieldTypeDescription
contentstring | nullThe message text (at most 20,000 characters).
embedsarray of object
componentsarray of ActionRow
flagsinteger64 (ephemeral) sends a follow-up privately to the person who invoked the interaction.

EphemeralMessage

EphemeralMessage fields
FieldTypeDescription
id requiredstring
channel_id requiredstring
flags requiredintegerAlways 64.
ephemeral requiredbooleanAlways true: only the person who invoked the interaction sees it.
author requiredobject
author.id requiredstringThe app's bot user.
author.kind requiredstringOne of: bot.
content requiredstring
embeds requiredarray of Embed
components requiredarray of ActionRow
created_at requiredstring (date-time)
edited_at requiredstring (date-time) | null
expires_at requiredstring (date-time)Private replies are kept 15 minutes, then dropped.

Activity

Activity fields
FieldTypeDescription
kind requiredstringWhat the person is doing. One of: live, playing, listening, watching, custom.
name requiredstringThe service or game ("Twitch", "Elden Ring").
detail requiredstring | nullA second line: the stream's title, the song.
url requiredstring | nullAn https link (the stream).
started_at requiredstring (date-time) | nullWhen it began.
expires_at requiredstring (date-time)When the line disappears unless it is posted again.
source requiredstringapi for a line set through this API; otherwise the provider that set it (twitch).

ActivityInput

ActivityInput fields
FieldTypeDescription
kind requiredstringOne of live, playing, listening, watching, custom. One of: live, playing, listening, watching, custom.
name requiredstringThe service or game, up to 80 characters. At most 80 characters.
detailstring | nullOptional second line, up to 120 characters. At most 120 characters.
urlstring | nullOptional https link.
started_atstring (date-time) | nullOptional: when it began (clamped to now).
ttl_secondsintegerHow 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

MyActivity fields
FieldTypeDescription
activity requiredActivity | nullThe current line, or null.
visible requiredbooleanWhether others see it: the person's Settings → Connections → "Share my activity" switch.

MyContext

MyContext fields
FieldTypeDescription
current_time requiredstring (date-time)Current UTC instant; never infer the person's zone from this.
time_zone requiredstring | nullIANA zone from the query or last saved browser preference; null when unknown.
time_zone_source requiredstringOne of: provided, saved_preference, unknown.
local_date requiredstring | nullCalendar date YYYY-MM-DD in time_zone; null when unknown.
local_time requiredstring | nullWall-clock time HH:mm:ss in time_zone; null when unknown.
weekday requiredstring | nullLowercase English weekday in time_zone; null when unknown.
week_start requiredstringOne of: monday, sunday.
week_start_source requiredstringOne of: workspace, default.
org_id requiredstring | nullSelected org, or the only reachable org; null when no org was selected.

Me

Me fields
FieldTypeDescription
kind requiredstringWhat the credential is. One of: user, pat, app.
user requiredUser
orgs requiredarray of Org
scopes requiredarray of string
token requirednull | object
token.id requiredstring
token.name requiredstring
token.hint requiredstringe.g. msv_pat_…a1b2
token.expires_at requiredstring (date-time) | null
token.include_dms requiredbooleanD3: may read its owner's direct messages.
app requirednull | objectFor 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 requiredstring
app.app_id requiredstring | null
app.channel_ids requiredarray of string

Org

Org fields
FieldTypeDescription
id requiredstring
name requiredstring
role requiredstring | nullYour role there: owner, admin, member or guest; null for an app.

User

User fields
FieldTypeDescription
id requiredstring
name requiredstring | null
email requiredstring | nullShown to people, as the app shows a fellow member's; never to apps, and null for bots.
kind requiredstringhuman, bot or system. One of: human, bot, system.
badge requiredstring | nullBOT, APP or SYSTEM for a non-human author; null for a person.

Channel

Channel fields
FieldTypeDescription
id requiredstring
org_id requiredstring
type requiredstringtext, private, voice, dm, group or meal_train. One of: text, private, voice, dm, group, meal_train.
name requiredstring
display_name requiredstring | null
topic requiredstring | null
category_id requiredstring | null
kind requiredstringWhat 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 requiredboolean
can_send requiredbooleanWhether this credential may post here.
created_at requiredstring (date-time)

ChannelMember

ChannelMember fields
FieldTypeDescription
user requiredUser
role requiredstring | null

AppInstall

AppInstall fields
FieldTypeDescription
id requiredstringThe install id (an app in an org).
org_id requiredstring
app requiredobject
app.id requiredstring
app.name requiredstring
app.description requiredstring | null
app.icon_url requiredstring | null
app.homepage_url requiredstring | null
app.origin requiredstringcustom: made in this org; directory: from a listing (Phase 3). One of: custom, directory.
bot_user requiredUser
bot_handle requiredstringWhat people @mention it by.
scopes requiredarray of string
status requiredstring[object Object]
installed_at requiredstring (date-time)
installed_by requirednull | User
channel_ids requiredarray of string

Member

Member fields
FieldTypeDescription
user requiredUser
role requiredstringowner, admin, member or guest.
title requiredstring | null
joined_at requiredstring (date-time)
roles requiredarray of RoleRef

RoleRef

RoleRef fields
FieldTypeDescription
id requiredstring
name requiredstring
color requiredstring | null

Role

Role fields
FieldTypeDescription
id requiredstring
name requiredstring
color requiredstring | null
position requiredinteger
member_count requiredinteger

Attachment

Attachment fields
FieldTypeDescription
id requiredstring
file_name requiredstring
content_type requiredstring
size requiredintegerBytes.
url requiredstring | nullA short-lived download path signed for this credential (relative to the API host); null for apps.
download_url requiredstringThe file with this credential's own bearer token: GET /v1/attachments/{id}/content (needs messages:read). Apps download this way.

Upload

Upload fields
FieldTypeDescription
id requiredstringPass in attachment_ids when posting a message.
file_name requiredstring
content_type requiredstring
size requiredintegerBytes.
created_at requiredstring (date-time)
download_url requiredstringReadable by the uploader until it is attached; then by whoever may read the channel.

Reaction

Reaction fields
FieldTypeDescription
emoji requiredstring
count requiredinteger
me requiredbooleanYou reacted with this.
user_ids requiredarray 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.

ActionRow fields
FieldTypeDescription
type requiredintegerOne of: 1.
components requiredarray of objectAt 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

Message fields
FieldTypeDescription
id requiredstring
channel_id requiredstring
author requiredany
webhook_id requiredstring | nullSet when an incoming webhook posted it.
acting_user_id requiredstring | nullA post by the org's system author made for a person (their poll, their crosspost): that person's id. Null otherwise.
content requiredstringThe text (Markdown).
embeds requiredarray of Embed
components requiredarray of ActionRow
attachments requiredarray of Attachment
reactions requiredarray of Reaction
reply_to requiredstring | nullThe message this one replies to (a thread).
reply_count requiredinteger
pinned requiredboolean
created_at requiredstring (date-time)
edited_at requiredstring (date-time) | null

NewMessage

NewMessage fields
FieldTypeDescription
contentstring1–20000 characters. Required unless the message has files, or an app sends embeds or components. At most 20000 characters.
reply_tostringReply in the thread of this message (same channel).
attachment_idsarray of stringUp 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.
embedsarray of Embed
componentsarray of ActionRow
allowed_mentionsobjectApps only. Which @mentions notify anyone (Discord's rules). Absent: @user mentions count; @everyone, @here and roles don't.
allowed_mentions.parsearray of stringOne of: users, roles, everyone.
allowed_mentions.usersarray of string
allowed_mentions.rolesarray of string

SearchHit

SearchHit fields
FieldTypeDescription
channel requiredobject
channel.id requiredstring
channel.name requiredstring
channel.type requiredstringtext, private, voice, dm, group or meal_train.
snippet requiredstringThe matching words in context, marked «like this».
message requiredMessage

MessageEdit

MessageEdit fields
FieldTypeDescription
contentstringAt most 20000 characters.
embedsarray of Embed
componentsarray of ActionRow

Reactions

Reactions fields
FieldTypeDescription
reactions requiredarray of Reaction

NewChannel

NewChannel fields
FieldTypeDescription
name requiredstringLowercase letters, numbers and hyphens.
topicstring
category_idstring
kindstringThe 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

Category fields
FieldTypeDescription
id requiredstring
name requiredstring
position requiredinteger
workspace_kind requiredstring | nullA workspace category's kind (an outside party's workspace, a client portal), or null.
portal_id requiredstring | nullThe client portal over this category, if any.
group_id requiredstring | nullThe sidebar group holding it, if any.
channel_ids requiredarray of string

CategoryList

CategoryList fields
FieldTypeDescription
data requiredarray of Category
groups requiredarray of object
groups[].id requiredstring
groups[].name requiredstring
groups[].position requiredinteger
can_organise requiredbooleanWhether this person may group and order categories.
next_cursor requirednull

CategoryGroup

CategoryGroup fields
FieldTypeDescription
id requiredstring
name requiredstring
position requiredinteger
category_ids requiredarray of string

FlashcardCardInput

FlashcardCardInput fields
FieldTypeDescription
kindstringbasic (front / back) or cloze (front holds {{c1::…}} gaps; back is extra notes). One of: basic, cloze.
front requiredstring
backstring
tagsarray of string
reversedbooleanA basic card also asked back to front.

FlashcardCard

FlashcardCard fields
FieldTypeDescription
id requiredstring
kind requiredstring
front requiredstring
back requiredstring
tags requiredarray of string
reversed requiredboolean
created_at requiredstring (date-time)

FlashcardDeck

FlashcardDeck fields
FieldTypeDescription
id requiredstring
org_id requiredstring
channel_id requiredstring
name requiredstring
description requiredstring | null
new_per_day requiredinteger
cards requiredintegerHow many notes the deck holds.
created_at requiredstring (date-time)
updated_at requiredstring (date-time)

QuizQuestion

QuizQuestion fields
FieldTypeDescription
prompt requiredstring
options requiredarray of string
correct_index requiredintegerWhich option is right (0-based).
time_limit_secondsinteger5–300 (default 20).
pointsinteger10–10,000 (default 1,000).

Quiz

Quiz fields
FieldTypeDescription
id requiredstring
org_id requiredstring
title requiredstring
created_at requiredstring (date-time)
updated_at requiredstring (date-time)
questions requiredarray of any
host_url requiredstringWhere 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.

EventInput fields
FieldTypeDescription
titlestring
starts_atstring (date-time)
ends_atstring (date-time)
all_dayboolean
time_zonestring | nullAn IANA name, like America/Chicago.
summarystring | null
descriptionstring | nullMarkdown (sealed at rest in encrypted workspaces).
locationstring | null
online_urlstring | nullhttps only.
listedbooleanShown in the Events page list (default true).
category_idstring | null
place_idstring | null
department_idstring | null
audiencestringOne of: everyone, chosen.
audience_department_idsarray of string
audience_role_idsarray of string
organiser_idsarray of string
signupobjectSign-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

Poll fields
FieldTypeDescription
id requiredstring
channel_id requiredstring
message_id requiredstringThe poll's card in the channel.
question requiredstring
options requiredarray of string
max_votes requiredinteger
is_secret requiredboolean
ends_at requiredstring (date-time) | null

ScheduledMessage

ScheduledMessage fields
FieldTypeDescription
id requiredstring
channel_id requiredstring
content requiredstringOnly in the create answer.
scheduled_at requiredstring (date-time)
reply_to requiredstring | null
status requiredstringscheduled, sent, failed or cancelled.

PrayerRequest

PrayerRequest fields
FieldTypeDescription
id requiredstring
channel_id requiredstring
who requiredstring
request requiredstring
anonymous requiredbooleanNever named, to anyone.
status requiredstring
created_at requiredstring (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.

PendingConfirmation fields
FieldTypeDescription
status requiredstringOne of: pending_confirmation.
action_id requiredstring
org_idstring
confirm_url requiredstring
expires_at requiredstring (date-time)
summary requiredstringWhat will happen, in words.
step_upbooleanConfirming 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

Recording fields
FieldTypeDescription
id requiredstring
org_id requiredstring
kind requiredstringvoice (a voice channel or Stage) or meeting.
channel_id requiredstring | null
meeting_id requiredstring | null
where requiredstringThe channel's or meeting's name as it is now.
status requiredstringrecording, sealing (being saved) or ready.
video requiredbooleanVideo was recorded as well as sound.
started_at requiredstring (date-time)
ended_at requiredstring (date-time) | null
duration_seconds requiredinteger | null
bytes requiredinteger
started_by_name requiredstring | nullWho started it (a name, never an email).
expires_at requiredstring (date-time) | nullWhen the workspace's retention deletes it; null when kept (pinned) or not ready.
pinned requiredbooleanKept past the retention period.
download_url requiredstring | nullThe sound (Ogg Opus), signed for you; null until ready. Works until download_expires_at; access is checked again when fetched.
video_download_url requiredstring | nullThe video (MP4) when there is one, signed like download_url.
download_expires_at requiredstring (date-time) | nullWhen 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

BookingPage fields
FieldTypeDescription
id requiredstring
org_id requiredstring
host_user_id requiredstring
handle requiredstringThe last part of the page's link.
display_name requiredstring
time_zone requiredstringThe host's IANA zone.
published requiredboolean
url requiredstring | nullThe public link; null until the workspace has a link name.

BookingEventType

BookingEventType fields
FieldTypeDescription
id requiredstring
page_id requiredstring
name requiredstring
slug requiredstring
description requiredstring | null
lengths_minutes requiredarray of integer
location_kind requiredstringmissived (a Missived meeting), phone_booker, phone_host, in_person or link.
active requiredboolean
offered_to_client_portals requiredboolean
url requiredstring | nullThe event type's public link.

Booking

Booking fields
FieldTypeDescription
id requiredstring
org_id requiredstring
event_type_id requiredstring | nullNull once the event type was deleted.
event_type_name requiredstring
host_user_id requiredstring
host_name requiredstringThe host's workspace name.
start requiredstring (date-time)
end requiredstring (date-time)
status requiredstringconfirmed or cancelled.
location_kind requiredstring
source requiredstringpage, portal or assistant.
portal_id requiredstring | null
cancelled_by requiredstring | nullbooker or host.
meeting_id requiredstring
created_at requiredstring (date-time)
booker requiredobject | nullNull 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 requiredstring | null
booker.time_zone requiredstring | null
booker.emailstring | null
booker.answers requiredarray of object
booker.answers[].question_id requiredstring
booker.answers[].label requiredstring
booker.answers[].value requiredstring

KnowledgePage

KnowledgePage fields
FieldTypeDescription
id requiredstring
title requiredstring
published requiredboolean
open_status requiredstring | nulldraft, submitted or null.
pending_review requiredboolean
updated_at requiredstring (date-time)

Meeting

Meeting fields
FieldTypeDescription
id requiredstring
org_id requiredstring
title requiredstring
agenda requiredstring | null
status requiredstringscheduled, live, ended or cancelled.
room_type requiredstring
start_time requiredstring (date-time)
end_time requiredstring (date-time)
time_zone requiredstring | null
organizer requirednull | object
organizer.id requiredstring
organizer.name requiredstring | null
my_role requiredstringorganizer, invitee or approver. One of: organizer, invitee, approver.
rsvp requiredstring | nullYour answer as an invitee.
join_url requiredstring | nullThe meeting's page in the web app.
created_at requiredstring (date-time)
updated_at requiredstring (date-time)

Shift

Shift fields
FieldTypeDescription
id requiredstring
org_id requiredstring
schedule requiredobject
schedule.id requiredstring
schedule.name requiredstring
label requiredstring | null
notes requiredstring | null
starts_at requiredstring (date-time)
ends_at requiredstring (date-time)
break_minutes requiredinteger
position requiredstring | null
event requirednull | object
event.id requiredstring
event.name requiredstring
published_at requiredstring (date-time) | null

ScheduleEvent

ScheduleEvent fields
FieldTypeDescription
id requiredstring
org_id requiredstring
name requiredstring
location requiredstring | null
notes requiredstring | null
starts_at requiredstring (date-time)
ends_at requiredstring (date-time)
published_at requiredstring (date-time) | null
updated_at requiredstring (date-time)

MeetingInviteeInput

Give user_id or email. The organiser is never an invitee.

MeetingInviteeInput fields
FieldTypeDescription
user_idstringA member of this org.
emailstringAnyone'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).
namestringA display name for an outside guest. At most 100 characters.
rolestringOne of: participant, co_host. Default "participant".

NewMeeting

NewMeeting fields
FieldTypeDescription
title requiredstringAt most 200 characters.
agendastringAt most 5000 characters.
start_time requiredstringISO 8601 with a time zone; at most five minutes in the past, two years ahead.
duration_minutes requiredinteger5–1440. From 5 to 1440.
time_zone requiredstringIANA zone, e.g. America/New_York (how invites show the time).
room_typestringgeneral (its own room) or personal_office (members only). One of: general, personal_office. Default "general".
inviteesarray of MeetingInviteeInputAt most 200 items.
send_invitesbooleanEmail invites (with an .ics) now. false: add them quietly. Default true.

MeetingPatch

MeetingPatch fields
FieldTypeDescription
titlestringAt most 200 characters.
agendastring | nullAt most 5000 characters.
start_timestringISO 8601. Only before the meeting starts.
duration_minutesintegerFrom 5 to 1440.
time_zonestring
room_typestringOne of: general, personal_office.
notifybooleanEmail invitees an update (or reschedule) and fire meeting.updated. false: change quietly. Default true.

MeetingInviteesReplace

MeetingInviteesReplace fields
FieldTypeDescription
invitees requiredarray of MeetingInviteeInputThe whole list: people left out are uninvited (and sent a cancellation). At most 200 items.
notifybooleanDefault true.

MeetingInvitee

MeetingInvitee fields
FieldTypeDescription
id requiredstring
user_id requiredstring | null
email requiredstring
name requiredstring
external requiredboolean
role requiredstringOne of: participant, co_host.
rsvp requiredstringneeds_action, accepted, declined or tentative.

MeetingCancel

MeetingCancel fields
FieldTypeDescription
reasonstring | nullAt most 500 characters.
notifybooleanDefault true.

NewTask

NewTask fields
FieldTypeDescription
title requiredstringAt most 500 characters.
notesstringAt most 5000 characters.
due_atstringISO 8601.
remind_atstringISO 8601: a reminder in the app then.

Task

Task fields
FieldTypeDescription
id requiredstring
title requiredstring
notes requiredstring | null
status requiredstring
due_at requiredstring (date-time) | null
remind_at requiredstring (date-time) | null
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)

AuditEventPage

AuditEventPage fields
FieldTypeDescription
data requiredarray of object
next_cursor requiredstring | null
has_more requiredboolean

LegacyObject

A JSON object; the operation that uses it describes its fields.

IncomingWebhook

IncomingWebhook fields
FieldTypeDescription
id requiredstring
name requiredstring
avatar_url requiredstring | null
avatar_proxy_url requiredstring | null
channel requiredobject
channel.id requiredstring
channel.name requiredstring | null
token_last_four requiredstring | nullThe URL token's last four characters (the URL itself is shown once).
github_secret_set requiredboolean
source requirednull | stringWhat it was made for (BN31). Every URL works whichever it is.
providers requiredarray of objectServices with a pasted signing secret.
providers[].provider requiredstringgitlab, sentry, linear, stripe or pagerduty
providers[].signing_hint requiredstring | nullThe pasted secret's last four characters.
providers[].legacy_hint requiredstring | nullGitLab's older secret token, last four.
providers[].updated_at requiredstring (date-time)
paused requiredboolean
paused_at requiredstring (date-time) | null
paused_reason requiredstring | null
last_used_at requiredstring (date-time) | null
post_count requiredinteger
created_at requiredstring (date-time)
rotated_at requiredstring (date-time) | null
created_by requirednull | object
created_by.id requiredstring
created_by.label requiredstring
created_by.is_member requiredboolean
created_by_token requirednull | objectSet when an API token made it.
created_by_token.id requiredstring

IncomingWebhookList

IncomingWebhookList fields
FieldTypeDescription
webhooks requiredarray of IncomingWebhook
cap requiredintegerThe plan's limit.
githubAvailable requiredbooleanThis server can store GitHub secrets.
providersAvailable requiredbooleanThis server can store the services' signing secrets (BN31).
formatters requiredarray of stringThe services with their own URL suffix.

IncomingWebhookDraft

IncomingWebhookDraft fields
FieldTypeDescription
name requiredstring1–80 characters; also the bot's name. At most 80 characters.
channelId requiredstringA text channel of this org (an app: one it was added to).
avatarUrlstring | nullAn https:// image URL.
sourcestring | nullWhat it's made for: discord, slack, github, gitlab, sentry, linear, stripe or pagerduty (BN31).

IncomingWebhookPatch

IncomingWebhookPatch fields
FieldTypeDescription
namestringAt most 80 characters.
channelIdstring
avatarUrlstring | null
pausedboolean

IncomingWebhookCreated

IncomingWebhookCreated fields
FieldTypeDescription
webhook requiredIncomingWebhook
url requiredstringThe full URL to post to (Discord's execute-webhook format; /slack and /github after it for those formats). Shown once.
path requiredstringThe same, without the API's origin.
githubSecret requiredstring | nullThe secret for GitHub's webhook settings; null when this server can't store one.

EventSubscription

EventSubscription fields
FieldTypeDescription
id requiredstring
name requiredstring | null
url requiredstringWhere deliveries go (https, public internet).
secret requiredstringMasked: the last four characters. The secret is shown once, on create and rotate.
ed25519_public_key requiredstring | nullSet when the subscription also signs with Ed25519 (v1a).
static_header requiredobject | null
static_header.name requiredstring
event_types requiredarray of string
channel_ids requiredarray of string | nullnull = every channel the subscriber may see; a private channel's events only reach a subscription listing it.
payload_mode requiredstring | nullThis subscription's choice (thin | full); null = the org's default. One of: thin, full, null.
effective_payload_mode requiredstringWhat deliveries carry after the org's rule (D5). One of: thin, full.
enabled requiredboolean
paused_reason requiredstring | nullWhy it is off: the circuit breaker, unopenable secrets, or the receiver's 410 Gone.
dropped_count requiredintegerEvents skipped because the subscription was over its per-minute budget.
created_at requiredstring (date-time)
updated_at requiredstring (date-time)
created_by requiredobject | null
created_by.id requiredstring
created_by.label requiredstring
created_by.is_member requiredboolean
created_by_token requiredobject | nullSet when an API token made it (a REST hook).
created_by_token.id requiredstring
created_by_token.name requiredstring
deliveriesobjectPresent on reads.
deliveries.last_delivered_at requiredstring (date-time) | null
deliveries.last_attempt_at requiredstring (date-time) | null
deliveries.delivered_24h requiredinteger
deliveries.failed_24h requiredinteger
deliveries.pending requiredinteger

EventSubscriptionDraft

EventSubscriptionDraft fields
FieldTypeDescription
url requiredstringhttps only, on the public internet.
namestring | null
event_typesarray of string
channel_idsarray of string | null
payload_modestring | nullOne of: thin, full, null.
asymmetricbooleanAlso sign with Ed25519; the public key is returned once.
static_headerobject | nullAn extra header on every delivery; the value is stored sealed and never shown again.
static_header.name requiredstring
static_header.value requiredstring

EventSubscriptionPatch

EventSubscriptionPatch fields
FieldTypeDescription
urlstring
namestring | null
event_typesarray of string
channel_idsarray of string | null
payload_modestring | nullOne of: thin, full, null.
enabledbooleanPause / resume (resuming clears the circuit breaker).
rotate_secretbooleanIssue a new signing secret; the old one keeps verifying until the next rotation.

EventSubscriptionCreated

EventSubscriptionCreated fields
FieldTypeDescription
data requiredEventSubscription
secret requiredstringThe whsec_ signing secret, shown only here.
ed25519_public_keystring

EventSubscriptionPage

EventSubscriptionPage fields
FieldTypeDescription
data requiredarray of EventSubscription
cap requiredintegerThe plan's cap on event subscriptions.
next_cursor requiredstring | null

EventSubscriptionResult

EventSubscriptionResult fields
FieldTypeDescription
data requiredEventSubscription
secretstringOnly after rotate_secret.

EventDelivery

EventDelivery fields
FieldTypeDescription
id requiredstring
event_id requiredstringThe event's id, also the webhook-id header.
event_type requiredstring | null
status requiredstringOne of: pending, retrying, delivered, dead.
attempts requiredinteger
last_status_code requiredinteger | null
last_error requiredstring | null
next_attempt_at requiredstring (date-time) | null
created_at requiredstring (date-time)
delivered_at requiredstring (date-time) | null

EventEnvelope

EventEnvelope fields
FieldTypeDescription
id requiredstringThe event id (webhook-id).
type requiredstringA catalogue name, domain.verb.
timestamp requiredstring (date-time)
org_id requiredstring
payload requiredstringfull carries the content part; thin leaves it out (D5). One of: thin, full.
data requiredobjectPer type; see docs/OUTGOING_EVENTS.md.

EventsSettings

EventsSettings fields
FieldTypeDescription
encrypted requiredbooleanThe 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 requiredboolean | nullThe Owner's explicit choice; null = the default rule.
effective requiredstringOne of: thin, full.
can_change requiredbooleanOnly an Owner may change it.

EventCatalog

EventCatalog fields
FieldTypeDescription
data requiredarray of object
data[].id requiredstring
data[].group requiredstring
data[].has_content requiredboolean
globs requiredarray of string
payload requiredstring

ReplayResult

ReplayResult fields
FieldTypeDescription
queued requiredinteger
truncated requiredbooleanThe window had more than 1 000 events; narrow it.
window requiredobject
window.since requiredstring (date-time)
window.until requiredstring (date-time)

Table

Table fields
FieldTypeDescription
id requiredstringThe handle: a Table's id, or a shared view's (then kind is view and everything here is the view's).
org_id requiredstring
channel_id requiredstringThe channel that draws it (a view has its own channel).
name requiredstring
kind requiredstringA Table, or a shared view of one. One of: table, view.
version requiredintegerBumped on every change to the Table; rows read at this version carry it.
row_count requiredintegerRows this credential sees.
can_edit requiredbooleanThis credential may change cells.
can_add_rows requiredboolean
can_delete_rows requiredboolean
updated_at requiredstring (date-time)
columns requiredarray of TableColumn

TableColumn

TableColumn fields
FieldTypeDescription
id requiredstringStable across renames; rows' cells are keyed by it.
name requiredstringUnique within the Table (case-insensitive); rows' fields are keyed by it, and a write may name a column by it.
type requiredstringWhat 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 requiredbooleanThe row's title column.
computed requiredbooleanA formula or system column: filled in by the Table, never written.
writable requiredbooleanThis credential may write it (not computed, not locked for it, editable in a view).
choices requiredarray of object | nullselect / multi_select: the choices. Write a choice by its label (or id).
choices[].id requiredstring
choices[].label requiredstring
currency requiredstring | nullcurrency: the ISO 4217 code.
precision requiredinteger | nullDecimals shown.
unit requiredstring | nullnumber: 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

TableRow fields
FieldTypeDescription
id requiredstring
table_id requiredstringThe handle the row was read through.
version requiredintegerThe 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 requiredstring (date-time)
updated_at requiredstring (date-time)
created_by requiredstring | nullA user id.
updated_by requiredstring | nullA user id.
cells requiredobjectEvery column this credential sees, by column id.
fields requiredobjectThe same values by column name (handy in no-code tools).

ForumAuthor

ForumAuthor fields
FieldTypeDescription
id requiredstring | nullA user id (null once the account is gone).
name requiredstring
kind requiredstringOne of: human, bot, system.

ForumPostSummary

ForumPostSummary fields
FieldTypeDescription
id requiredstring
channel_id requiredstring
message_id requiredstringThe opening message: reply with reply_to set to it; read replies at …/messages/{message_id}/replies.
title requiredstring
excerpt requiredstringThe question's first words, plain text.
author requiredForumAuthor
tag_ids requiredarray of string
status requiredstringOne of: open, solved, closed.
replies_locked requiredboolean
pinned requiredbooleanA guide, shown above the list.
reply_count requiredinteger
helpful_count requiredinteger
has_answer requiredboolean
created_at requiredstring (date-time)
last_activity_at requiredstring (date-time)

ForumMessageBrief

ForumMessageBrief fields
FieldTypeDescription
message_id requiredstring
author requiredForumAuthor
content requiredstring
created_at requiredstring (date-time)
edited_at requiredstring (date-time) | null
attachment_count requiredintegerRead the files from the message itself (GET /v1/channels/{channelId}/messages/{messageId}).
helpful_count requiredinteger

ForumPost

Type: any.

ForumPostInput

ForumPostInput fields
FieldTypeDescription
title requiredstringRequired, 3–120 characters. At most 120 characters.
content requiredstringThe question (markdown). At most 8000 characters.
tag_idsarray of string

ForumPostPatch

ForumPostPatch fields
FieldTypeDescription
titlestringAt most 120 characters.
tag_idsarray of string
solvedbooleanSolved without an answer, or back to open.

UpsertedTableRow

Type: any.

TableRowInput

TableRowInput fields
FieldTypeDescription
cells requiredobjectValues 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

Workflow fields
FieldTypeDescription
id requiredstring
name requiredstring
description requiredstring | null
status requiredstringOne of: draft, live, paused.
paused_reason requiredstring | nullWhy it stopped: person, failing, owner_lost_access, owner_left, plan, feature_off, billing or shared_channel.
trigger_kind requiredstringmanual, form, event, schedule or webhook.
owner requiredobject | null
owner.idstring
owner.namestring
live_version requiredinteger | null
draft_rev requiredintegerSend it back when you save or publish.
has_draft_changes requiredboolean
runs_this_month requiredinteger
last_run requiredobject | null
last_run.statusstring
last_run.atstring (date-time)
may_edit requiredboolean
may_run requiredbooleanYou may run it by hand (a live manual or form workflow shared with you).
updated_at requiredstring (date-time)

WorkflowProblem

WorkflowProblem fields
FieldTypeDescription
code requiredstring
message requiredstring
nodestringThe node it's about.
pathstringWhere in the node.

WorkflowDetail

Type: any.

WorkflowRun

WorkflowRun fields
FieldTypeDescription
id requiredstring
workflow_id requiredstring
workflow_name requiredstring
version requiredinteger | null
status requiredstringOne of: queued, running, waiting, succeeded, failed, cancelled, timed_out, skipped.
test requiredbooleanA test run: writes were simulated.
trigger_kind requiredstring
trigger_summary requiredstring
started_by requiredobject | null
started_by.idstring
started_by.namestring
step_count requiredinteger
started_at requiredstring (date-time)
finished_at requiredstring (date-time) | null
error_code requiredstring | null

WorkflowRunDetail

Type: any.

DashboardSummary

DashboardSummary fields
FieldTypeDescription
id requiredstringThe dashboard's channel id.
org_id requiredstring
name requiredstring
topic requiredstring | null
category_id requiredstring | null
widgets requiredinteger
layout_rev requiredintegerSend it as If-Match when you arrange.
arrange requiredbooleanYou may add, change, remove and arrange widgets.
read_only requiredbooleanThe dashboards feature is off here, or the plan no longer has it: you can still read and remove.

DashboardWidget

DashboardWidget fields
FieldTypeDescription
id requiredstring
kind requiredstringA native kind (portal_waiting, bookings, …), or push / pull / connector / app for connected widgets.
source requiredstringnative, api, push, pull or connector. One of: native, api, push, pull, connector.
title requiredstring | nullNull = the kind's own name.
settings_rev requiredintegerChanges with each title / settings change.
settingsobjectArrangers only: the widget's settings.
notestring | nullArrangers only, for a Notes widget.
pushobjectArrangers only, a webhook widget: format, shape, last received. Never the address.
pullobjectArrangers only, a watched address: host, source, every, last checked. Never the full address.
apiobjectArrangers only, an API widget: its shape and who feeds it (app, assistant, token or session).
data requiredobjectWhat 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

Dashboard fields
FieldTypeDescription
id requiredstring
org_id requiredstring
name requiredstring | null
topic requiredstring | null
layout_rev requiredinteger
arrange requiredboolean
read_only requiredboolean
widget_cap requiredintegerHow many widgets the plan allows on one dashboard.
items requiredarray of DashboardLayoutItem
widgets requiredarray of DashboardWidget

DashboardLayoutItem

DashboardLayoutItem fields
FieldTypeDescription
widget_id requiredstring
w requiredintegerColumns of 12: 3, 4, 6, 8 or 12.
h requiredintegerRows: 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

WidgetInput fields
FieldTypeDescription
kindstringA native kind from GET /v1/widget-types (leave source out).
sourcestringapi (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.
shapestringFor source: api: stat, status, list, bars, table or card.
titlestring | nullAt most 60 characters.
settingsobjectThe kind's settings (native), { format, shape? } (push) or { source, every, … } (pull).
notestring | nullA Notes widget's text (markdown, at most 2,000 characters; passes the word filter).
secretstringpush: the sending service's signing secret, when its format needs one.
urlstringpull: the https address to watch.
connector_idstringconnector: a connector the workspace already runs.

WebhookTestResult

WebhookTestResult fields
FieldTypeDescription
request requiredobject
request.url requiredstring
request.headers requiredobject
request.body requiredobject
response requiredobject{ status, body } from the receiver, or { status: null, error }.