Response Headers
Header presence depends on decision path and limiter result. Not every response contains all headers.
Rate-limit headers
| Header | Present when | Notes |
|---|---|---|
RateLimit-Limit |
Limiter returns limit |
Algorithm-dependent |
RateLimit-Remaining |
Limiter returns remaining |
Algorithm-dependent |
RateLimit-Reset |
Limiter returns reset or retry_after |
Fallback 1 in some limiter paths |
RateLimit |
A limiter result exists | Structured: "<policy_or_rule>";r=<remaining>;t=<reset> |
Fairvisor follows the standard RateLimit* header model from:
- https://datatracker.ietf.org/doc/draft-ietf-httpapi-ratelimit-headers/
- https://datatracker.ietf.org/doc/draft-polli-ratelimit-headers/
Reject headers
| Header | Present when |
|---|---|
Retry-After |
Reject decisions |
Retry-After includes deterministic per-identity jitter and is not runtime-configurable.
X-Fairvisor-Policy, X-Fairvisor-Rule, and the reject reason are emitted in debug-session headers only (as X-Fairvisor-Debug-Policy, X-Fairvisor-Debug-Rule, X-Fairvisor-Debug-Reason). See Debug Session.
Advisory headers
| Header | Present when |
|---|---|
X-Fairvisor-Warning |
Non-blocking warning paths (budget_warn, budget_throttle, loop_warn) |
X-Fairvisor-Loop-Count |
Loop detector emits loop metadata |
Debug headers
Debug headers are available only on requests that carry a valid signed debug cookie. Set FAIRVISOR_DEBUG_SESSION_SECRET and call POST /v1/debug/session to obtain one.
| Header | Notes |
|---|---|
X-Fairvisor-Decision |
Effective decision action |
X-Fairvisor-Mode |
enforce or shadow |
X-Fairvisor-Latency-Us |
Decision latency in microseconds |
X-Fairvisor-Debug-Decision |
Same as above (verbose form) |
X-Fairvisor-Debug-Mode |
Same as above (verbose form) |
X-Fairvisor-Debug-Reason |
Internal reject reason |
X-Fairvisor-Debug-Policy |
Policy ID that triggered the decision |
X-Fairvisor-Debug-Rule |
Rule name that triggered the decision |
X-Fairvisor-Debug-Latency-Us |
Same as above (verbose form) |
X-Fairvisor-Debug-Matched-Policies |
Number of policies evaluated |
X-Fairvisor-Debug-Descriptor-* |
Per-descriptor key/value pairs (up to 16) |
See Debug Session.
Notes on token headers
Some docs/examples may show additional token-specific headers such as X-Fairvisor-TPD-Remaining. Treat those as implementation-dependent unless explicitly documented by your running version.
Shadow mode
In shadow mode, would-reject decisions are converted to allow. Reject-specific response headers are suppressed for the client path.
Top-level runtime overrides (global_shadow, kill_switch_override) also do not add client-visible response headers. Use logs and metrics to verify override state.
decision_service vs reverse_proxy
- In
decision_service, headers are returned on/v1/decisionand must be forwarded by the gateway. - In
reverse_proxy, headers are attached on proxied responses in nginx filter phases.