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

# Rate limits

> Each key gets its own budget.

Each API key may make **300 requests per minute**. The budget is per key, and two keys never
share a bucket, so one busy integration can never starve another.

## Knowing where you stand

Every response on `/v1/*` carries the standard `RateLimit` headers, a `304 Not Modified`
included, so you can slow down before you are refused rather than after:

```
RateLimit: limit=300, remaining=284, reset=41
RateLimit-Policy: 300;w=60
```

`remaining` is what is left in the current window. `reset` is the seconds until it refills.

`/health` and `/openapi.json` are unmetered and carry none of these headers.

## Being refused

Over budget, the API answers `429`:

```json theme={null}
{ "data": null, "error": { "code": "rate_limited", "message": "too many requests" } }
```

Wait for `reset` seconds and retry. A request refused for a bad key costs nothing against the
budget, because the budget is keyed to the key itself.

## Staying under it

Caching is worth doing, but it does not stretch this budget. Responses on `/v1/*` carry an
`ETag`, and sending `If-None-Match` gets you a `304 Not Modified` for anything you already hold,
saving the bandwidth and the parsing. It does not save a request: a conditional request is
counted before the `304` is produced, so it costs exactly as much of the 300-per-minute budget
as a full `200` would.

To stay under the limit, make fewer requests. Poll less often, or ask for a wider page with a
larger `limit` instead of paging through many small ones.
