Getting started
Rate limits
Requests per minute, concurrency and how to back off gracefully.
Limits are per organisation and depend on your plan. They exist so one runaway script can't starve everybody else's rats.
| Plan | Requests / min | Concurrent requests | Concurrent crawls |
|---|---|---|---|
| Free | 20 | 2 | 1 |
| Starter | 120 | 5 | 3 |
| Pro | 600 | 25 | 10 |
| Growth | 2,000 | 60 | 25 |
| Scale | 5,000 | 120 | 50 |
| Enterprise | 20,000 | 500 | 200 |
- Requests per minute counts every API call, including polling
GET /v1/crawl/{id}. - Concurrent requests is how many requests may be in flight at once (browser-heavy scrapes hold a slot until they finish).
- Concurrent crawls is how many crawl jobs may be
queuedorrunningat once. Extra crawls are rejected, not queued.
When you hit a limit#
You get a 429 rate_limited with retry_after_ms in the body and a Retry-After header (seconds). It costs nothing.
{
"success": false,
"error": { "code": "rate_limited", "message": "120 requests/min exceeded", "retry_after_ms": 850 },
"credits_used": 0,
"request_id": "req_01J9V3M2A1"
}All six SDKs retry 429, 503 capacity_exceeded and transient network errors automatically with exponential backoff and jitter, honouring retry_after_ms. If you roll your own client, do the same: wait at least retry_after_ms, then double the delay on each further failure.
Need more?#
Higher plans raise every limit, and Enterprise limits are set per contract. Talk to us if you need a burst for a backfill.