Rate limits
The API caps requests per fixed 60-second window. Every response — success or error — carries the current bucket's counters:
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 117
X-RateLimit-Reset: 1715701260
-
Limit— requests allowed in the current window. -
Remaining— what you have left in this window. -
Reset— unix timestamp (seconds) when the window rolls over.
Default buckets
| Caller | Limit | Keyed by |
|---|---|---|
| Authenticated PAT | 120 rpm | PAT id |
| Authenticated OAuth | 120 rpm | (client_id, account_id) |
| Anonymous | 30 rpm | client IP |
Buckets are independent — a single account holding two PATs
gets 2 × 120 rpm across them.
Per-endpoint overrides
OAuth public endpoints have their own dedicated buckets, keyed by IP, so a spike on one endpoint can't starve the others:
| Endpoint | Limit |
|---|---|
GET /v1/oauth/authorize |
30 rpm / IP |
POST /v1/oauth/token |
60 rpm / IP |
POST /v1/oauth/revoke |
60 rpm / IP |
POST /v1/oauth/introspect |
120 rpm / IP |
POST /v1/oauth/register |
5 rpm / IP |
Going over the limit
The next request after the bucket is exhausted returns
429 rate_limited:
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded; retry in 27s.",
"details": { "bucket": "pat", "limit": 120, "window_seconds": 60 },
"request_id": "req_…"
}
}
Headers:
Retry-After: 27
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1715701260
Wait at least Retry-After seconds before
retrying.
Recommendations
-
Read
X-RateLimit-Remainingproactively and slow your batch jobs down as it approaches 0 — don't wait for the 429. -
On
429, back off until the window resets. Reset is a hard boundary, not a sliding penalty. -
For bulk reads, prefer
limit=100(the max) and followmeta.next_cursorrather than re-issuing the same query with smaller pages. - Buckets are fail-open if our rate-limit cache hiccups — the headers remain best-effort during such an outage.
Anonymous calls
A few endpoints accept unauthenticated requests
(/.well-known/*, OAuth public endpoints). They
share the 30 rpm-per-IP anonymous bucket. Any real integration
should be authenticated and will use the higher per-token
quota.
Last updated May 14, 2026.