> ## Documentation Index
> Fetch the complete documentation index at: https://docs.integrateledger.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Rate limits

> How fast you can call Ledger, and how to handle a 429.

Ledger limits requests per API key, so one runaway loop can't slow down everyone else. Each limit is a token bucket: you can send a burst at once, then keep up the sustained rate.

| Requests | Sustained | Burst |
| - | - | - |
| `POST /v1/check` and `POST /v1/track` | 200 a second | 1,000 |
| Billing (`/v1/billing/*`, cancellation) and catalog writes, which call Stripe | 5 a second | 25 |
| Everything else: customers and catalog reads | 50 a second | 100 |

Each kind of request has its own budget: billing calls don't use up a key's `check` budget, and sandbox and live keys are counted separately.

## Headers

Every API response says where the key stands:

| Header | Meaning |
| - | - |
| `RateLimit-Limit` | The burst |
| `RateLimit-Remaining` | Requests you can send right now |
| `RateLimit-Reset` | Seconds until the full burst is back |
| `RateLimit-Policy` | The sustained rate and burst, such as `200;w=1;burst=1000` |

## Handling a 429

Over the limit, Ledger answers `429` with `{ "error": "rate_limited" }` and a `Retry-After` header in seconds. Nothing was recorded: wait that long and send the same request again. Retrying `track` with the same `request_id` is always safe. The SDKs [fail open](https://docs.integrateledger.com/fail-open.md) on a `429` from `check` or `track`.

Spread out bulk work, such as a backfill or a catalog script, rather than sending it all at once. If your traffic needs more than these limits, [contact us](mailto:support@integrateledger.com).

## Failed requests

Repeated `401` responses from one IP address, about 30 in a row, make Ledger refuse further requests from that address for a short time. A key that has worked recently keeps working. Check your key if you see `401`s.

## Request size

Request bodies are limited to 1 MiB, far more than the largest catalog. A bigger body gets `413` with `{ "error": "payload_too_large" }`.

## Webhooks

Signed Stripe and Clerk webhook deliveries are never limited. Only deliveries that fail verification count, per sending address and endpoint.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.