429 Too Many Requests, but they are distinct error codes with different retry guidance. Branch on error.code to tell them apart.
Per-minute burst limit
Authenticated requests are limited to 6,000 requests per 60 seconds (100 per second) per API key. Unauthenticated requests (missing or invalid key) are limited to 120 requests per 60 seconds per IP address. The window is fixed, not rolling. Each 60-second wall-clock interval is its own counter; all requests within that interval share it, and the counter resets to 0 in a single step at the next boundary. Available budget jumps from0 back to the full bucket size (6000 for authenticated API keys, 120 for unauthenticated IP buckets) instantaneously at the boundary, rather than aging out one slot at a time. Trust X-RateLimit-Reset for the exact reset timestamp; do not assume requests age out individually.
Headers
Every authenticated response (including non-429s) includes three headers so you can monitor consumption:| Header | Type | Meaning |
|---|---|---|
X-RateLimit-Limit | integer | Total budget for the current window. 6000 for authenticated requests (per API key), 120 for unauthenticated requests (per IP). |
X-RateLimit-Remaining | integer | Requests remaining in the current window. Reaches 0 immediately before a burst-limit 429. |
X-RateLimit-Reset | integer | Unix timestamp (seconds) when the window resets and X-RateLimit-Remaining returns to its full budget. |
| Header | Type | Meaning |
|---|---|---|
Retry-After | integer (seconds) | Minimum number of seconds to wait before the next request. Range in practice: 1 to 60, since the burst window is 60 seconds. Do not retry sooner than this. |
Example error body
Retry guidance
This 429 is retryable. Recommended pattern:- Honor
Retry-Afteras the minimum wait. Do not retry sooner. - For retries beyond the first, apply exponential backoff with jitter (e.g. base =
Retry-After, double on each attempt, add random jitter in[0, 1s], cap at a few minutes). - Cap the total number of attempts (e.g. 3 to 5) and surface the failure if exhausted, rather than retrying indefinitely.
- Treat
X-RateLimit-Remainingas a leading indicator: if it is near zero on a successful response, slow down voluntarily before the next request to avoid the 429 entirely.
Monthly per-company limit
Each company has a monthly cap on total API calls, independent of and in addition to the per-minute burst limit:| Plan | Monthly cap |
|---|---|
| Formation (free) | 10 |
| Startup ($30/month) | 300 |
| Growth ($300/month) | 30,000 |
400 from bad parameters counts the same as a 200. Unauthenticated requests (401) do not count, and blocked requests (after hitting the monthly limit) are also not counted, so hitting the cap does not extend the cap-exceeded period.
Example error body
Retry-After is not sent in this case. The X-RateLimit-* burst-window headers may still be present but are unrelated to the monthly cap.
Retry guidance
This 429 is not retryable in the short term. The only meaningful remediation is to upgrade the plan or wait until the 1st of the next month. Recommended pattern:- Branch on
error.codefirst.rate_limit_exceededis the burst case (retryable, see above).monthly_limit_exceededis this case. - If the code is
monthly_limit_exceeded, stop retrying. Surface the error to your user with the reset date from the message body, or page the operator to upgrade the plan. - SDKs that auto-retry on 429 should treat the absence of
Retry-Afteras a “do not retry” signal, or branch onerror.codedirectly.
Best practices
- Branch on
error.code, not the status code alone. Both limits surface as 429 but have different remediation paths. A retry loop that does not distinguish the two will burn through quota on monthly exhaustion. - Check headers proactively. Monitor
X-RateLimit-Remainingand slow down before you hit the burst limit. - Use larger page sizes. When paginating, set
limitup to 500 to pull more data per request and reduce total calls. - Cache responses. If you are repeatedly pulling the same data, cache it on your end to conserve your monthly quota.