Requests-per-minute limits
Primary rate-limiting is a 60-second sliding window in Redis. Two halves worth keeping apart:- the limit comes from the plan and from any quota preset attached to the API key you are calling with;
- the counter is per workspace, shared by every key in it.
You see the effective value in API Keys next to each key.
Exceeded response
Daily token budgets
In addition to requests per minute, some plans cap total tokens per day (rateLimitTpd in your quota preset). Hitting this is a 403 with its own code, and the counter resets at UTC midnight:
Global safety net
We enforce a 5 000 req / 10 min per IP ceiling at the edge to stop scraping. This almost never trips for real users — only poorly-configured crawlers.Best practices
- Don’t retry inside the window. There is no
Retry-Afterto honour, and a retry sooner than 60 seconds extends the wait rather than shortening it. - Queue on your side. A local token bucket at ~80% of your limit is the only approach that beats the window instead of feeding it.
- Use exponential backoff with jitter for 5xx — 1s → 2s → 4s → 8s (+random 0–500 ms) — but only where repeating the call is safe. A 500 on a generation call may already have been billed; see Rate limits & retries.
- Consider fallback chains. They cover a provider’s refusal on
gpt-4oby advancing togpt-4o-miniorgemini-2.5-flash. They do not cover your own workspace limit, which is refused before a model is chosen. - Separate environments by workspace, not just by key. Keys share their workspace’s window; only a separate workspace gives dev its own.
Rate limits on specific endpoints
/contact/sales— 5 req / hour per IP (spam protection)/public/plansand/public/models— 30 req / min per IP/v1/filesupload — the RPM limit applies; additionally serialised by workspace (one upload at a time), so a concurrent upload answers409 upload_in_progress— that one is safe to retry in a moment, and our SDKs do