Discover/Azdeq API
live

Azdeq APIazsdwis.azdeq.gov

Access Arizona Safe Drinking Water Information System data: water systems, analytes, sample results, and CCR reports via 7 structured endpoints.

Endpoint health
verified 6d ago
search_water_systems
list_filters
get_water_system_analytes
get_available_ccr_years
get_water_system_detail
6/6 passing latest checkself-healing
Endpoints
7
Updated
21d ago

What is the Azdeq API?

The Arizona SDWIS API exposes public drinking water data from azsdwis.azdeq.gov across 7 endpoints, covering everything from statewide water system search to per-analyte historical sample results. The search_water_systems endpoint lets you query by name, county, system type, or source water type and returns system IDs needed to chain into detail, analyte, and sample-result calls.

Try it

No input parameters required.

api.parse.bot/scraper/075111a7-0e3d-4140-82e1-efebeab264a1/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/075111a7-0e3d-4140-82e1-efebeab264a1/list_filters' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

Typed, relational, agent-ready

A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.

  • Fully typed · autocompletes
  • Objects link to objects
  • Typed errors & pagination

Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:

uv add parse-sdk
uv run parse init
uv run parse add --marketplace azsdwis-azdeq-gov-api

uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.

"""Arizona Safe Drinking Water Information System — search, drill-down, sample results."""
from parse_apis.arizona_safe_drinking_water_information_system_api import (
    ArizonaDrinkingWater,
    County,
    SystemType,
    WaterSystemNotFound,
)

client = ArizonaDrinkingWater()

# Fetch available filters (counties, system types, source types)
filters = client.filters.get()
print(filters.counties, filters.water_system_types)

# Search for community water systems in Maricopa County
for ws in client.watersystems.search(county=County.MARICOPA, system_type=SystemType.COMMUNITY, limit=3):
    print(ws.name, ws.pws_id, ws.tinwsys_is_number)

# Take one system and get its full detail (contacts, sources)
system = client.watersystems.search(county=County.PIMA, limit=1).first()
if system:
    detail = system.detail()
    print(detail.name, detail.primary_source, detail.status)

    # List monitored analytes for this system
    for analyte in system.analytes.list(limit=3):
        print(analyte.name, analyte.code)

        # Get historical sample results for this analyte
        for sample in analyte.samples.list(tinwsys_is_number=system.tinwsys_is_number, limit=2):
            print(sample.date, sample.detection_limit, sample.mcl)

    # Check available Consumer Confidence Report years
    for year in system.ccr_years.list(limit=5):
        print(year.year)

# Typed error handling
try:
    bad_system = client.watersystems.search(number="AZ9999999", limit=1).first()
    if bad_system:
        bad_system.detail()
except WaterSystemNotFound as exc:
    print(f"System not found: {exc.tinwsys_is_number}")

print("exercised: filters.get / watersystems.search / detail / analytes.list / samples.list / ccr_years.list")
All endpoints · 7 totalmissing one? ·

List available search filters for water systems including counties, system types, source water types, and point of contact types.

Input

No input parameters required.

Response
{
  "type": "object",
  "fields": {
    "counties": "array of county name strings",
    "source_water_types": "array of source water type display names",
    "water_system_types": "array of water system type display names",
    "point_of_contact_types": "array of contact type display names"
  },
  "sample": {
    "data": {
      "counties": [
        "All",
        "APACHE",
        "COCHISE",
        "COCONINO",
        "GILA",
        "GRAHAM",
        "GREENLEE",
        "LA PAZ",
        "MARICOPA",
        "MOHAVE",
        "NAVAJO",
        "PIMA",
        "PINAL",
        "SANTA CRUZ",
        "YAVAPAI",
        "YUMA"
      ],
      "source_water_types": [
        "All",
        "GroundWater",
        "GroundWater Purchased",
        "GroundWater UDI SurfaceWater",
        "GroundWater UDI SurfaceWater Purchased",
        "SurfaceWater",
        "SurfaceWater Purchased"
      ],
      "water_system_types": [
        "All",
        "Community",
        "Non-Community",
        "Non-Transient Non-Community"
      ],
      "point_of_contact_types": [
        "None",
        "Administrative Contact",
        "Emergency Contact",
        "Owner",
        "Lead Engineer",
        "Operator",
        "Financial Contact",
        "Legal Contact",
        "Designated Op in Charge",
        "Sampling"
      ]
    },
    "status": "success"
  }
}

About the Azdeq API

What the API Covers

This API surfaces data from Arizona's Safe Drinking Water Information System (SDWIS), maintained by the Arizona Department of Environmental Quality (ADEQ). It covers public water systems (PWS) statewide — community, non-community, and non-transient non-community systems — along with their monitored contaminants, lab sample results, and Consumer Confidence Report (CCR) availability. The list_filters endpoint returns all valid enumerated values for county, system type, source water type, and point-of-contact type, which are the accepted inputs throughout the rest of the API.

Searching and Identifying Water Systems

