Rate Limits
Rate limits per authentication method, response headers, and 429 handling strategies
The API counts requests per client and per route, and answers a 429 with how long to wait. Read this page when you're sizing a batch of calls, seeing throttling errors, or deciding how often to poll: it lists the per-minute and per-second ceilings, the headers a throttled response carries, and how to back off.
Rate Limits
Two layers throttle every web API request. The per-minute layer counts by client IP, so a Clerk JWT and an API key from the same machine share that budget; the burst layer counts per route and caller. Neither depends on which credential you send.
Per-minute limits (every /api route)
The edge middleware picks a tier from the path and method, then counts requests per client IP over a one-minute window:
| Tier | Applies to | Requests per minute |
|---|---|---|
| Read | GET requests | 200 |
| Write | POST, PUT, PATCH, DELETE requests | 50 |
| Expensive | Paths containing /compute, /rdkit, /orchestrator or /export | 20 |
| Search | Paths containing /search, /suggest or /autocomplete | 120 |
Burst limits (per route)
Each route also sets a one-second and a three-second ceiling. Job submission is the tightest:
| Route | 1 second | 3 seconds |
|---|---|---|
POST /api/v1/jobs | 2 | 5 |
GET /api/v1/jobs | 5 | 12 |
| Harness session routes (create, get, checkpoints, events) | 6 | 15 |
POST /api/harness/sessions/:id/execute and /sync | 10 | 30 |
Guest calls
A caller with no key uses the keyless orchestrate request: one POST to /api/v1/orchestrate with a prompt. Its daily limit is stated once, with the request, in Guest curl and in llms.txt. Each guest response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; read them rather than counting locally.
Rate Limit Headers
Throttled responses (HTTP 429) carry Retry-After. The per-minute layer also sends its counters on the 429:
| Header | Description |
|---|---|
Retry-After | Seconds to wait before retrying |
X-RateLimit-Limit | Maximum requests in the current window |
X-RateLimit-Remaining | Remaining requests in the current window |
X-RateLimit-Reset | When the window resets |
X-RateLimit-Tier | Which per-minute tier refused the request |
Successful authenticated responses do not carry these headers; only the guest orchestrate route reports its remaining quota on every response.
429 Response Format
The per-minute layer answers:
A burst limit answers with the standard error envelope:
Handling Rate Limits
TypeScript SDK
The SDK automatically retries 429 responses with exponential backoff (up to config.retries attempts):
Manual Retry (Any Language)
React with Rate Limit UI
Best Practices
- Use the SDK — built-in retry handles 429 automatically
- Honor
Retry-After— wait the stated seconds before the next attempt - Batch when possible — use the Batch API for multiple items
- Use WebSocket/SSE — avoid polling for job status; subscribe to real-time updates instead
- Cache lookups — public endpoints like
/lookup/uniprot/:idreturn stable data suitable for caching
Read next
- Authentication — which credential to send
- Guest curl — the keyless first call and its limit
- SDK Errors — handling
IvyApiError.isRateLimited - Server-sent events — follow a run without polling
Was this page helpful?