Docs

Connect Dayroom to the tools you use

Build integrations with the REST API, connect your AI apps, or send backend events into a room. Every connection follows your team’s permissions.

Get an API token

REST API

restREST API · 1 of 6

Your first request

Build with REST: HTTPS, JSON and scoped API tokens.

Create your API token3 steps

  1. Sign in to Dayroom and open API tokens.
  2. Name your integration, choose one workspace and select its access.
  3. Create the token and save it in your backend’s secret manager.

Set DAYROOM_API_TOKEN securely in your environment, then run:

Example
export DAYROOM_API_URL='https://app.usedayroom.com/api/v1'
curl --fail-with-body "$DAYROOM_API_URL/workspace" \
  --header "Authorization: Bearer $DAYROOM_API_TOKEN"

Example response (IDs and names are illustrative):

Example
{
  "workspace": {"id": "workspace_123", "name": "Acme Studio"},
  "you": {"id": "person_123", "name": "Amara", "owner": false},
  "member_count": 8,
  "can_send": false,
  "app": "Release notifications"
}

Use GET /conversations to find conversation IDs, and GET /people to find person IDs. A token already selects its workspace; you don’t pass a workspace ID in the URL.

rest-authenticationREST API · 2 of 6

Authentication and permissions

Every request uses Authorization: Bearer YOUR_API_TOKEN. Browser cookies, webhook credentials and MCP OAuth tokens cannot authenticate to this API. Keep tokens on your server; browser CORS access is not enabled.

AccessScopeAllows
Read onlydayroom:readWorkspace, people, conversations, messages, threads, search and to-dos.
Read and writedayroom:read dayroom:writeReading plus sending, thread replies, reactions, read receipts and to-do changes.

Tokens expire after 7, 30 or 90 days. Up to 20 active tokens can belong to one person. Only a token hash is stored; the secret is shown once. To rotate, create a replacement, update your backend and revoke the old token.

A token acts as its creator in one workspace. It never grants extra access. Private rooms, DMs and to-dos keep their existing permissions; archived rooms stay read-only, deleted rooms disappear, and plan restrictions still apply. Private companion conversations and connected-provider data are excluded.

Revoke access from API tokens. Password changes, account recovery and workspace removal also revoke affected tokens. Rejoining a workspace does not restore them. Revocation prevents new authenticated requests; a request already executing may finish.

rest-examplesREST API · 3 of 6

Working examples

Read messages with Python

Uses the Python standard library. The conversation ID comes from GET /conversations.

Example
import json
import os
from urllib.parse import quote
from urllib.request import Request, urlopen

base = os.environ["DAYROOM_API_URL"].rstrip("/")
token = os.environ["DAYROOM_API_TOKEN"]
conversation = quote(os.environ["DAYROOM_CONVERSATION_ID"], safe="")
request = Request(
    f"{base}/conversations/{conversation}/messages?limit=20",
    headers={"Authorization": f"Bearer {token}"},
)
with urlopen(request, timeout=20) as response:
    page = json.load(response)
for message in page["messages"]:
    print(message["author"]["name"], message["text"])
print("Older messages cursor:", page["before_message_id"])

Send a message with Node.js

Requires built-in fetch. Choose read and write when creating the token. Persist the same event key and JSON for retries.

Example
const base = process.env.DAYROOM_API_URL.replace(/\/$/, '');
const conversation = encodeURIComponent(process.env.DAYROOM_CONVERSATION_ID);
const response = await fetch(`${base}/conversations/${conversation}/messages`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAYROOM_API_TOKEN}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': 'release-2026-11-02-001'
  },
  body: JSON.stringify({text: 'The new release is ready for review.'}),
  signal: AbortSignal.timeout(20000)
});
const result = await response.json();
if (!response.ok) {
  throw new Error(`${response.status} ${result.error.code}: ${result.error.message}`);
}
console.log(result.message.id, result.duplicate);

Successful sends return 200, including the first request:

Example
{
  "message": {
    "id": 123,
    "conversation_id": "room_123",
    "author": {"id": "person_123", "name": "Amara"},
    "text": "The new release is ready for review.",
    "created": "2026-11-02T12:00:00Z",
    "thread_root_id": null,
    "thread_reply_count": 0,
    "reply_to": null,
    "files": [],
    "reactions": [],
    "sent_via": "Release notifications",
    "agent": false,
    "webhook": false
  },
  "duplicate": false
}

