429; cross it and you’ll get told exactly how long to wait.
The numbers
| Knob | Value |
|---|---|
| Requests per minute | 60 |
| Burst capacity | 60 tokens |
| Refill rate | 1 token / second |
| Algorithm | Token bucket, in-memory, per-key |
Headers on every response
The four headers below ride on every API response, success or failure:| Header | Example | Meaning |
|---|---|---|
X-RateLimit-Limit | 60 | Bucket capacity. Constant. |
X-RateLimit-Remaining | 42 | Tokens left right now. |
X-RateLimit-Reset | 1777358866 | Unix epoch seconds when the bucket would be full again at the current rate. |
Retry-After | 8 | Only on 429. Seconds to wait before retrying. |
Retry-After whenever it sees
429:
When you hit 429
Retry-After seconds, then retry. The bucket refills
continuously — you don’t need to wait until it’s full to issue the
next request.
Tips
- Cache aggressively. History rows are immutable once written for a given
(universe, day, engine)triple — cache them client-side and you’ll rarely re-query. - Use
/tabs/{tab}instead of N/metrics/{metric}calls. One round-trip vs five. - Use
/historyto grab everything once a day. A single 2 MB response beats 50 small ones. - Spread bursts across keys if you’re running heavy back-fills. Multiple keys → multiple buckets.
Roadmap
- Tier-based limits — Enterprise customers will get higher buckets in a future release.
- Redis-backed counter — when we run multiple frontend instances, we’ll move the counter off in-process to keep the budget consistent across instances.