How this works
Data sources
Five public sources, one derived dataset, and an explicit list of what is missing from it.
Foods
65
36 carry residue data.
Conventional samples
47,622
Across all commodities in the dataset.
Organic samples
2,737
Roughly 6% of the conventional volume — the core limitation of every organic comparison.
Program years ingested
2014–2024
PDP samples roughly twenty commodities a year and rotates them, so each food pools the 3 most recent years in which USDA actually tested it. The range behind each food is printed on its own page.
Primary sources
- USDA Pesticide Data Program (PDP)
- Residue detections, sample counts, and organic/conventional sample sets.
- U.S. EPA — Food and Pesticides
- Tolerances and benchmark context for what a detection means.
- USDA FoodData Central
- Nutrition per serving and the inputs to the nutrient-density score.
- USDA Economic Research Service — Fruit and Vegetable Prices
- Baseline retail price levels and organic price premiums.
- FDA/EPA — Advice about Eating Fish
- Mercury categories used on the seafood entries.
How the dataset is assembled
Residue rows are generated. scripts/ingest/build_pdp_dataset.py reads the annual PDP archives, joins each detection to the EPA tolerance for that pesticide/commodity pair, and aggregates per commodity and marketing claim into sample counts, detection frequency, mean residues per sample, and the share of samples near and above tolerance. The output is committed as src/data/pdp.generated.json.
Nutrition, price, and all prose stay hand-authored in TypeScript and are merged with the generated numbers at build time. The split is deliberate: a data refresh cannot rewrite the writing, and editing the writing cannot disturb the data.
Every index, band, verdict, and ranking is then computed from those inputs bysrc/lib/scoring.ts. Nothing is hand-scored.
Known gaps
- Organic sample sets are small. Typically a tenth of the conventional volume, sometimes fewer than 50 samples. The priority score is discounted where confidence is limited.
- 2 commodities have no usable organic sample set —Cherries, Sweet corn. Where the conventional index is material, these return "insufficient data" rather than an inferred verdict.
- No origin or seasonal breakdown. The raw files carry origin and collection date, but this site aggregates across both. That is a limitation of the current ingest, not of the source data.
- Detections without a tolerance are excluded from the near-benchmark and above-tolerance figures, because there is no benchmark to measure them against. For some commodities that is half the detections, which makes both figures conservative.
- Nutrition and price rows are still curated rather than ingested from a source dataset. Only the residue half is generated.
- Prices are national and static. Regional and weekly variation exceeds the differences between many of the figures shown.
- No live retailer data. This site does not scrape or partner with any grocery retailer.
Licensing and reuse
The underlying government datasets are public domain. The derived indices, priority scores, and rankings on this site may be reused with attribution and a link. If you are building something on top of it, an attribution link back to the relevant page is all we ask.
Refresh cadence
The residue programme publishes annually. The intended cadence here is an annual full refresh when new program data lands, with price rows reviewed twice a year and nutrition rows reviewed when the underlying reference data changes. Every change is listed on thechangelog.