Reply in a thread

Example
curl --fail-with-body "$DAYROOM_API_URL/conversations/$DAYROOM_CONVERSATION_ID/messages" \
  --header "Authorization: Bearer $DAYROOM_API_TOKEN" \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: release-thread-reply-001' \
  --data '{"text":"Deployment is complete.","thread_root_id":123}'

Create a private to-do

Example
curl --fail-with-body "$DAYROOM_API_URL/todos" \
  --header "Authorization: Bearer $DAYROOM_API_TOKEN" \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: release-followup-task-001' \
  --data '{"title":"Review the release notes","due":"Friday","shared":false}'

Returns {"todo":{...}}. Without assignee_id, the to-do belongs to you. Assigning someone else defaults to team visibility; send shared:false to keep it private between you and the assignee.

rest-referenceREST API · 4 of 6

Endpoint reference

Base URL: https://app.usedayroom.com/api/v1. Responses are JSON objects, not JSON-RPC. All successful operations return 200. Timestamps are ISO 8601 UTC strings; nullable fields are returned as JSON null.

Download the OpenAPI 3.1 document for request and response schemas. Unknown fields and repeated query parameters are rejected. Omit optional request fields instead of sending null. Send {} for an operation with no body fields.

GET /workspace — Workspace and you

Who you are in this Dayroom workspace: its name, your name and role, how many people are in it, and whether this connection can send messages.

Required scope: dayroom:read.

FieldTypeRequirement
No parameters.
GET /people — List people

List the people in this workspace with their IDs, status (available, working, away, do not disturb, lunch, sick, out of office) and whether they are online. Use an ID to mention someone, send a direct message or assign a to-do.

Required scope: dayroom:read.

FieldTypeRequirement
No parameters.
GET /conversations — List conversations

List the rooms and direct messages you can see, with IDs, topics, unread counts and mentions. Use a conversation ID with GET or POST /conversations/{conversation_id}/messages.

Required scope: dayroom:read.

FieldTypeRequirement
kindstring · all, rooms, dmsOptional
unread_onlybooleanOptional
include_archivedbooleanOptional. Archived rooms are read-only.
GET /conversations/{conversation_id}/messages — Read messages

Read a room or direct message, oldest first. Thread replies are not included; follow a message with replies using dayroom_read_thread. For older messages pass the returned before_message_id.

Required scope: dayroom:read.

FieldTypeRequirement
conversation_idstringPath; max 100 characters
limitintegerOptional; max 50
before_message_idintegerOptional; max 9223372036854775807. Return messages older than this one.
around_message_idintegerOptional; max 9223372036854775807. Return the messages around this one, e.g. a search result.
POST /conversations/{conversation_id}/messages — Send a message

Post a message as you in a room or direct message, optionally as a thread reply. It appears with your name, labelled with this app. To mention someone, include @Their Name in the text and their person ID in mention_ids ("all" mentions everyone).

Required scope: dayroom:write. Send Content-Type: application/json. Required header: Idempotency-Key.

FieldTypeRequirement
conversation_idstringPath; max 100 characters
textstringRequired; max 8000 characters
thread_root_idintegerOptional; max 9223372036854775807. Reply inside the thread that starts with this message.
reply_to_message_idintegerOptional; max 9223372036854775807. Quote this message in the reply.
mention_idsarrayOptional
PUT /conversations/{conversation_id}/read — Mark as read

Mark a conversation as read for you, up to a message or to the latest one.

Required scope: dayroom:write. Send Content-Type: application/json.

FieldTypeRequirement
conversation_idstringPath; max 100 characters
up_to_message_idintegerOptional; max 9223372036854775807
GET /messages/search — Search messages

Find messages containing some text across the rooms and direct messages you can see, newest first.

Required scope: dayroom:read.

FieldTypeRequirement
querystringRequired; max 200 characters
limitintegerOptional; max 50
before_message_idintegerOptional; max 9223372036854775807. Continue a search from the returned cursor.
GET /messages/{message_id} — Get a message

Get one message by ID, with its conversation.

Required scope: dayroom:read.

FieldTypeRequirement
message_idintegerPath; max 9223372036854775807
GET /messages/{message_id}/thread — Read a thread

