Rate limits
| Mode | Limit |
|---|---|
| Live | 600 requests per minute per account |
| Test | 120 requests per minute per account |
The limit is shared by all your keys in the same mode. Uploads to upload URLs don’t count towards it. A class of 150 students needs about 300 requests: one file and one submission each.
Every request we accept your key for gets these headers, a 429 for going over included. Requests refused before that (401, 403 and the address limit below) and POST /v1/api_key/revoke don’t:
| Header | Meaning |
|---|---|
RateLimit-Limit |
Requests allowed per window |
RateLimit-Remaining |
Requests left in the current window |
RateLimit-Reset |
Seconds until the window resets |
Over the limit, you get 429 rate_limit_exceeded with a Retry-After header in seconds. Wait that long before retrying.
Requests with a key we don’t recognise are counted separately, by address. After 120 of them in a minute from one IPv4 address, or one IPv6 /64, every request from there gets 429 rate_limit_exceeded with Retry-After until that minute ends, including requests with a valid key. A revoked key, a missing scope or a disallowed address doesn’t count towards this.
The limit counts requests, not work. You can queue as many submissions as your credits cover, and we mark them in the order they arrive.
Prefer webhooks to polling. If you must poll, poll each object no more than once every 30 seconds, or poll the list endpoint with updated_after.
If you need a higher limit, contact us.