Appearance
Rate limits
Limits are per key, per minute, and reads and writes have separate budgets. Exhausting one does not affect the other.
| Limit | |
|---|---|
Writes (POST, DELETE) | 60 / minute |
Reads (GET) | 600 / minute |
You never have to guess
Every response carries the current state of your budget:
RateLimit: limit=60, remaining=41, reset=27
RateLimit-Limit: 60
RateLimit-Remaining: 41
RateLimit-Reset: 27reset is seconds until the window rolls over. Both the current draft-ietf-httpapi-ratelimit-headers names and the widely-deployed legacy ones are sent, so whichever your HTTP client understands is there.
When you exceed one
You get 429 with code: RATE_LIMIT_EXCEEDED and a Retry-After header, in seconds:
json
{
"type": "https://api.zefi.ai/problems/rate-limit-exceeded",
"title": "Rate limit exceeded",
"status": 429,
"code": "RATE_LIMIT_EXCEEDED",
"detail": "Quota of 60 write requests per minute exhausted. Retry in 4s."
}Honour Retry-After rather than retrying on a schedule of your own. The window is fixed, not rolling, so the value is exact — backing off for longer wastes budget, and retrying sooner just spends another rejection.
Staying inside them
Batch rather than loop: one call creating 50 links costs one write, where fifty calls cost fifty. See Creating links in bulk.
If a limit is genuinely too low for what you are building, talk to us rather than working around it — the budget is per key and can be raised.