Read a message and its thread replies, oldest first. Pass any message in the thread.

Required scope: dayroom:read.

FieldTypeRequirement
message_idintegerPath; max 9223372036854775807
before_message_idintegerOptional; max 9223372036854775807. Return replies older than this one.
PUT /messages/{message_id}/reactions — React to a message

Add or remove one of Dayroom’s emoji reactions on a message, as you.

Required scope: dayroom:write. Send Content-Type: application/json.

FieldTypeRequirement
message_idintegerPath; max 9223372036854775807
emojistring · 👍, 👎, ❤️, 😂, 🎉, 🙏, 👀, ✅, 🔥, 💯, 😊, 😮, 😢, 🙌, ☕, 🚀, 👋, 🤔, 💡, 🌿Required
removebooleanOptional
POST /direct-messages — Send a direct message

Send a direct message as you to one person, starting the conversation if needed. Get person IDs from dayroom_list_people.

Required scope: dayroom:write. Send Content-Type: application/json. Required header: Idempotency-Key.

FieldTypeRequirement
person_idstringRequired; max 100 characters
textstringRequired; max 8000 characters
GET /todos — List to-dos

List to-dos in this workspace: yours by default, or everyone’s you can see. Pending only unless include_done is true.

Required scope: dayroom:read.

FieldTypeRequirement
mine_onlybooleanOptional
include_donebooleanOptional
POST /todos — Create a to-do

Create a to-do. Without assignee_id it is yours and private; a to-do for someone else defaults to team visibility. Set shared=false to keep an assignment private between you and its assignee.

Required scope: dayroom:write. Send Content-Type: application/json. Required header: Idempotency-Key.

FieldTypeRequirement
titlestringRequired; max 240 characters
assignee_idstringOptional; max 100 characters
duestringOptional; max 120 characters. Free text, e.g. "Friday" or "2026-11-02".
sharedbooleanOptional. Show it to the team. False shares only with you and the assignee.
PATCH /todos/{todo_id} — Update a to-do

Mark a to-do done or pending, or change its title, due date or assignee. Only its creator changes the details; its assignee can also change the status.

Required scope: dayroom:write. Send Content-Type: application/json.

FieldTypeRequirement
todo_idstringPath; max 100 characters
statusstring · pending, doneOptional
titlestringOptional; max 240 characters
duestringOptional; max 120 characters
assignee_idstringOptional; max 100 characters

Response collections

  • /people: people, each with id, name, you, owner, online and status.
  • /conversations: conversations, each with id, name, kind, topic, unread, mentions, muted, archived and last_message_id.
  • Message list: conversation, messages, has_more, before_message_id.
  • Single message: conversation and message. Thread: root, replies, has_more, before_message_id.
  • Search: results, has_more, before_message_id. Each result includes conversation_name.
  • To-do list: todos. Create/update: todo. Each has id, title, status, assignee, due, shared, created, conversation_id and message_id.
  • Direct send: conversation_id, message, duplicate. Reaction: message_id, reactions. Mark read: conversation_id, unread.

File metadata may appear in messages. File upload/download, message edits/deletion, room administration, Works project mutations, outbound event subscriptions and provider APIs are outside v1. A Works task returned in to-dos must be edited in Dayroom.

rest-paginationREST API · 5 of 6

Pagination

Messages are returned oldest first within each page. Search results are newest first. Start with limit=20 (maximum 50). If has_more is true, pass the returned before_message_id on the next request:

Example
GET /api/v1/conversations/room_123/messages?limit=20&before_message_id=123
GET /api/v1/messages/search?query=release&limit=20&before_message_id=123

Treat the returned cursor as opaque: imported history can have a different chronology from numeric IDs. Don’t subtract from it. Threads also accept before_message_id; their page size is set by Dayroom. around_message_id locates a message’s surrounding context and uses a server-sized page; don’t combine it with before_message_id.

People, conversations and to-dos return their currently visible collection without cursors. Reading messages doesn’t mark them read; use PUT /conversations/{id}/read explicitly.

rest-errorsREST API · 6 of 6

Errors, limits and safe retries

Example
{
  "error": {
    "code": "invalid_token",
    "message": "Use a valid, unexpired Dayroom API token.",
    "request_id": "73a102ab92fe0123456789ab"
  }
}

