Limits are shared across your whole org. All of your API keys draw on one
rate-limit bucket, one concurrency pool, and one tier — extra keys are
for rotation and security, not more capacity. Creating five keys does not give
you five times the limits.
Tiers
These are current limits, not hard caps — we raise them per customer as you scale. Contact us if you need more headroom.
What counts as a request
The requests-per-minute limit counts new requests started per minute:POST /tts/bytesandPOST /tts/sse— one request per HTTP call.GET /tts/websocket— one request per connection, spent at handshake, not per message. A long-lived socket streaming many turns costs a single request token when it opens; what bounds its ongoing work is the concurrency cap.
How concurrency is measured
This is the important, non-obvious part. A stream counts against your concurrency limit only while it is actively generating audio — not for the socket’s lifetime, and not for the whole call.- A slot is held only while a turn is generating, then freed as soon as the turn finishes.
- Idle time between turns (the user talking, silence, thinking) costs nothing.
Handling 429 Responses
When you exceed a limit you’ll receive429 Too Many Requests with a Retry-After header:
context_id; there’s no “push through,” since continuing to stream a rejected context produces no audio. Rejected turns aren’t charged.
Separately from your tier limits, overloaded (429) means the synthesis servers are at capacity. Back off and retry; don’t rely on a Retry-After header for it.
Credits
Billing is separate from rate limits and is keyed to your org, shared across all its keys. Each character oftranscript costs 1 credit; $15 buys 1,000,000 characters and credits never expire. Billing is postpaid: requests start only while your balance is above zero, and once it reaches zero you’ll get a 402 payment_required — top up on the Billing page.
Best Practices
- Cache generated audio — don’t regenerate the same text repeatedly
- Respect concurrency — pool and reuse streams rather than opening unbounded connections
- Back off on 429 — use the
Retry-Afterheader when present, and retry rejected turns on a freshcontext_id - Monitor your dashboard — watch usage and balance before hitting limits