Rate limits & quotas
Last updated: October 2026
There are two kinds of limits. Rate limits cap how fast you can call the API and reset on their own. Plan quotas cap how much you can store and upload per month. This page lists both.
Rate limits
| Endpoint | Limit | Counted per |
|---|---|---|
Authenticated image API: POST /v1/images, POST /v1/images/batch, GET/DELETE /v1/images/*, POST /v1/images/:id/sign-url, /v1/collections* | 60 requests per minute per key, and 300 per minute across all of a project's keys | API key, then project |
POST /v1/images/generate (also counts toward the 60 per minute above) | 60 generations per hour | Account |
Keyless POST /v1/images (no API key) | 20 per hour, and a short burst guard of 10 per minute | IP address |
POST /v1/playground/upload | 10 per hour, and 10 per minute | IP address |
/v1/auth/* (register, login, sign-in codes, reset) | 5 per minute | IP address |
GET /v1/export | 10 per hour | IP address |
GET /v1/export-jobs/* (status and download) | 120 per minute | IP address |
POST /v1/claim | 20 per hour | IP address |
Serving images from img.pixelvault.dev is not part of the API rate limit. It is governed by your plan's bandwidth quota instead.
When you hit a limit
The API answers 429 Too Many Requests with a Retry-After header (seconds) and this body:
{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit of 60 requests per 1 minute(s) exceeded."
}
} Wait for Retry-After seconds and retry; do not retry in a tight loop. Most limited routes also send an X-RateLimit-Limit header with the limit that applied. The per-key limit (60 per minute) does not report a remaining count.
Batching helps: POST /v1/images/batch uploads many images in one request, which counts once against the 60 per minute limit.
Plan quotas
| Free | Starter | Pro | |
|---|---|---|---|
| Storage | 200 MB | 5 GB | 25 GB |
| Uploads per month | 500 | 25,000 | 50,000 |
| Bandwidth per month | 1 GB | 25 GB | 50 GB |
| AI image credits per month | 10 | 300 | 1,500 |
Maximum size per image is 5 MB. Prices and the full feature comparison are on the pricing page; see Billing for what happens when you change plan.
When you hit a plan quota
A plan quota is not a rate limit, so it does not answer 429. Waiting never helps: storage does not free itself and uploads reset only next month. The API answers 402 Payment Required instead, with a message that links to the upgrade page:
| Error code | Meaning | What to do |
|---|---|---|
storage_limit_reached | Total storage is at your plan's cap | Delete images or upgrade |
upload_limit_reached | Monthly upload count is used up | Wait for resets_at or upgrade |
private_limit_reached | Free plan's 100 private images are used | Delete some or upgrade |
Do not retry a 402. In a batch upload the same codes appear per item. Check GET /v1/usage before a bulk upload to see what is left.
Uploads that expire
Keyless uploads are temporary (30 days). Playground uploads are removed within 24 hours. Keyed uploads with expires_in are removed by an hourly cleanup, so removal can lag the TTL by up to about two hours. See Upload image.