Every API response includes X-Request-ID. Keep that ID when reporting a failed request; don’t log the bearer token.

StatusWhat to do
400 / 415Correct the fields or JSON content type.
401Replace the expired or revoked token. Cookies cannot substitute.
402The operation needs a different workspace plan.
403 / 404Check the scope and current resource access.
405Use the documented HTTP method.
409Check archived/read-only state or conflicting idempotency key.
410The resource was deleted; don’t replay its creation.
413Keep the JSON body within 40 KiB.
429Honor the Retry-After header (seconds).
5xxRetry with exponential backoff and jitter.

Limits are 240 requests per minute per token and 600 per source IP, including invalid authentication attempts. Existing operation limits also apply, such as 100 message-send attempts per minute per person. Tokens are available on every plan; ordinary plan and visibility rules still apply.

Idempotency

Sending messages, sending DMs and creating to-dos require Idempotency-Key: 8–90 ASCII letters, digits, underscores or hyphens. Generate one per logical event. Retry with exactly the same key, endpoint and fields after a timeout, network error or 5xx response.

The key is bound to that token and request. Reusing it with changed fields returns 409. Message retries return the same ID and duplicate:true; to-do retries return the existing to-do. Keys remain bound for the token’s lifetime. Retrying after the created message or to-do was deleted returns 410. Permissions are checked again on retries, so a previously successful request can fail after access changes. Rotating a token starts a separate key namespace; don’t replay completed events with the replacement.

PUT/PATCH operations set the requested state and can be retried with the same body. They may produce a newer result if someone else changed the resource in between. Avoid automatic retries for other 4xx errors.

Versioning

The contract lives under /api/v1. Clients should ignore new response fields. Breaking request or response changes belong in a new API version. The OpenAPI document describes this deployed service; there is no separate sandbox host. Use a dedicated workspace for development.

AI apps

addressAI apps · 1 of 10

Your Dayroom address

Every AI app connects to the same address. You approve one workspace, and the app works as you, with your permissions. There’s nothing to install.

https://app.usedayroom.com/mcp

You’ll also find it in Dayroom under My account → Connected AI apps.

claudeAI apps · 2 of 10

Connect Claude

In Claude on the web, desktop or phone.

Set it up

  1. Open Customize → Connectors (older versions: Settings → Connectors) and choose Add custom connector.
  2. Name it Dayroom and paste your Dayroom address. Leave the advanced settings empty.
  3. Choose Connect. Dayroom opens: sign in, choose a workspace and select Allow.
  4. In a chat, turn on Dayroom from the + menu under Connectors.

On Claude Team and Enterprise, an owner adds it in Organization settings → Connectors first.

chatgptAI apps · 3 of 10

Connect ChatGPT

Through ChatGPT’s developer mode, on plans that include it.

Set it up

  1. Open Settings → Apps & Connectors → Advanced settings and turn on Developer mode.
  2. Choose Create, name it Dayroom, paste your Dayroom address and choose OAuth.
  3. Dayroom opens: sign in, choose a workspace and select Allow.

Work accounts may need an admin to allow developer mode. Menus change often; search ChatGPT’s help for custom connectors.

claude-codeAI apps · 4 of 10

Connect Claude Code

Add Dayroom from your terminal, then approve in your browser.

claude mcp add --transport http dayroom https://app.usedayroom.com/mcp

Then

  1. Type /mcp in Claude Code and choose Authenticate, or run claude mcp login dayroom.
  2. Approve in the Dayroom tab that opens in your browser.
other-appsAI apps · 5 of 10

Other AI apps

Any app that supports remote MCP servers with sign-in can connect. Add a remote or custom MCP server, paste your Dayroom address and sign in when it asks.

No client ID, secret or API key needed. Dayroom handles the sign-in.

approveAI apps · 6 of 10

When you approve, you stay in charge

One workspace

Pick the workspace it can use. Connect again for another one.

Reading, always

The rooms, DMs, threads, people and to-dos you can see.

Acting as you, if you tick it

Send messages and replies, react, mark read and manage to-dos.

Dayroom shows which app is asking and where it sends you back. For apps on your own computer (localhost), approve only a connection you just started.

askAI apps · 7 of 10

What to ask, in your own words

You“What did I miss in Dayroom?”

Unread messages across rooms, DMs and threads, anything that needs you first. Nothing gets marked read.

