---
title: "Caps and the 402 contract | Recovea"
description: "An armed cap refuses the request before it reaches your provider, and answers 402."
canonical: "https://recovea.ai/docs/products/cap/"
source: "https://recovea.ai/docs/products/cap/"
---

Docs

# A cap refuses. An alert only warns.

An armed cap answers in the request path, before anything reaches your provider.

Recovea does both: the warning on the way up, the refusal at the line. Threshold alerts are Team and above; a refusal mails your owners and billing contacts on any plan, Free included, once per budget each month.

## The response

The three strings your code should branch on are the status, the error type and the error code. The message is prose and may be reworded; those three are the contract.

```
HTTP/1.1 402 Payment Required

{
  "error": {
    "message": "Monthly budget reached. Traffic resumes at reset, or raise the cap.",
    "type": "insufficient_quota",
    "param": null,
    "code": "budget_exceeded"
  }
}
```

One shape answers every window, and the sentence inside it names the window that was reached. This one is a month's. A day, a year and a lifetime say their own word; a run says run, and stays stopped. No body names the budget, the key, the project or the run.

## The contract

|  |  |
| --- | --- |
| Status | 402 |
| Error type | insufficient_quota |
| Error code | budget_exceeded |

## What is not a refusal

Designed to fail open: if the gateway degrades, traffic goes straight to your provider. The only stop is a cap you armed.

Caps up to $1,000/mo on Free — Developer raises the ceiling to your full band.

The kill-switch is separate from the cap ceiling: it is binary, per budget, has no dollar value, and is live on every plan. It refuses where the cap beside it refuses: the hard stop enforces at workspace and key scope. Prices and bands are on [pricing](https://recovea.ai/pricing/).
