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.
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
| Field | Type | Required | Description |
message_id | string<uuid> | yes | The message. |
chip_index | integer | yes | Which attachment, from 0. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
message_id | query | string<uuid> | yes | The message. |
chip_index | query | integer | yes | Which attachment of the message, from 0. |
Responses
| Status | Description |
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
| Field | Type | Required | Description |
message_id | string<uuid> | yes | The message. |
chip_index | integer | yes | Which attachment, from 0. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Field | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Request Body
| Field | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Request Body
| Field | Type | Required | Description |
chips | array of object | yes | The attachments to check. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Request Body
| Field | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Request Body
| Field | Type | Required | Description |
user_ids | array of string | yes | The people to add. |
{
"user_ids": [
"0190a6f2-3c1e-7d4b-9a2f-5b6c7d8e9f01"
]
}
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
userId | path | string<uuid> | yes | The member. |
Request Body
| Field | Type | Required | Description |
role | string (enum) ownermanagermember | yes | The new role. |
{
"role": "manager"
}
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
userId | path | string<uuid> | yes | The member to remove. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Request Body
| Field | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Request Body
| Field | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
messageId | path | string<uuid> | yes | The message. |
Request Body
| Field | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
messageId | path | string<uuid> | yes | The message. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
messageId | path | string<uuid> | yes | The message. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
messageId | path | string<uuid> | yes | The message. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Request Body
| Field | Type | Required | Description |
last_read_message_id | string<uuid> | yes | The newest message read, in this conversation. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
id | path | string<uuid> | yes | The conversation. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Field | Type | Required | Description |
items | array of object | yes | One entry per direct conversation. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Field | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Name | In | Type | Required | Description |
limit | query | integer | no | Optional. How many, default 200. |
Responses
| Status | Description |
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
| Field | Type | Description |
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
| Status | Description |
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
| Field | Type | Description |
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
| Field | Type | Required | Description |
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
| Status | Description |
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
| Field | Type | Description |
settings | object | The caller's Chat settings. |