What it means
Yourclient_id has burned through its per-minute or per-day budget. We
return 429 until the sliding window opens back up.
Budgets
| Window | Default budget per client_id |
|---|---|
| Per minute | 600 |
| Per day | 10,000 |
Headers on every authenticated response
Every200, 304, and 429 carries:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | The window’s budget (e.g. 600 for per-minute). |
X-RateLimit-Remaining | How many requests you have left in this window. |
X-RateLimit-Reset | Unix timestamp (seconds) when the window resets. |
429 also includes Retry-After: <seconds>.
What to do
- Respect
Retry-After. Wait at least that long before retrying. - Back off, don’t retry tight. A retry loop that ignores
Retry-Afterwill keep hitting429for the rest of the window. - Use conditional GETs. Pair every read with the prior
ETagorLast-Modified— a304Not Modified counts as 1 request but returns no body. See Rate limits for the full polling story. - Subscribe to webhooks. They cost zero rate-limit budget. Polling every user every minute will burn your budget fast; webhooks + a conditional GET on receipt is essentially free.

