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

# Rate limits

> Per-user request budgets and the response headers.

Rate limits apply **per user**. All of your API keys share a single budget, and
so do the [Solana regions](/concepts/chains#regions) — `eu.` and `us.` draw on
one allowance rather than one each.

| Window     | Limit           |
| ---------- | --------------- |
| Per minute | 60 requests     |
| Per hour   | 1,200 requests  |
| Per week   | 10,000 requests |

## Response headers

Every response (including errors) includes your current budget:

| Header                         | Description                                     |
| ------------------------------ | ----------------------------------------------- |
| `X-RateLimit-Limit-Minute`     | Configured per-minute limit                     |
| `X-RateLimit-Limit-Hour`       | Configured per-hour limit                       |
| `X-RateLimit-Limit-Week`       | Configured per-week limit                       |
| `X-RateLimit-Remaining-Minute` | Requests remaining in the current minute window |
| `X-RateLimit-Remaining-Hour`   | Requests remaining in the current hour window   |
| `X-RateLimit-Remaining-Week`   | Requests remaining in the current week window   |

Counts are shared across regions and reconciled continuously, so the
`Remaining-*` values are accurate within a moment rather than to the request.
Right after you move traffic to another region its headers can read high until
they catch up. A sudden *increase* in remaining budget is stale reporting, not
new headroom — if you pace against these headers, keep your own counter as a
floor.

## HTTP 429: Too Many Requests

When any window is exhausted the server responds with `429` (code
[`RATE_LIMITED`](/concepts/errors#api-errors)) and adds a `Retry-After` header:

| Header        | Description                              |
| ------------- | ---------------------------------------- |
| `Retry-After` | Seconds until the blocking window resets |

The `details` field contains `retry_after=<seconds>`. The rejected request is
**not counted** against your budget.
