CDC NNDSS Weekly Outbreak & Disease Anomaly Monitor
Pricing
from $3.85 / 1,000 results
CDC NNDSS Weekly Outbreak & Disease Anomaly Monitor
Monitor CDC NNDSS weekly notifiable-disease cases. Computes spike ratio (current vs 52-week max), YoY cumulative change, and flags outbreak anomalies (new 52-week highs / spikes) per disease and reporting area. Keyless.
Pricing
from $3.85 / 1,000 results
Rating
0.0
(0)
Developer
Kyle Maloney
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
5 days ago
Last modified
Share
CDC NNDSS Weekly Outbreak and Disease Anomaly Monitor
Turns CDC's National Notifiable Diseases Surveillance System weekly feed (1.9 million rows, keyless) into per-disease, per-reporting-area rows with spike ratio, year-over-year change and anomaly flags - plus the one thing raw NNDSS scrapers throw away: what a blank cell actually means.
The blank-cell problem, in numbers
CDC does not publish a number in most NNDSS cells. It publishes a flag. Measured live on 2026-08-01 across all 1,924,440 rows:
m1_flag | Rows | Share | What it means |
|---|---|---|---|
- | 1,770,931 | 92.0% | No reported cases - a verified ZERO |
N | 70,192 | 3.6% | Not notifiable in that jurisdiction - unknown |
U | 6,967 | 0.36% | Unavailable - unknown |
| (none) | 76,350 | 4.0% | A real case count is published |
A verified zero and a jurisdiction that does not track the disease are different facts. This Actor reports both, separately, on every row.
Who it's for
- Public-health and epidemiology teams watching a disease across states.
- Pharma, diagnostics and biotech tracking disease burden by geography.
- Journalists and researchers covering outbreaks.
- AI agents needing a "check current US notifiable-disease signals" tool.
Example input
{"diseases": ["Measles"],"areas": ["Colorado", "Texas"],"onlyAnomalies": true,"maxResults": 1000}
Inputs
| Input | Type | Notes |
|---|---|---|
diseases | array | Substring match, on purpose - Measles reaches Measles, Imported and Measles, Indigenous. |
areas | array | Reporting areas. An exact CDC area name is matched exactly; anything else falls back to a substring match and the row says so. |
year | string | e.g. 2026. Blank = latest published weeks first. |
weekFrom / weekTo | integer | MMWR week window. |
minCases | integer | Minimum current-week cases, applied to the resolved count. |
anomalyThreshold | string | Spike ratio at which a row is flagged. Default 2.0. |
onlyAnomalies | boolean | Emit only flagged rows. |
maxResults | integer | Row cap. Truncation is reported in result_truncated. |
Output fields
Identity
| Field | Description |
|---|---|
disease | CDC condition label. |
reporting_area | CDC reporting area (state, region, or a Total roll-up). |
year / week | MMWR year and week. |
sort_order | CDC sort key (YYYYWW + geo). Unique across the whole dataset. |
location_level_1 / location_level_2 | CDC location hierarchy. |
Case counts, raw and resolved
| Field | Description |
|---|---|
current_week_cases | Raw current-week count. Null whenever CDC published a flag instead of a number. |
current_week_cases_resolved | The same cell with CDC's flag applied: the number, or 0 for a verified -, or null for a genuine unknown. |
current_week_status | reported, zero_reported, not_notifiable, not_nationally_notifiable, not_previously_published, unavailable, not_calculated, unknown. |
current_week_flag | The raw CDC flag. |
max_52wk / max_52wk_resolved / max_52wk_status / max_52wk_flag | Prior-52-week maximum, same treatment. |
cum_ytd / cum_ytd_resolved / cum_ytd_status / cum_ytd_flag | Cumulative year to date. |
cum_prior_ytd / cum_prior_ytd_resolved / cum_prior_ytd_status / cum_prior_ytd_flag | Prior-year cumulative for the same period. |
reported_this_week | True when cases were reported, false when CDC published an explicit zero, null when the jurisdiction does not report it. |
surveillance_applicable | False where the disease is not notifiable in that area. A false here is not a clean week. |
Signals
| Field | Description |
|---|---|
spike_ratio | Current week divided by the 52-week maximum. |
yoy_cum_change_pct | Cumulative YTD vs the same period last year, percent. |
anomaly | True when any reason fired. |
anomaly_reasons | new_52wk_high, spike_ratio>=N, emergence_after_zero_52wk, yoy_from_zero. |
anomaly_threshold_used | The threshold this run applied. |
Freshness, status and provenance
| Field | Description |
|---|---|
is_latest_published_week | True for the newest published week - the most provisional and the most likely to be revised upward. |
latest_published_year / latest_published_week | Newest week CDC had published at run time. |
weeks_behind_today | Publication lag in ISO weeks (measured 2026-08-01: 2). |
data_is_provisional | Always true. NNDSS weekly counts are provisional. |
area_match_mode | exact, substring, mixed or none. |
cdc_nndss_status | ok or partial_error. Never blank. |
cdc_nndss_error | Error text if a page failed mid-run. Null on a healthy run. |
rows_pulled | Raw CDC rows retrieved before filtering. |
result_truncated | True when the cap or a failure stopped the pull, so the anomaly list is not exhaustive. |
dataset_url / source_system / retrieved_at | Provenance. |
Reliability - what this Actor asserts live, on every run
An offline fixture cannot see a degraded upstream, because the fixture was shaped from the degraded data. Before any billable row is emitted, the run fails if any of these regress. Every measured value is logged.
- Column presence - all 15 NNDSS columns it reads, including all four
suppression flags. Losing
m1_flagwould silently erase the only signal that separates a verified zero from an unknown. - Closed flag vocabulary - an unrecognised suppression flag fails the run. A new code could mean "zero" or could mean "unknown", and guessing fabricates a clean week or erases a real one.
- Dataset size - measured 2026-08-01: 1,924,440 rows.
- Negative control - an impossible disease name must match exactly 0
rows. If Socrata ever stops applying an unsatisfied
$where, every filtered outbreak pull would silently become an unfiltered slice of the whole file. - Positive canary -
label LIKE %MEASLES%must match a plausible band (measured 2026-08-01: 33,320). - Freshness - the latest published week must be within 20 ISO weeks of today (measured 2026-08-01: 2 weeks). A frozen surveillance feed is the classic silent failure.
- Reporting-area vocabulary - at least 20 distinct areas must be published, because area filters are resolved against that list.
If CDC never answers the outbreak query at all, the run fails with an explicit message. It never emits "no outbreak signals detected", which is a different fact.
Limits you should know
- NNDSS weekly counts are provisional and are revised as jurisdictions
report. The newest week is the least complete;
is_latest_published_weekmarks it. - Reporting areas appear in two vintages, mixed case and uppercase
(
VirginiaandVIRGINIA). Exact matching handles both. Totaland regional rows (New England, and so on) are roll-ups, not states. Filter onreporting_areaif you want states only.- These are notifiable-disease case reports, not deaths and not hospitalisations.
Use as an MCP tool
Available to AI agents through Apify's MCP server. An agent can read
current_week_status to tell "zero cases" from "not tracked here" before
drawing a conclusion, and result_truncated to decide whether to re-query.
Pricing
Pay per result: one event per emitted disease-week row. A run that fails a drift assertion or never reaches CDC emits nothing and bills nothing.
FAQ
Why is current_week_cases null but current_week_cases_resolved 0?
Because CDC published the - flag rather than the digit 0. The raw column is
preserved for pipelines built against it; the resolved column is the fact.
Why does v1.1 flag more rows than v1.0? Two reasons were added: emergence_after_zero_52wk and yoy_from_zero. Both fire only when CDC published an explicit - (verified zero) baseline, never on an unknown one. Measured on a live 1,000-row Measles pull: 122 rows newly flagged, all yoy_from_zero. No row that v1.0 flagged is unflagged. If you want the v1.0 signal set, filter anomaly_reasons to new_52wk_high and spike_ratio>=N.
Does an anomaly flag mean an outbreak? No. These are screening signals over provisional counts. Confirm against the CDC weekly tables before acting.
Why did my Virginia query used to include West Virginia? Because areas were
matched as substrings. Measured live, %VIRGINIA% returned 54,984 rows of which
exactly half were West Virginia. Exact area names are now matched exactly.
Related actors
- CMS Open Payments Roll-up - industry payments to physicians.
- Drug Shortage Delta Monitor - openFDA drug shortage changes.
- HRSA Shortage Designation Monitor - HPSA and MUA designations.