US Water System & Utility Leads Scraper (EPA SDWIS) avatar

US Water System & Utility Leads Scraper (EPA SDWIS)

Pricing

from $2.75 / 1,000 water system records

Go to Apify Store
US Water System & Utility Leads Scraper (EPA SDWIS)

US Water System & Utility Leads Scraper (EPA SDWIS)

Scrape every US public water system from the official EPA SDWIS database: utility name, admin contact, email, phone, address, population served, service connections, owner & source type, plus health-based violations. Filter by state, size & type. B2B water-utility leads + monitoring.

Pricing

from $2.75 / 1,000 water system records

Rating

0.0

(0)

Developer

Scrape Sage

Scrape Sage

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Extract every public water system in the United States — drinking-water utilities, water districts, municipal systems, mobile-home parks, HOAs, schools and more — straight from the official EPA SDWIS (Safe Drinking Water Information System) database. Each system comes with its administrative contact, email, phone and mailing address, plus population served, service connections, owner type, water source, and an optional drinking-water violation / compliance history.

No login, no cookies, no browser, no API key — fast JSON extraction from the EPA Envirofacts service with a derived lead score on every record.

Why this water system scraper?

Most "water" scrapers on the market either dump raw SDWIS rows with no contacts, or focus on hydrology gauges and risk reports. This actor ships the richest water-utility lead dataset in the category — built for sales, not just research:

DataTypical scrapersThis actor
Administrative contact name
Contact email
Contact phone + extension
Full mailing addresspartial
Population served + size tierpartial
Service connections
Owner type (local gov / private / state / federal)
Water source (ground / surface / purchased)
Wholesaler & school/daycare flags
Health-based violations + contaminants✅ opt-in
Counties / cities served✅ opt-in
Lead score (0–100) + lead signals
New-system / new-violation monitoring

There are ~150,000 active public water systems in the US (≈50,000 of them community systems serving year-round residents) — every one a potential buyer of treatment chemicals, equipment, lab testing, engineering, metering or compliance software.

Use cases

  • B2B lead generation — water utilities are recurring buyers: treatment chemicals & equipment (filtration, disinfection, membranes), pipe/valve/pump suppliers, SCADA / AMI smart-metering / leak-detection, lab & PFAS/lead testing, engineering & consulting, infrastructure financing, and compliance SaaS. Score systems by populationServed and reach the named contactName / contactEmail directly.
  • Territory planning — pull every community system in a state, filter by size (minPopulationServed) and owner type, and build a clean call list for reps.
  • Compliance / service intent — turn on includeViolations and healthBasedViolationsOnly to surface systems with recent MCL / treatment-technique violations — the highest-intent prospects for remediation, treatment and testing vendors.
  • Market & infrastructure analysis — analyze water-source mix, system sizes, ownership and service connections by state or county.
  • Monitoring — schedule recurring runs with monitorMode to capture only new systems or newly-recorded violations as fresh leads.

How to use

  1. Sign up for Apify — the free plan is enough to try this actor.
  2. Open the US Water System Scraper, choose states and system types, set filters (size, owner, source, compliance), and click Start.
  3. Watch results stream into the dataset table.
  4. Export as JSON, CSV, Excel, XML, or HTML — or pull results programmatically via the Apify API.

Input

