Rate limits & reliability

LLM account limits, duplicate-request throttling, response headers, and retry guidance.

LLM account limits

LLM requests are limited independently for each account + model + channel selected by the API key:

  • RPM counts requests in a rolling 60-second window.
  • Maximum concurrency counts requests for that scope that are still processing.

When no user-specific policy is set, the system policy applies. A user-specific policy overrides the system policy per metric: an unset metric keeps the system value, and a metric unset on both sides is unlimited. Limits can therefore differ by account, model, and channel; do not assume one platform-wide number.

An account-limit rejection returns 429, is not billed, and is not sent upstream. error.message names the model, channel, and the limit that was hit.

Limiterror.codeResponse headers
RPMaccount_rpm_limitRateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset (seconds until the rolling window frees capacity)
Concurrencyaccount_concurrency_limitRetry-After (seconds)

Both use error.type: "rate_limit_error". Use the code to distinguish the cause; do not expect the RPM headers on a concurrency rejection.

Duplicate-request protection

The exact same request from one API key is allowed three times within 10 seconds. The fourth attempt returns 429, is not billed, and is not sent upstream. Changing the prompt or parameters counts as a different request.

This protection is separate from account limits, so its 429 does not include the RateLimit-* or Retry-After headers described above.

Other APIs and retries

The LLM account limits above do not apply to media tasks, OpenAI-compatible image endpoints, file endpoints, account endpoints, or catalog endpoints. GET /v1/account/credits and the model catalog no longer share the former per-key or per-IP request allowance.

GET /v1/account/usage, GET /v1/account/usage/summary, and GET /v1/account/usage/{request_id} share a separate limit of 120 requests per minute for each API key. That rejection is 429 with error.code usage_rate_limit and draft-6 RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset. Media and image creation still retain their separate duplicate-request protection.

For LLM 424, 429, and recoverable 5xx, use bounded application-level exponential backoff with jitter. Do not retry 400, 401, or 402; fix the request or top up first.

On this page

On this page