Food recall record › Methodology

How this archive is collected, and what it cannot tell you

4,487 sealed rows, 260 distinct recalls, 45 seals.

What this archive is, exactly. Once a day we seal one copy of a single openFDA request: the 100 most recently reported food enforcement records. That is a rolling window, not the enforcement database. A recall that entered and left the window between two of our seals is not here at all, and a recall missing from the newest seal was pushed out by newer reports — it was not withdrawn by FDA. These pages are a record of what openFDA served us on each date. They are not a complete list of food recalls and must not be read as one.
Days we did not seal. 45 seals span 47 calendar days, so these days inside the span have no sealed copy: 2026-07-04, 2026-07-15. A missing day means we did not read the API. It does not mean nothing changed, and a change that landed and was superseded across one of those gaps is not in this archive.
How often the source actually moves. Our 45 fetches returned only 7 distinct payloads — openFDA refreshes this endpoint roughly weekly, so most daily seals record an unchanged file. A change can only be witnessed between two seals that straddle a refresh.

The request

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.

What we store, and what we deliberately do not

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.

How we identify a recall

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.

How we count a change

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.

What this archive is not

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 fetch behind this archive

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.

SealCollected at (UTC)HTTPBytesPayload digest
2026-08-082026-08-08T22:49:15+00:00200125,98636efe69e192b
2026-08-072026-08-07T13:04:26+00:00200125,98636efe69e192b
2026-08-062026-08-06T13:03:40+00:00200125,98636efe69e192b
2026-08-052026-08-05T13:04:54+00:00200125,98636efe69e192b
2026-08-042026-08-04T13:04:03+00:00200125,98636efe69e192b
2026-08-032026-08-03T13:02:30+00:00200124,66506c613f6f081
2026-08-022026-08-02T13:02:08+00:00200124,66506c613f6f081
2026-08-012026-08-01T13:03:38+00:00200124,66506c613f6f081
2026-07-312026-07-31T13:01:15+00:00200124,66506c613f6f081
2026-07-302026-07-30T13:02:06+00:00200124,66506c613f6f081
2026-07-292026-07-29T13:04:07+00:00200124,66506c613f6f081
2026-07-282026-07-28T13:03:43+00:00200124,66506c613f6f081
2026-07-272026-07-27T13:03:43+00:00200127,3610ff3448f6186
2026-07-262026-07-26T13:02:42+00:00200127,3610ff3448f6186
2026-07-252026-07-25T13:03:42+00:00200127,3610ff3448f6186
2026-07-242026-07-24T13:02:41+00:00200127,3610ff3448f6186
2026-07-232026-07-23T13:02:34+00:00200127,3610ff3448f6186
2026-07-222026-07-22T13:03:00+00:00200127,3610ff3448f6186
2026-07-212026-07-21T13:02:28+00:00200130,41789ac0ad5c71f
2026-07-202026-07-20T13:01:56+00:00200130,41789ac0ad5c71f
2026-07-192026-07-19T13:03:43+00:00200130,41789ac0ad5c71f
2026-07-182026-07-18T13:04:31+00:00200130,41789ac0ad5c71f
2026-07-172026-07-17T13:03:30+00:00200130,41789ac0ad5c71f
2026-07-162026-07-16T00:50:59+00:00200130,41789ac0ad5c71f
2026-07-142026-07-14T13:01:53+00:00200130,41789ac0ad5c71f
2026-07-132026-07-13T13:03:34+00:00200129,536aced440f7176
2026-07-122026-07-12T13:04:57+00:00200129,536aced440f7176
2026-07-112026-07-11T13:05:04+00:00200129,536aced440f7176
2026-07-102026-07-10T13:35:51+00:00200129,536aced440f7176
2026-07-092026-07-09T13:04:30+00:00200129,536aced440f7176
2026-07-082026-07-08T13:03:44+00:00200129,536aced440f7176
2026-07-072026-07-07T13:04:00+00:00200129,536aced440f7176
2026-07-062026-07-06T13:01:00+00:00200127,918a2d0e59e2d36
2026-07-052026-07-05T20:55:32+00:00200127,918a2d0e59e2d36
2026-07-032026-07-03T15:35:46+00:00200127,918a2d0e59e2d36
2026-07-022026-07-02T13:02:05+00:00200127,918a2d0e59e2d36
2026-07-012026-07-01T13:00:32+00:00200127,918a2d0e59e2d36
2026-06-302026-06-30T13:03:42+00:00200127,918a2d0e59e2d36
2026-06-292026-06-29T13:04:18+00:00200129,00613471c1bc49e
2026-06-282026-06-28T13:01:35+00:00200129,00613471c1bc49e
2026-06-272026-06-27T13:02:56+00:00200129,00613471c1bc49e
2026-06-262026-06-26T13:04:59+00:00200129,00613471c1bc49e
2026-06-252026-06-25T13:03:20+00:00200129,00613471c1bc49e
2026-06-242026-06-24T13:02:35+00:00200129,00613471c1bc49e
2026-06-232026-06-23T05:05:33+00:00200129,00613471c1bc49e

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.

Food recall record home · Status changes we witnessed · How this is collected · FDA recalls · US Tech Automations.