{
"states": ["TX"],
"pwsTypes": ["CWS"],
"ownerTypes": ["L", "P"],
"minPopulationServed": 3300,
"withPhoneOnly": true,
"includeViolations": true,
"healthBasedViolationsOnly": false,
"sortBy": "leadScore",
"maxResults": 500
}
  • states — two-letter USPS codes (CA, TX, NY). Leave empty to sweep all states & territories (bounded by maxResults).
  • pwsTypes (default ["CWS"])CWS (Community), NTNCWS (Non-Transient Non-Community: schools/factories/offices), TNCWS (Transient Non-Community: gas stations/campgrounds). Empty = all.
  • activeOnly (default true) — only systems currently active in SDWIS.
  • ownerTypes / sourceTypes — filter by ownership (Local gov, Private, State, Federal, Mixed, Native American) and water source (Ground / Surface / GUDI).
  • cities / zipCodes / nameQuery — filter by the system's mailing city, ZIP prefix, or name text.
  • minPopulationServed / maxPopulationServed / minServiceConnections — target by system size.
  • wholesalersOnly / servesSchoolOrDaycareOnly / withEmailOnly / withPhoneOnly — high-value segment toggles.
  • includeViolations (default false) — enrich each system with its EPA drinking-water violation history (counts, latest date, contaminants, recent detail).
  • healthBasedViolationsOnly — keep only systems with recent health-based violations (needs includeViolations).
  • includeGeographicArea (default false) — add the counties, cities and ZIPs each system serves.
  • sortByleadScore (recommended), populationHigh, connectionsHigh, recentViolation, name, or source.
  • maxResults / maxResultsPerState / deduplicateResults — output controls.
  • monitorMode / monitorKey — only emit new / changed systems across scheduled runs.

Output

One record per public water system (recordType: "waterSystem"):

{
"recordType": "waterSystem",
"pwsid": "TX0610001",
"pwsName": "City Of Austin Water",
"pwsTypeCode": "CWS",
"pwsType": "Community Water System",
"isCommunity": true,
"activityStatus": "Active",
"ownerTypeCode": "L",
"ownerType": "Local government",
"isGovernmentOwned": true,
"primarySourceCode": "SW",
"primarySource": "Surface water",
"isSurfaceWater": true,
"populationServed": 960000,
"populationCategory": "Very large (>100k)",
"serviceConnections": 248000,
"isWholesaler": true,
"servesSchoolOrDaycare": false,
"primacyType": "State",
"epaRegion": "06",
"orgName": "City Of Austin",
"contactName": "Jane Doe",
"contactEmail": "jane.doe@austintexas.gov",
"contactPhone": "(512) 555-0142",
"addressLine1": "625 E 10th St",
"city": "Austin",
"state": "TX",
"zip": "78701",
"fullAddress": "625 E 10th St, Austin, TX, 78701",
"violationCount": 7,
"healthBasedViolationCount": 1,
"recentHealthViolationCount": 1,
"latestViolationDate": "2024-09-30",
"topContaminants": ["3100", "1040"],
"hasRecentHealthViolation": true,
"countiesServed": ["Travis"],
"leadScore": 92,
"leadSignals": ["Very large system (>100k served)", "Community water system", "Local government", "Has email", "Has phone", "Water wholesaler", "Recent health-based violation"],
"sourceUrl": "https://data.epa.gov/efservice/WATER_SYSTEM/PWSID/TX0610001/JSON",
"scrapedAt": "2026-06-20T12:00:00.000Z"
}

Every record also carries sourceFields — the complete raw SDWIS row — so no data is lost.

Field coverage — measured, not promised

Measured on real platform runs (2026-07-22) and verified field-by-field against the raw EPA columns, so you know exactly what you are buying. Core lead fields are 100%: pwsid, pwsName, pwsType, ownerType, primarySource, populationServed, serviceConnections, contactName, contactPhone, addressLine1, city, state, zip, fullAddress, leadScore.

FieldCoverageWhy
contactEmail100% large municipal (TX) · 83% FL · 68% small rural (WY/MT)EPA makes the admin email optional; coverage scales with system size. Use withEmailOnly to keep only systems that publish one.
seasonBeginDate / seasonEndDate100% seasonal systems · 0% year-roundSDWIS records an operating season only for seasonal systems (campgrounds, RV parks) — not a gap.
fax, phoneExt, altPhone, addressLine20–18%Optional legacy SDWIS columns, rarely filled by the utility.
Violation block (violationCount, healthBasedViolationCount, topContaminants, …)100% with includeViolations onOff by default because it adds one request per system.
countiesServed / citiesServed / zipsServed97% / 57% / 7% with includeGeographicArea onOff by default (one request per system). EPA indexes most systems by county, about half by city, and rarely by ZIP served.

