Skip to main content
Two separate controls protect the API and keep grading fair for every institute:
  • 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.
Both answer 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/search and POST /credits/quote.
  • Writes: every other POST, PUT, PATCH and DELETE.
  • Upload files: POST /uploads is 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

A refused request does not use up any of your budget. Wait 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.
Requests that are refused (for example 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.
Do not retry a daily_quota_exceeded in a tight loop: nothing changes until the reset. Queue the remaining copies on your side and resume after resets_at, or contact us before a large exam to raise the quota.

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 /uploads call 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}/results returns 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.