- Text endpoints (
/v1/chat/completions,/v1/messages) are rate-based: requests per minute (RPM), tokens per minute (TPM), and a cap on the size of one request. - Media endpoints (image, video, audio) are concurrency-based: only jobs that are actively running count against your limit.
Tier ladder
Your tier is determined bylifetime_purchased — the total Stripe-purchased face value of credits across your account’s history. Signup bonuses, referral credits, and promotional grants don’t count.
Every tier’s exact numbers are published live, with no authentication:
tiers carries:
Tier is recomputed after every successful purchase. There is no waiting period — top up $5 and your Tier 1 limits apply within seconds.
Text limits
RPM, per-model RPM and TPM are counted in fixed one-minute windows that start on the minute (UTC), not in a rolling window. Once RPM or TPM is used up, requests get a429 until the next minute starts and the counters reset.
Before a request runs, Kyma estimates its size (roughly 4 characters per token of messages, plus max_tokens). A request whose estimate exceeds max_single_request, or would push you past tpm, is refused up front with a 429. Split the message or lower max_tokens.
Audio limits
Audio is gated by concurrency only. Each model family has its own pool, so saturating one family does not block the others: for example, a burst ofwhisper-v3-turbo transcriptions does not use the slots of a text-to-speech model.
audio_concurrent_per_capability in /v1/limits/tiers is the largest pool in each capability. Some model families in the same capability have a smaller pool on the same tier, and the text-to-speech families are the tightest. When a pool is full, the 429 message states the cap you hit, for example Too many concurrent audio jobs (8/8, Tier 2).
Audio requests do not queue: at capacity they return 429 right away.
Image and video: queue + backpressure
Image and video jobs are asynchronous (you get a jobid and poll it). When all your slots for that kind are busy:
- Queue has room → the job is accepted with
"status": "queued"and aqueue_position, and starts when a slot frees up. Poll it like any other job. - Queue is full too →
429witherror.code: queue_fullandRetry-After: 30.
429 responses
The body and headers depend on the endpoint:
Every error also carries
error.request_id and the x-request-id header, and x-should-retry: true on a 429 that can be retried. See Errors for the full contract.
x-ratelimit-limit-requests is your RPM, x-ratelimit-remaining-requests is what is left of it in the current minute, and x-ratelimit-reset-requests is the ISO 8601 time the minute ends. The text Retry-After is a fixed 60 seconds; if you track the window yourself, x-ratelimit-reset-requests tells you when the counters reset. Successful (200) responses carry no rate-limit headers.
Error codes
Out of credits is a
402, not a 429; see Error Handling.
How limits are computed
Your tier comes from the deposit ladder:lifetime_purchased (Stripe purchases only) crossed against each tier’s min_deposit.
Tier is read from your balance record, which is cached for at most 30 seconds, so a new tier applies within 30 seconds of a purchase.
Need higher limits?
Two paths: 1. Natural tier upgrade. Deposit more credits to cross the next threshold. Tiers apply immediately — no application needed. 2. Heavy users on a tight ramp. If you’re shipping a product on Kyma and expect to scale beyond Tier 3 limits before you’d naturally cross the $1000 deposit threshold, emailhello@kymaapi.com with:
- Product name and URL
- Expected monthly usage (rough is fine)
- Primary capabilities (audio / text / image / video mix)
See also
- Pricing — per-token, per-image, per-second rates by SKU
- Tier limits — the live
/v1/limits/tiersreference - Audio Transcriptions — speech-to-text
- Error Handling — retry strategies and idempotency