- Home
- 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 sitemake— the make as NHTSA files itmodel— the model as NHTSA files ityear_start— the first model year of the generationyear_end— the last model year of the generationcomplaints_with_mileage— NHTSA owner complaints for the generation that record an odometer reading; complaints without one are not counted heremedian_miles— the median mileage at failure across those complaints, in milesp10— the 10th percentile of that mileagep25— the 25th percentilep75— the 75th percentilep90— the 90th percentileshape— a one-word label for the shape of the mileage distribution, such as early, late or spreadrecall_campaigns— the number of NHTSA recall campaigns that cover the generationleading_systems— up to six vehicle systems named most often in the generation’s complaints, each withsystem(the NHTSA component name),complaints(complaints naming it, with or without mileage) andmedian_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.