# Rejection Reasons

- Canonical URL: https://docs.fairvisor.com/docs/reference/reasons/
- Section: docs
- Last updated: n/a
> Reason codes returned in X-Fairvisor-Reason.


`X-Fairvisor-Reason` is set on reject responses.

## Core reasons

| Reason | Meaning |
|---|---|
| `no_bundle_loaded` | No active bundle is loaded |
| `kill_switch` | Request matched an active kill switch |
| `token_bucket_exceeded` | Token bucket denied request |
| `budget_exceeded` | Cost budget exhausted |
| `circuit_breaker_open` | Policy circuit breaker is open |
| `loop_detected` | Loop detector threshold exceeded |

## LLM-specific reasons

| Reason | Meaning |
|---|---|
| `prompt_tokens_exceeded` | Prompt estimate exceeded max prompt limit |
| `max_tokens_per_request_exceeded` | Prompt + completion reservation exceeded per-request cap |
| `tpm_exceeded` | Tokens-per-minute budget exhausted |
| `tpd_exceeded` | Tokens-per-day budget exhausted |

## Streaming reason

`completion_tokens_exceeded` may appear in streaming SSE error payloads when mid-stream completion limit is hit. It is not emitted as `X-Fairvisor-Reason` header in the normal reject path.

## Shadow mode

In shadow mode, would-reject reasons are kept in internal decision metadata while HTTP response is allow (`200`).

