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

# Plans and limits

> The three plans, their per-minute rates and quotas, and what hitting a ceiling returns.

A plan sets two limits on a key: a per-minute request rate and a longer-window quota. The data is identical across plans — paid plans buy throughput, not different numbers.

| Plan    | Per minute |          Quota |     Price |
| ------- | ---------: | -------------: | --------: |
| Free    |   30 / min |      100 / day |       \$0 |
| Starter |   60 / min | 10,000 / month | \$29 / mo |
| Builder |  300 / min | 75,000 / month | \$99 / mo |

Every tool is available on every plan; see [/pricing](/docs/pricing). Choose Builder over Starter when you need the higher ceilings for fan-out, batch jobs, or bursty agent traffic.

## Hitting a ceiling

Both limits return HTTP `429`, distinguished by code:

| Code                  | Cause                                                        | When it clears                                                 |
| --------------------- | ------------------------------------------------------------ | -------------------------------------------------------------- |
| `rate_limit_exceeded` | Exceeded the per-minute rate.                                | Within the minute — back off a few seconds and resume slower.  |
| `quota_exhausted`     | Used up the daily (Free) or monthly (Starter/Builder) quota. | Only at the window boundary — which can be hours or days away. |

<Note>
  If a `429` response carries a `Retry-After` header, honor it. `rate_limit_exceeded` is the per-minute limit and clears quickly. `quota_exhausted` clears only when the daily or monthly quota window resets, so stop the job instead of looping.
</Note>

## Response headers

Authenticated `/v1` tool responses include budget headers when Unkey reports the corresponding state during key verification:

| Header                  | Meaning                                                                                                          |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `X-Credits-Remaining`   | Integer credits left after the verification debit. A `quota_exhausted` 429 sends `0`.                            |
| `X-RateLimit-Remaining` | Integer requests left in the selected Unkey rate-limit window. Present only when Unkey returns rate-limit state. |
| `X-RateLimit-Reset`     | The selected Unkey rate-limit `reset` value, in milliseconds. Present only with `X-RateLimit-Remaining`.         |

If Unkey returns multiple rate-limit rows, the API exposes an exceeded row first; otherwise it exposes the row with the lowest `remaining` value.

`/health`, `/ready`, docs, and any unconfigured local-dev keyless path do not include these headers.

Schema 2 conditional requests have one nuance: a matching `If-None-Match` returns `304 Not Modified`, then the auth boundary refunds the quota credit. The `X-Credits-Remaining` header on that `304` is the value from the pre-refund verification response, so it can be one credit lower than the final refunded balance. The API does not make an extra Unkey call just to reread the balance after the refund.

See [Errors and retries](/docs/guides/errors-and-retries) for a retry loop that handles both cases.
