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

# monthly_cap_exceeded

> 403 permission — this key has reached its calendar-month spend cap.

**HTTP 403 · type `permission`.** The key carries a `monthly_cap_usd`, and settled
spend this calendar month (UTC) has reached it — or this request's reservation would
push past it. Caps are permissions, not rates: the refusal happens at reservation
time, before anything runs. Nothing was charged.

## The shape

```json theme={null}
{
  "error": {
    "type": "permission",
    "code": "monthly_cap_exceeded",
    "message": "This key's monthly cap is $100.00; $98.60 is already spent this month.",
    "doc_url": "https://docs.fiveninelabs.com/errors/monthly_cap_exceeded",
    "request_id": "req_3fp77b",
    "cap_usd": 100,
    "spent_usd": 98.6
  }
}
```

## How to fix

* Raise the key's monthly cap in the dashboard, if you own that decision — or wait:
  the window is the **calendar month in UTC**, so it resets at 00:00 UTC on the 1st.
* If this key belongs to one workload among several, mint separate keys with separate
  caps — the cap is per key, which is what makes it a budget boundary you can hand
  out.
* Audit where the month went: `GET /v1/usage?key=key_…` pages the ledger, every
  settle citing the run whose signed receipts justify it.

## Reproduce it

Set a throwaway key's monthly cap to less than you've already spent with it this
month (dashboard → Keys), then make any spending POST:

```bash theme={null}
curl https://api.fiveninelabs.com/v1/sessions \
  -H "Authorization: Bearer $CAPPED_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "vinyl records under $30", "max_spend_usd": 1}'
```
