docs

Rate limits & errors

Plan limits, 429 semantics, and every error shape you can receive.

Plan limits

Limits attach to each API key, on three independent axes: concurrent streams, requests per minute, and characters per calendar month. Your key’s exact limits are shown in the console settings.

PlanConcurrent streamsRequests / minCharacters / month
Free253,0005,000,000
Starter5010,00050,000,000
Pro10030,000500,000,000
Scale250100,000unlimited
Internal1,000500,000unlimited
These are private-beta limits, deliberately generous so you can build and load-test without friction. They will tighten and re-tier before general availability; we’ll give notice before changing anything that affects you.
  • Concurrent streams: in-flight requests at once. Each open connection (including a WebSocket) holds one slot; slots free on completion, and a crashed connection’s slot self-frees on a short TTL.
  • Requests per minute: fixed 60-second window, counted per key.
  • Characters per month: summed input length over the calendar month (UTC). unlimited plans aren’t metered against a quota.

Handling 429s

When a limit is hit you get 429 with a machine-readable status and, where applicable, a Retry-After header (seconds). Successful responses also carry your remaining budget:

ParameterTypeDefaultDescription
x-ratelimit-remaining-requestsheader-Requests left in the current minute window.
x-ratelimit-remaining-streamsheader-Concurrency slots free for this key right now.
x-ratelimit-remaining-charactersheader-Characters left this month (absent on unlimited plans).

Back off and retry on rate_limit_exceeded and too_many_concurrent_requests (retry after ~1 s for concurrency). Treat insufficient_quota as terminal until the month rolls over or your plan changes; don’t retry-storm it.

Error catalogue

All errors share one shape, so a single handler covers them: { "detail": { "status": "...", "message": "..." } }.

{
  "detail": {
    "status": "rate_limit_exceeded",
    "message": "Request rate limit exceeded."
  }
}
ParameterTypeDefaultDescription
rate_limit_exceeded429-Too many requests this minute. Respect Retry-After.
too_many_concurrent_requests429-All concurrency slots for this key are in use. Retry in ~1 s.
insufficient_quota429-Monthly character quota exhausted. Terminal until reset/upgrade.
missing_api_key / invalid_api_key401-Auth problem; see Authentication.
These status values intentionally match the OpenAI and ElevenLabs error vocabularies, so those SDKs’ built-in retry logic works against Svara unchanged.