search_water_systems accepts up to five optional filters — name (partial match), number (e.g. AZ0407025), county, source_type, and system_type — and returns an array of matching systems with fields including pws_id, federal_type, status, county, source_type, tinwsys_is_number, and tinwsys_st_code. The tinwsys_is_number value is the internal ID required by get_water_system_detail, get_water_system_analytes, and get_water_system_sample_results, so a search call is typically the first step in any workflow.

Analytes and Sample Results

get_water_system_analytes returns every contaminant monitored for a given system, including code, name, and analyte_id. Passing an analyte_id plus tinwsys_is_number to get_water_system_sample_results returns the full sample history for that contaminant, with fields for sample_type, date, sample_point, result, uom (unit of measure), and a less_than flag for non-detect readings. get_available_ccr_years takes a pws_id and returns which Consumer Confidence Report years are on file for that system.

Known Limitation

The get_glossary endpoint is documented in the API but currently returns an error because the corresponding page has been removed from the ADEQ site. All other endpoints return structured data. Coverage is limited to Arizona public water systems; no data from other states is included.

Reliability & maintenanceVerified

The Azdeq API is a managed, monitored endpoint for azsdwis.azdeq.gov — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when azsdwis.azdeq.gov changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.

This isn't an official azsdwis.azdeq.gov API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.

Last verified
6d ago
Latest check
6/6 endpoints passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Build a lookup tool that maps Arizona county names to their public water systems and current operational status.
  • Track historical contaminant levels for a specific water system by chaining analyte and sample-result endpoints.
  • Generate alerts when sample results for a regulated analyte exceed a threshold value across multiple systems.
  • Compile a list of available Consumer Confidence Report years for all Community water systems in a given county.
  • Identify all water systems using a specific source water type (e.g. GroundWater) across Arizona counties.
  • Audit contact records for water systems by pulling operator and emergency contact data from the detail endpoint.
  • Cross-reference federal_type and status fields to identify inactive or non-community water systems statewide.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo1005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min

One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.

Frequently asked questions
Does ADEQ provide an official developer API for SDWIS data?+
ADEQ does not publish a documented public developer API for the SDWIS portal at azsdwis.azdeq.gov. The site is intended for public lookup use rather than programmatic access.
What does get_water_system_detail return beyond basic system info?+
In addition to system-level fields like pws_id, name, county, federal_type, primary_source, status, and activity_date, the endpoint returns two sub-arrays: sources (each with name, type, status, and availability) and contacts (each with type, name, and communication fields such as phone or email).
Does the API return violation history or enforcement actions for water systems?+
Not currently. The API covers system details, monitored analytes, historical sample results, and CCR report availability. You can fork it on Parse and revise it to add an endpoint that retrieves violation or enforcement records if that data becomes accessible from the source.
Can I retrieve sample results for all analytes at once, or do I have to query one at a time?+
The get_water_system_sample_results endpoint requires a single analyte_id per call, so results are retrieved one analyte at a time. You can get the full list of analyte IDs for a system from get_water_system_analytes first, then loop through them. The API does not currently support a bulk-analyte sample fetch. You can fork it on Parse and revise to add a batched endpoint if that workflow is needed.
Is the glossary endpoint usable?+
No. The get_glossary endpoint currently returns an error because the underlying glossary page has been removed from the ADEQ site. All other six endpoints return structured data normally.
Page content last updated . Spec covers 7 endpoints from azsdwis.azdeq.gov.
Related APIs in Government PublicSee all →
azbar.org API
Search for Arizona lawyers by name, location, specialty, or company to find the right legal professional for your needs. View detailed lawyer profiles including their specializations, licensed jurisdictions, law school, admission history, and any disciplinary records.
illinoisreportcard.com API
Search and analyze comprehensive performance data for Illinois public schools, districts, and the state, including academic achievements in ELA, math, and science, student demographics, teacher and administrator information, school finances, and environmental conditions. Compare schools side-by-side, track growth metrics, and access accountability ratings and school highlights to make informed decisions about education quality.
arts.ca.gov API
Discover California arts funding opportunities by browsing grant programs, searching awarded grantees, and accessing resources from the California Arts Council. Find relevant grants and grantee information while staying updated with the latest news and resources in California's arts funding landscape.
cps.edu API
Search Chicago Public Schools by name and filters, retrieve full school listings with key details, and download school attendance boundary GeoJSON for mapping.
arc-sos.state.al.us API
Search and retrieve detailed information about Alabama business entities, including their registration status, agents, officers, and incorporators. Verify if a business exists and look up specific company details by name or associated contacts.
naco.org API
Search and explore detailed U.S. county government information, including profiles, economic indicators, funding data, and research resources all in one place. Quickly access bulk county statistics and NACo insights to support planning, analysis, and decision-making at the local government level.
data.ers.usda.gov API
Access comprehensive economic and demographic data for any US county, including unemployment rates, employment figures, income levels, poverty statistics, and population characteristics from the USDA Economic Research Service. Search and filter across all 3,143 US counties to analyze rural economic trends and county classifications for research, planning, or policy development.
kys.udiseplus.gov.in API
Search for schools across India by geographic region and management type, then access detailed information about any school including academic performance, facilities, and enrollment data. Navigate through states, districts, and blocks to find schools that match your criteria and compare their profiles.