Proxy Error Responses

Control how Vrata formats its own error responses — infrastructure failures, no matching route, circuit breaker open, etc. Each listener can expose a different level of detail, so a public listener hides internals while an internal listener shows full debugging context.

Configuration

{
  "proxyErrors": {
    "detail": "standard"
  }
}

The only field is detail. When proxyErrors is absent or detail is empty, standard is used.

Detail levels

LevelFieldsUse case
minimalerror, statusPublic-facing listeners — hide internals
standarderror, status, messageDefault — enough for debugging without exposing infrastructure
fullerror, status, message, destination, endpoint, timestampInternal listeners — full debugging context

Example responses

minimal:

{"error": "connection_refused", "status": 502}

standard (default):

{"error": "connection_refused", "status": 502, "message": "upstream connection refused"}

full:

{
  "error": "connection_refused",
  "status": 502,
  "message": "upstream connection refused",
  "destination": "api-svc",
  "endpoint": "10.0.1.14:8080",
  "timestamp": "2026-03-30T14:22:01Z"
}

Error types

Every proxy-generated error carries a classified error field:

TypeWhen it fires
connection_refusedTCP connect refused (backend down)
connection_resetConnection established but cut by backend
dns_failureHostname can’t be resolved
timeoutRequest or per-attempt timeout expired
tls_handshake_failureTLS handshake failed
circuit_openCircuit breaker prevented the attempt
no_destinationNo destination has healthy endpoints
no_endpointDestination exists but all endpoints are down
no_routeNo route matched the request
request_headers_too_largeRequest headers exceeded maxRequestHeadersKB

Status codes

Error typeHTTP status
circuit_open503
timeout504
no_route404
request_headers_too_large431
Everything else502

Per-listener example

A common setup: public listener with minimal, internal with full.

# Public — clients see only the error type
curl -X POST localhost:8080/api/v1/listeners -d '{
  "name": "public",
  "port": 443,
  "proxyErrors": {"detail": "minimal"}
}'

# Internal — operators see full context
curl -X POST localhost:8080/api/v1/listeners -d '{
  "name": "internal",
  "port": 8081,
  "proxyErrors": {"detail": "full"}
}'