You“When are we launching, and who owns what?”

Searches, then reads the conversation and the thread where your team decided.

You“Reply to Amara that I’ll send the pricing sheet by 2pm.”

Posts the reply as you, in the right conversation.

You“Add a to-do for me to send the pricing sheet today.”

Creates it in your Dayroom to-dos.

Anything an app sends appears under your name with a small via label, so your team knows how it was sent. Most AI apps ask before they send or change anything.

privacyAI apps · 8 of 10

What it can see and what it can’t

It can see

  • What you can see, in the workspace you chose
  • Rooms, DMs and threads you’re in
  • People, status and your to-dos

It never sees

  • Private rooms you’re not in
  • Your other workspaces
  • Other people’s DMs
  • Your private chat with the Dayroom companion

Connect only apps you trust: whatever an app reads in Dayroom goes to that AI service to answer you. The same history limits apply as in the app (Free shows the last 30 days), and archived rooms stay read-only.

disconnectAI apps · 9 of 10

Disconnect any time

In Dayroom, open My account → Connected AI apps and choose Disconnect. The app loses access straight away; messages it already sent stay.

Changing your password disconnects every AI app, and leaving a workspace ends its connections there.

helpAI apps · 10 of 10

Troubleshooting, quick fixes

The app says it needs to sign in again

Connect or authenticate again from the app. This happens after you disconnect it, change your password or leave the workspace.

“This connection is read-only”

Connect again and tick Also let it act as you.

It can’t find a room or message

It only sees what you can see in the workspace you chose. Connect again to choose a different workspace.

Older messages are missing

The Free plan shows the last 30 days of history.

“Too many requests”

Wait a minute and try again.

Claude or ChatGPT can’t reach Dayroom

They connect from their own servers, so use your Dayroom address, not a Dayroom server running on your computer.

Developers

mcpDevelopers · 1 of 8

The MCP server, for developers

Dayroom hosts a remote MCP server at the address below. Any MCP client can connect with OAuth sign-in; nothing needs registering first.

https://app.usedayroom.com/mcp

Transport

  • Streamable HTTP at /mcp. Each POST gets one JSON response; no sessions or event streams.
  • MCP 2026-07-28, plus clients on 2025-11-25, 2025-06-18 and 2025-03-26.

Authorization

  • OAuth 2.1 with PKCE (S256 only). Responses include iss.
  • Discovery at /.well-known/oauth-protected-resource and /.well-known/oauth-authorization-server; a request without a token gets 401 pointing there.
  • Clients use a Client ID Metadata Document or Dynamic Client Registration at /oauth/register. Redirect URIs: HTTPS, or HTTP on localhost/127.0.0.1 (any port).
  • Send Authorization: Bearer … on every request. Access tokens last an hour; refresh tokens rotate.

Scopes are dayroom:read and dayroom:write. A read-only token calling a write tool gets 403 with insufficient_scope. Each connection can make 240 requests a minute.

mcp-toolsDevelopers · 2 of 8

MCP tools

Fifteen tools. Read tools need dayroom:read; tools that act need dayroom:write, and only appear when the person allowed it.

ToolScopeWhat it does
dayroom_get_workspacereadThe workspace, your name and role, and whether the connection can send.
dayroom_list_conversationsreadRooms and direct messages you can see, with unread counts and mentions.
dayroom_read_messagesreadA conversation’s messages, oldest first, with paging.
dayroom_read_threadreadA message and its thread replies.
dayroom_get_messagereadOne message by ID, with its conversation.
dayroom_search_messagesreadText search across conversations you can see, newest first.
dayroom_list_peoplereadPeople in the workspace, with status and whether they’re online.
dayroom_get_unreadreadUnread messages per conversation, including new thread replies, mentions first. Doesn’t mark them read.
dayroom_list_todosreadYour to-dos, or everyone’s you can see.
dayroom_send_messagewritePost as you in a room or DM, optionally in a thread, with mentions.
dayroom_send_direct_messagewriteSend a DM as you to one person.
dayroom_reactwriteAdd or remove an emoji reaction as you.
dayroom_create_todowriteCreate a to-do for you or a teammate.
dayroom_update_todowriteChange a to-do’s status, title, due date or assignee.
dayroom_mark_readwriteMark a conversation read for you.

