/v1 response tells you where you stand through four response headers, and exceeding a limit returns a 429 rate_limited error with the relevant details.
This page covers the model, the headers, the 429 body, the per-scope defaults, and how to back off and retry.
The model
Limits are counted along three dimensions at once:Your API key. Each key has its own counter.
The scope the route requires (
data:read, ops:read, or admin). Each scope has its own limit, so heavy product traffic on data:read does not consume your ops:read budget.A fixed time window. The current window length is 60 seconds. Your counter resets at the start of each window.
Rate limit headers
Every/v1 response (success or error) carries four headers describing your current budget. Read them on every response and let them drive your pacing.
A description of the policy applied to this request (the limit and window in effect for the matched scope).
The maximum number of requests allowed in the current window for this client and scope.
The number of requests you have left in the current window. When this reaches 0, further requests return
429 until the window resets.The timestamp when the current window resets and
remaining refills. Use this to schedule retries.Example response headers
The 429 response
When you exceed your limit, the request fails with HTTP429 and the rate_limited code. The details object tells you which scope was limited, the ceiling, and the window length.
429 rate_limited
The scope whose limit you exceeded.
The request ceiling for that scope in one window.
The window length in seconds.
Defaults per scope
Default limits, applied per client over a 60 second window:| Scope | Limit | Window | Applies to |
|---|---|---|---|
data:read | 1000 requests | 60s | Product and data routes (most of the API). |
ops:read | 500 requests | 60s | Operational routes (liveness, source health, manifest). |
admin | 250 requests | 60s | Sensitive admin routes. The admin scope also satisfies lower scopes. |
These are defaults. Always trust the live
x-ratelimit-* headers and the details in a 429 over any number hard-coded in your client, since the values in effect for your key are authoritative.Backoff and retry
Retry on429 and on 5xx (internal_error). Do not retry on 4xx other than 429: a bad_request, unauthorized, forbidden, or not_found will fail identically on retry, so fix the request instead.
For a 429, the cleanest strategy is to wait until the window resets:
Read the reset time
Take
x-ratelimit-reset from the response headers (or compute from details.window_seconds).Errors
The full error envelope and code table.
Response envelope
The shared shape of every response.