Chat

Backbuild Chat: channels and direct and group conversations, members, messages with edits, reactions and pins, delivery and read receipts, the people you chat with, and file attachments. Message bodies are end-to-end encrypted: the API carries sealed envelopes that members' devices open, never plaintext.

35 endpoints. Generated from the OpenAPI 3.1 specification.

POST /v1/chat/chips/authorize

Open an attachment

Checks that the caller can still open one attachment of a message, and returns what to open: the file's name, type and size and a link to it in Backbuild Files. Access is checked every time: the caller must still be a member, the conversation's access to the file must still stand, and the sender must still be allowed to share it. At most 30 attachment requests a minute per user.

Auth Session JWT (Bearer)

Request Body

FieldTypeRequiredDescription
message_id string<uuid> yes The message.
chip_index integer yes Which attachment, from 0.

Responses

StatusDescription
200 The attachment.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FORBIDDEN`, with `error.details.code` `ACCESS_REMOVED` when access to the file was removed.
404 `NOT_FOUND`, with `error.details.code` `FILE_DELETED` when the file was deleted.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
share_id string | null The conversation's access to the file.
resource_type string | null What the attachment is.
resource_id string | null The Files item.
capability string | null The access given.
conversation_id string | null The conversation.
message_id string<uuid> The message.
chip_index integer The attachment.
chip object | null The attachment as stored.
deep_link string | null Where to open it in Backbuild Files.
file object | null The file's details.
GET /v1/chat/chips/file

Download an attachment

Checks access exactly as opening does, then returns the file's bytes. There is no shareable link: each download is made with the caller's own session, so someone removed from the conversation cannot reuse it. The file is sent as a download (`Content-Disposition: attachment`) and is not cached. At most 30 attachment requests a minute per user.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
message_id query string<uuid> yes The message.
chip_index query integer yes Which attachment of the message, from 0.

Responses

StatusDescription
200 The file's bytes.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FORBIDDEN`, with `error.details.code` `ACCESS_REMOVED` when access to the file was removed.
404 `NOT_FOUND`: no such attachment, or `error.details.code` `FILE_DELETED`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
503 `SERVICE_UNAVAILABLE`: file storage is unavailable; retry.
POST /v1/chat/chips/revoke

Remove a conversation's access to an attachment

Ends the conversation's access to one attached file: every attachment of that file in the conversation then opens as access removed, and the file itself stays where it is in Backbuild Files. The message's sender, an owner or manager of the conversation, or a Chat administrator can do this, also in an archived conversation. Repeating it answers `revoked: false`. At most 30 attachment requests a minute per user.

Auth Session JWT (Bearer)

Request Body

FieldTypeRequiredDescription
message_id string<uuid> yes The message.
chip_index integer yes Which attachment, from 0.

Responses

StatusDescription
200 Whether access was removed.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
revoked boolean False when access had already ended.
share_id string | null The access that ended.
GET /v1/chat/conversations

List your conversations

Lists the conversations the caller belongs to, with the caller's own membership state for each (role, notification setting, star, section, read position and unread mentions) and whether it has unread messages. Exact unread counts are not computed. At most 240 reads a minute per user.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
include_archived query string (enum) no Optional. Include archived conversations (default false).
limit query integer no Optional. Page size, default 200.
cursor query string no Optional. The `next_cursor` from the previous page; opaque.

Responses

StatusDescription
200 A page of the caller's conversations.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
items array of object
next_cursor string | null Pass as `cursor` for the next page; null at the end.
POST /v1/chat/conversations

Create a channel or group conversation

Creates a channel or a group conversation and makes the caller its owner. A channel name is lowercase letters, digits, `.`, `_` and `-`, up to 80 characters, and must be free (`NAME_EXISTS`). Creating a channel needs the permission to create channels, and the organization's settings may limit who can. A group conversation holds at most 9 people including the caller; asking for the same set of people again returns the existing conversation (`existing: true`). A one-to-one conversation is opened with `POST /v1/chat/dm/open`, not here. `zero_knowledge` conversations cannot be created yet. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Request Body