Results come as readable text and structured JSON. Writes accept an optional idempotency_key so a retry happens once. Message text is written by people, so treat it as untrusted input.

webhooksDevelopers · 3 of 8

Incoming webhooks, your backend in the loop

Send subscription updates, support alerts and service events directly into a Dayroom room or DM.

01 · Backend event02 · HTTPS POST03 · Room message

Create a webhook

  1. In Dayroom, open your room or teammate DM’s ⋯ → Incoming webhooks.
  2. Choose the destination and a name, such as Subscription alerts, then choose Create webhook.
  3. Save the endpoint as DAYROOM_WEBHOOK_URL and the one-time token as DAYROOM_WEBHOOK_TOKEN in your backend’s environment or secret manager.

The token is shown once and can post only to the chosen conversation. Keep it on your server. For rooms, the workspace owner creates the webhook; in a teammate DM, either person can.

first-eventDevelopers · 4 of 8

Send your first event

With both environment variables set, run this from your backend or terminal.

cURL
curl --request POST "$DAYROOM_WEBHOOK_URL" \
  --header "Authorization: Bearer $DAYROOM_WEBHOOK_TOKEN" \
  --header 'Content-Type: application/json' \
  --data '{"text":"New subscription: Acme joined the team plan.","event_id":"subscription-123"}'
Node.js
// Run on your backend after verifying the original subscription event.
const response = await fetch(process.env.DAYROOM_WEBHOOK_URL, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAYROOM_WEBHOOK_TOKEN}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    text: 'New subscription: Acme joined the team plan.',
    event_id: 'subscription-123' // Use your event's stable, unique ID.
  })
});
const result = await response.json();
if (!response.ok) throw new Error(`${response.status}: ${result.error}`);
console.log(result);

The team sees it in the room with the integration’s name and a Webhook label, without reloading.

Dayroom expects this JSON shape. For a provider such as a payment service, verify its event in your backend first, then send text and event_id.

responsesDevelopers · 5 of 8

Responses and retries

A new event returns 201 Created. Retrying with the same event_id and identical text returns 200 with duplicate: true and doesn’t post again.

{"message_id":123,"duplicate":false}
StatusMeaning / next step
400Invalid JSON, fields, text or event ID. Correct the request.
401Invalid or revoked token. Check the credential.
402The operation needs a different workspace plan.
403 / 404Ownership or room access lost, or room unavailable.
409Room archived, or event ID reused with different text.
410The resource was deleted; don’t replay its creation.
413Body exceeds 40 KiB.
429Rate limit or monthly allowance reached. Honor Retry-After.

For network failures or 5xx, retry with backoff and the same event ID and text. For 429, honor Retry-After, or wait at least 60 seconds. Don’t blindly retry other 4xx.

referenceDevelopers · 6 of 8

Request reference

HTTP
POST /api/channels/{room_id}/incoming-webhooks/{webhook_id}/messages
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
  • text: required, nonblank, up to 8,000 characters. Line breaks and links are supported.
  • event_id: optional, 1–128 ASCII letters, digits, dots, colons, underscores or hyphens. Unique per webhook; without it, each request creates a new message.
  • Other fields are rejected. Attachments, mentions, thread replies and sender overrides aren’t supported.

Use the exact endpoint from setup. No cookie or CSRF token is needed. The token can’t read messages, choose another room or run agents, and @all doesn’t notify anyone.

limitsDevelopers · 7 of 8

Limits and access

  • Free: 1 active webhook per workspace and 100 new messages per calendar month (UTC), shared across rooms and DMs. Paid: 10 active webhooks per conversation, no monthly cap.
  • 60 new messages a minute per webhook; 300 a minute per workspace.
  • 300 requests a minute per source IP, including invalid credentials and retries.
  • 40 KiB maximum JSON body.

Room webhooks need workspace ownership and room access; DM webhooks need you in that DM. Duplicate and failed requests don’t use the allowance, which resets on the first of each month.

revokeDevelopers · 8 of 8

Revoke and rotate

Open Incoming webhooks and choose Revoke beside the integration. The credential stops working at once; existing messages stay.

Rotate a token

  1. Create a new webhook for the same conversation.
  2. Update your backend with the new endpoint and token.
  3. Revoke the old webhook.

Archiving pauses deliveries. Deleting the room revokes its credentials, and restoring the room doesn’t bring them back.