---
title: "CO2 & emissions"
description: "The difference between the measured and estimated CO2 fields, the NEDC/WLTP split that makes a standard tag mandatory, which sources publish a figure, and how to render it without overclaiming."
canonical: "https://thecarapi.com/docs/co2"
contract_version: "2026-08-19"
api_base: "https://api.thecarapi.com"
source: "https://thecarapi.com/docs/co2.md"
---

# CO2 & emissions

The difference between the measured and estimated CO2 fields, the NEDC/WLTP split that makes a standard tag mandatory, which sources publish a figure, and how to render it without overclaiming.

Roughly half of EU auction lots publish a CO2 figure and the rest publish nothing at all. The API therefore carries **two** CO2 fields with deliberately different meanings, plus a third that says which test standard the second one is on. Rendering them as one number is the single most common way to get emissions wrong.

| Field | Type | What it is |
| --- | --- | --- |
| `co2` | `integer | null` | **Measured.** The figure the auction house itself published, in g/km. `null` on the roughly half of lots that publish none. Carries no standard tag. |
| `co2_estimated` | `integer | null` | **Derived.** Inferred for lots that publish nothing, from other lots of the same specification. Never a measured value. `null` wherever the specification does not decide it. |
| `co2_estimated_standard` | `"NEDC" | "WLTP" | null` | Which EU test cycle `co2_estimated` is expressed on. Always read the estimate together with this. |

> **Why they are two fields and not one** — An estimate must never be able to masquerade as a measurement. Estimates are deliberately not written into `co2`, so a consumer can always tell the two apart — and so can a regulator, a buyer, or your own support team when someone asks where a number came from.

## The two standards, and why it matters

EU registration documents declared NEDC-correlated CO2 through 2020 and switched to WLTP from 1 January 2021. **The same physical car reads 12–25% higher under WLTP.** Nothing about the car changed; the test did.

| Specification | Registered ≤2020 (NEDC) | Registered ≥2021 (WLTP) | Step |
| --- | --- | --- | --- |
| Peugeot 5008 Petrol 96 kW | 115–121 | 145–150 | +25% |
| Peugeot 3008 Petrol 96 kW | 114–120 | 140–144 | +21% |
| BMW 1-series Diesel 85 kW | 100–104 | 111–120 | +17% |
| VW Passat Diesel 110 kW | 106–113 | 127–128 | +15% |
| VW Tiguan Diesel 110 kW | 127–129 | 140–144 | +12% |
| BMW X1 Diesel 85 kW | 104 | 117 | +12% |

_Median g/km for fixed specifications across the labelled inventory. The 2021 switch is visible as a step, not a trend._

> **`co2` mixes both eras and does not say which** — The measured column has always carried both standards: pre-2021 rows are effectively NEDC, 2021-and-later rows are WLTP, and the field carries no tag to tell them apart. If you rank, average or threshold on `co2` across a mixed-year set, newer cars look dirtier than they are. Group by registration year, or state the caveat where you show the number.

## Which sources publish a measured figure

| Source | Measured `co2` | Notes |
| --- | --- | --- |
| `openlane` | Yes | Published on the listing itself. |
| `ecarstrade` | Yes | From the specification table on the listing. |
| `auto1` | Yes | Published with the vehicle specification. |
| `copart` | Effectively no | Present on a fraction of a percent of lots. |
| `schadeautos` | No | Publishes none. |
| `encar` | No | Korean market — homologated on a different cycle entirely. |
| `japanauction` | No | Japanese market — homologated on JC08/WLTC, not an EU cycle. |

## Which lots can carry an estimate

Only EU-market lots: `openlane`, `auto1`, `ecarstrade` and `schadeautos`. Korean and Japanese cars are homologated on JC08/WLTC and American salvage on the EPA cycle — **no EU figure exists for them**, so producing one would not be imprecision, it would be a category error. Those lots carry `null` in both CO2 fields and that is correct.

Within the eligible set, an estimate is produced only where the specification decides the answer with enough confidence — matched on standard, make, model, fuel, engine power in kW and, where possible, year. Where the specification does not pin it down, the field stays `null` rather than guessing. Coverage is deliberately traded away for accuracy: a broader rule that filled far more lots was measured, found to land within 10 g/km only about a third of the time, and rejected.

> **What accuracy to expect** — Measured against a source the reference table was **not** built from — the realistic case — the tighter match answers around a quarter of eligible lots at a median error of about 5 g/km, and the looser one around 30% at about 7 g/km. Good enough to band a car, filter a search, or show a comparison. Not good enough to print on a document.

## Rendering it correctly

```javascript
function co2Label(auction) {
  // A measured figure wins. Note it carries no standard tag — infer the era
  // from registration year if you need to compare across 2020/2021.
  if (auction.co2 != null) {
    return { value: auction.co2, measured: true, standard: null };
  }

  // An estimate is only meaningful with its standard attached.
  if (auction.co2_estimated != null) {
    return {
      value: auction.co2_estimated,
      measured: false,
      standard: auction.co2_estimated_standard,   // "NEDC" | "WLTP"
    };
  }

  // Neither. Common, and correct — most non-EU lots will land here.
  return null;
}
```

_Prefer the measurement, fall back to the estimate, and never silently merge the two._

- **Show the provenance.** "142 g/km" and "≈142 g/km (WLTP, estimated)" are different claims. Your users can tell, and so can anyone auditing your listing.
- **Do not sort or filter on `co2_estimated`.** It is `null` on most lots, so any ordering that uses it drops them without saying so. Sort on `co2` if you must sort at all, and expect the same caveat about mixed eras.
- **Do not compare a 2019 figure with a 2022 figure.** They are different tests. A 12–25% gap between two cars of the same specification is usually the standard, not the engine.
- **Do not treat `null` as zero.** An electric car and a car that published nothing both render as blank if you do — one of those is very wrong.

## Related emissions fields

`effluent_standard_group_search` on the auction detail carries the vehicle's emissions class where the source publishes it (Euro 5, Euro 6 and so on). It is a separate concept from CO2 — it describes pollutant limits the car was type-approved against, not the carbon it emits — and the two should not be presented as one figure. `vehicle_details.specs` may also carry source-published emissions and, for electric vehicles, charging figures.
