Connector cdc-uscs — U.S. Cancer Statistics (NPCR + SEER incidence, NVSS mortality)
Status: active, license approved (US Government work, public domain, citation requested). Documentation verified 2026-09-08.
Why this source
The task was to find a machine-readable, open US incidence source usable without an account. Findings:
| candidate | result |
|---|---|
| USCS public use database (https://www.cdc.gov/united-states-cancer-statistics/public-use/index.html, "How to Access the Data" https://www.cdc.gov/united-states-cancer-statistics/public-use/access-data.html) | case-level SEER*Stat database: "You must have access to SEER Research Plus data", "Complete the U.S. Cancer Statistics Database Request Form", "Email the form to uscsdata@imsweb.com", "A new SEER data use agreement … required for each data submission year". Not open — not used. |
data.cdc.gov (Socrata) — https://api.us.socrata.com/api/catalog/v1?domains=data.cdc.gov&q=cancer |
84 hits; no site-level incidence dataset. Only h3hw-hzvg "DQS Death rates for malignant neoplasms, by sex, race, Hispanic origin, and age" (all cancers combined, Public Domain U.S. Government) and provisional death counts. Not usable for per-site incidence. |
| USCS Data Visualizations tool (https://gis.cdc.gov/cancer/uscs/) | React app calling an undocumented internal API (/cancerapi/DataVizApi/GetJSON/…). Undocumented → not used directly. Its "Download Data" link leads to ↓ |
| USCS data tables (https://www.cdc.gov/united-states-cancer-statistics/dataviz/data-tables.html) | "Download pre-analyzed data tables from the Data Visualizations tool or the U.S. Cancer Statistics Web-based Report in delimited ASCII format." — packages https://www.cdc.gov/cancer/uscs/USCS-1999-2023-ASCII.zip (35.9 MB, last-modified 2026-06-04) back to 1999. Used. |
| WONDER cancer incidence databases (https://wonder.cdc.gov/cancer.html: "Cancer Incidence 1999-2022", "Cancer Mortality") | present on WONDER, but the API help only documents the vital-statistics databases as API-enabled and the USCS ASCII tables already carry the same statistics. Not used. |
Terms on the download page (verbatim): "By using these data, you signify your agreement to comply with the following requirements: These data are provided for statistical reporting and analysis purposes only. CDC's Policy on Releasing and Sharing Data prohibits linking these data with other data sets or information for the purpose of identifying an individual. All material in the reports are in the public domain and may be reproduced or copied without permission. However, a citation is requested."
Suggested citation (Data Visualizations tool footer, embedded in the application bundle): "U.S. Cancer Statistics Working Group. U.S. Cancer Statistics Data Visualizations Tool. U.S. Department of Health and Human Services, Centers for Disease Control and Prevention and National Cancer Institute; https://www.cdc.gov/cancer/dataviz, released in June 2026."
Package contents (USCS-1999-2023-ASCII.zip, verified)
BRAINBYSITE.TXT, BYAGE.TXT, BYAREA.TXT, BYAREA_COUNTY.TXT, BYSITE.TXT, CHILDBYAGE_ADJ.TXT, CHILDBYSITE.TXT, ICCCBYAGE_ADJ.TXT, ICCCBYSITE.TXT, "Data Dictionary USCS ASCII Nov_2025 submission.xlsx", USCS_ascii_input_program_2026.sas. Dictionary: "All datasets are used "|" as a delimiter and blank is used to stand for missing"; SAS program header: "Years included - 1999-2023 for incidence data; 1999-2024 for mortality data."
Only BYSITE.TXT is ingested (71,806 rows, 83 site labels):
YEAR|RACE|SEX|SITE|EVENT_TYPE|AGE_ADJUSTED_CI_LOWER|AGE_ADJUSTED_CI_UPPER|AGE_ADJUSTED_RATE|COUNT|POPULATION
2023|All Races|Male and Female|Lung and Bronchus|Incidence|49.9|50.3|50.1|228058|336806231Rows kept: RACE = "All Races", single years (multi-year aggregates "2019-2023"/"2020-2024" are skipped because the unique index has no year_end), SEX ∈ {Male and Female → all, Female, Male}. Markers: ~ = suppressed ("Statistics based on counts below 16 are not shown in U.S. Cancer Statistics" — https://www.cdc.gov/united-states-cancer-statistics/technical-notes/suppression.html), . = not available (e.g. Kaposi sarcoma mortality: "Kaposi sarcoma death rates are not included" because HIV is the underlying cause — Mortality Data Sources note). Age adjustment: "the 2000 U.S. standard population is based on the proportion of the 2000 population in 19 age groups" (https://www.cdc.gov/united-states-cancer-statistics/technical-notes/incidence-death-rates.html) → standard_population = "2000 U.S. standard population (19 age groups)". Coverage: "In 2023, all registries met the publication criteria. Counts and rates cover 100% of the U.S. population." (publication-criteria note).
Metrics written
incidence_count, as_incidence_rate (1999–2023), mortality_count, as_mortality_rate (1999–2024), with lower_ci/upper_ci on rates, geography = united-states, age_group = all, estimate_type = observed. One provenance row per package (dataset_version = "USCS 1999-2023 ASCII package, Nov 2025 submission (last-modified …; sha256 …)"), one source_records row per (site, event type) holding the rows (raw lake), the ZIP saved under data/raw/cdc-uscs/<date>/.
Real run 2026-09-08: 8,820 observations (2,200 incidence counts, 2,200 incidence rates, 2,210 mortality counts, 2,210 mortality rates), 0 rejected, 78 not-available cells skipped, 0 suppressed at national level.
Site mapping (sites.ts) — located through cancer_codes only
USCS groups sites with the SEER recodes ("the cancer sites in mortality data were grouped according to the revised SEER recodes dated March 1, 2018"; incidence "categorized according to the revised SEER recodes dated January 27, 2003"). Definitions were copied from the SEER Cause of Death Recode 1969+ (ICD-10 column, https://seer.cancer.gov/codrecode/1969_d04162012/index.html) and the Site Recode ICD-O-3/WHO 2008 (https://seer.cancer.gov/siterecode/icdo3_dwhoheme/index.html). Each mapped label carries the three-character ICD-10 codes used for lookup and the relation expected against the entity's cancer_codes (system icd10) range set, checked at run time by matchIcd10Codes; a mismatch queues the label in unresolved_labels instead of storing numbers.
- Exact (30 labels → 28 groups): Salivary Gland, Nasopharynx, Hypopharynx, Esophagus, Stomach, Colon excluding Rectum (C18 + C26.0 per SEER), Rectum and Rectosigmoid Junction, Anus…, Liver and Intrahepatic Bile Duct, Pancreas, Larynx, Melanomas of the Skin, Mesothelioma, Kaposi Sarcoma, Male and Female Breast / Female Breast / Male Breast (sex-specific labels → one entity, one label per sex), Vulva, Vagina, Cervix, Corpus, Ovary, Penis, Prostate, Testis, Kidney and Renal Pelvis, Urinary Bladder, Brain and Other Nervous System, Thyroid, Hodgkin Lymphoma, Leukemias.
- Narrower (registry-standard definitions, documented in
site_definition): Lung and Bronchus = C34 (our group C33-C34 adds trachea), Non-Hodgkin Lymphoma = C82-C85 + C96.3 (ours C82-C86, C96), Myeloma = C90.0/C90.2 (ours C88, C90). - Deliberately unmapped (composite or partial → would give one entity two definitions in a scope): Lip and Oral Cavity (USCS publishes Lip, Tongue, Floor of Mouth, Gum and Other Mouth separately and "Oral Cavity and Pharynx" = C00-C14), Oropharynx (USCS "Oropharynx" = C10 only; tonsil C09 separate), Gallbladder (USCS "Gallbladder" = C23; "Other Biliary" = C24), Non-Melanoma Skin ("Other Non-Epithelial Skin" excludes basal/squamous which registries do not collect; mortality recode adds C46). All other labels present in the file are queued once in
unresolved_labelswith the reason.
site_definition example: USCS "Lung and Bronchus" (ICD-10 C34; ICD-O-3 C340-C349).
Operations
- Release discovery: the connector reads the download page and takes the newest
USCS-1999-YYYY-ASCII.zip;CDC_USCS_ZIP_URLoverrides; fallback constant = the 2026 package. - Anomaly guard: refuses to persist if BYSITE.TXT has fewer than 20,000 rows.
- Two HTTP requests per run; schedule yearly (July, after the June release).
- Health: HEAD on the ZIP.
- Gotcha:
www.cdc.govalso rejectscurl(Akamai) — use Node.
Files
packages/connectors/src/connectors/cdc-uscs/{manifest.ts,zip.ts,parse.ts,sites.ts,index.ts,cdc-uscs.test.ts,fixtures/BYSITE-excerpt.txt} (fixture = 611 real rows incl. ~ and . markers and one non-"All Races" row).