Signal Explorer › Methodology
How signal records are classified, verified, and updated
The Signal Explorer turns public recall and outbreak notices into one dataset with fixed categories, so recurring risks can be counted and compared. This page is the full method. It is generated from the same code that classifies the records, so it cannot describe rules the site does not actually use.
Four principles
- Accuracy
- Every number comes from an agency record, fetched by code that is tested against saved copies of the real responses and checked daily against the live sites. Nothing is estimated or filled in. A field the agency did not provide is shown as "not stated".
- Consistency
- Every record, from all three agencies, is classified with the same fixed vocabularies below, by the same rules, at the same time. When a rule changes, every record is reclassified and the change log shows what moved.
- Traceability
- Every record links to the agency's notice and keeps the agency's original wording next to each derived label, with a note saying whether the label was stated by the agency, coded by the agency, or inferred by our rules. Every version of the dataset is kept in the project's public history.
- Useful reporting
- The explorer answers practical questions: which hazards recur, in which products, from which sources, whether the rate is changing, and how often causes are actually known. Any filtered view can be shared as a link or downloaded as a CSV.
What is in the dataset
Records reported since Jan 1, 2021, from:
The dataset starts on January 1, 2021 and keeps growing. Once it holds 15 years, the oldest records age out so it never exceeds that span.
- CDC
- Centers for Disease Control and Prevention: multistate outbreak notices. Currently 75 records.
- FDA
- Food and Drug Administration: enforcement reports via openFDA, covering most foods and pet food. Currently 2,641 records.
- USDA FSIS
- USDA Food Safety and Inspection Service: meat, poultry, and egg product recalls and alerts. Currently 383 records.
Record types: Recall: a product recall from fda or usda fsis.; Public health alert: an fsis alert issued instead of a recall.; Outbreak notice: a cdc multistate foodborne outbreak investigation notice..
Not included: dietary supplements (excluded from FDA records by product wording), drugs, cosmetics, and medical devices (never fetched), single-state outbreaks (CDC does not publish notices for them), and anything before the start date. Pet food is included and labeled. FDA records are grouped so that one recall event with many products is one record.
What a record contains
| Field | Meaning | Where it comes from |
|---|---|---|
| Source and agency id | Which agency, and the agency's own identifier | openFDA event id, FSIS recall number, CDC notice path |
| Title, firm, product | What was affected and who recalled it | Agency fields; FDA titles are built from firm and first product |
| Hazard type | The kind of danger | Inferred from the reason wording (rules below) |
| Organism, allergen, or material | The specific agent(s) named | Inferred from the reason wording; CDC names the pathogen directly |
| Product category | One food category | Inferred from product wording |
| Class | FDA/FSIS risk class (I is most serious) | Agency field; outbreaks have no class |
| Geography | Distribution scope and named states | FSIS state list (stated); FDA free text (inferred); CDC per-state counts (stated) |
| Root cause | Why the problem happened | FSIS reason codes (coded) or free text (inferred); otherwise "not stated" |
| How it was found | What triggered the action | FSIS "problem was discovered" sentence (inferred); CDC (coded); FDA usually "not stated" |
| Corrective action | What was done | Agency coded fields |
| Status | Open, closed, or unknown, with the agency's word | Agency field, normalized |
| Dates | Event, reported, last agency update, closed | Agency fields; "not stated" when absent |
| Outbreak figures | Cases, hospitalizations, deaths, onset range | CDC notice (outbreaks only) |
| Missing and inferred | Lists of fields the source lacked, and fields our rules assigned | Computed for every record |
| Record history | First seen, last changed, revision count | Computed by comparing each build with the previous one |
The categories and rules (version 1.0)
Hazard type
Follows from the organism, allergen, material, or chemical named in the reason. Organisms take precedence, then allergens, foreign material, chemicals. Only when none is named do the regulatory and other rules apply.
| Value | Definition |
|---|---|
| Biological | A pathogen (bacteria, virus, or parasite) or a condition that lets one grow, such as underprocessing or temperature abuse. |
| Undeclared allergen | A major food allergen present but not declared on the label. |
| Physical | Foreign material in the food: metal, plastic, glass, wood, bone, pests. |
| Chemical | Lead and other heavy metals, pesticide residue, unapproved additives or colors, cleaning chemicals, toxins. |
| Labeling or regulatory | No named hazard: misbranding, import violations, or products made without required inspection. |
| Other | A stated problem that fits none of the above, such as spoilage or a packaging defect, with no agent named. |
| Undetermined | The agency's wording matched none of our rules. The original reason is shown on the record. |
Product category
One category per record from the product description and title. Rules are ordered from most specific (infant, prepared foods) to most general (beverages); the first match wins. The finer food tags used elsewhere on the site are kept too.
| Value | Definition |
|---|---|
| Produce | Fresh, cut, or frozen fruits, vegetables, herbs, and sprouts. |
| Meat | Beef, pork, lamb, and products made mainly from them, including deli meats and sausages. |
| Poultry | Chicken, turkey, duck, and products made mainly from them. |
| Seafood | Fish and shellfish. |
| Dairy | Milk, cheese, yogurt, ice cream, butter, cream. |
| Eggs | Shell eggs and egg products. |
| Nuts and seeds | Nuts, seeds, and butters made from them. |
| Grains and bakery | Flour, cereal, bread, pasta, baked goods, cookies. |
| Snacks and confectionery | Chips, crackers, candy, chocolate. |
| Prepared foods | Ready-to-eat meals, sandwiches, salads, soups, dips, frozen entrees. |
| Condiments and spices | Spices, seasonings, sauces, dressings, oils, sweeteners. |
| Beverages | Juice, water, soft drinks, coffee, tea, and other drinks. |
| Infant and baby | Infant formula and foods marketed for babies and toddlers. |
| Pet food | Food and treats for animals. FDA files these under food; they are labeled here so they are never mistaken for human food. |
| Other or unclassified | Nothing in the product description matched a category. |
Geography
FSIS lists states explicitly. FDA gives free text ("Nationwide", "CA, NV, and OR", "Distributed in WA only"), which is read for state names and codes; in all-capitals text, two-letter codes are only trusted inside a list, so words like IN and OR are not mistaken for states. CDC per-state case counts give the states for outbreaks.
| Value | Definition |
|---|---|
| Nationwide | The agency says the product was distributed nationwide or throughout the US. |
| Multi-state | Two or more named states. |
| Single state | One named state. |
| International only | Only distribution outside the US was named. |
| Unspecified | The agency gave no distribution area, or gave one our rules could not read. The original wording is on the record. |
Root cause
FSIS codes each recall with a reason; the codes that describe a cause (Misbranding, Processing Defect, Insanitary Conditions, Import Violation, Produced Without Benefit of Inspection) are used directly and marked "coded by the agency". Otherwise keyword rules read the free text. A pathogen finding or an undeclared allergen on its own is a hazard, not a cause, so those records say "not stated" unless the text explains why it happened.
| Value | Definition |
|---|---|
| Labeling or packaging error | Wrong label, wrong package, or an ingredient left off the label. |
| Supplier or ingredient | An ingredient or component from a supplier was contaminated or recalled. |
| Process deviation | Underprocessing, temperature abuse, or another step that did not go as designed. |
| Equipment failure | Broken or worn equipment, usually the origin of metal or plastic fragments. |
| Sanitation or facility | Insanitary conditions or a contaminated plant environment. |
| Import or inspection violation | Product entered the US without eligibility or inspection, or was made without federal inspection. |
| Not stated | The agency did not say why the problem happened. This is the honest default: most notices describe the hazard, not its cause. |
How it was found
FSIS press releases usually contain a sentence beginning "The problem was discovered when…"; that sentence is read. FDA enforcement reports rarely say, and are marked "not stated". CDC notices are illness investigations by definition.
| Value | Definition |
|---|---|
| Consumer complaint | A consumer or customer reported the problem. |
| Illness reports or outbreak | Reported illnesses or an outbreak investigation led to the action. |
| Firm's own testing or review | The company found the problem itself and told the agency. |
| Another agency or partner | Another agency, a state lab, or a business partner notified the responsible agency. |
| Agency sampling or inspection | Routine agency testing, inspection, or surveillance found it. |
| Not stated | The notice does not say how the problem was found. FDA enforcement reports never do. |
Corrective action
From coded fields: FDA's "voluntary/mandated" and "initial firm notification", FSIS's record type (recall or public health alert), and CDC's "Recall issued" line.
| Value | Definition |
|---|---|
| Voluntary recall | The firm removed the product from the market. Nearly all US food recalls are voluntary. |
| Mandated recall | FDA ordered the recall. |
| Public health alert | FSIS warned the public without a recall, usually because the product is no longer for sale. |
| Outbreak investigation, recall issued | CDC's notice says a recall was issued for the implicated food. |
| Outbreak investigation, no recall | CDC's notice says no recall was issued. |
| Outbreak investigation | CDC's notice does not say whether a recall was issued. |
| Unknown | The source gave no usable information. |
Status
Recorded on every record and used to detect closures for the change log, but deliberately not offered as a filter or a headline figure in the explorer. Across agencies "open" is an administrative state meaning the agency has not formally closed the record, not a statement that the product is still a risk: FDA recalls commonly stay "Ongoing" for years after the food is gone. Counting the three agencies' senses of the word together produced a figure that invited exactly that misreading. Each record shows the agency's own word instead. For open CDC investigations specifically, see the open outbreaks list on the overview. FSIS gives only a closing year, not a date; that is recorded as a missing closed date.
| Value | Definition |
|---|---|
| Open | FDA "Ongoing", FSIS "Active Recall" or an active public health alert, or a CDC investigation CDC lists as open. |
| Closed | FDA "Completed" or "Terminated", FSIS "Closed Recall" or an archived alert, or an outbreak CDC has declared over. |
| Unknown | The source gave no status we could read. |
Organisms recognized: Listeria monocytogenes, Salmonella, E. coli (STEC), Hepatitis A, Norovirus, Clostridium botulinum, Cyclospora, Cronobacter, Campylobacter, Vibrio, Shigella, Staphylococcus, Bacillus cereus, Clostridium perfringens, mold or yeast, and "unspecified microbial" when the reason describes conditions for growth (underprocessing, temperature abuse) without naming one. Allergens: the nine US major allergens plus sulfites and mustard, recognized only when the reason is about declaration, so "raw milk tested positive for Salmonella" is not a milk-allergen record. Foreign materials: metal, plastic or rubber, glass, wood, bone or pit fragments, pests. Chemicals: lead, other heavy metals, pesticide residue, unapproved additives or colors, cleaning chemicals, mycotoxins, histamine, ethylene oxide, drug residues, radioactive contamination. The exact patterns are in classify.ts.
Missing and inferred information
- Missing means the agency did not provide it. The record shows "not stated" and lists the field under "What is missing or inferred". It is never estimated, and a missing value never counts toward any figure (for example, a missing closed date does not make a record open).
- Inferred means our rules assigned the value from the agency's wording. Every inferred label is marked as such on the record, and the wording it was read from is shown beside it so a reader can check it.
- Undetermined / other / unspecified are real values, not gaps to hide: they mean the wording matched no rule. They are counted and shown in the explorer like any other value, so you can see how often the rules fall short.
- Updated information replaces the old value in the record, and the old value is written to the change log with the date. Agencies update recalls (status changes, terminations) and CDC updates outbreak counts; the record always shows the agency's latest.
Data quality right now
Of 3,099 records built Sep 26, 2026, 9:14 PM UTC. "Stated" includes values coded or written explicitly by the agency.
| Field | Stated by agency | Inferred by rules | Not stated / no match |
|---|---|---|---|
| Hazard type | 75 (2%) | 2,888 (93%) | 136 (4%) |
| Organism or allergen | 75 (2%) | 2,796 (90%) | 228 (7%) |
| Product category | 0 (0%) | 2,904 (94%) | 195 (6%) |
| Geography | 251 (8%) | 2,535 (82%) | 313 (10%) |
| Root cause | 217 (7%) | 299 (10%) | 2,583 (83%) |
| Detection | 75 (2%) | 434 (14%) | 2,590 (84%) |
| Corrective action | 3,090 (100%) | 0 (0%) | 9 (0%) |
| Status | 3,092 (100%) | 0 (0%) | 7 (0%) |
| Class | 2,977 (96%) | 0 (0%) | 122 (4%) |
| Closed date | 2,743 (89%) | 0 (0%) | 356 (11%) |
How records are verified
- Parser tests. Every fetcher and every classification rule has automated tests that run against saved copies of real agency responses before any deploy. A deploy is blocked if a test fails.
- Daily live check. Once a day the parsers run against the live CDC, FDA, and USDA sites without writing anything, and fail loudly if a site has changed shape.
- Source links on every record. Each record links to the agency notice and, for FDA, to the exact machine-readable record. The agency's own reason, status, and distribution wording are shown unchanged.
- Independent failure. If a source cannot be fetched, its previous records are kept unchanged, the site shows a warning, and no "removed" entries are written for that source.
- Public history. The dataset files are committed to the public repository on every change, so any past state can be inspected.
How records are updated and logged
The dataset is rebuilt every six hours from a fresh fetch. Each new build is compared with the previous one, record by record, on these fields: status, agency status, class, hazard type, agents, product category, root cause, detection, corrective action, geography, states, updated date, closed date, outbreak cases, hospitalizations, deaths, firm, product, reason, and rules version. The change log records:
- Added: a record seen for the first time.
- Updated: a tracked field changed, with old and new values.
- Closed and Reopened: status changes, with the other field changes that came with them.
- Removed by source: a record inside the window that the agency no longer returns (rare; usually a withdrawn entry). Records that simply age out of the window are not logged.
- Backfilled history: one entry when the start date is moved earlier, counting the older records loaded from the agencies' history.
- Initial load: one entry for the first build. Records loaded then are marked "backfilled": their first-seen time is the load time, not the agency's posting date. 3,084 of the current records are backfilled.
Each record carries the version of the rules it was classified under. When the rules change, the version is bumped, every record is reclassified on the next build, and each record whose labels moved gets an "updated" entry that names the rule change. Log entries are kept for 400 days; older history remains in the repository.
Rules history
- Version 1.0 (Sep 17, 2026): First release of the classification rules: hazard type, organism or allergen, product category, geography, root cause, detection, corrective action, and status, with missing and inferred fields flagged on every record.
Limitations to keep in mind
- Counts reflect agency reporting, not the true rate of contamination. A change in how an agency reports can look like a trend.
- FDA enforcement reports appear in openFDA days to weeks after a firm's announcement, so the most recent month is always incomplete and fills in later. openFDA itself updates weekly.
- Keyword rules are approximate. The explorer shows how often they fall short (undetermined, other, unspecified), and every record can be checked against the original wording.
- Root cause is rarely stated in public notices. The large "not stated" share is a fact about the notices, not a gap this site could fill responsibly.
- A record with several products or several hazards is one record. The hazard breakdown counts a record under each agent it names.
- CDC has removed some older outbreak notices from cdc.gov, and a few are not in its archive either. Those keep a minimal record (food, germ, and the month encoded in CDC's notice id) with no case counts, status, or states, all marked as not stated, and they link to CDC's outbreak list instead of a notice.
Reusing the data
The full dataset with every field is data/signals.json in the repository, and the change log is data/signals-changelog.json. The compact version the explorer loads is at signals/data.json. Any filtered view in the explorer can be downloaded as CSV. All of it is derived from public US government data; please cite the agency notice for anything that matters.