Docs

Guides

Rate limits

Per-key quotas, the headers that report them and how to back off.

Requests are limited per API key, over a window of 60 seconds.

KeyRequests per minute
Sandbox100
Live, Launch plan100
Live, Growth plan600
Live, Enterprise plan3,000

Headers#

Every authenticated response tells you where you stand:

HeaderMeaning
X-RateLimit-LimitQuota of the current window.
X-RateLimit-RemainingRequests left in the window.
X-RateLimit-ResetSeconds before the quota renews.
Retry-AfterOn 429 only: seconds to wait before retrying.

When you go over#

The API answers 429 with error.code = "rate_limit_exceeded" and a Retry-After header. Wait that many seconds, then retry. Spread your calls rather than bursting, and prefer a single call that returns a page of 100 items over many calls that return one.

async function callWithRetry(url, init, attempts = 4) {
  for (let i = 0; i < attempts; i++) {
    const res = await fetch(url, init)
    if (res.status !== 429 && res.status < 500) return res
    const wait = Number(res.headers.get('Retry-After')) || 2 ** i
    await new Promise((r) => setTimeout(r, wait * 1000))
  }
  throw new Error('Too many retries')
}

When retrying a POST, reuse the same Idempotency-Key so the operation cannot run twice. Need a higher quota? It follows your plan: see Pricing and limits.