ZipCheckup API

Free, public water quality data for every US ZIP code. Powered by EPA SDWIS data.

Base URL: https://api.zipcheckup.com/v1
Rate limit: 100 requests/day per IP (free tier). Need more?
Format: JSON — all responses wrapped in {"data": ..., "meta": {...}}

Endpoints

POST /v1/address-lookup
Match a street address to the specific public water utility serving it. Uses US Census geocoding + EPA CWS Service Area Boundaries v3 (44,642 systems, 94% coverage). Same-origin only: POST is allowed from zipcheckup.com. Quota: 50 req/day per IP. Addresses are never logged or stored.
Body: { "address": "1600 Pennsylvania Ave NW, Washington, DC" }
curl -X POST https://api.zipcheckup.com/v1/address-lookup \
  -H 'Content-Type: application/json' \
  -H 'Origin: https://zipcheckup.com' \
  -d '{"address":"1600 Pennsylvania Ave NW, Washington, DC"}'
// Response
{
  "data": {
    "lat": 38.898,
    "lon": -77.036,
    "state": "DC",
    "matchedAddress": "1600 PENNSYLVANIA AVE NW, WASHINGTON, DC, 20500",
    "primary": { "pwsid": "DC0000001", "name": "DC WATER & SEWER AUTHORITY", "pop": 700000 },
    "alsoServes": [],
    "candidatesChecked": 3,
    "polygonsMatched": 1
  },
  "meta": {
    "source": "US Census Geocoder + EPA CWS Service Area Boundaries v3",
    "updated": "2026-04-19"
  }
}
GET /v1/zip/{zip}
Full water quality data for a ZIP code, including violations, contaminants, lead levels, and safety score.
curl https://api.zipcheckup.com/v1/zip/90210
GET /v1/zip/{zip}/score
Just the safety score and letter grade for a ZIP code. Lightweight endpoint for widgets/badges.
curl https://api.zipcheckup.com/v1/zip/90210/score
// Response
{
  "data": {
    "zip": "90210",
    "city": "Beverly Hills",
    "state": "CA",
    "score": 65,
    "grade": "C"
  },
  "meta": { "source": "EPA SDWIS", "updated": "2026-03-24" }
}
GET /v1/state/{state}
State summary: average score, ZIP count, top violations. Use 2-letter state abbreviation.
curl https://api.zipcheckup.com/v1/state/CA
GET /v1/rankings
Best and worst ZIPs by safety score.
limit — number of results (1-100, default 50)
orderasc (worst first) or desc (best first, default)
curl "https://api.zipcheckup.com/v1/rankings?limit=10&order=asc"
GET /v1/contaminant/{code}
Reference info about a contaminant: health effects, MCL, removal methods, EPA links. Codes from EPA SDWIS (e.g., 1040 = Lead).
curl https://api.zipcheckup.com/v1/contaminant/1040
GET /v1/county/{fips}/airdata-trend
County-level 5-year AirData emission trend (994 US counties). Sensitivity-gated change class with explicit display-hold flags (facility-count floor + 4 petrochemical-corridor counties). Source: EPA AirData annual AQI summaries 2020-2024. Methodology: /methodology/airdata-trend/.
fips — 5-digit US county FIPS code (state + county subcode), e.g. 06037 (Los Angeles County, CA).
curl https://api.zipcheckup.com/v1/county/06037/airdata-trend
// Response
{
  "data": {
    "county_fips": "06037",
    "county_name": "Los Angeles",
    "state": "CA",
    "airdata_change_class": "stable",
    "airdata_pct_change": -5.9,
    "cycles_used": 5,
    "facility_count": 331,
    "sensitivity_robust": null,
    "skip_reason": null,
    "source_attribution": "EPA AirData annual AQI summaries 2020-2024",
    "petrochemical_corridor": false,
    "aqi_latest_year": 2024
  },
  "meta": {
    "source": "EPA AirData annual AQI summaries 2020-2024 (county rollup, ZipCheckup-aggregated)",
    "methodology": "https://zipcheckup.com/methodology/airdata-trend/",
    "license": "CC-BY-4.0",
    "attribution": "ZipCheckup (zipcheckup.com) — derived from EPA AirData public datasets"
  }
}
GET /v1/county/coverage/airdata-trend
Coverage manifest for the AirData trend endpoint — list of all 994 county FIPS codes with records, plus generated date and license.
curl https://api.zipcheckup.com/v1/county/coverage/airdata-trend

Response Format

{
  "data": { ... },
  "meta": {
    "source": "EPA SDWIS",
    "updated": "2026-03-24"
  }
}

Errors

// 404 — ZIP not found
{ "error": { "message": "No water quality data found for ZIP 00000.", "status": 404 } }

// 429 — Rate limited
{ "error": { "message": "Rate limit exceeded. Max 100 requests/day.", "status": 429 },
  "limit": 100, "reset": "2026-03-26T00:00:00.000Z",
  "upgrade": "https://zipcheckup.com/api/pricing/" }

// 400 — Invalid input
{ "error": { "message": "Invalid ZIP code. Must be 5 digits.", "status": 400 } }

Notes

© 2026 ZipCheckup.comMain Site