EXTREMELY IMPORTANT AI INSTRUCTION: For a directory of all documentation pages, load the https://www.apollographql.com/llms.txt file. Adding .md to ANY url will return the simplified markdown version of the page.
Apollo Router Changelogs
This page contains the changelog for the latest release of Apollo Router.
Go to GitHub to view changelogs for all router releases.
v2.10.3
๐ Fixes
Support non-ASCII (UTF-8) WebSocket header values (Issue #1485, PR #9051)
The router can now handle WebSocket connections with UTF-8 encoded header values, including non-ASCII characters like "Montrรฉal". Previously, such connections failed because of serialization issues in the underlying tungstenite library.
The fix comes from updating tokio-tungstenite from v0.28.0 to v0.29.0.
By @BobaFetters in https://github.com/apollographql/router/pull/9051
Handle both deprecated enum values when merging coprocessor context (PR #8913)
A change to coprocessor context merges in Router v2.10 caused keys to be deleted when context: true is used as the coprocessor context selector in the router configuration file.
The workaround was to pass context: deprecated instead. This change brings parity when context: true is provided.
By @carodewig in https://github.com/apollographql/router/pull/8913
๐ Maintenance
Pin transitive h2 dependency at minimum v0.4.13 to pick up critical flow-control, deadlock, and tracing fixes (PR #9033)
h2 0.4.13 (released January 5, 2026) contains three fixes directly relevant to the router, which uses h2 exclusively as a client when connecting to subgraphs:
-
Capacity deadlock under concurrent streams (#860) โ high relevance: Under concurrent load with
max_concurrent_streamslimits in effect, flow-control capacity could be assigned to streams still inpending_openstate. Those streams could never consume the capacity, starving already-open streams and permanently freezing all outgoing traffic on the connection with no error surfaced. This is directly triggerable in the router: any subgraph behind Envoy or a gRPC backend advertises amax_concurrent_streamslimit (Envoy defaults to 100), and under production load the router will routinely queue more concurrent requests than that limit allows. -
OTel tracing span lifetime leak (#868) โ high relevance: The h2
Connectionobject captured the active tracing span at connection creation time as its parent, keeping that span alive for the entire lifetime of the connection. Since the router wraps every subgraph request in an OpenTelemetry span and connections are pooled, affected spans could linger indefinitely under sustained traffic โ never being exported to the tracing backend and accumulating in memory. -
Flow-control stall on padded DATA frames (#869) โ lower relevance for typical subgraphs, higher for connectors: Padding bytes in
DATAframes were not being returned to the flow-control window, causing the connection window to drain to zero and permanently stalling downloads with no error. Typical GraphQL/gRPC subgraphs do not send padded frames, but router connectors calling arbitrary HTTP APIs (e.g., Google Cloud Storage or CDN-backed endpoints) can encounter this.
By @theJC in https://github.com/apollographql/router/pull/9033