FieldTypeRequiredDescription
type string (enum) channelgroup_dm yes What to create.
name string no A channel's name (lowercase letters, digits, `.`, `_`, `-`), or a group conversation's title.
name_emoji string no An emoji to show with the name.
visibility string (enum) publicprivate no A channel's visibility, default public.
topic string no The topic.
purpose string no The description.
member_user_ids array of string no People to add at creation.
encryption_mode string (enum) standardzero_knowledge no Leave it out for `standard`; `zero_knowledge` cannot be created yet.
posting_policy string (enum) everyonemanagers_only no Who may post in a channel, default everyone.
{
  "type": "channel",
  "name": "launch-planning",
  "visibility": "private",
  "topic": "Q4 launch",
  "member_user_ids": []
}

Responses

StatusDescription
201 The conversation, or the existing group conversation for the same people.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`: `NAME_EXISTS` (the channel name is taken) or `GROUP_DM_LIMIT` (more than 9 people).
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
201 response body: data fields
FieldTypeDescription
conversation object A conversation.
existing boolean True when an existing group conversation for the same people was returned.
GET /v1/chat/conversations/{id}

Get a conversation

Returns a conversation and the caller's membership in it. A member sees it in full; anyone in the organization can see a public channel's details (null membership) without its messages. At most 240 reads a minute per user.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Responses

StatusDescription
200 The conversation and the caller's membership, or null membership.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
conversation object A conversation.
membership any The caller's membership, or null when the caller is not a member.
PATCH /v1/chat/conversations/{id}

Rename or describe a conversation

Changes a channel's name, emoji, topic, description or posting rule, or a group conversation's title and emoji. Send at least one field; `null` clears a field. In a channel, renaming and the posting rule need the owner role or the organization's channel management permission, and the topic and description need the manager role or above. Any participant can set a group conversation's title and emoji. A one-to-one conversation cannot be renamed. A rename, a topic, title or posting-rule change posts a notice in the conversation; a description change does not. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Request Body

FieldTypeRequiredDescription
name string | null no A new channel name or group title; null clears a group title.
name_emoji string | null no The emoji; null clears it.
topic string | null no The topic; null clears it.
purpose string | null no The description; null clears it.
posting_policy string (enum) everyonemanagers_only no Who may post in a channel.
{
  "topic": "Launch on the 14th"
}

Responses

StatusDescription
200 The conversation and whether anything changed.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code`: `NAME_EXISTS`, `NAME_TAKEN_ARCHIVED` (an archived channel holds the name), `ARCHIVED`, `GENERAL_PROTECTED` or `WRONG_CONVERSATION_TYPE`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
conversation object A conversation.
changed boolean False when nothing needed to change.
POST /v1/chat/conversations/{id}/archive

Archive a channel

Archives a channel: its members can still read it, but it takes no new messages. Needs the owner role or the organization's channel management permission; the organization's default channel cannot be archived. Repeating it changes nothing. Send no body, or `{}`. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Responses

StatusDescription
200 Done.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with the reason in `error.details.code`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
conversation object A conversation.
changed boolean False when nothing needed to change.
POST /v1/chat/conversations/{id}/chips/resolve

Check attachments before sending

Checks Backbuild Files items the caller wants to attach and returns them in the form a send stores. Only files from Backbuild Files can be attached (`CHIP_UNSUPPORTED`, with the `chip_index`), and the caller must be allowed to share each one. Nothing is shared until the message is sent; the send then gives the conversation access to each file. At most 30 attachment requests a minute per user.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Request Body

FieldTypeRequiredDescription
chips array of object yes The attachments to check.

Responses

StatusDescription
200 The attachments as a send will store them.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FORBIDDEN`, with `error.details.code`: `POSTING_RESTRICTED`, or `CEILING_EXCEEDED` when the organization's sharing limits do not allow the file to be shared here.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code` `ARCHIVED`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
chips array of object The attachments as a send will store them, with each file's own name, type and size.
POST /v1/chat/conversations/{id}/convert

Turn a group conversation into a private channel

