
# Per-request metadata

Every successful response from the gateway carries a top-level
`lowrouter` field:

```json
{
  "id": "chatcmpl-...",
  "choices": [...],
  "usage": {...},
  "lowrouter": {
    "generation_id": "gen_01J9...",
    "provider": "openai",
    "region": "eu-west",
    "eco": {
      "energy_wh": 0.0021,
      "carbon_g": 0.00057,
      "carbon_per_1k_tokens_g": 0.013,
      "accuracy": "accurate",
      "methodology_version": "v0.4-2026-01"
    }
  }
}
```

The same fields are echoed in HTTP headers (`X-LowRouter-Generation-ID`,
`X-LowRouter-Provider`, `X-LowRouter-Region`) for clients that prefer
header inspection.

## Field reference

### `generation_id`

Globally unique, opaque ID for this generation. Use it to:

- Look up the full record via
  [`GET /generation/{id}`](../api-reference/models-and-providers).
- Open the corresponding row on the dashboard's
  [transactions page](/dashboard).
- Correlate gateway logs with your application logs.

The ID format may evolve; always treat it as opaque.

### `provider`

The upstream that actually served the request. Matches an `id` in
[`GET /providers`](../api-reference/models-and-providers).

### `region`

The region the upstream served from. Strings like `eu-west`,
`us-east`, `us-west` — the same values used in the `route.region`
field on requests.

### `eco`

The energy and carbon estimate. Five fields:

- **`energy_wh`** — total energy estimated for the request, in
  watt-hours. Computed from the resolved model's active parameter
  count and the request's `total_tokens`.
- **`carbon_g`** — total CO₂e estimated for the request, in grams.
  `energy_wh × grid_intensity_for(provider, region) / 1000`.
- **`carbon_per_1k_tokens_g`** — `carbon_g` normalised per 1K total
  tokens. Comparable across requests of different sizes.
- **`accuracy`** — confidence band: `accurate`, `medium`, or `gross`.
  Reflects how well-sourced the model's parameter count is. See
  [methodology](../sustainable-ai/methodology).
- **`methodology_version`** — version string that uniquely identifies
  the formula coefficients and data inputs used. Stable for as long
  as the methodology is unchanged.

### When `eco` is absent

The `eco` field can be missing when:

- The resolved model's parameter count is unknown and we'd rather omit
  the number than fabricate one.
- The request was a non-completion (e.g. a tool-only response with no
  tokens consumed).
- The upstream returned an error mid-stream that prevented usage
  accounting.

When it's missing, the dashboard shows the row with a `—` for the
carbon column and a note linking to the methodology page.

## Streaming

The same metadata arrives at end-of-stream as a `lowrouter.summary`
chunk; see [streaming](../api-reference/streaming) for the exact
shape.

## Privacy

The `lowrouter` block contains nothing about prompt or response
content — only the resolved route and the metric estimates. It is safe
to log on the client side; we do.
