openaqi docs

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.

TierRequests / minuteRequests / day
free6010,000
partner300200,000
internal6,0005,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 only

The 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=60 and are identical for every caller.
  • Batch geographically. One /v1/cells call for a bounding box beats one /v1/air call 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.

Rate limits — openaqi docs