<!-- Markdown twin of https://pixelvault.dev/docs/limits/ -->

Getting Started

[Quickstart](/docs/#quickstart) [Authentication](/docs/#authentication)

API Reference

[Overview](/docs/#api-reference) [Register](/docs/#register) [Upload image](/docs/#upload) [Generate image](/docs/#generate) [List images](/docs/#list) [AI descriptions & tags](/docs/#descriptions) [Get image](/docs/#get) [Delete image](/docs/#delete) [Batch upload](/docs/#batch) [Private images](/docs/#private) [Collections](/docs/#collections) [Usage & quota](/docs/#usage) [API keys](/docs/#keys) [Upgrade & billing](/docs/#billing-api) [Sign in by email code](/docs/#device-login) [Export all images](/docs/#export) [Transforms](/docs/#transforms) [Rate limits & quotas](/docs/limits/)

Tools

[CLI](/docs/#cli) [SDKs (JS & Python)](/docs/#sdks) [Claude Code skill](/docs/#claude-code)

Integration

[Paste & host](/docs/#paste) [Images in email](/docs/#email) [MCP server](/docs/#mcp) [Upload from Claude](/docs/claude/) [ChatGPT Custom GPT](/docs/#chatgpt-actions) [Agent discovery](/docs/#agent-discovery)

Account

[Billing & subscriptions](/docs/billing/)

# 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`](/docs/#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](/pricing/); see [Billing](/docs/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`](/docs/#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](/docs/#upload).
