Food recall record › Methodology
4,487 sealed rows, 260 distinct recalls, 45 seals.
Once a day we make exactly one call: https://api.fda.gov/food/enforcement.json?limit=100&sort=report_date:desc. We store one row per recall per day, and we never edit a sealed row. Nothing in this pipeline uses a language model.
Each sealed row keeps only these fields: status, classification, product_description, recalling_firm, recall_initiation_date, report_date, state. The recalling firm is a business named on a public federal enforcement record, so it is published. Consignee-level detail that openFDA also returns — street addresses, cities, postal codes, distribution patterns, lot and code information, and the free-text reason for the recall — is excluded at the reader, not hidden in a template, so no page on this site can reach it. That exclusion is why you will find no ‘recalls by hazard’ page here: the hazard lives in the free-text reason field we do not publish.
Not by recall number alone. openFDA seals the literal string “N/A” for records with no number assigned, and several unrelated products share it, so a recall is keyed on its number and its product description when the number is missing. Grouping on the bare number would show unrelated products as one recall.
11 status changes and 0 classification changes, both out of 260 recalls sealed more than once — not out of 260. A change is only witnessable in a record we read twice, and because the window slides, a recall can leave and re-enter it. Every change is reported as a pair of seal dates rather than a single date, because our cadence cannot resolve the moment inside that bracket.
It is not a complete record of US food recalls, it is not a regulatory record, and it is not a substitute for the FDA enforcement report. It is a dated log of what one public API served us each day, published so that a claim about how the record moved can be checked against the seals that back it.
Every seal below is one call to the exact request we make. The digest is the first characters of the SHA-256 of the response body, so a reader can see for themselves which days returned the same file.
| Seal | Collected at (UTC) | HTTP | Bytes | Payload digest |
|---|---|---|---|---|
| 2026-08-08 | 2026-08-08T22:49:15+00:00 | 200 | 125,986 | 36efe69e192b |
| 2026-08-07 | 2026-08-07T13:04:26+00:00 | 200 | 125,986 | 36efe69e192b |
| 2026-08-06 | 2026-08-06T13:03:40+00:00 | 200 | 125,986 | 36efe69e192b |
| 2026-08-05 | 2026-08-05T13:04:54+00:00 | 200 | 125,986 | 36efe69e192b |
| 2026-08-04 | 2026-08-04T13:04:03+00:00 | 200 | 125,986 | 36efe69e192b |
| 2026-08-03 | 2026-08-03T13:02:30+00:00 | 200 | 124,665 | 06c613f6f081 |
| 2026-08-02 | 2026-08-02T13:02:08+00:00 | 200 | 124,665 | 06c613f6f081 |
| 2026-08-01 | 2026-08-01T13:03:38+00:00 | 200 | 124,665 | 06c613f6f081 |
| 2026-07-31 | 2026-07-31T13:01:15+00:00 | 200 | 124,665 | 06c613f6f081 |
| 2026-07-30 | 2026-07-30T13:02:06+00:00 | 200 | 124,665 | 06c613f6f081 |
| 2026-07-29 | 2026-07-29T13:04:07+00:00 | 200 | 124,665 | 06c613f6f081 |
| 2026-07-28 | 2026-07-28T13:03:43+00:00 | 200 | 124,665 | 06c613f6f081 |
| 2026-07-27 | 2026-07-27T13:03:43+00:00 | 200 | 127,361 | 0ff3448f6186 |
| 2026-07-26 | 2026-07-26T13:02:42+00:00 | 200 | 127,361 | 0ff3448f6186 |
| 2026-07-25 | 2026-07-25T13:03:42+00:00 | 200 | 127,361 | 0ff3448f6186 |
| 2026-07-24 | 2026-07-24T13:02:41+00:00 | 200 | 127,361 | 0ff3448f6186 |
| 2026-07-23 | 2026-07-23T13:02:34+00:00 | 200 | 127,361 | 0ff3448f6186 |
| 2026-07-22 | 2026-07-22T13:03:00+00:00 | 200 | 127,361 | 0ff3448f6186 |
| 2026-07-21 | 2026-07-21T13:02:28+00:00 | 200 | 130,417 | 89ac0ad5c71f |
| 2026-07-20 | 2026-07-20T13:01:56+00:00 | 200 | 130,417 | 89ac0ad5c71f |
| 2026-07-19 | 2026-07-19T13:03:43+00:00 | 200 | 130,417 | 89ac0ad5c71f |
| 2026-07-18 | 2026-07-18T13:04:31+00:00 | 200 | 130,417 | 89ac0ad5c71f |
| 2026-07-17 | 2026-07-17T13:03:30+00:00 | 200 | 130,417 | 89ac0ad5c71f |
| 2026-07-16 | 2026-07-16T00:50:59+00:00 | 200 | 130,417 | 89ac0ad5c71f |
| 2026-07-14 | 2026-07-14T13:01:53+00:00 | 200 | 130,417 | 89ac0ad5c71f |
| 2026-07-13 | 2026-07-13T13:03:34+00:00 | 200 | 129,536 | aced440f7176 |
| 2026-07-12 | 2026-07-12T13:04:57+00:00 | 200 | 129,536 | aced440f7176 |
| 2026-07-11 | 2026-07-11T13:05:04+00:00 | 200 | 129,536 | aced440f7176 |
| 2026-07-10 | 2026-07-10T13:35:51+00:00 | 200 | 129,536 | aced440f7176 |
| 2026-07-09 | 2026-07-09T13:04:30+00:00 | 200 | 129,536 | aced440f7176 |
| 2026-07-08 | 2026-07-08T13:03:44+00:00 | 200 | 129,536 | aced440f7176 |
| 2026-07-07 | 2026-07-07T13:04:00+00:00 | 200 | 129,536 | aced440f7176 |
| 2026-07-06 | 2026-07-06T13:01:00+00:00 | 200 | 127,918 | a2d0e59e2d36 |
| 2026-07-05 | 2026-07-05T20:55:32+00:00 | 200 | 127,918 | a2d0e59e2d36 |
| 2026-07-03 | 2026-07-03T15:35:46+00:00 | 200 | 127,918 | a2d0e59e2d36 |
| 2026-07-02 | 2026-07-02T13:02:05+00:00 | 200 | 127,918 | a2d0e59e2d36 |
| 2026-07-01 | 2026-07-01T13:00:32+00:00 | 200 | 127,918 | a2d0e59e2d36 |
| 2026-06-30 | 2026-06-30T13:03:42+00:00 | 200 | 127,918 | a2d0e59e2d36 |
| 2026-06-29 | 2026-06-29T13:04:18+00:00 | 200 | 129,006 | 13471c1bc49e |
| 2026-06-28 | 2026-06-28T13:01:35+00:00 | 200 | 129,006 | 13471c1bc49e |
| 2026-06-27 | 2026-06-27T13:02:56+00:00 | 200 | 129,006 | 13471c1bc49e |
| 2026-06-26 | 2026-06-26T13:04:59+00:00 | 200 | 129,006 | 13471c1bc49e |
| 2026-06-25 | 2026-06-25T13:03:20+00:00 | 200 | 129,006 | 13471c1bc49e |
| 2026-06-24 | 2026-06-24T13:02:35+00:00 | 200 | 129,006 | 13471c1bc49e |
| 2026-06-23 | 2026-06-23T05:05:33+00:00 | 200 | 129,006 | 13471c1bc49e |
Get told the day a recall status moves for your suppliers
openFDA serves the current status and nothing else, and the field that marks a termination only shows up once the termination has already happened — so an imminent change is invisible in a single fetch. We seal a dated copy every day and can see the move the day it lands. Leave your email and we'll tell you when a recall in your suppliers changes, with what it said before.
Email me recall status changes →Work email only. No newsletter, no obligation.
Prefer to just buy it? See what we sell off this archive, priced, with a sample of what changed.
Compiled from dated copies of the U.S. Food and Drug Administration's public openFDA food enforcement API (public domain, CC0 1.0). Data provided by the U.S. Food and Drug Administration. Values are reproduced exactly as openFDA served them on the date shown and may since have changed; FDA is the authority on the current status of any recall. openFDA data is provided as-is with no warranty, is not a certified regulatory record, does not represent FDA's official position, and must not be used as the sole basis for a compliance decision. Always verify against the FDA enforcement report before acting.