diff --git a/packages/documentation/content/docs/router/configuration/telemetry.mdx b/packages/documentation/content/docs/router/configuration/telemetry.mdx
index dc604b56..8306f4c5 100644
--- a/packages/documentation/content/docs/router/configuration/telemetry.mdx
+++ b/packages/documentation/content/docs/router/configuration/telemetry.mdx
@@ -7,20 +7,84 @@ tracing and metrics behavior in Hive Router.
## client_identification
-Configure how Hive Router identifies calling clients in telemetry, based on request headers.
+Configure how Hive Router identifies calling clients for usage reporting and tracing.
-| Field | Type | Notes |
-| ---------------- | -------- | ------------------------------------------------------------ |
-| `name_header` | `string` | HTTP header used to read client name for usage reporting. |
-| `version_header` | `string` | HTTP header used to read client version for usage reporting. |
+| Field | Type | Notes |
+| ---------------- | -------------------------- | ---------------------------------------------------------------------------------------------------------- |
+| `name_header` | `string` | HTTP header used to read client name for usage reporting. Default: `graphql-client-name`. |
+| `version_header` | `string` | HTTP header used to read client version for usage reporting. Default: `graphql-client-version`. |
+| `ip_header` | `string \| object \| null` | Optional header-based client IP resolution used for tracing. Default: `null`, which means use socket peer. |
```yaml title="router.config.yaml"
telemetry:
client_identification:
name_header: graphql-client-name # default
version_header: graphql-client-version # default
+ ip_header: null # default
```
+### `ip_header`
+
+By default, Hive Router uses the address of the incoming socket connection as the client address.
+
+If your router runs behind proxies or load balancers, you can tell it to resolve the client IP from
+an HTTP header instead. This affects the `http.server` tracing span attributes such as
+`client.address` and `client.port`.
+
+#### Use the left-most value from a header
+
+```yaml title="router.config.yaml"
+telemetry:
+ client_identification:
+ ip_header: x-forwarded-for
+```
+
+In this scenario, Hive Router reads the configured header and records the left-most valid IP address as
+`client.address`. If the header value includes a port, it also records `client.port`.
+
+This works well when your networking layer already sanitizes forwarding headers before requests
+reach the router.
+
+#### Trust forwarding headers only from trusted proxies
+
+```yaml title="router.config.yaml"
+telemetry:
+ client_identification:
+ ip_header:
+ name: x-forwarded-for
+ trusted_proxies:
+ - 10.0.0.0/8
+ - 192.168.0.0/16
+ - 127.0.0.1
+```
+
+Use this option when the router sits behind one or more trusted proxies.
+
+Hive Router first checks whether the socket peer address belongs to `trusted_proxies`. If the peer is not trusted, the router ignores the header and falls back to the socket peer.
+
+If the peer is trusted, the router scans the configured header from right to left, skips trusted proxy addresses, and records the first non-trusted IP as `client.address`.
+
+If all values in the header are trusted, the router uses the left-most value. If no valid client IP can be resolved, the router falls back to the socket peer address.
+
+Each `trusted_proxies` entry can be either a single IP address or a CIDR range.
+
+
+ Supported header value formats
+
+Hive Router can parse common forwarding header formats, including:
+
+- `x-forwarded-for: 198.51.100.7, 10.0.0.2`
+- `x-forwarded-for: 198.51.100.7:4444, 10.0.0.2`
+- `forwarded: for=198.51.100.7;proto=https`
+- `forwarded: for="[2001:db8::1]:8080";proto=https`
+
+
+
+
+ Forwarding headers such as `x-forwarded-for` can be spoofed by clients. Only
+ trust them when the incoming socket peer is a trusted proxy you control.
+
+
## resource
Attach OpenTelemetry resource attributes that describe this router instance, such as service name,
diff --git a/packages/search-api/wrangler.toml b/packages/search-api/wrangler.toml
index f2d496ea..c105da56 100644
--- a/packages/search-api/wrangler.toml
+++ b/packages/search-api/wrangler.toml
@@ -5,7 +5,3 @@ compatibility_date = "2026-04-30"
[[r2_buckets]]
binding = "SEARCH_INDEX"
bucket_name = "hive-docs-search-index"
-
-[[migrations]]
-tag = "remove-search-index-object"
-deleted_classes = ["SearchIndexObject"]