Rate limits and idempotency
Current limits
Section titled “Current limits”| Traffic | Requests per 60 seconds | Counted by |
|---|---|---|
Anonymous /v1 reads |
30 | IP from cf-connecting-ip |
API-key /v1 reads |
120 | API key ID |
OAuth /v1 reads |
120 | Principal user ID |
Console /platform API |
60 | Human principal user ID |
POST /oauth/register |
10 | IP from cf-connecting-ip |
IP values are trimmed; absent or blank values share the unknown bucket.
Counters are best effort per Cloudflare location. OAuth tokens for the same
principal share a read bucket. These limits also cover the OpenAPI endpoint;
an unavailable or missing limiter returns 429.
Retry a read
Section titled “Retry a read”On 429, stop requests and wait for Retry-After: 60 before retrying.
Reduce concurrency and bound retries. Do not create more keys or identities to
evade limits. A repeated GET does not need an idempotency key, but its content
can change between calls. /me/notifications reads do not mark items as read.
Use Usage in the console to inspect daily request and error totals for the last 30 UTC days, plus totals by route group. Counts are recorded after authentication on a best-effort basis; they are not live remaining-quota counters.
Write limits and idempotency
Section titled “Write limits and idempotency”Do not send idempotency keys expecting replay protection for today’s API. Write retry rules and retention will be documented when write endpoints exist.