# X_OTLP_HEADERS_INVALID

## Means

`OTEL_EXPORTER_OTLP_HEADERS` is malformed

## Typical cause

in `OTEL_EXPORTER_OTLP_HEADERS` or the per-signal `OTEL_EXPORTER_OTLP_TRACES_HEADERS` / `..._METRICS_HEADERS` that replaces it for its signal — the `cause` names the variable read — a percent-escape in one header **value** that `decodeURIComponent` cannot decode — a stray `%` meant literally (`api-key=100%`), or a truncated escape (`%zz`). Refused rather than kept raw: an operator-set variable with a bad escape is a misconfiguration, and sending the undecoded bytes would authenticate against nothing while looking like a collector outage. The header **key** is named in the `cause` and the `fix`; the value never is, because a header value is a credential

## Fix

`set <the variable the cause names>=<key>=<encoded>`, where `<encoded>` is what `bun -e 'console.log(encodeURIComponent(process.argv[1]))' <value>` prints — or drop the stray `%` if it was meant literally

[Metrics](/error-codes#metrics)
