CANON·EVENT
Recall enforcement audit
Independent. Not affiliated with, endorsed by, or operated by CPSC, the EU Safety Gate, or any marketplace named here.

01 What the sweep found

How these were measured ↓

02 Every recall, and what we found on sale

One row per government recall notice. Open any row to see the regulator's record beside the listing we fetched, and the identifier we matched inside that page's own text.

# Product Hazard, in the regulator's words Found in Days since recall Verdict

03 How we know, and how sure we are

Every proportion above carries a 95% confidence interval, and every figure that depends on a broken collector is withheld rather than published. The three collectors below are the only part of this that touches a marketplace.

07 The other half of the measurement

08 What we are asking for

A measurement with no addressee is a curiosity. This one has both, and the ask is small on purpose: it is not that anyone fix product recalls, it is that a field already being written gets written into the field that exists for it.

Addressed to
The US Consumer Product Safety Commission
The ask
Populate Products[].Model, or add a ProductGTIN field beside the existing ProductUPCs.
Cost to the regulator
Nothing new to collect. The model number is already in the same JSON response, written as English prose in Description, one key away.

Right now anyone checking a recall programmatically has to parse that prose to find out which unit was recalled: a marketplace running its own listings against the feed, a journalist asking whether a product is still on sale, a customs authority, a comparison site, and the regulator itself. We wrote that parser. It is in data/pull_seeds.py and it recovered an identifier for 82 of 103 US notices the structured field did not carry. Nobody should have to write it.

What this page does not claim. Nothing in the sweep says any product is on sale, and nothing in it names a seller. The one number this project would stake itself on is a count of an empty field in a public feed, and it needs no scraper, no credit and no permission to reproduce:

curl -s "https://www.saferproducts.gov/RestWebServices/Recall?format=json&RecallDateStart=2026-07-20&RecallDateEnd=2026-08-13"   | python3 -c "import json,sys; d=json.load(sys.stdin);       print(sum(1 for r in d for p in r['Products'] if not (p.get('Model') or '').strip()),             'of', sum(len(r['Products']) for r in d))"