Converts a group conversation into a private channel with the name given (any participant can), or a public channel into a private one (owner role or the organization's channel management permission). Conversion is one way. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Request Body

FieldTypeRequiredDescription
to string (enum) private_channel yes Always `private_channel`.
name string no The channel's name; required when converting a group conversation.
{
  "to": "private_channel",
  "name": "launch-core"
}

Responses

StatusDescription
200 The converted conversation.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code`: `WRONG_CONVERSATION_TYPE` (including a one-to-one conversation that ended), `GENERAL_PROTECTED`, `REKEY_REQUIRED` (a key change is still pending; retry shortly) or `NAME_EXISTS`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
conversation object A conversation.
changed boolean False when nothing needed to change.
POST /v1/chat/conversations/{id}/join

Join a public channel

Adds the caller to a public channel. Joining one you already belong to returns `existing: true`; the first person to join an empty channel becomes its owner. A private channel, or one the caller cannot see, answers 404. Send no body, or `{}`. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Responses

StatusDescription
200 Done.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with the reason in `error.details.code`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
conversation object A conversation.
membership object The caller's own membership in a conversation.
existing boolean True when the caller was already a member.
POST /v1/chat/conversations/{id}/leave

Leave a conversation

Removes the caller from a channel or group conversation and posts a notice. The conversation's key is then replaced, so the caller cannot open messages sent afterwards (`rekey_required`). When the last owner leaves, the longest-standing manager, else member, becomes owner; the last member leaving a private channel archives it. A one-to-one conversation and the organization's default channel cannot be left. Send no body, or `{}`. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Responses

StatusDescription
200 Done.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with the reason in `error.details.code`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
left boolean True.
conversation_id string<uuid> The conversation.
rekey_required boolean True: the conversation's key will be replaced.
promoted_user_id string | null Who became owner, when the caller was the last owner.
auto_archived boolean True when the caller was the last member of a private channel, which is now archived.
GET /v1/chat/conversations/{id}/members

List a conversation's members

Lists the people in a conversation: its members can read it, anyone in the organization can read a public channel's, and channel managers in the organization can read any channel's. Only names, roles and join details are listed, never a member's own read, notification or star settings. A channel lists active members; a direct or group conversation also lists deactivated ones (`is_deactivated: true`). At most 240 reads a minute per user.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.
query query string no Optional. Text to match a member's name or email.
limit query integer no Optional. Page size, default 50.
cursor query string no Optional. The `next_cursor` from the previous page; opaque.

Responses

StatusDescription
200 A page of members and the total listed.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
items array of object
next_cursor string | null Pass as `cursor` for the next page; null at the end.
total integer How many members are listed in all.
POST /v1/chat/conversations/{id}/members

Add people to a conversation

Adds active people from the organization. In a public channel any member can add people; in a private channel the manager role or above can. A group conversation holds at most 9 people (`GROUP_DM_LIMIT`; convert it to a channel for more). People already in the conversation are listed in `already_members`. New members can read messages from the conversation's current key onward. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Request Body

FieldTypeRequiredDescription
user_ids array of string yes The people to add.
{
  "user_ids": [
    "0190a6f2-3c1e-7d4b-9a2f-5b6c7d8e9f01"
  ]
}

Responses

StatusDescription
200 Who was added, and who already belonged.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code`: `NOT_IN_ORG` (with the offending `user_ids`; nobody is added), `GROUP_DM_LIMIT`, `GROUP_DM_EXISTS` (that set of people already has a conversation), `WRONG_CONVERSATION_TYPE` or `ARCHIVED`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
added array of string Who was added.
already_members array of string Who already belonged.
conversation object A conversation.
PATCH /v1/chat/conversations/{id}/members/{userId}

Change a member's role in a channel

Sets a channel member's role to owner, manager or member. Needs the owner role or the organization's channel management permission; the last owner cannot be demoted. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.
userId path string<uuid> yes The member.

Request Body

FieldTypeRequiredDescription
role string (enum) ownermanagermember yes The new role.
{
  "role": "manager"
}

Responses

StatusDescription
200 The member and whether the role changed.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code`: `LAST_OWNER` or `WRONG_CONVERSATION_TYPE`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
member object
changed boolean False when the role was already that.
DELETE /v1/chat/conversations/{id}/members/{userId}

Remove a member from a channel

Removes someone from a channel and posts a notice; the conversation's key is then replaced so they cannot open later messages (`rekey_required`). Needs the manager role or above, or the organization's channel management permission; an owner can be removed only by another owner. Removing someone who is not a member answers `removed: false`. Removing yourself is the same as leaving. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.
userId path string<uuid> yes The member to remove.

Responses

StatusDescription
200 The outcome.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code`: `LAST_OWNER`, `GENERAL_PROTECTED` or `WRONG_CONVERSATION_TYPE`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
removed boolean False when they were not a member.
conversation_id string<uuid> The conversation.
user_id string<uuid> The person.
rekey_required boolean True when the conversation's key will be replaced.
PATCH /v1/chat/conversations/{id}/membership

Set your own preferences for a conversation

Changes the caller's own settings in a conversation: notification override, mute, star and sidebar section. Send at least one field; `null` clears it. Works on archived conversations too. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Request Body

FieldTypeRequiredDescription
notification_override string | null no `all`, `mentions` or `mute`; null follows your Chat settings.
muted_until string | null no Mute until this time; null unmutes.
is_starred boolean no Star or unstar.
section_id string | null no A sidebar section of your own; null removes it from a section.
{
  "is_starred": true
}

Responses

StatusDescription
200 The caller's membership.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
membership object The caller's own membership in a conversation.
GET /v1/chat/conversations/{id}/messages

List messages

Returns a page of a conversation's messages, newest first by default, as sealed envelopes the caller's device opens (`envelope_b64`), with their cleartext details: sender, time, mentions, attachments, reactions, pin flag, thread counts and edit or delete marks. Deleted messages appear as tombstones without a body. `inactive_people` names anyone the page mentions or shows who has left or been deactivated, so their name still shows. Members only. At most 240 reads a minute per user.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.
cursor query string no Optional. The `next_cursor` from the previous page; opaque.
direction query string (enum) no Optional. `before` (default) pages back from the cursor, newest first; `after` pages forward, oldest first, to catch up.
limit query integer no Optional. Page size, default 50.
thread_root_id query string<uuid> no Optional. List one thread's replies.
include_threads query string (enum) no Optional. Include thread replies in the main list (default false: top-level messages and replies also sent to the channel).

Responses

StatusDescription
200 A page of messages.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
items array of object
next_cursor string | null Pass as `cursor` for the next page; null at the end.
has_more boolean Whether there are more.
current_key_epoch integer The conversation's current key generation.
inactive_people array of object People on the page who have left or been deactivated.
POST /v1/chat/conversations/{id}/messages

Send a message

Sends a message to a conversation the caller belongs to. Message bodies are end-to-end encrypted: the API carries a sealed envelope (`envelope_b64`) that the sender's device encrypted with the conversation's key, and that members' devices open. In a standard conversation Backbuild opens a new or edited message once, on the server, with the organization's chat key, to check its mentions and build its search index; the plaintext is not stored. Sealing and opening need the conversation key on a registered Chat device, which the Backbuild apps manage; that device-key protocol is not part of this reference. `key_epoch` must be the conversation's current key generation; after a key change the send is refused with `STALE_EPOCH`, and the client fetches the new key, seals again and retries. `client_msg_id` makes a send safe to retry: the same id returns the first message with `deduplicated: true`. Mentions are listed in cleartext so the right people are notified, and must match the mentions sealed in the message. The conversation's posting rule applies (`POSTING_RESTRICTED`), and `everyone` is allowed only in the organization's default channel by people with that permission. Attachments are Backbuild Files items passed as chips (see `POST /v1/chat/conversations/{id}/chips/resolve`). At most 60 sends, edits, deletes, reactions, pins and read marks a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Request Body

FieldTypeRequiredDescription
client_msg_id string<uuid> yes A new id per message from the client; retrying with the same id never sends twice.
envelope_b64 string yes The message body sealed on the sending device with the conversation's key, as base64 (at most 128 KiB decoded). Never plaintext.
key_epoch integer yes The key generation the body is sealed with; must be the conversation's current one.
thread_root_id string<uuid> no Reply in this message's thread.
also_send_to_channel boolean no For a thread reply, also show it in the main conversation.
sender_device_id string<uuid> no The sending device, when signing.
sender_sig_b64 string no The sending device's signature, base64.
mention_user_ids array of string no People mentioned. Must match the mentions sealed in the body.
mention_group_ids array of string no Groups mentioned.
mention_specials array of enum herechanneleveryone no `here`, `channel` or `everyone` (organization policy applies).
chips array of object no Attachments, at most 20 and 16 KiB in all.

Responses

StatusDescription
201 The stored message.
400 `VALIDATION_ERROR`: a malformed body; or, with `error.details.code`, `ENVELOPE_INVALID` or `BODY_INVALID` (the envelope could not be opened as a message), `MENTIONS_MISMATCH` (the declared mentions differ from the sealed ones) or `CHIP_UNSUPPORTED` (with the `chip_index` of an attachment that cannot be attached). `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FORBIDDEN`, with `error.details.code` `POSTING_RESTRICTED` when the posting rule does not allow the caller; `FEATURE_DISABLED` when Chat is off.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code`: `STALE_EPOCH` (re-seal with the current key), `ARCHIVED`, `NOT_IN_ORG` or `USER_DEACTIVATED` (the other person in a one-to-one conversation left or was deactivated), or a storage limit (`DB_STORAGE_CAP_EXCEEDED`).
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
503 `SERVICE_UNAVAILABLE`: encryption is temporarily unavailable; retry.
201 response body: data fields
FieldTypeDescription
message object A message. The body is a sealed envelope; everything else is cleartext.
deduplicated boolean True when this `client_msg_id` was already sent and the first message is returned.
PATCH /v1/chat/conversations/{id}/messages/{messageId}

Edit a message

Replaces the body of the caller's own message with a newly sealed envelope. `expected_revision` is the revision the client loaded; if the message changed since then, for example through an edit from another device, the edit is refused (`REVISION_CONFLICT`). The organization's edit window applies (`EDIT_WINDOW_EXPIRED`). Mentions and chips follow the same rules as a send; leaving `chips` out keeps the attachments, and removing an attachment ends the conversation's access to that file unless another message still carries it. Message bodies are end-to-end encrypted: the API carries a sealed envelope (`envelope_b64`) that the sender's device encrypted with the conversation's key, and that members' devices open. In a standard conversation Backbuild opens a new or edited message once, on the server, with the organization's chat key, to check its mentions and build its search index; the plaintext is not stored. Sealing and opening need the conversation key on a registered Chat device, which the Backbuild apps manage; that device-key protocol is not part of this reference. At most 60 sends, edits, deletes, reactions, pins and read marks a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.
messageId path string<uuid> yes The message.

Request Body

FieldTypeRequiredDescription
envelope_b64 string yes The message body sealed on the sending device with the conversation's key, as base64 (at most 128 KiB decoded). Never plaintext.
key_epoch integer yes The conversation's current key generation.
expected_revision integer yes The revision the client loaded; the edit becomes the next one.
mention_user_ids array of string no People mentioned. Must match the mentions sealed in the body.
mention_group_ids array of string no Groups mentioned.
mention_specials array of enum herechanneleveryone no `here`, `channel` or `everyone` (organization policy applies).
chips array of object no Attachments, at most 20 and 16 KiB in all.

Responses

StatusDescription
200 The edited message.
400 `VALIDATION_ERROR`: a malformed body; or, with `error.details.code`, `ENVELOPE_INVALID`, `BODY_INVALID`, `MENTIONS_MISMATCH` or `CHIP_UNSUPPORTED`, as for a send.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FORBIDDEN`: not the sender, or `error.details.code` `EDIT_WINDOW_EXPIRED`.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code`: `STALE_EPOCH`, `REVISION_CONFLICT` or `ARCHIVED`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
503 `SERVICE_UNAVAILABLE`: encryption is temporarily unavailable; retry.
200 response body: data fields
FieldTypeDescription
message object A message. The body is a sealed envelope; everything else is cleartext.
DELETE /v1/chat/conversations/{id}/messages/{messageId}

Delete a message

Deletes a message, leaving a tombstone: the body, search entry, reactions and pins are removed, and attachments it carried stop being shared with the conversation unless another message still carries them. The sender can delete within the organization's delete window; a Chat administrator who is a member of the conversation can delete any of its messages when the organization allows it. At most 60 sends, edits, deletes, reactions, pins and read marks a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.
messageId path string<uuid> yes The message.

Responses

StatusDescription
200 Deleted.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
deleted boolean True.
PUT /v1/chat/conversations/{id}/messages/{messageId}/reactions/{emoji}

React to a message

Adds the caller's reaction. Adding the same reaction again returns it (`deduplicated: true`). A message holds at most 50 different reactions and 23 from one person (`REACTION_LIMIT`); a custom emoji must exist (`EMOJI_UNAVAILABLE`). At most 60 sends, edits, deletes, reactions, pins and read marks a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.
messageId path string<uuid> yes The message.
emoji path string yes An emoji shortcode or custom emoji name, optionally followed by `::skin-tone-2` to `::skin-tone-6`.

Responses

StatusDescription
200 The reaction.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code`: `REACTION_LIMIT`, `EMOJI_UNAVAILABLE` or `ARCHIVED`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
reaction object
deduplicated boolean True when the caller had already added it.
DELETE /v1/chat/conversations/{id}/messages/{messageId}/reactions/{emoji}

Remove your reaction

Removes the caller's own reaction. At most 60 sends, edits, deletes, reactions, pins and read marks a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.
messageId path string<uuid> yes The message.
emoji path string yes An emoji shortcode or custom emoji name, optionally followed by `::skin-tone-2` to `::skin-tone-6`.

Responses

StatusDescription
200 Removed.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code` `ARCHIVED`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
removed boolean True when something was removed.
GET /v1/chat/conversations/{id}/pins

List pinned messages

Lists a conversation's pinned messages, newest pin first, each with its message. Members only. At most 240 reads a minute per user.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.
limit query integer no Optional. Page size, default 50.
cursor query string no Optional. The `next_cursor` from the previous page; opaque.

Responses

StatusDescription
200 A page of pins.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
items array of object
next_cursor string | null Pass as `cursor` for the next page; null at the end.
has_more boolean Whether there are more.
PUT /v1/chat/conversations/{id}/pins/{messageId}

Pin a message

Pins a message in the conversation for every member. Pinning it again returns the pin (`deduplicated: true`). A conversation has a limit on pins (`PIN_LIMIT`). At most 60 sends, edits, deletes, reactions, pins and read marks a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.
messageId path string<uuid> yes The message.

Responses

StatusDescription
200 The pin.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code`: `PIN_LIMIT` or `ARCHIVED`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
pin object
deduplicated boolean True when it was already pinned.
DELETE /v1/chat/conversations/{id}/pins/{messageId}

Unpin a message

Removes a pin. At most 60 sends, edits, deletes, reactions, pins and read marks a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.
messageId path string<uuid> yes The message.

Responses

StatusDescription
200 Removed.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with `error.details.code` `ARCHIVED`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
removed boolean True when something was removed.
POST /v1/chat/conversations/{id}/read

Mark a conversation read

Moves the caller's read position forward to a message of this conversation (an older message changes nothing) and clears the unread-mention count when it reaches the newest message. While the caller shares read receipts, the move also updates what others see as read in a direct conversation. At most 60 sends, edits, deletes, reactions, pins and read marks a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Request Body

FieldTypeRequiredDescription
last_read_message_id string<uuid> yes The newest message read, in this conversation.

Responses

StatusDescription
200 The caller's membership and whether the position moved.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
moved boolean False when the position was already at or past that message.
direct boolean Whether the conversation is a direct one.
membership object The caller's read state.
GET /v1/chat/conversations/{id}/receipts

Read delivery and read receipts

Returns how far every other member of a direct conversation has received and seen it, as the oldest such message id over those members: what the sender's ticks show. Nothing per member is returned. Channels have no receipts (`mode: none`). `read_through` is null unless the caller shares their own read receipts. Members only. At most 240 reads a minute per user.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Responses

StatusDescription
200 The conversation's receipts.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
mode string (enum) noneselfdirect `none` for a channel, `self` for your own space or when nobody else is left, `direct` otherwise.
delivered_through string | null Every other member has received messages up to this one.
read_through string | null Every other member has seen messages up to this one; null unless the caller shares read receipts.
read_receipts_shared boolean Whether the caller shares their own read receipts.
POST /v1/chat/conversations/{id}/unarchive

Unarchive a channel

Reverses an archive, with the same permissions. Send no body, or `{}`. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
id path string<uuid> yes The conversation.

Responses

StatusDescription
200 Done.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`, with the reason in `error.details.code`.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
conversation object A conversation.
changed boolean False when nothing needed to change.
GET /v1/chat/conversations/browse

Browse channels

Lists channels the caller can see: every public channel, and the private channels the caller belongs to. A private channel the caller is not in is never returned. `query` matches a channel's name or description. At most 240 reads a minute per user.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
query query string no Optional. Text to match in the name or description.
filter query string (enum) no Optional. Which channels, default `all`.
sort query string (enum) no Optional. Order, default `name`.
limit query integer no Optional. Page size, default 50.
cursor query string no Optional. The `next_cursor` from the previous page; opaque.

Responses

StatusDescription
200 A page of channels with the total that match.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
items array of object
total integer How many channels match.
next_cursor string | null Pass as `cursor` for the next page; null at the end.
POST /v1/chat/delivered

Report delivered messages

Reports, for up to 100 direct conversations at once, the newest message the caller's app has received, so senders see it as delivered. Each conversation may appear once. Conversations whose delivered position moved are listed in `advanced`; the rest in `skipped`. At most 60 sends, edits, deletes, reactions, pins and read marks a minute per user, together.

Auth Session JWT (Bearer)

Request Body

FieldTypeRequiredDescription
items array of object yes One entry per direct conversation.

Responses

StatusDescription
200 Which conversations advanced.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
advanced array of string Conversations whose delivered position moved.
skipped array of any Entries that changed nothing.
POST /v1/chat/dm/open

Open a direct conversation

Opens the direct conversation for a set of people, creating it the first time: no ids opens the caller's own space, one id the one-to-one conversation with that person, and more ids a group conversation (at most 9 people in all). Asking again returns the same conversation (`existing: true`). Every id must be an active person in the organization; a virtual worker or service account is refused like a non-member. At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Request Body

FieldTypeRequiredDescription
user_id string<uuid> no The other person in a one-to-one conversation.
member_user_ids array of string no The other people: empty for your own space, one for a one-to-one, more for a group.
{
  "user_id": "0190a6f2-3c1e-7d4b-9a2f-5b6c7d8e9f01"
}

Responses

StatusDescription
200 The conversation and whether it already existed.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
404 `NOT_FOUND`: no such conversation the caller can see. A conversation the caller is not allowed to know about answers the same way.
409 `CONFLICT`: `GROUP_DM_LIMIT` (more than 9 people).
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
conversation object A conversation.
existing boolean True when it already existed.
GET /v1/chat/people

List the people you chat with

Lists the active people in the organization the caller has exchanged direct messages with, plus anyone whose one-to-one conversation the caller starred, most recent activity first. Virtual workers and service accounts are not people here. Conversation ids and messages are never included. At most 240 reads a minute per user.

Auth Session JWT (Bearer)

Parameters

NameInTypeRequiredDescription
limit query integer no Optional. How many, default 200.

Responses

StatusDescription
200 The people and the total.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
items array of object
total integer How many in all.
GET /v1/chat/settings

Get your Chat settings

Returns the caller's own Chat settings in the active organization: notification mode, keywords, do-not-disturb, notification schedule, status and app preferences. Defaults are returned (`exists: false`) until the caller saves any. At most 240 reads a minute per user.

Auth Session JWT (Bearer)

Responses

StatusDescription
200 The caller's settings.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
settings object The caller's Chat settings.
PUT /v1/chat/settings

Change your Chat settings

Changes the caller's own Chat settings; send at least one field. Only the caller's own settings can be changed: a `user_id` is refused. `prefs` is a small object the apps use for preferences such as pinned virtual workers (at most 8 KiB). At most 30 changes to conversations, memberships and settings a minute per user, together.

Auth Session JWT (Bearer)

Request Body

FieldTypeRequiredDescription
notification_mode string (enum) allmentionscustomnothing no Which messages notify you.
keywords array of string no Words that notify you.
dnd_until string | null no Do not disturb until this time; null ends it.
notification_schedule object no When notifications are allowed (at most 4 KiB).
prefs object no App preferences (at most 8 KiB).
{
  "notification_mode": "mentions",
  "keywords": [
    "launch"
  ]
}

Responses

StatusDescription
200 The saved settings.
400 `VALIDATION_ERROR`: a malformed id, body or query (the response lists the problems); `INVALID_JSON`: the body is not JSON.
401 401 Unauthorized: missing, expired, malformed, or revoked credentials.
403 `FEATURE_DISABLED`: Chat is not enabled for the organization. `FORBIDDEN`: the caller is not an active member with permission to use Chat, or lacks the role the action needs; `error.details.code` names a more specific reason when there is one.
429 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window.
500 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side.
200 response body: data fields
FieldTypeDescription
settings object The caller's Chat settings.