Data and methods
Where every number on this site comes from, how often it refreshes, and what it does and does not mean. Last refresh: Nov 1, 2026, 6:16 AM UTC.
How the site works
A scheduled job runs every six hours. It fetches each source below, converts it to a plain data file, and rebuilds this site from those files. Nothing is fetched while you are viewing a page, and no page ever calls an agency website directly. Each source is fetched independently: if one fails, its previous data stays on the site with a visible warning, and no value is ever estimated or filled in.
The data files, their full history, and the code are public in the project repository.
Sources
- CDC multistate foodborne outbreak notices
- CDC's outbreak list is read from the data file behind its table, then each outbreak's own pages are read for the case, hospitalization, death, and state counts, the investigation status, the dates CDC posted and updated the notice, and the illness onset range. Refreshes every 6 hours. Only outbreaks from the current and previous calendar year are read in detail.
An outbreak is open when CDC's notice says "Investigation status: Open". It is over when the notice says "Closed", "This outbreak is over", or "This outbreak has ended". Notices with neither are shown as unknown and left out of the open list. - CDC active investigation counts
- The same CDC page states how many multistate investigations CDC is working for Campylobacter, E. coli, Listeria, and Salmonella, with a "last updated" date. Most of these never become public notices. Refreshes every 6 hours.
- CDC burden estimates
- The comparison figures (9,900,000 illnesses, 53,300 hospitalizations, 931 deaths per year) are CDC's published estimates of total annual illness from the seven major foodborne pathogens, based on 2019 data and published in 2025. They are fixed numbers cited from CDC's foodborne burden page and are not computed by this site.
- FDA food recalls
- The openFDA food enforcement API, which FDA updates weekly and which reports its own data date (shown next to the recall tables). FDA lists one record per product; this site groups them into one row per recall event, showing the first product and the count of others. Recalls from the last 120 days are kept. Dietary supplements are excluded. Pet food is included and labeled, because FDA files it under food.
FDA warns that openFDA should not be relied on for public alerts, and enforcement reports can lag a firm's own announcement by days or weeks. For the newest FDA recall press releases, see FDA's recalls page. - USDA FSIS recalls
- The FSIS recall API, covering meat, poultry, and egg products, refreshed every 6 hours, with recalls from the last 12 months kept. If the API is unavailable the FSIS RSS feed is used instead, which gives only the title, link, and date; a note appears on the site when that happens. Each row links to the FSIS recall notice.
- News and agency notices
- Five RSS feeds, refreshed every 6 hours, keeping 30 days: Food Safety News; FDA's food safety recall, outbreak investigation, and press release feeds (press releases filtered to food topics by keyword); and a Google News search for "foodborne outbreak" or "food recall". Only the title, link, publisher, date, and a short excerpt are stored. Duplicate links are removed, preferring the agency's own notice over a news story about it.
- The daily AI summary
- Every morning at 7:30 AM US Eastern, the last 7 days of news items, agency notices, CDC outbreak updates, and recalls are numbered and given to an AI model (Claude Haiku 4.5, via the Anthropic API) with instructions to write a short brief using only those sources and to cite a source number at the end of every sentence. Before publishing, the code checks every sentence: any sentence without a citation, or citing a number not on the list, causes the draft to be rejected and rewritten once; if it fails again, the previous day's summary stays up with a notice. The model runs inside the scheduled job, never when you load a page, and no visitor data is sent anywhere. The summary is not reviewed by a person before publishing; treat it as a reading guide and follow the cited links for anything that matters to you.
- Recall reason categories
- The "Reason" label on each recall is assigned by this site from the agency's free-text reason using keyword rules (for example, any mention of Listeria becomes "Listeria"; "not declared" or "allergen" becomes "Undeclared allergen"; import violations and products made without inspection become "Regulatory"). The agency's original wording is shown under the label. Recalls that match no rule are labeled "Other".
- Signal Explorer
- Three years of FDA and FSIS recalls, FSIS public health alerts, and CDC outbreak notices, classified with fixed categories for hazard type, organism or allergen, product, geography, root cause, detection, corrective action, and status. Its own methodology page lists every category, the rules, how missing and inferred values are handled, and how the change log is produced.
- Recently implicated foods
- Food names from outbreak notices and recall product descriptions are matched against a fixed list of food types (lettuce, eggs, sprouts, and so on) by keyword. A product can match several types or none. Grouping covers items posted or updated in the last 90 days.
What the headline numbers mean
The illnesses, hospitalizations, and deaths on the overview are sums of the figures CDC reports on every multistate outbreak notice first posted in the trailing 12 months, whether the outbreak is now open or closed. Figures are CDC's latest for each outbreak, so they change as investigations update. A notice missing a figure counts as zero and a note says so.
These sums are a small fraction of true foodborne illness. They include only outbreaks that crossed state lines, were investigated by CDC, and were announced publicly. Single-state outbreaks, outbreaks investigated without a public notice, and the great majority of illnesses that are never linked to any outbreak are not included. CDC estimates the true annual burden at about 9.9 million illnesses. The two figures are shown side by side so that neither is mistaken for the other.
A single very large outbreak can dominate the 12-month total for a year. When one outbreak accounts for 40% or more of the illnesses, the overview names it.
What this site is not
It is not a government site and not a substitute for agency alerts. It summarizes public data and links to the original notice for every item. If you think you have food poisoning, contact a health care provider; to report a food safety problem, contact your local health department, FDA, or USDA.
Historical outbreak data going back to 1998 is available in CDC's National Outbreak Reporting System, which lags by one to two years and is therefore not used for any current figure here.
Current source status
| Source | Last successful fetch | Agency data date | Items | Status |
|---|---|---|---|---|
| CDC multistate foodborne outbreak notices | Nov 1, 2026, 6:16 AM UTC | — | 78 | OK |
| CDC active multistate investigation counts | Nov 1, 2026, 6:16 AM UTC | 2026-10-28 | 4 | OK |
| FDA food recalls (openFDA enforcement reports) | Nov 1, 2026, 6:16 AM UTC | 2026-10-21 | 2687 | OK |
| USDA FSIS recalls (recall API) | Nov 1, 2026, 6:16 AM UTC | 2026-10-30 | 501 | OK |
| Food Safety News | Nov 1, 2026, 6:16 AM UTC | — | 15 | OK |
| FDA recall notice | Nov 1, 2026, 6:16 AM UTC | — | 19 | OK |
| FDA outbreak notice | Nov 1, 2026, 6:16 AM UTC | — | 1 | OK |
| FDA press release | Nov 1, 2026, 6:16 AM UTC | — | 6 | OK |
| Google News | Nov 1, 2026, 6:16 AM UTC | — | 16 | OK |
Privacy
No cookies, no advertising, and no tracking networks. This site counts page views usingGoatCounter, an open-source analytics service, so we can tell whether anyone is reading. It is the only third-party script on the site.
GoatCounter records the page you viewed, the site that linked you here, and coarse details like browser name, screen width, and country. These are kept as separate daily totals that cannot be linked to each other, so there is no profile of any individual reader. Nothing is stored on your device. To tell a returning reader from a fresh one, GoatCounter holds your IP address and browser string in memory for eight hours and maps them to a random identifier; the address and browser string are never written to disk. A practical consequence: readers cannot be recognised across days, so a weekly visitor count is the sum of its daily counts, and one person reading on Monday and Thursday is counted twice.
In the interest of full disclosure, GoatCounter does not honour the Do Not Track browser setting. If you would rather not be counted, blocking gc.zgo.at in a content blocker prevents it entirely, and every part of this site works exactly as it does otherwise.
The recalls page and the Signal Explorer use JavaScript to filter tables; without it, every row is shown.