Default tiers
Each team gets the following bursting capacity. The bucket refills at the sustained rate. Limits may change. We raise limits without notice — a loosening never breaks your integration — and announce any reduction in advance in the changelog. Always treat theX-RateLimit-Limit response header as the authoritative current value; don’t hard-code the numbers below into retry logic.
Character synthesis is limited below the image endpoint because each create or resynthesize fans out to four image generations internally. At 15 creates/minute that is 60 image generations/minute — matching the
POST /v1/images budget. The three synthesis routes share one bucket (see the note under Implementation notes below).
Headers on every response
X-RateLimit-Limitis the bucket capacity for this endpoint class.X-RateLimit-Remainingis the tokens left after this request.X-RateLimit-Resetis the epoch second at which the bucket would be back to full, assuming no further requests.
When you hit the limit
Retry-After seconds and retry. Don’t hammer — the bucket only refills at the sustained rate.
The message names the endpoint class you exceeded — for example characters_synthesize rather than the images_post shown above. Switch on error.code (always too_many_requests), never on the human-readable message string.
Implementation notes
- Limits are per-team, keyed off the API key’s
team_id. Multiple keys on the same team share the bucket. - Bucket counts are atomic across concurrent requests on the same team — no race window between read and write.
- Each endpoint class has its own bucket, so heavy POST traffic doesn’t starve your reads.
POST /v1/images/:id/cancelis bucketed underimages_postregardless of whether the canceled generation isimg_*orvid_*(single shared bucket on the cancel route — a pure-video team’s cancel storm would still draw fromimages_post). Runaway cancels can’t drain the GET read bucket.- Character synthesis shares one per-team bucket across
POST /v1/characters,POST /v1/characters/{id}/refs/regenerate, andPOST /v1/characters/{id}/resynthesize. A burst of regenerations or resynthesizes draws down the same 30-token bucket as new creates — they are not independently budgeted. If you batch-onboard characters while also regenerating poses, budget both against the single 15/minute sustained rate. Note thatregeneratemints a single pose but still draws one full token from this bucket (which is sized for 4-pose creates), so a regenerate-heavy workload is capped at 15/minute even though it produces fewer images. (X-RateLimit-Remainingreflects consumption across all three routes.)

