On this page
Limits and Rate Limits
The numbers to design around.
| What | Limit |
|---|---|
| Requests | 120 a minute for each API key, in a fixed 60 second window |
| Over the limit | 429 rate_limited with a Retry-After header (seconds) |
| Rate limit headers | X-RateLimit-Limit and X-RateLimit-Remaining on every answer |
| People in a room | 1 to 200 (max_participants) |
| Room name | Up to 32 characters, letters, digits, - and _ |
Room metadata |
4 KB of JSON |
| Translation languages in a room | At most 5 |
| Meeting token life | 1 second to 24 hours, default 2 hours |
| List page size | 1 to 100, default 10 |
| API chat message | 1 to 1,000 characters |
| Webhook endpoints | 20 for each project and mode |
| Webhook retries | 7 attempts over about 20 hours |
| Idempotency keys | The first answer is kept for 24 hours |
| One recording | At most 240 minutes |
| Recording storage time | 30 days by default, counted from the end of the recording |
| Usage query | At most 366 days |
Your project can set its own request rate in the dashboard. Ask us if you need a higher one.
Handle 429#
Wait for the Retry-After seconds, then try again. The Node and Python SDKs do this for you (2 retries by default). If you call
the API yourself, add a small random delay so many workers do not return at the same second.
Idempotent writes#
Every POST accepts an Idempotency-Key header (up to 255 characters). If a network error leaves you unsure whether a call worked,
send it again with the same key and the same body. You get the first answer back and the header Idempotent-Replayed: true. The same
key with a different body answers 409 idempotency_key_reused.
Pagination#
Lists answer {"object": "list", "data": [...], "has_more": true}, newest first. To get the next page pass starting_after with the
id of the last item you received.