Free tier and rate limits

Understand Free endpoint usage and realtime session limits.
View as Markdown

Free endpoint limits are enforced per user and endpoint so that capacity remains available to all users.

Free endpoints are provided on a best-effort basis. Nari Labs does not guarantee service-level objectives for Free endpoints, including uptime or latency.

Free endpoint limits

APIEndpointConcurrent sessions per userRequests per day
TTSqwen3-tts-fast:freeUp to 2Up to 50
TTSqwen3-tts:freeUp to 3Up to 100
STTqwen3-asr-fast:freeUp to 2Up to 50
STTqwen3-asr:freeUp to 5Up to 100

Limits apply separately to each endpoint. For TTS, a concurrent session is an in-flight speech request. For STT, it is an open realtime WebSocket connection, which can transcribe multiple utterances.

Only successful requests count toward the daily allowance. Failed and cancelled requests do not count, and requests made in the Playground do not consume the allowance. A streaming TTS request counts once; its audio chunks do not count separately. Daily allowances reset at 00:00 UTC.

Partner endpoints provide higher concurrency through early access. The Partner access section explains availability and how to contact Nari Labs.

Response headers and errors

TTS responses include these headers when concurrency is enforced:

HeaderMeaning
x-concurrency-limitMaximum number of concurrent requests
x-concurrency-remainingAvailable request slots when the response was generated

These headers describe concurrency only; they do not report the remaining daily Free allowance.

When a request exceeds a limit, use error.code to choose the appropriate retry behavior:

CodeAction
CONCURRENCY_LIMIT_EXCEEDEDWait for a TTS request or STT session to finish, then retry.
FREE_DAILY_LIMIT_EXCEEDEDWait until 00:00 UTC, or use a Partner endpoint.
UPSTREAM_RATE_LIMITEDRetry with exponential backoff and a small random delay.

The error guide covers the complete error response and retryable server failures.

Realtime STT session limits

In addition to the Free endpoint limits above, every STT connection has protocol-level constraints. After configuration, the session.configured event returns the duration and idle limits applied to that connection.

LimitDefaultBehavior
Utterance duration36 seconds of input audioFinalizes the current utterance with commit_reason: "max_duration"; the connection remains open
Session idle timeout60 seconds without nonempty audioCloses the idle connection; time spent waiting for a final result is exempt
WebSocket message size128 KiB for the complete UTF-8 JSON messageRejects an oversized audio append event; split audio into smaller chunks

The realtime transcription guide explains audio chunking and session configuration. Transcripts and turn detection covers automatic utterance finalization, and the WebSocket error guide lists the errors that require reconnecting.