Rate limits

A rate limit on this API is a ceiling per bucket inside a fixed window: the limiter counts a request in the API process, lets the first ones through, and refuses the next one with 429 rate_limit_exceeded. The table below is rendered from the same object the limiter reads, so every number here is an applied limit and not a summary of an intention.

Bucket Limit Window Counted
key_chat
inference calls made with one API key
600 1 min per API key
org_chat
inference calls across a whole organization
1800 1 min per organization
platform
platform API calls: organization, keys, usage, traces, policies
300 1 min per API key
public_chat
anonymous playground calls
20 1 h per IP address
public_page
public page requests
300 1 h per IP address — not enforced
public_card_request
model card requests sent from the public form
5 1 h per IP address
auth
sign-in, sign-up, password recovery and reset attempts
20 15 min per IP address

A row marked as not enforced is defined in the limiter table but no request path checks it on this deployment. It is listed so the absence is visible rather than silent: a number in the documentation is not an applied limit.

Concurrency

At most 8 requests may be in flight on one API key at a time, counted per key and not per organization. A request above that is refused at once with the same 429 — there is no queue to wait in.

What a refusal looks like

A refused request is HTTP 429 with type rate_limit_error and code rate_limit_exceeded. This deployment sets no retry-after and no x-ratelimit-* response headers, so the body is the only clock: where the limiter knows the window end, the message ends with it in ISO 8601 (Retry after 2026-10-06T12:00:00.000Z); the per-organization message names no time at all. Wait for that instant or back off exponentially — retrying sooner cannot succeed, because the counter only moves when the window rolls. Treat a 429 as retryable; every other error in this documentation needs the request to change before it can succeed.

Where the counter lives

Windows are counted in the API process and written back to the rate_limits table every 15 seconds and on shutdown, so a restart continues the window instead of handing out a fresh budget. The ceiling that follows is stated rather than discovered: the counter is per API node, so two nodes double every effective limit. REDIS_URL is reserved for the shared version and nothing reads it yet — run one API node, or accept per-node limits.

Frequently asked questions

What is a rate limit on this API?

A ceiling per bucket inside a fixed window. The limiter counts a request in the API process, lets the first 600 through inside a 1 min window on one API key, and refuses the next one with 429 rate_limit_exceeded. The window starts at the first request after the previous window ended, and every number in the table above is read from the object the limiter itself reads.

Which limit counts my chat calls — the key or the organization?

Both, and both have to pass. key_chat counts 600 inference calls per API key in 1 min, org_chat counts 1800 across the whole organization in the same window. A call that reaches either ceiling is refused, and the message says which one: the per-key message carries the window reset instant, the per-organization message does not.

Do I have to read the message to find out when to retry?

For a limit counted per key or per IP address, yes. This deployment sets no Retry-After header, so the reset instant inside the message text — an ISO 8601 timestamp taken from the limiter's own window end — is the only clock the response carries. For the per-organization limit the message names no time at all, so back off exponentially there. A retry before the window rolls cannot succeed: the counter only moves when the window does.

Is the counter shared across API nodes, or per process?

Per API process. Windows live in memory and are written back to the rate_limits table every 15 seconds and on shutdown, then restored on boot, so a restart continues a window instead of handing out a fresh budget. Two API nodes therefore double every effective limit. REDIS_URL is reserved for the shared version and nothing reads it yet, so run one API node or accept per-node limits.

Are all of these limits actually applied?

No. public_page is defined in the limiter table but no request path checks it on this deployment, and the table above marks it as not enforced for that reason. Every other row is named at a limiter call site, which is what applied means on this page.

How many requests may be in flight at once on one key?

8 at most. The count is kept per API key, raised when a call enters the chat handler and lowered when it finishes, and a request above the cap is refused at once with the same 429 rate_limit_exceeded — there is no queue behind it.