- Rate limits cap how many requests you send per second and per minute.
- A daily copy quota caps how many copies your institute sends for grading per day.
429 Too Many Requests when you hit them, with a different error.code and a Retry-After header.
Rate limits
Every request counts against your key and against your institute (all keys of the institute together), so adding more keys does not raise the institute’s ceiling. Requests fall into three kinds:- Reads: every
GET, plus the lookups that only read:POST /exams/search,POST /candidates/searchandPOST /credits/quote. - Writes: every other
POST,PUT,PATCHandDELETE. - Upload files:
POST /uploadsis a write, and each file it presigns also counts against the upload limit (one call can presign up to 100 files).
Standard tier
High tier
Available on request for high-volume integrations.
Each key has a tier,
standard by default. GET /me returns it as rate_tier. To move a key to the high tier, contact hello@evalezy.com.
Limits use fixed one-second and one-minute windows and are enforced across our servers, so treat them as approximate: a sharp burst can be throttled slightly before the exact figure. Pace your traffic evenly and always honour
429 and Retry-After instead of tuning to the exact number.Rate limit headers
Responses to authenticated requests carry three headers describing the tightest window this request counted against:When you hit a rate limit
Retry-After seconds and retry.
Daily copy quota
Each institute has a daily copy quota: the number of copies it can send for grading per day, across all its keys. Evalezy sets it per institute; ask us if you need more. A key can also carry its own daily copy cap, so one integration cannot use the whole institute quota. What counts as one copy:- every accepted
POST /exams/{id}/submissions, handwritten or typed (including typed submissions with only objective answers), - every accepted
POST /submissions/{id}/re-evaluate.
402, 409 or 422) do not count. Quotas reset at 00:00 UTC (05:30 IST).
Check your quota: GET /me
GET /me works with any valid key, needs no scope, and is the quickest way to check a key before wiring anything else.
Response
string
The key’s rate limit tier:
standard unless a higher tier was agreed.integer
Your institute’s daily copy quota.
integer | null
This key’s own daily cap, or
null when the key has none.integer
Copies your institute has sent today, across all keys.
string
When the daily counters reset (next 00:00 UTC).
When you hit the daily quota
details.quota is daily_copy_quota when the institute quota is used up, or daily_copy_cap when this key’s own cap is. Retry-After is the number of seconds until the reset.
Handling 429 well
1
Branch on the code
rate_limited clears within seconds; daily_quota_exceeded clears at 00:00 UTC.2
Wait for Retry-After
The header is always present on a
429. Use it instead of a fixed delay.3
Retry with the same Idempotency-Key
A
429 is never stored for idempotent replay, so the retry runs normally and can never create a duplicate.Practical tips
- Upload in batches. One
POST /uploadscall can presign up to 100 PDFs. That is one write instead of 100. - Poll gently. To follow grading, read the submission feed every 30 to 60 seconds instead of polling each submission.
- Read results in pages.
GET /exams/{id}/resultsreturns up to 50 full results per call. - Spread a large exam. Writes are capped at 120 per minute per key on the standard tier: about 7,200 write calls an hour from one key. Plan large result days with that in mind, or ask for the high tier.