Nothing above is a parser gap — each was checked against its raw EPA column in sourceFields and matches 1:1. Empty means EPA is empty.

Automate & schedule

Run this actor on autopilot and pull results into your own stack:

  • Apify API — start runs, fetch datasets, and manage schedules over REST.
  • apify-client for JavaScript and apify-client for Python — official SDKs.
  • Schedules — run it weekly/monthly with monitorMode to capture newly-added systems and newly-recorded violations as leads.
  • Webhooks — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('scrapesage/us-water-system-scraper').call({
states: ['CA'],
pwsTypes: ['CWS'],
minPopulationServed: 10000,
withPhoneOnly: true,
sortBy: 'leadScore',
maxResults: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} water-utility leads`);

Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

  • Make — multi-step automation scenarios.
  • Zapier — push new utility leads straight into your CRM.
  • Slack — get notified when a monitored search finds new systems.
  • Google Drive / Sheets — auto-export every run to a spreadsheet.
  • Airbyte — pipe results into your data warehouse.
  • GitHub — trigger runs from commits or releases.

Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this actor from Claude, ChatGPT, or any agent framework through the Apify MCP server — ask your assistant to "find every large community water utility in Texas with a phone number and recent violations" and let it run this scraper for you.

Agent-ready: autonomous payments (x402 & Skyfire)

This actor is agent-ready — AI agents can discover it, run it, and pay for it autonomously, with no Apify account and no human in the loop. It uses pay-per-event pricing and limited permissions, so it qualifies for Apify's agentic-payment standards:

  • x402 — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the Apify MCP server — no account, no API key.
  • Skyfire — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

More scrapers from scrapesage

Build a complete US B2B lead-gen & regulatory-intelligence stack from official open-data sources:

Tips

  • Best leads first: keep pwsTypes on CWS and sortBy on leadScore — community systems with a contact email/phone and large populations rank highest.
  • Service-intent targeting: turn on includeViolations + healthBasedViolationsOnly to find systems with active water-quality problems (treatment, testing, engineering buyers).
  • National sweeps: leave states empty and set a maxResults cap; use maxResultsPerState for an even spread across states.
  • Cost & speed: compliance and geographic enrichment add one request per returned system — leave them off for the fastest, cheapest base list, then re-run with enrichment on your shortlist.
  • Proxies: not needed — the EPA SDWIS / Envirofacts API is queried directly. Leave the proxy off for the fastest queries.

FAQ

Where does the data come from? The official US EPA SDWIS (Safe Drinking Water Information System), served through the public Envirofacts REST API (data.epa.gov/efservice). No API key or login is required.

What is a "public water system"? Any system that provides water for human consumption to at least 15 connections or 25 people. SDWIS classifies them as Community (CWS), Non-Transient Non-Community (NTNCWS), or Transient Non-Community (TNCWS).

Do records include contact emails and phones? Yes — SDWIS stores each system's administrative contact (name, email, phone, mailing address). Coverage varies by system; fields are null only when EPA doesn't publish them, never because the scraper skipped them.

Can I get only systems with violations? Yes — turn on includeViolations, then healthBasedViolationsOnly to keep only systems with recent health-based (MCL / treatment-technique) violations.

Can I export to Google Sheets, CSV, or Excel? Yes — one click in the dataset view, or automatically on every run via the Google Drive integration.

How do I monitor new systems automatically? Turn on monitorMode, give each watch a monitorKey, and create a Schedule. Each run emits only systems that are new or whose violation history changed since the last run.

Is this legal? This actor collects publicly available government data only. You are responsible for using the data in compliance with applicable laws and EPA's terms.

Need help?

Open an issue on the actor's Issues tab, or visit the Apify help center. Feature requests are welcome — this actor is actively maintained.