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 |
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 |
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.
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.