Skip to main content
Breeze applies plan-based concurrent generation limits to protect long-running synthesis capacity. Standard API requests are not currently throttled by a published request-per-minute quota.

Concurrent generations

Concurrent generations are synthesis jobs that are admitted or running. Queued generations are short background waits for admitted capacity. Studio and Developer API jobs share the same per-user pool. Text to speech, streaming text to speech, async text to speech, voice design, and voice cloning all count toward these limits. Voice design counts each requested preview as one generation. When preview_count is omitted, Breeze generates one preview. When both admitted and queued generation capacity are full, the API returns 429 GENERATION_CONCURRENCY_EXCEEDED. When Breeze shared generation capacity is temporarily unavailable, the API returns 503 GENERATION_CAPACITY_EXCEEDED.

Realtime sessions

Realtime text-to-speech WebSocket sessions have their own limits on top of the generation pool:
  • Each API key can hold up to 20 concurrent realtime sessions. A connection over the limit receives an error frame with code RATE_LIMITED (with the limit in meta.max_sessions_per_key) and close code 1008. Close idle sessions or retry shortly after one ends.
  • A session stays open for at most 30 minutes (SESSION_EXPIRED, close code 1000) and times out when idle for inactivity_timeout_seconds — 30 seconds by default, configurable up to 180 (IDLE_TIMEOUT, close code 1001). Frames from the client and audio for an in-flight turn both count as activity.
  • Managed SDK and CLI conversations normally mark each physical WebSocket for turn-boundary rotation when it reaches 10 minutes and continue on a fresh connection. An active turn can delay the switch; this client-side lifecycle does not change the 30-minute raw WebSocket limit or consume an extra generation while the conversation is idle.
  • Each realtime turn occupies one concurrent generation from the plan pool above while it synthesizes, and realtime turns do not queue. When the pool is full, turn.start receives a GENERATION_CONCURRENCY_EXCEEDED error frame; the session stays open, so retry the turn with backoff.
Event payloads, error semantics, and close codes are documented in the realtime guide.

Best practices

  • Use exponential backoff with jitter for 429 GENERATION_CONCURRENCY_EXCEEDED and transient 5xx responses.
  • Group text into natural requests instead of sending one word at a time.
  • Treat async text to speech as a background job and poll for completion. Async delivery does not bypass concurrent generation limits.
  • Cache responses when appropriate. Identical inputs are re-billed.

Design around limits

Pricing

See how plan limits, queued generations, and shared Studio/API credits fit together.

Text to speech

Use async jobs for longer text and retry only the failed segments of a batch.

Streaming

Choose streaming for lower time-to-first-byte without bypassing generation concurrency.

Errors

Handle 429, 503, and 504 responses with the right retry behavior.