API
Rate Limits
Per-key request limits and how to back off gracefully.
The v1 API rate-limits each API key independently. Every response carries the current state of your budget in headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed per window |
X-RateLimit-Remaining | Requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp (seconds) when the window resets |
When you exceed the limit, the API returns 429 rate_limited and sets Retry-After: <seconds>. Wait at least that long before retrying.
Current limits
| Credential | Limit | Window |
|---|---|---|
| API key | 1000 requests | per hour |
| OAuth access token | 1000 requests | per hour |
If your integration genuinely needs more, contact support — these are starting limits.
Back-off strategy
Exponential back-off with jitter on 429 and 5xx responses:
async function withBackoff(req, max = 5) {
for (let attempt = 0; attempt < max; attempt++) {
const res = await req()
if (res.status !== 429 && res.status < 500) return res
const retryAfter = Number(res.headers.get('retry-after')) || 2 ** attempt
const jitter = Math.random() * 0.5
await new Promise((r) => setTimeout(r, (retryAfter + jitter) * 1000))
}
throw new Error('Max retries exceeded')
}