Errors and limits
Status codes, error bodies, rate limits and retries.
json
{
"error": { "code": "insufficient_scope", "message": "This key needs the `rooms:write` scope." },
"request_id": "req_4f1c0d2e9a7b41c3a8e5"
}Include request_id (also sent as the X-Request-Id header) when you contact support.
| Status | code | Meaning |
|---|---|---|
| 400 | invalid_request · invalid_json | Check error.details for the fields |
| 401 | unauthorized | Missing, malformed, revoked or expired key |
| 403 | insufficient_scope · forbidden | The key or its creator can't do this |
| 404 | not_found | Doesn't exist, or isn't in the key's scope |
| 402 | insufficient_credit | API credit is used up — top up in Developers → Billing |
| 409 | conflict | For example, the room is locked |
| 413 | payload_too_large | Bodies are limited to 64 KB |
| 429 | rate_limited | Wait for Retry-After seconds |
| 503 | media_unavailable | Temporary; retry with backoff |
Rate limits
Each key may make 120 requests per minute. Responses include X-RateLimit-Limit and X-RateLimit-Remaining. Retry 429 and 5xx responses with exponential backoff; the SDK does this for you.
| Resource | Limit |
|---|---|
| Active API keys per workspace | 25 |
| Webhook endpoints per workspace | 10 |
| Join link lifetime | 7 days |
| Media token lifetime (to connect) | 10 minutes |
| Participants per meeting | 300 |
| Poll options | 10 |
| Recording size | 6 GB |