API guides
Rate limits
Limits are per API key, in fixed one-minute windows. Over a limit the API answers 429 with Retry-After (seconds until the window resets) and the request does not run.
| Caller | Limit |
|---|---|
| API key, reads (GET) | 600 requests per minute |
| API key, everything else | 120 requests per minute |
| MCP, same key | Shares the key’s budget: a call to a write tool counts as a write, every other message as a read |
| Public reads without credentials | Per client IP address and workspace |
| Manual webhook redeliveries | 30 per workspace per hour |
Every authenticated request counts, refused ones included. Limits are per key, so one busy integration cannot starve another that uses its own key.
When you hit a limit
HTTP/1.1 429 Too Many Requests
Retry-After: 17
Content-Type: application/json
{ "error": { "code": "rate_limited", "message": "Too many requests; try again later." } }- Wait for
Retry-Afterseconds, then repeat the request. It is safe for every method: nothing ran. - Spread bulk jobs over time instead of retrying in a tight loop.
- Prefer a page size of 100 when you read everything (pagination).
- Subscribe to webhooks instead of polling for changes.
@upvoiced/sdk retries a 429 automatically after Retry-After, up to maxRetries (default 2) and as long as the wait is under maxRetryDelayMs (default 60 s); see the SDK guide.