Rate limits
Per-account quota, the headers that tell you where you stand, and what to do about a 429.
Quota belongs to your account, not to a key.
Why this is worth stating twice
The intuition runs the other way — people expect a new key to come with a new allowance. It does not. Keys are identities, not budgets, so that "one key per app" stays good hygiene rather than becoming a way to buy capacity.
| Tier | Requests / minute | Requests / day |
|---|---|---|
| free | 60 | 10,000 |
| partner | 300 | 200,000 |
| internal | 6,000 | 5,000,000 |
Sending readings is not limited by tier. Only reading is, and that limit exists to stop one client accidentally scanning the planet.
Headers on every response
RateLimit-Limit: 60
RateLimit-Remaining: 57
RateLimit-Reset: 42 # seconds until the window resets
RateLimit-Policy: 60;w=60
Retry-After: 42 # on a 429 onlyThe older X-RateLimit-* names are sent too. You never have to discover the
limit by hitting it.
An X-RateLimit-Degraded: 1 header means our limiter was unavailable and your
request was let through anyway. Do not read it as headroom.
When you get a 429
{
"error": {
"code": "rate_limited",
"message": "Account quota exceeded: 60 requests per minute.",
"hint": "Quota is shared across every key on an account…",
"request_id": "req_ce3715fc8042498fa21b"
}
}Wait Retry-After seconds. Then look at whether you needed those requests:
- Cache. Responses carry
max-age=60and are identical for every caller. - Batch geographically. One
/v1/cellscall for a bounding box beats one/v1/aircall per location. - Poll slower. Readings arrive every minute or two at best. Polling every five seconds spends 12× the quota for the same data.
If you still need more, ask — the partner tier is free.