Skip to main content
💧 TapWaterData

Water hardness data & methodology

Every hardness number on this site traces to a named primary source. This page documents exactly how the dataset is built: the source tiers, the formulas and thresholds (all pinned to USGS/NIST references), how conflicting values are handled, and where the data's limits are.

Current coverage: 16,561 of 18,775 tracked US cities (88.2%), reaching 97.5% of tracked city population. Published values by tier: 6,778 cities on utility-reported values (T1), 836 on values computed from utility-reported minerals (T2), and 8,947 on labeled county estimates (T3). The remaining 2,214 cities are counted as uncovered — we publish no number rather than guess one.

Source tiers

Each utility contributes its best available value in strict tier order (T1a, then T1b, then T2). County ambient data (T3) only covers cities with no defensible tap-tier value — it is always labeled as an estimate.

TierWhat it isHow it is citedCities with this signal
T1aUtility-reported hardnessThe average hardness figure a water utility itself reports for its distribution system, parsed unit-aware (PPM and grains-per-gallon forms).Utility-reported water quality data, cited with the utility name and PWSID.6,586
T1bReported “Hardness (Total)” resultA “Hardness (Total)” entry in the utility’s reported contaminant results, used when the utility publishes no headline hardness figure.Utility-reported water quality data, cited with the utility name and PWSID.3,240
T2Computed from calcium + magnesiumHardness computed from the utility’s reported calcium and magnesium results via the standard formula 2.497 × Ca + 4.118 × Mg.Computed from utility-reported calcium and magnesium (USGS/Standard Methods 2340 B formula).3,876
T3County ambient estimateThe median of EPA/USGS Water Quality Portal hardness samples across the city’s county, 2000–present — a labeled ESTIMATE of ambient county water, never mixed into measured medians or rankings.EPA/USGS Water Quality Portal, always cited with the sample count, county, and window.13,802

A modeled T4 layer (predicting hardness for cities no tier covers) is deliberately NOT included: it is deferred behind an explicit quality gate, and no modeled value ships until it passes. Uncovered cities stay honestly uncovered.

Formulas & thresholds

How city values are aggregated

  • Per utility: the best available tier wins, in the order T1a, then T1b, then T2.
  • Per city: the population-weighted mean across the city's utilities (weight = people served by each utility). If no utility reports a served population, a simple mean is used.
  • The city's displayed tier is the tier supplying the largest population share (ties go to the better tier).

Conflicting values: the disputed rule

When a city's tap-tier values (T1a vs T1b vs T2) disagree beyond the tolerance of ±15% or ±10 mg/L (whichever is larger), the city is flagged disputed: the best-tier value stays the primary number, the full range of conflicting values is shown next to it, and the city is excluded from study rankings. Currently 1,556 cities carry the disputed flag.

County ambient data (T3) can never dispute a tap value. Where a measured city's county also has Water Quality Portal data, we show it as separately labeled county context — because a real gap between the two is usually legitimate, not an error: utilities soften or blend their water, and many draw on surface sources, all of which move treated tap water away from the county's ambient (largely raw) levels. Presenting that divergence as a conflict would be wrong; presenting it as labeled context is honest.

County estimates (T3): the Water Quality Portal pull

  • Window: results collected 2000-01-01 to present, so medians reflect modern analytical methods; every T3 citation discloses the window ("2000–present"). Current national pull retrieved 2026-07-04.
  • Characteristics: direct hardness results ("Hardness", "Hardness, Ca, Mg", "Total hardness"), normalized to mg/L as CaCO₃; partial-hardness characteristics (carbonate / non-carbonate) are excluded. Elemental calcium + magnesium results are combined via the signed formula ONLY where a county has zero usable direct results.
  • Value: the median of the normalized results in the county.
  • Site types: unfiltered — streams, lakes, wells, springs, and facilities all contribute, because utilities draw on both surface water and groundwater. The semantics are "ambient county water hardness, all site types" — a context value, never a tap measurement.
  • Sample-count display: every county estimate is displayed with its sample count (n), county, and window; county-context values on measured cities disclose their n too. A zero-sample county publishes nothing — the city stays uncovered and is counted.
  • County assignment: each city maps to the majority county across its ZIP codes using a vendored US Census 2020 ZCTA-to-County crosswalk (the HUD-USPS crosswalk is preferred but requires a registered token; ZCTAs are Census approximations of ZIP codes — see limitations). A ZCTA spanning multiple counties keeps the county with the largest land-area overlap; remaining ties break to the smallest county FIPS, deterministically.

Corrections: overrides & sanity bounds

