Skip to content

Rate limits and idempotency

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.

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.

Do not send idempotency keys expecting replay protection for today’s API. Write retry rules and retention will be documented when write endpoints exist.