Reference
Rate limits

Rate limits

Rate limits are enforced per tenant (API key), per 60-second sliding window. The ceiling is set by your plan tier.

PlanRequests / minute
Free10
Hobby60
Pro200
Scale600
Custom3 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:

HeaderDescription
X-RateLimit-LimitYour tier's per-minute ceiling
X-RateLimit-RemainingRequests 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_retries

Notes

  • 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.