Skip to main content
Chariot limits how many requests you can run at the same time (concurrency), scaled to your plan. There is no fixed requests-per-second cap. The control is on simultaneous in-flight generations.

How concurrency works

Each workspace may have a fixed number of TTS generations and speech-to-text transcriptions running concurrently. Active work takes a slot and releases it when finished. TTS and synchronous ASR requests are rejected when no slot is available. Async ASR files wait in a queue until a slot is free. The limit is scoped to your workspace and driven by your plan tier. Text to speech and speech to text have separate limits, so one never uses up the other’s slots.
  • Text to speech: the limit applies to both HTTP TTS endpoints and active WebSocket generations. Idle WebSocket connections do not hold a generation slot. WebSocket limit errors close the connection with 4429.
  • Speech to text: live, synchronous file, and asynchronous file transcription share the same ASR limit. Each streaming session holds one slot for its entire life, including pauses, until the connection closes. A new session over the limit gets an error event and closes with 4429. Synchronous file requests return 429 when all slots are busy. Async batch acceptance does not reserve slots; each file takes a slot when a worker starts preparing and transcribing it.

Limits by plan

These are the current defaults and can change as plans evolve. Check your plan in the dashboard for the value that applies to your workspace.

The 429 response

When you exceed your concurrency limit:
If your plan does not include the product at all, you get 403 instead:

Handling limits

A 429 is an immediate rejection of that request. TTS and synchronous file requests do not queue for concurrency. Async batch files queue after acceptance, but batch submission can still return 429 when pending work is at capacity. Handle rejected requests on the client:
  • Cap your in-flight requests to your plan’s concurrency limit so you rarely hit 429 in the first place.
  • Retry with exponential backoff and jitter when you do, e.g. 0.5s, 1s, 2s, 4s with random jitter.
  • Use a worker pool sized to your limit rather than firing all requests at once.
  • Close speech-to-text sessions promptly. Send input.done when the audio ends, rather than leaving an idle session open until it times out.
Python

Need more headroom?

If you consistently hit your concurrency limit, upgrade your plan for more slots, or contact support@chariot.in to discuss higher limits.