X-Kernel-Proxy-Error response header to a typed code.
The header is set on every branded proxy-layer error response, including WebSocket and subresource requests where the page body never renders. The status is 502 for every proxy-layer failure, including timeouts, and 403 when the session’s egress allowlist blocks the destination. When Chromium exposes the response, use the header rather than the status to decide what went wrong. Cross-origin requests can fail CORS or opaque response blocking (ORB) checks before page JavaScript can inspect the response; see blocked destinations.
Error codes
Recovering from a proxy error
An agent driving the browser usually recovers on its own, because a failed step leads it to re-navigate. When a person is driving the browser instead — for example through an embedded live view — nobody re-navigates, and a transient provider failure becomes a dead end. Read the header on a502 and retry the navigation so those failures never reach the person holding the browser:
Typescript/Javascript
origin_response_incomplete is deliberately absent from that set. The destination may have already acted on the request, so retrying it automatically can duplicate a submission.
If the connection drops after response headers reach the browser, you may get a truncated response or a browser network error. Kernel can’t change the status or add X-Kernel-Proxy-Error at that point.
Observing proxy errors after the fact
With network browser telemetry enabled, the collector classifies branded502 or 403 responses exposed in Chromium’s Network.responseReceived as proxy_error events. These events aren’t a complete record of proxy refusals: cross-origin requests blocked by CORS or ORB can appear only as network_loading_failed, without the proxy status or header. WebSocket handshake failures and bare CONNECT refusals on ports other than 443 aren’t classified as proxy_error either.
Use the header when it’s available to recover in the moment, and correlate network events by request and URL when investigating failures. A generic loading error alone doesn’t identify a proxy refusal.
A header value the browser image does not recognize is reported as unknown, with the original value in raw_code. Read the header when you need the exact code.