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.