Rate limits
Rate limits are enforced per tenant (API key), per 60-second sliding window. The ceiling is set by your plan tier.
| Plan | Requests / minute |
|---|---|
| Free | 10 |
| Hobby | 60 |
| Pro | 200 |
| Scale | 600 |
| Custom | 3 000 |
An unknown or unset tier falls back to the Free limit (10/min).
Known wart: the tier field in responses uses legacy names. The rate limiter predates the
current plan names, so the tier value in a 429 body and in your key's
metadata may read starter where the plan is called Hobby, or business where it is called
Scale. free and pro are unchanged, and enterprise is the internal name for the Custom
tier. You never have to send these values to use the API, they only appear in responses. The one
place a legacy id is still required as input is the plan field of
POST /v1/billing/checkout.
Response headers
Every response carries your current limit and remaining budget, so you can throttle before you ever hit a 429:
| Header | Description |
|---|---|
X-RateLimit-Limit | Your tier's per-minute ceiling |
X-RateLimit-Remaining | Requests left in the current window |
When you exceed the limit
A request over the limit returns HTTP 429 with a Retry-After: 60 header:
HTTP 429
Retry-After: 60
{
"error": "Rate limit exceeded",
"limit": 200,
"tier": "pro",
"retryAfterSeconds": 60
}Wait the indicated retryAfterSeconds (60) before retrying. Because the window is sliding, not a fixed per-minute reset, capacity frees up continuously as your oldest requests age out, so spacing requests evenly is more effective than bursting.
Handling 429 in code
import time, requests
def call(url, payload, api_key, max_retries=3):
for attempt in range(max_retries):
r = requests.post(url, json=payload, headers={"x-api-key": api_key})
if r.status_code != 429:
return r
time.sleep(int(r.headers.get("Retry-After", 60)))
return r # give up after max_retriesNotes
- Rate limits are separate from monthly quota. The per-minute limit controls burst rate; your plan's monthly page/extraction quota controls total volume. See Pricing.
- Limits are keyed per tenant, so all keys belonging to the same tenant share one window.
- Exceeding your monthly quota is a billing condition (handled per the Pricing overage rules), distinct from a per-minute
429.