CC-BY-4.0

Open Water Quality Dataset

Free U.S. home safety and water quality data by ZIP code: violations, source-qualified lead measurements, copper action-level exceedance flags, radon zones, and Home Safety Scores. Each source follows its own reporting period.

42,679 ZIP codes
344,324 Total violations recorded
51 States + DC covered
2026-09-19 Snapshot generated

Download

Dataset Fields

The 55-field table below is rendered from the metadata shipped with the current dataset. One row is published per ZIP code. A null value means the accepted source contract does not cover or measure that field for the ZIP; it is not a measured zero or false.

Field Description
zip5-digit ZIP code
cityCity name
state2-letter state abbreviation
water_data_availabletrue only when this ZIP has a directly mapped EPA public water system in the exported snapshot; false means all water/system/CCR/enforcement-derived fields are unavailable, not zero. This field does not assert source freshness.
system_namePrimary water system name
pwsidEPA Public Water System ID
populationPopulation served
water_sourceSW=Surface Water, GW=Groundwater
water_violation_measurement_statusmeasured when the accepted ECHO roster covers every directly mapped PWSID; null when direct water evidence is unavailable
water_violation_source_quarterAccepted ECHO submission quarter, for example 2026Q2
water_violation_from_yearInclusive lower record-year bound for accepted violation evidence
water_violation_through_yearInclusive upper record-year bound for accepted violation evidence
total_violationsAll accepted violation records inside the explicit inclusive record-year window
health_violationsAccepted records classified as health-based inside the explicit window
resolved_violationsAccepted records with resolved status
archived_violationsAccepted records with archived status; excluded from current noncompliance
addressed_violationsAccepted records with addressed status; included in current noncompliance under this source contract
unaddressed_violationsAccepted records with unaddressed status; included in current noncompliance
current_noncompliance_violationsaddressed_violations + unaddressed_violations
resolved_health_violationsHealth-based subset with resolved status
archived_health_violationsHealth-based subset with archived status
addressed_health_violationsHealth-based subset with addressed status
unaddressed_health_violationsHealth-based subset with unaddressed status
current_noncompliance_health_violationsaddressed_health_violations + unaddressed_health_violations
unresolved_violationsCompatibility alias equal to current_noncompliance_violations
violation_systemsJSON array of measured per-PWSID count partitions that conserve to the ZIP totals
recent_violationsJSON array of recent accepted events with identity, PWSID, year, date, category, exact four-state status and health classification
lead_level_mg_lSource-reported 90th percentile lead level normalized to mg/L only when the source unit is explicit; null if no accepted measurement. Values at or above 1 mg/L are held for source review and are never auto-rescaled.
copper_action_level_exceedancetrue = a copper action-level (CU90) exceedance record exists for this ZIP; null = no exceedance record on file / unknown (NOT clean). EPA transmits no verified copper unit, so no concentration is published.
radon_zoneEPA radon zone (1=highest, 3=lowest), null if no data
home_safety_scoreHome Safety Score model output from 0 through 100; null when required score coverage is incomplete
home_safety_gradeA/B/C/D/F letter grade; null when the score is unavailable
home_safety_seriesStable score-series identifier
home_safety_model_versionSemantic model version
home_safety_registry_versionAppend-only vertical registry version
home_safety_component_scoresObject containing every model component score or null
home_safety_component_statusObject containing observed, missing, or insufficient_coverage status for each component
home_safety_domain_scoresObject containing each equally weighted model-domain score or null
home_safety_coverageReconciled score-availability counts and missing component/domain IDs
latitudeZIP centroid latitude
longitudeZIP centroid longitude
contaminant_countNumber of distinct health-based contaminants; null when no directly mapped EPA water system is available
health_contaminant_namesSemicolon-separated list of health-based contaminant names; null when no directly mapped EPA water system is available
ccr_contaminant_countNumber of contaminants reported in Consumer Confidence Report (CCR), null if no CCR data
ccr_violation_countEvidence-bound CCR violation count. 0 is emitted only for an accepted measured-zero claim; null means unknown/unaccepted.
ccr_violation_statusmeasured_zero, reported_nonzero, or unknown under the evidence-bound CCR claim contract.
ccr_violation_report_yearExact report year for an accepted CCR violation claim; null when unknown.
ccr_violation_scopeNamed source scope for an accepted CCR violation claim; null when unknown.
ccr_violation_claimFull evidence-bound CCR violation claim object.
ccr_lsl_claimField-level evidence-bound CCR lead-service-line claim object; missing counts remain unknown, never zero.
enforcement_action_countTotal EPA/state enforcement actions against the water system. null = enforcement data not available for this ZIP (NOT measured-zero).
enforcement_health_violationsNumber of health-based violations from enforcement records. null = enforcement data not available for this ZIP (NOT measured-zero).
has_active_issuesWhether the exported source record flags active enforcement or violation issues (true/false). null = enforcement data not available for this ZIP (NOT measured-false).
boil_water_advisoriesReserved. Always null until a source-bound authoritative advisory feed with issue/lift timestamps is admitted.
ccr_accepted_evidenceSource-bound accepted CCR period, explicit exact-date absence, typed lead result, copper exceedance flag with concentration withheld, and evidence ref/SHA-256; null when no accepted binding exists.

Usage Examples

Python (pandas)
import pandas as pd df = pd.read_csv('https://zipcheckup.com/data/open/zipcheckup-water-quality.csv') print(df.head()) # Filter by state ca_zips = df[df['state'] == 'CA']
R
df <- read.csv('https://zipcheckup.com/data/open/zipcheckup-water-quality.csv') head(df) # Filter ZIPs with health violations risky <- df[df$health_violations > 0, ]
JavaScript (browser / Node.js)
fetch('https://zipcheckup.com/data/open/zipcheckup-water-quality.json') .then(r => r.json()) .then(data => { const withLead = data.filter(z => z.lead_level_mg_l > 0.005); console.log(`ZIPs with elevated lead: ${withLead.length}`); });

License: CC-BY-4.0

This dataset is released under the Creative Commons Attribution 4.0 International license. You are free to share and adapt the data for any purpose, including commercial use, as long as you provide attribution to ZipCheckup.com.

Required attribution: "Data sourced from ZipCheckup.com, based on EPA SDWIS data."

Data Source
Water quality data is sourced from the U.S. EPA Safe Drinking Water Information System (SDWIS). Radon zone data comes from the EPA's county-level radon potential map. Home Safety Scores are a ZipCheckup composite metric - full methodology here.
Related analysis: Spanish-language water reports by utility - which water systems serving Spanish-speaking communities publish a full Spanish Consumer Confidence Report.
Disclaimer: This dataset reflects reported EPA SDWIS records and is not an assurance of current water safety. Water quality can change. For the most current information, contact your local water utility or request a Consumer Confidence Report.

Want a full water safety report for your ZIP code?

Check Your ZIP Code
Check your water filter options Free tool - no phone call required.