MileageCurve
  1. Home
  2. Open data

The data behind the generation pages

The per-generation figures behind the pages of this site are published as one file. It carries 322 vehicle generations across 29 makes, built from 519,963 NHTSA complaints that record an odometer reading at failure.

Download aggregates.jsonDownload generations.json

What is in it

aggregates.json is a list of 322 records, one per vehicle generation on this site, and each record has these fields:

  • url — the address of the generation’s page on this site
  • make — the make as NHTSA files it
  • model — the model as NHTSA files it
  • year_start — the first model year of the generation
  • year_end — the last model year of the generation
  • complaints_with_mileage — NHTSA owner complaints for the generation that record an odometer reading; complaints without one are not counted here
  • median_miles — the median mileage at failure across those complaints, in miles
  • p10 — the 10th percentile of that mileage
  • p25 — the 25th percentile
  • p75 — the 75th percentile
  • p90 — the 90th percentile
  • shape — a one-word label for the shape of the mileage distribution, such as early, late or spread
  • recall_campaigns — the number of NHTSA recall campaigns that cover the generation
  • leading_systems — up to six vehicle systems named most often in the generation’s complaints, each with system (the NHTSA component name), complaints (complaints naming it, with or without mileage) and median_miles (the median mileage of those that record one, or null)

Not in the file: the total of all complaints filed for a generation, the per-model-year medians, the data behind the charts and the comparisons across the site on the home and method pages. The pipeline computes those from the same NHTSA download.

generations.json carries the generation definitions: the make and model as NHTSA files them, including the other strings NHTSA uses for the same vehicle, the label and model years of each generation, the platform code, engines and transmissions where they are documented, the sources consulted, and the curated notes that explain how each boundary was drawn — including the overlaps, where a maker sold two bodies under one name in the same year.

What the numbers mean, and what they do not

These are complaints, not failures, and not a failure rate. A complaint exists because an owner filed one; nothing here counts the owners who did not. There is no denominator: no free model-level production figure exists, and the obvious substitute — the affected-vehicle count on recall campaigns — was tested here and rejected, because it overstates by a median factor of 7.6 when a campaign spans several model years.

Medians fall as generations get newer, and that is age rather than decline: a car built three years ago has not had time to reach a high odometer reading. Compare generations of similar age, never across the column. The method page sets out every step from the raw federal file to the figures here.

Licence and how to cite

The aggregates are published under CC BY 4.0: use them anywhere, including commercially, with attribution and a link back. The underlying NHTSA data is a United States government work and is in the public domain.

Suggested citation: MileageCurve, Mileage at failure by vehicle generation, derived from NHTSA Office of Defects Investigation, snapshot 2026-10-20. https://mileagecurve.com/data/

Rebuilding it yourself

The pipeline has no dependencies beyond the Python standard library: fetch the federal flat files, load them into SQLite, compute, render. The generation boundaries used are in the file above, and the snapshot date on every page says which download the figures came from.