Rate limits
| Limit | Value | On breach |
|---|---|---|
| Requests per account | 300 per minute | 429 rate_limit_exceeded with retry-after |
| Failed authentications per IP address | 10 per minute | 429 too_many_failed_auth with retry-after |
| Request body | 5 MB | 413 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#
{"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.