# The Norovirus Tracker — method Gut Health Times. Built by `build-norovirus-tracker.py` (Python 3, standard library only). Every number on the tracker page comes from `norovirus-snapshot.json`, which the script derives from the files below. Nothing in it is estimated or modelled by us; where we compute something (a weekly mean, a percentage change, a sum), the computation is described here. ## Pull Pull completed **2026-10-03T15:05:24Z** (UTC). | Source file | URL | Bytes | ms | Retrieved (UTC) | |---|---|---|---|---| | `calicinet-map.json` | https://www.cdc.gov/norovirus/reporting/calicinet/calicinet-data-map-B.json | 8,826 | 90 | 2026-10-03T15:00:42Z | | `calicinet-monthly.json` | https://www.cdc.gov/norovirus/reporting/calicinet/dv-confirmed-norovirus-outbreaks.json | 8,949 | 93 | 2026-10-03T15:00:42Z | | `calicinet.html` | https://www.cdc.gov/norovirus/php/reporting/calicinet-data.html | 51,402 | 106 | 2026-10-03T15:00:41Z | | `cdc-catalog-norovirus.json` | https://data.cdc.gov/api/catalog/v1?q=norovirus&limit=50 | 12,052 | 263 | 2026-10-03T15:01:08Z | | `cdc-catalog-wastewater.json` | https://data.cdc.gov/api/catalog/v1?q=wastewater&limit=100&only=dataset | 935,123 | 438 | 2026-10-03T15:01:09Z | | `fda-alerts.html` | https://www.fda.gov/food/recalls-outbreaks-emergencies/alerts-advisories-safety-information | 92,673 | 136 | 2026-10-03T15:01:05Z | | `norostat-data.html` | https://www.cdc.gov/norovirus/php/reporting/norostat-data.html | 50,843 | 95 | 2026-10-03T15:00:38Z | | `norostat-table-20240811023235.html` | https://web.archive.org/web/20240811023235id_/https://www.cdc.gov/norovirus/php/reporting/norostat-data-table.html | 51,156 | 717 | 2026-10-03T15:00:41Z | | `norostat-table-20250905205255.html` | https://web.archive.org/web/20250905205255id_/https://www.cdc.gov/norovirus/php/reporting/norostat-data-table.html | 52,692 | 705 | 2026-10-03T15:00:40Z | | `norostat-table-20260725200827.html` | https://web.archive.org/web/20260725200827id_/https://www.cdc.gov/norovirus/php/reporting/norostat-data-table.html | 52,866 | 679 | 2026-10-03T15:00:39Z | | `norostat-table.html` | https://www.cdc.gov/norovirus/php/reporting/norostat-data-table.html | 53,205 | 117 | 2026-10-03T15:00:38Z | | `nors-all-by-year.json` | https://data.cdc.gov/resource/5xkq-dg7x.json?$query=SELECT%20year%2C%20count%28%2A%29%20AS%20outbreaks%20GROUP%20BY%20year%20ORDER%20BY%20year | 1,855 | 298 | 2026-10-03T15:00:44Z | | `nors-meta.json` | https://data.cdc.gov/api/views/5xkq-dg7x.json | 39,828 | 272 | 2026-10-03T15:00:45Z | | `nors-norovirus-by-year.json` | https://data.cdc.gov/resource/5xkq-dg7x.json?$query=SELECT%20year%2C%20count%28%2A%29%20AS%20outbreaks%2C%20sum%28illnesses%29%20AS%20illnesses%2C%20sum%28hospitalizations%29%20AS%20hospitalizations%2C%20sum%28deaths%29%20AS%20deaths%20WHERE%20etiology%20like%20%27%25Norovirus%25%27%20GROUP%20BY%20year%20ORDER%20BY%20year | 3,400 | 323 | 2026-10-03T15:00:43Z | | `nors-norovirus-mode-latest.json` | https://data.cdc.gov/resource/5xkq-dg7x.json?$query=SELECT%20year%2C%20primary_mode%2C%20count%28%2A%29%20AS%20outbreaks%20WHERE%20etiology%20like%20%27%25Norovirus%25%27%20AND%20year%20%3E%3D%20%272019%27%20GROUP%20BY%20year%2C%20primary_mode%20ORDER%20BY%20year%2C%20outbreaks%20DESC | 1,726 | 339 | 2026-10-03T15:00:45Z | | `nors-norovirus-multi.json` | https://data.cdc.gov/resource/5xkq-dg7x.json?$query=SELECT%20year%2C%20count%28%2A%29%20AS%20outbreaks%20WHERE%20etiology%20like%20%27%25Norovirus%25%27%20AND%20etiology%20like%20%27%25%3B%25%27%20GROUP%20BY%20year%20ORDER%20BY%20year | 879 | 278 | 2026-10-03T15:00:44Z | | `openfda-norovirus-wildcard.json` | https://api.fda.gov/food/enforcement.json?search=reason_for_recall:noro*&limit=1 | 2,192 | 520 | 2026-10-03T15:01:05Z | | `openfda-norovirus.json` | https://api.fda.gov/food/enforcement.json?search=reason_for_recall:norovirus&limit=1000 | 55,386 | 615 | 2026-10-03T15:01:04Z | | `vsp-1993-2018.html` | https://archive.cdc.gov/www_cdc_gov/nceh/vsp/surv/outbreak/archived-outbreaks-1993-2018.html | 139,055 | 117 | 2026-10-03T15:00:49Z | | `vsp-2019-2022.html` | https://archive.cdc.gov/www_cdc_gov/vessel-sanitation/cruise-ship-outbreaks/earlier-outbreaks-2019-2022.html | 95,266 | 119 | 2026-10-03T15:00:49Z | | `vsp-2023.html` | https://www.cdc.gov/vessel-sanitation/cruise-ship-outbreaks/earlier-outbreaks-2023.html | 52,541 | 626 | 2026-10-03T15:00:48Z | | `vsp-2025-2023.html` | https://www.cdc.gov/vessel-sanitation/cruise-ship-outbreaks/earlier-outbreaks.html | 71,150 | 1293 | 2026-10-03T15:00:47Z | | `vsp-current.html` | https://www.cdc.gov/vessel-sanitation/cruise-ship-outbreaks/index.html | 55,575 | 126 | 2026-10-03T15:00:46Z | | `wws-about.html` | https://data.wastewaterscan.org/about/ | 70,313 | 270 | 2026-10-03T15:00:33Z | | `wws-categories-national.json` | https://data.wastewaterscan.org/data/categories/national.json | 6,173 | 205 | 2026-10-03T15:00:32Z | | `wws-categories-regions.json` | https://data.wastewaterscan.org/data/categories/us-census-regions.json | 27,718 | 225 | 2026-10-03T15:00:32Z | | `wws-national.csv` | https://data.wastewaterscan.org/data/averages/national.csv | 1,290,581 | 468 | 2026-10-03T15:00:34Z | | `wws-region-midwest.csv` | https://data.wastewaterscan.org/data/averages/region-midwest.csv | 915,571 | 506 | 2026-10-03T15:00:35Z | | `wws-region-northeast.csv` | https://data.wastewaterscan.org/data/averages/region-northeast.csv | 817,569 | 533 | 2026-10-03T15:00:34Z | | `wws-region-south.csv` | https://data.wastewaterscan.org/data/averages/region-south.csv | 982,839 | 551 | 2026-10-03T15:00:36Z | | `wws-region-west.csv` | https://data.wastewaterscan.org/data/averages/region-west.csv | 1,225,602 | 528 | 2026-10-03T15:00:37Z | Plus 32 VSP outbreak detail pages and 6 CDC fact pages (full list in `norovirus-raw/provenance.json`). ## Sources | # | Source | What we use | Endpoint | Format | Updates | Latest data at this pull | Coverage | Licence / terms | Key | URL stability | |---|---|---|---|---|---|---|---|---|---|---| | 1 | WastewaterSCAN (Stanford / Emory / Verily) | Norovirus GII in wastewater solids: national and 4 census-region daily lines, plus WWSCAN's low/medium/high category | `https://data.wastewaterscan.org/data/averages/{national,region-northeast,region-midwest,region-south,region-west}.csv`; `https://data.wastewaterscan.org/data/categories/national.json`; `.../categories/us-census-regions.json` | CSV (all ~30 targets, daily since 2020; 0.8-1.3 MB each, ~0.44 MB gzipped) and JSON (6 KB / 28 KB) | Rebuilt at least daily | Category: sample date 2026-10-01. Daily line: 2026-09-30. Last complete week: ending 2026-09-26 | Norovirus GII from 2022-11-12; 141 sites in the current national panel (WWSCAN's own count in its national influenza A onset calculation); 193 plants in 41 states and DC listed, current and past | CC BY-NC 4.0, plus a use statement and a required attribution and citation (see Limitations) | No | Undocumented dashboard files. They have not changed shape in this build but carry no stability promise | | 2 | CDC NoroSTAT | Weekly suspected + confirmed norovirus outbreaks in 12 states, this season against the 2012-13 to 2025-26 range | `https://www.cdc.gov/norovirus/php/reporting/norostat-data-table.html` (table); `https://www.cdc.gov/norovirus/php/reporting/norostat-data.html` (CDC's own season-to-date sentence) | HTML table (53 KB; 10 KB gzipped) | Monthly | Page updated 2026-09-17; outbreaks with onset to 2026-09-04 | Seasons 2012-13 on (Aug-Jul), 12 states | US government work | No | HTML. The page moved in 2024 (old address `/norovirus/reporting/norostat/data-table.html`) and its column layout changed in 2026 | | 3 | CDC NoroSTAT, prior seasons | Each prior season's weekly column as CDC published it | Wayback captures of source 2: `20260725200827` (2025-26), `20250905205255` (2024-25), `20240811023235` (2023-24) | HTML | Fixed (captures are immutable) | n/a | 3 seasons | Archived copy of a US government page | No | Stable | | 4 | CDC CaliciNet | Genotypes of lab-confirmed outbreaks; monthly GI/GII counts; outbreaks by state | `https://www.cdc.gov/norovirus/php/reporting/calicinet-data.html`; Open Viz configs `https://www.cdc.gov/norovirus/reporting/calicinet/dv-confirmed-norovirus-outbreaks.json` and `.../calicinet-data-map-B.json` | HTML + JSON (9 KB each, data embedded) | Monthly | Page updated 2026-09-03; data to 2026-08-31 | Sep 2024 - Aug 2026 on the page | US government work | No | JSON config URLs look stable; the CSV names inside them carry the month (`..._September2026.csv`) | | 5 | CDC NORS (data.cdc.gov) | Annual norovirus outbreaks, illnesses, hospitalisations, deaths, transmission mode | Socrata resource `5xkq-dg7x` — `https://data.cdc.gov/resource/5xkq-dg7x.json?$query=...` | JSON (SoQL) | About yearly | Rows updated 2024-12-20; latest year 2023 | 1971-2023 (all-mode reporting from 2009) | Public Domain U.S. Government | No | Stable resource ID | | 6 | CDC Vessel Sanitation Program | GI outbreaks on cruise ships: line, ship, sailing dates, agent, % of passengers and crew ill | `https://www.cdc.gov/vessel-sanitation/cruise-ship-outbreaks/index.html` (2026), `.../earlier-outbreaks.html` (2025, 2024, 2023), `.../earlier-outbreaks-2023.html`, archive.cdc.gov pages for 2019-2022 and 1993-2018, and each 2025-26 outbreak's own page (case counts) | HTML (55-140 KB per page) | When an outbreak is posted (irregular) | Page updated 2026-07-23; latest outbreak sailed 2026-07-15 to 2026-07-20 | 1994 on (one 1993 sailing) | US government work | No | HTML. The 2026 table lists outbreaks without case counts; those live on one page per outbreak | | 7 | openFDA food enforcement | Recall records whose reason names norovirus | `https://api.fda.gov/food/enforcement.json?search=reason_for_recall:norovirus&limit=1000` | JSON (55 KB) | Weekly | `last_updated` 2026-09-23; newest norovirus record reported 2026-02-11 | 2012 on | CC0 1.0 | No (240/min, 1,000/day per IP) | Stable, documented API | | 8 | FDA Alerts, Advisories & Safety Information | FDA shellfish advisories whose title names norovirus | `https://www.fda.gov/food/recalls-outbreaks-emergencies/alerts-advisories-safety-information` (Shellfish list) | HTML (93 KB) | When an advisory is posted | Page content current as of 2026-08-12; newest norovirus advisory April 2026 | 2023 on in the list | US government work | No | HTML list | | 9 | CDC fact pages | Evergreen facts, checked verbatim every run | 6 pages, listed in Facts below | HTML | Rarely | see each page | n/a | US government work | No | Stable | **CDC wastewater (NWSS) has no norovirus data.** CDC's wastewater programme publishes SARS-CoV-2, influenza A, RSV, measles, mpox and H5 only (data.cdc.gov datasets `j9g8-acpt`, `ymmh-divb`, `45cq-cw4i`, `akvg-8vrb`, `xpxn-rzgz`, `mtpu-urpp`; viral activity levels `atcp-73re`). A catalog search of data.cdc.gov for "norovirus" returns only a California state link. The script repeats that search on every run (check below). WastewaterSCAN is therefore the only national, multi-region norovirus wastewater series published online, and it is not a CDC product. **Also checked and not used.** NREVSS: CDC says it was expanded to include select enteric viruses, but its public datasets (`rgnm-fkqb`, `seuz-s2cv`, `3cxc-4k8q`) carry respiratory pathogens only. Stanford Digital Repository: WastewaterSCAN deposits there (e.g. `purl.stanford.edu/rk281xb8780`, norovirus GII at 145 plants, Nov 2022 - Apr 2023, CC BY-NC) are one-off research snapshots tied to papers, not a running feed. FDA's CORE outbreak-investigation table lists no norovirus investigation in 2020-2026. ## Exact queries - openFDA: `https://api.fda.gov/food/enforcement.json?search=reason_for_recall:norovirus&limit=1000` (39 records). Cross-check: `search=reason_for_recall:noro*` returns the same 39. `norwalk` and `"noro virus"` return none. - NORS (each URL-encoded into `?$query=`): - `SELECT year, count(*) AS outbreaks, sum(illnesses) AS illnesses, sum(hospitalizations) AS hospitalizations, sum(deaths) AS deaths WHERE etiology like '%Norovirus%' GROUP BY year ORDER BY year` - `SELECT year, count(*) AS outbreaks GROUP BY year ORDER BY year` - `SELECT year, count(*) AS outbreaks WHERE etiology like '%Norovirus%' AND etiology like '%;%' GROUP BY year ORDER BY year` - `SELECT year, primary_mode, count(*) AS outbreaks WHERE etiology like '%Norovirus%' AND year >= '2019' GROUP BY year, primary_mode ORDER BY year, outbreaks DESC` - data.cdc.gov catalog: `https://data.cdc.gov/api/catalog/v1?q=norovirus&limit=50` and `?q=wastewater&limit=100&only=dataset`. - WastewaterSCAN: column `Noro_G2 trimmed` (and `Noro_G2 untrimmed`) of each averages CSV; key `Noro_G2` of each category JSON. ## Definitions and normalisation **Wastewater value.** WastewaterSCAN measures norovirus GII RNA in settled solids, divides it by PMMoV (a pepper virus that tracks how much human faecal material is in the sample) and, for display, multiplies the ratio by 1,000,000. Each site's line is a centred 5-sample trimmed average (drop the highest and lowest of 5, average the rest). National and regional lines are averages of state lines weighted by each state's population. We take that daily national or regional value and average it over each MMWR week (Sunday to Saturday). A week counts as complete when all 7 days have a value; headline figures use the latest complete week only. The number has no unit a reader would recognise; it is useful for comparing one week or season with another, not as a count of people. **Season.** August to July, CDC's NoroSTAT convention, so "2025-26" runs from August 2025 to July 2026. `season_week` 1 is the MMWR week that ends between 1 and 7 August; this lines weeks up across seasons for an overlaid chart. **Same calendar week, earlier seasons.** The complete week whose end date is nearest (within 3 days) the same day and month one, two and three years earlier. We do not match by MMWR week number because 2025 had 53 MMWR weeks, which would shift the comparison by a week. **Season peak.** The highest complete-week value in a season. 2022-23 is flagged partial because WastewaterSCAN's norovirus series starts on 12 November 2022. **Wastewater category.** WastewaterSCAN's own label, copied, not recalculated. For norovirus it combines the level (lower, middle or upper third, against the past 365 days) with a 21-day trend test: lower third with no trend or a downward trend is LOW; lower third rising, or middle third flat or falling, is MEDIUM; middle third rising, or anything in the upper third, is HIGH. We could not reproduce WWSCAN's thirds from the published aggregate lines (they appear to be computed on underlying site data), so the page should show the category as WastewaterSCAN's reading. **NoroSTAT week.** CDC's fixed 7-day bins labelled by their first day ("1-Aug", "8-Aug" ... "24-Jul"), the same labels every season, by date of illness onset. The historical band (minimum, maximum, 25th and 75th percentiles) covers 2012-13 to 2025-26 and is recomputed by CDC on the **current 12-state network**. **NoroSTAT network changes, and why prior seasons are labelled "as published".** The network was 14 states in 2025-26 (Massachusetts and New Mexico have since left) and 14 in 2024-25 (with Alabama, which left before 2025-26; New Hampshire joined for 2025-26). CDC restates history on the current state set, so the old weekly columns in our Wayback captures are on a different footing from today's table. Example: for 1 August - 4 September 2025, the 2025-26 column as published in July 2026 sums to 34; CDC's own sentence today puts the same period at 29 on the current network. For same-period comparisons, use only CDC's sentence. The archived columns are kept for the shape of each season (peak week) and are labelled with their state count. **Cruise year.** The year of the CDC table an outbreak is listed under. CDC files a voyage that crosses New Year under the year it started. "Year to date" counts outbreaks whose sailing started on or before today's month and day in each year. "Norovirus" means CDC's causative-agent field names norovirus; "unknown" includes "Specimens not obtained". Case percentages are CDC's own, as printed; for a handful of 2000s rows CDC printed counts without a percentage and we computed it. **Recalls.** openFDA publishes one record per product line, so one recall can be several records. "Recall events" counts distinct `event_id`. Year is `report_date`, the date the recall appeared in FDA's weekly Enforcement Report. **FDA shellfish advisories.** A separate FDA instrument from recalls: an advisory tells restaurants, retailers and consumers not to serve, sell or eat named lots. Advisories do not always produce an openFDA enforcement record: none of the three 2026 advisories (British Columbia, Drayton Harbor, Hammersley Inlet) appears in openFDA at this pull. That is why both lists are kept. Counted by the month FDA shows next to each title. ## Limitations 1. **Wastewater is not a case count.** It shows how much norovirus genetic material reaches sewers, relative to human waste. It does not say how many people are ill, and some people shed the virus without symptoms. A low reading does not mean no illness in any one town. 2. **WastewaterSCAN's site panel changes.** Plants join and leave, so a national line in 2026 does not rest on exactly the same sewersheds as in 2023. The population weighting is by state, not by the people actually sampled. 3. **Recent days revise.** The last two days of each WWSCAN line rest on 3-4 samples, and anything in the last 10 days is computed only if half the region's plants have a value. We publish complete weeks only. 4. **WastewaterSCAN licence.** CC BY-NC 4.0. The dashboard adds: the data "are being made available to inform public health decision making. Anyone seeking to use the database for other purposes or for research is required to contact the WastewaterSCAN / SCAN team". Required attribution, verbatim: "These data were collected as part of the WastewaterSCAN / SCAN project, a partnership between Stanford University, Emory University, and Verily funded philanthropically through a gift to Stanford University." They also ask users to cite Boehm et al., *Data in Brief*, 2026 (link in the snapshot and summary). 5. **NoroSTAT covers 12 states**, not the country, and only outbreaks (two or more linked cases), not individual illness. States have 7 business days to report and CDC refreshes monthly, so the latest weeks will rise. Nationally, CDC says over half of reported norovirus outbreaks are in long-term care facilities. 6. **CaliciNet counts lab-confirmed, genotyped outbreaks** from participating public-health labs, so it shows which strains are circulating more reliably than how much. Its two charts on the same page do not sum identically for the same period (see checks); quote the genotype table's n. 7. **NORS stops at 2023** in the public dataset, and outbreaks naming norovirus alongside a second pathogen are included (148 of 2,376 in 2023). Person-to-person outbreaks were only reportable from 2009, so do not trend across 2009. 8. **The cruise list is a threshold list.** CDC posts an outbreak only when the ship is in VSP jurisdiction (a voyage with US and foreign ports) and at least 3% of passengers or crew report GI illness to the ship's medical staff. Counts move with how many people sail, not only with how much norovirus there is. CDC posted nothing between 23 July and this pull. 9. **Recalls and advisories are regulatory actions**, not a measure of risk. Almost all norovirus actions in 2023-2026 concern raw or frozen oysters and other shellfish. 10. **Everything HTML can break.** NoroSTAT, CaliciNet's page, VSP and the FDA list are parsed from HTML. The script fails loudly (assertions, or a check that stops matching) rather than writing a silently wrong number. ## Verification Each check runs on every build. "Agency page" is what the agency's own page or file shows today. These are the results of this pull: | # | Check | Pipeline | Agency page | Result | Note | |---|---|---|---|---|---| | 1 | NoroSTAT season-to-date outbreaks (sum of CDC weekly table vs the count CDC states in prose on norostat-data.html) | 27 | 27 | **MATCH** | period August 1–September 4, 2026; table updated 2026-09-17 | | 2 | NoroSTAT 'within the middle 50%' statement vs sum of weekly 25th-75th band | 27 in [19, 34] | The total number of outbreaks reported during the 2026-2027 seasonal year is within the middle 50% of outbreaks (interquartile range) reported in the same perio | **MATCH** | sum of weekly percentiles is an approximation of CDC's cumulative band | | 3 | VSP 2026 outbreaks listed on the CDC page vs rows parsed / detail pages parsed | 9 rows; 9 detail pages with case counts | 9 | **MATCH** | | | 4 | VSP causative agent: listing table vs outbreak detail page | 0 mismatches | same agent on both | **MATCH** | | | 5 | CaliciNet genotype table rows sum to stated n (September 1, 2025 – August 31, 2026) | 153 | 153 | **MATCH** | | | 6 | CaliciNet genotype table rows sum to stated n (September 1, 2024 – August 31, 2025) | 411 | 411 | **MATCH** | | | 7 | CaliciNet state map total vs genotype-table n (same period) | 153 | 153 | **MATCH** | | | 8 | CaliciNet monthly GI+GII chart total vs genotype-table n (same period) | 150 | 153 | **DIFFERS** | CDC's two charts on the same page do not sum identically; quote n from the genotype table | | 9 | openFDA records pulled vs total the API reports | 39 | 39 | **MATCH** | | | 10 | openFDA 'norovirus' vs wildcard 'noro*' query totals | 39 | 39 | **MATCH** | | | 11 | WastewaterSCAN National category vs WWSCAN's published level x trend table | tertile 1, trend none -> low | low | **MATCH** | | | 12 | WastewaterSCAN Northeast category vs WWSCAN's published level x trend table | tertile 1, trend up -> medium | medium | **MATCH** | | | 13 | WastewaterSCAN Midwest category vs WWSCAN's published level x trend table | tertile 1, trend none -> low | low | **MATCH** | | | 14 | WastewaterSCAN South category vs WWSCAN's published level x trend table | tertile 2, trend none -> medium | medium | **MATCH** | | | 15 | WastewaterSCAN West category vs WWSCAN's published level x trend table | tertile 1, trend up -> medium | medium | **MATCH** | | | 16 | WastewaterSCAN averages file is current with the category file | 2026-09-30 | 2026-10-01 | **MATCH** | 1 day(s) apart | | 17 | CDC NWSS publishes a norovirus wastewater dataset on data.cdc.gov | False | CDC wastewater datasets: CDC Wastewater Data for Avian Influenza A (H5); CDC Wastewater Data for Influenza A; CDC Wastewater Data for Measles; CDC Wastewater Da | **MATCH** | MATCH here means: confirmed absent, so WastewaterSCAN is the only national norovirus wastewater series | | 18 | NORS 2019 norovirus outbreaks vs CDC 'about 2,500 reported norovirus outbreaks' per year | 2607 | about 2,500 | **MATCH** | consistency check only: CDC's figure is a rounded annual average | | 19 | Evergreen CDC quotes found verbatim on their pages today | 25 of 25 | all | **MATCH** | | How to read the one DIFFERS row: CaliciNet's monthly GI/GII bar chart sums to 150 outbreaks for September 2025 - August 2026, while the genotype table and the state map on the same page both give n = 153. That is CDC's own inconsistency between two charts, not a parsing error. We quote 153, from the genotype table. Checked by hand against the live pages at this pull, beyond the automatic checks: - **NoroSTAT.** CDC's page says 27 outbreaks for 1 August - 4 September 2026 and 29 for the same period last season, within the middle 50% of 2012-2026. The pipeline's weekly column sums to 27 (7, 6, 2, 10, 2). - **VSP.** The 2026 table lists 9 outbreaks (5 norovirus, 2 E. coli, 2 unknown). The pipeline has 9, with case counts from all 9 outbreak pages. Spot check: the Ruby Princess page gives 107 of 3,032 passengers (3.5%) and 25 of 1,144 crew (2.2%); the CSV matches. The 2025 table lists 23 outbreaks; the pipeline has 23. - **CaliciNet.** 2025-26: GII.4 Sydney[P16] 73, GII.17[P17] 27, GII.7[P7] 14, other 39 (n = 153). 2024-25: GII.17[P17] 306, GII.4 Sydney 43, GII.6 16, other 46 (n = 411). The pipeline matches both tables. - **WastewaterSCAN.** The national category file says LOW for norovirus, sample date 2026-10-01; regions: Northeast MEDIUM, South MEDIUM, West MEDIUM, Midwest LOW. The pipeline carries the same values. The dashboard's chart is drawn from the same averages file, multiplied by 1,000,000, as the about page states. - **CDC wastewater.** Not verifiable, because CDC publishes no norovirus wastewater level. ## Facts (checked verbatim each run) The script fetches each page and checks that the exact sentence is still there (`evergreen_facts` in the summary). All 25 were found at this pull. | Topic | CDC page | |---|---| | incubation, duration, "stomach bug", reinfection | https://www.cdc.gov/norovirus/about/index.html | | when contagious | https://www.cdc.gov/norovirus/causes/index.html | | stay home, hand sanitizer, bleach, heat | https://www.cdc.gov/norovirus/prevention/index.html | | why soap beats sanitizer | https://www.cdc.gov/clean-hands/about/hand-sanitizer.html | | annual US burden, outbreaks per year, season | https://www.cdc.gov/norovirus/data-research/index.html | | long-term care, cruise share | https://www.cdc.gov/norovirus/outbreak-basics/index.html | ## Live fetch from WordPress: feasibility Measured from the build machine, 3 requests each, gzip accepted (`wp_remote_get` decompresses automatically). | Source | Smallest URL that answers the page's question | Wire size | Time | Failure modes | |---|---|---|---|---| | WWSCAN category | `https://data.wastewaterscan.org/data/categories/national.json` | 0.8 KB | 0.15 s | Undocumented; key names (`Noro_G2`) or path can change with a dashboard rebuild; licence terms apply | | WWSCAN regions | `https://data.wastewaterscan.org/data/categories/us-census-regions.json` | 1.6 KB | 0.15 s | as above | | WWSCAN weekly line | `https://data.wastewaterscan.org/data/averages/national.csv` (no filter possible: every target, every day since 2020) | 443 KB (1.3 MB unpacked) | 0.35-0.45 s | as above, plus PHP must parse 2,200 rows x 60 columns and redo the weekly and season maths | | NoroSTAT | `https://www.cdc.gov/norovirus/php/reporting/norostat-data-table.html` | 10 KB | 0.07-0.10 s | HTML scrape; CDC changed the column layout in 2026 and restates history when states join or leave; the season comparison sentence is on a second page | | CaliciNet | `https://www.cdc.gov/norovirus/reporting/calicinet/dv-confirmed-norovirus-outbreaks.json` | 2.9 KB | 0.07 s | Genotype table is HTML only | | VSP | `https://www.cdc.gov/vessel-sanitation/cruise-ship-outbreaks/index.html` | 10.6 KB | 0.07 s | HTML; percentages need one more page per outbreak | | openFDA | `https://api.fda.gov/food/enforcement.json?search=reason_for_recall:norovirus+AND+report_date:[20241003+TO+20261003]&limit=25` | 1.8 KB | 0.5-0.65 s | Documented and stable; 1,000 requests/day per IP without a key (shared hosting shares the IP) | | NORS | `https://data.cdc.gov/resource/5xkq-dg7x.json?$query=SELECT year, count(*) AS outbreaks WHERE etiology like '%Norovirus%' AND year >= '2019' GROUP BY year ORDER BY year` | 0.1 KB | 0.3-0.5 s | Stable; changes once a year | Unmeasured risk: whether cdc.gov and fda.gov answer requests from the host's IP. Their CDNs block some non-browser clients from some networks (USDA FSIS already does this to the recall tracker). **Recommendation: (b), a weekly snapshot JSON we generate, check and upload.** Reasons, in order: 1. The one source that changes more than weekly (WastewaterSCAN) needs a 1.3 MB file and our own weekly and season arithmetic to say "versus this week last year" and "last season peaked the week of". Doing that in PHP on page load duplicates the pipeline and its checks. 2. Every CDC source is HTML and updates monthly or irregularly. A live scrape gains nothing in freshness and adds a failure point; a scrape that breaks silently would publish a wrong number. 3. WastewaterSCAN's licence and use statement are better handled by publishing a reviewed weekly extract with the required attribution than by pulling the dashboard's internal files on every cache miss. 4. The snapshot carries an `as_of` date for every block, so the page can say exactly how fresh each reading is. Workable later as an addition: a live fetch of the 0.8 KB WWSCAN national category file with a 12-hour cache, falling back to the snapshot's category. Not needed for launch. Suggested cadence: run `python3 build-norovirus-tracker.py --refresh` every Monday (WWSCAN's week closes on Saturday), require "VERIFICATION: n of n checks match" (or an understood DIFFERS, like the CaliciNet one above), then upload `norovirus-snapshot.json`. ## Snapshot schema (`norovirus-snapshot.json`) Arrays of arrays keep the file small; each carries a `*_cols` key naming its columns. All dates are ISO `YYYY-MM-DD` (or `YYYY-MM` for advisories). At this pull the file is about 13 KB. ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "ght-norovirus-snapshot/1", "type": "object", "required": ["schema", "generated_utc", "wastewater", "outbreaks", "genotypes", "cruise", "recalls"], "properties": { "schema": {"const": "ght-norovirus-snapshot/1"}, "generated_utc": {"type": "string", "format": "date-time"}, "wastewater": { "type": "object", "required": ["source", "source_url", "licence", "attribution", "unit", "national", "regions", "series_cols", "series"], "properties": { "sites": {"type": ["integer", "null"]}, "national": { "type": "object", "required": ["category", "category_as_of", "week_end", "value", "same_week_prior", "prior_peaks"], "properties": { "category": {"enum": ["low", "medium", "high", "not calculated"]}, "category_as_of": {"type": "string", "format": "date"}, "week_end": {"type": "string", "format": "date"}, "value": {"type": "number"}, "change_3wk_pct": {"type": ["number", "null"]}, "same_week_prior": {"type": "array", "items": {"type": "object", "required": ["season", "week_end", "value", "now_vs_then_pct"]}}, "prior_peaks": {"type": "array", "items": {"type": "object", "required": ["season", "week_end", "value"]}} } }, "regions": {"type": "array", "items": {"type": "object", "required": ["region", "category", "trend_21d", "week_end", "value"], "properties": {"trend_21d": {"enum": ["up", "down", "none"]}}}}, "series_cols": {"const": ["season_week", "week_end", "value"]}, "series": {"type": "object", "additionalProperties": {"type": "array", "items": {"type": "array", "prefixItems": [{"type": "integer"}, {"type": "string"}, {"type": "number"}]}}} } }, "outbreaks": { "type": "object", "required": ["source_url", "as_of", "season", "period", "this_season", "last_season_same_period", "states", "weekly_cols", "weekly"], "properties": { "this_season": {"type": "integer"}, "last_season_same_period": {"type": "integer"}, "weekly_cols": {"const": ["week_label", "this_season", "p25_2012_on", "p75_2012_on", "max_2012_on"]}, "weekly": {"type": "array", "items": {"type": "array"}}, "prior_peaks_as_published": {"type": "array", "items": {"type": "object", "required": ["season", "week_of", "outbreaks", "states"]}} } }, "genotypes": {"type": "object", "required": ["source_url", "as_of", "tables"], "properties": {"tables": {"type": "array", "items": {"type": "object", "required": ["period", "n", "top"]}}}}, "cruise": {"type": "object", "required": ["source_url", "as_of", "year", "by_year", "list_cols", "list"], "properties": { "by_year": {"type": "object", "additionalProperties": {"type": "object", "required": ["all", "norovirus", "ytd_all", "ytd_norovirus"]}}, "list_cols": {"const": ["cruise_line", "ship", "sailing_start", "sailing_end", "agent", "passengers_ill_pct", "crew_ill_pct", "url"]}}}, "recalls": {"type": "object", "required": ["openfda_as_of", "window_start", "openfda_cols", "openfda_events", "fda_cols", "fda_shellfish_advisories"]} } } ``` ## Re-running ``` cd wp-build/data python3 build-norovirus-tracker.py --refresh # re-pull everything (~1 minute) python3 build-norovirus-tracker.py # rebuild from norovirus-raw/ offline ``` The script prints each fetch, writes all outputs, refreshes the two AUTO blocks in this file and ends with `VERIFICATION: n of m checks match`, listing any that differ. When CDC rolls NoroSTAT to a new season (each August/September), add the last capture of the finished season to `NOROSTAT_ARCHIVE`.