Docs menu

Rate limits

LimitValueOn breach
Requests per account300 per minute429 rate_limit_exceeded with retry-after
Failed authentications per IP address10 per minute429 too_many_failed_auth with retry-after
Request body5 MB413 request_too_large

There is no concurrency ceiling and no tokens-per-minute limit. Three hundred requests a minute is the whole of it, counted per account across all of its keys, in fixed sixty-second windows: the window opens on the first request and the count resets sixty seconds later. POST /v1/messages/count_tokens is not counted.

What a 429 looks like#

json
{"error": {"message": "…", "type": "rate_limit_error", "param": null, "code": "rate_limit_exceeded"}}

with a retry-after header in seconds. Wait that long and retry; the OpenAI, Anthropic and Vercel AI SDKs do this on their own. retry-after is exposed to browser clients through CORS.

A 429 rate_limit_exceeded can also mean that capacity for the requested model is temporarily unavailable rather than that you exceeded 300 a minute. In that case retry-after is present only when a reset time is actually known; if it is absent, back off exponentially.

The body cap#

5 MB is checked twice: against the declared content-length before anything else runs, and again as the body is read, so a request that lies about its length is still refused. A 413 is not retryable — shrink the request. Images as base64 data URLs are the usual reason to hit it.

Long prompts#

Context windows are the model's and are not enforced by Sator; a prompt longer than the window is rejected by the model and relayed as a 400 or 422 with its message. The windows are listed on Models.