Skip to main content

Rate Limits

Rate limits are applied per endpoint over a rolling 60-second window. Each endpoint has its own counter, so hitting the limit on one route never affects another. Exceeding a limit returns 429 Too Many Requests.

How it works

  • The window is 1 minute for every endpoint.
  • Limits are isolated per endpoint — list-boards and send-message count separately.
  • Every response carries rate-limit headers so you can pace yourself before hitting the cap.

Response headers

HeaderDescription
X-RateLimit-LimitMaximum requests allowed for this endpoint per window.
X-RateLimit-RemainingRequests remaining in the current window.
X-RateLimit-ResetWhen the current window resets.
Retry-AfterSeconds to wait before retrying (sent on 429 only).

Limits by category

Limits cluster into a few tiers. The exact cap depends on how heavy the operation is.

CategoryTypical limit (per minute)Examples
Reads50List boards, get a row, list channels, list notifications, list bookings
Heavier reads30Docs tree, drive tree, all /workspace/* reads
Writes30Create/update/delete rows, docs, comments, folders; upload presigned URLs
Heavy writes20Markdown writes (row, column, doc), multipart upload start/finalize
Search60The cross-entity /search endpoint (docs/drive search are 50)
Notification mutations60Mark read/unread, delete
Messaging100Send channel message, send direct message
Export10Async table export (the most restricted endpoint)

Representative endpoint limits

EndpointMethodLimit / min
/board/list-boardsGET50
/board/{boardId}/table/{tableId}/rowsGET50
/board/{boardId}/table/{tableId}/rowPOST30
/board/{boardId}/table/{tableId}/row/{rowId}/mdPOST20
/board/{boardId}/table/{tableId}/exportPOST10
/docs/treeGET30
/docs/{docId}/mdPOST20
/drive/files/upload/multipart/startPOST20
/searchGET60
/notificationsGET50
/notifications/{notificationId}PATCH / DELETE60
/workspace/infoGET30
/chat/channelsGET50
/chat/channel/{channelId}/send-messagePOST100
note

These numbers are accurate at the time of writing but may change. Always read the X-RateLimit-* headers at runtime rather than hardcoding limits — and consult the API Reference for the current value on a specific endpoint.

The 429 response

When you exceed a limit, the endpoint returns:

{
"statusCode": 429,
"error": "Too Many Requests",
"message": "Too many requests, please try again later",
"retryAfter": 27
}

The Retry-After header carries the same value (in seconds) as the retryAfter body field — the time until the window resets.

Backoff guidance

  • Honor Retry-After. On a 429, wait the number of seconds it specifies before retrying.
  • Use exponential backoff as a fallback. If no Retry-After is present (for example on a 5xx), back off exponentially: 1s, 2s, 4s, …
  • Watch X-RateLimit-Remaining. Slow down proactively as it approaches zero instead of waiting for a 429.
  • Spread bulk work. When iterating large lists or batch-creating rows, add a small delay between calls to stay under the per-minute cap.
  • Cap retries. Give up after a few attempts and surface the error rather than retrying forever.

See Error Handling for a complete retry example.