Where a city's upstream record is known-bad (for example, a city mapped to the wrong water system), we do not publish the bad value: the city gets a hand-verified override, taken from the utility's own published report and cited verbatim as the city's source. Current overrides (4):

  • il/chicago 138.9 mg/L (override). Source: City of Chicago Department of Water Management, Comprehensive Chemical Analysis 2024 (Q1-Q4) — 2024 average distribution-system hardness, mg/L as CaCO3 (PWSID IL0316000). https://www.chicago.gov/content/dam/city/depts/water/WaterQltyResultsNRpts/ccReports/CompChem_2024_Q1-Q4.pdf
  • az/phoenix 237 mg/L (override). Source: City of Phoenix Water Services Department, 2025 Water Quality Report (Consumer Confidence Report) - Total Hardness distribution-system range 172-302 ppm / 10-17.6 grains per gallon, published as a range with no single average; range midpoint (172+302)/2 = 237.0 mg/L as CaCO3 (PWSID AZ0407025). https://www.phoenix.gov/content/dam/phoenix/waterservicessite/documents/wsdprimarywqr.pdf
  • ca/san-diego 225 mg/L (override). Source: City of San Diego Public Utilities Department, 2024 Annual Drinking Water Quality Report - Total Hardness (ppm as CaCO3) per treatment plant: Alvarado 216, Miramar 229, Otay 230; three-plant mean (216+229+230)/3 = 225.0 mg/L as CaCO3 (PWSID CA3710020). https://www.sandiego.gov/sites/default/files/2025-06/pud-annual-drinking-water-quality-report-2024.pdf
  • nv/las-vegas 280 mg/L (override). Source: Las Vegas Valley Water District, 2026 Water Quality Summary — Las Vegas Valley: Total Hardness 280 mg/L as CaCO3 (16 grains/gallon, very hard) (PWSID NV0000090). https://www.lvvwd.com/water-quality/reports/summary-las-vegas-valley.html

Sanity bounds: candidate values at or below 0 mg/L or above 1000 mg/L as CaCO₃ never publish — they are almost always parse artifacts or not-detected placeholders, not water chemistry. The current build rejected 4,384 such candidate values (most of them not-detected placeholder zeros).

How the dataset is verified

  • Signed constants: every threshold and factor above lives in a signed source-of-record file pinning its citation and live primary-source URL (USGS, NIST); the build reads the constants from there, never from memory.
  • Golden sample: 27 cities spanning all four bands, tiers, and regions are hand-verified against their PRIMARY sources — the utility's own CCR or annual water-quality report, or an independent Water Quality Portal county pull.
  • Automated drift gate: every test run re-verifies the committed dataset end to end — provenance completeness (value, unit, tier, source, date on every entry), sanity bounds, classification-band agreement, disputed-range coherence, county sample counts, and golden drift within tolerance. A violation fails the build; nothing ships around the gate.

Limitations

  • Utility averages, not your tap: a city value is a distribution-system average; individual taps vary with treatment plant, blending, season, and plumbing.
  • Report lag: T1 values reflect the most recent published utility report, which may lag current conditions — every value carries its source date.
  • ZCTA ≈ ZIP approximation: county assignment uses Census ZCTAs, which approximate USPS ZIP codes; PO-box-only and some rural ZIPs resolve to no county, and those cities stay uncovered rather than guessed.
  • Aggregation limits: a multi-utility city is a population-weighted mean, and one number can mask real differences between the city's utilities; conflicts beyond tolerance surface as the disputed flag and range.
  • T3 is ambient, not tap: county estimates measure ambient water (streams, lakes, wells) across the county — not treated tap water.
  • Honest gaps: 2,214 tracked cities have no defensible value in any tier; they are published as uncovered and counted, never filled with a guess.

Data sources

Every figure traces to one of these references. The exact citation for a given city (utility + PWSID, or county + sample count + window) is shown with that city's value.

Cite this data

The dataset is free to use under Creative Commons Attribution 4.0 (CC BY 4.0): share and republish it, including commercially, as long as you credit TapWaterData with a link. Suggested citation:

TapWaterData Water Hardness Dataset, 2026. https://www.tapwaterdata.com/water-hardness — CC BY 4.0

Bulk downloads (CSV and JSON, with pinned columns and license metadata): open dataset.

Changelog

  • — Initial public release: 16,561 of 18,775 US cities covered (6,778 utility-reported, 836 computed from utility-reported minerals, 8,947 county-level estimates).

More water hardness data & tools

By TapWaterData Editorial.

Stay Informed About Your Water Quality

Get EPA reports, filter recommendations, and safety alerts for your area.

Join 10,000+ people protecting their families. Unsubscribe anytime.