429 rate_limit_exceeded, your integration sent more requests than the current allowance for that type of operation. The response tells you how long to wait.
Wait, then retry safely
- Read the latest
Retry-Afterfrom each429response. - Wait at least that interval, then add a small random delay. On subsequent
429responses, honor the newestRetry-Afterand increase the randomized delay up to a caller-defined cap to avoid a tight, unbounded retry loop. - Retry only when the operation is safe and within a caller-defined maximum-attempt count or elapsed-time/deadline budget. Stop and surface the error when that budget is exhausted. For the same logical write, within the documented idempotency boundary, preserve the same HTTP method, path, API version, semantically identical body, and original
Idempotency-Key.
Five independent counters
Operations consume one of five independent buckets:
Cancellation and pause operations consume
write, not execution. Transcript polling and recording polling each use their own dedicated bucket instead of consuming the general read allowance. Telephony work initiated by an accepted execution request does not consume another HTTP request allowance.
Recording downloads are not rate-limited — issuance is
GET /recordings and GET /recordings/{recording_id} consume the recording bucket like any other request, but fetching the signed download_url they return does not. That URL is served from a different host with no API key and no bucket to charge against. Throttling happens where the URL is minted, not where it is used: the number of valid download URLs that can exist at any moment is bounded by how many recording-bucket requests you are allowed per minute times the TTL window each one is minted with, not by a separate limit on the download itself.
Read the response headers
Use these values instead of assuming that every organization or key has the same allowance.
Queued is not rate-limited
Telephony concurrency is a different control. When capacity is temporarily full, already accepted work remainsqueued; it does not become a 429 and is not dropped. Poll the API resource and treat queueing as lifecycle state, not a request-throttling signal.