EPA ECHO facilities - permits, inspections, violations (API)
Pricing
from $5.00 / 1,000 records
EPA ECHO facilities - permits, inspections, violations (API)
Search EPA ECHO by state, city, zip, NAICS and program (air, water, hazardous waste, drinking water) and get one row per regulated facility: registry id, address, permits, compliance status, quarters in noncompliance, inspections, enforcement, penalties, report URL.
Pricing
from $5.00 / 1,000 records
Rating
0.0
(0)
Developer
RetrainMap Team
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
EPA ECHO facilities — permits, inspections, violations (API)
One row per EPA-regulated facility from ECHO (Enforcement and Compliance History Online), EPA's public facility search web service. Filter by state, city, ZIP, NAICS code and program (Clean Air Act, Clean Water Act / NPDES, RCRA hazardous waste, SDWA drinking water); get the FRS registry id, address, county, coordinates, NAICS/SIC codes, program flags and permit ids, compliance status per program, quarters in noncompliance (3 years), inspections, enforcement actions and penalties (5 years) and the detailed facility report URL — one flat row per facility, ready for CSV or JSON.
The default input (Raleigh, NC, all programs, up to 500 rows) succeeds within 5 minutes and returns rows — Apify auto-tests it daily.
Data source and status
| Publisher | U.S. Environmental Protection Agency — ECHO (https://echo.epa.gov) |
| API | ECHO web services, Facility Search (All Data): echodata.epa.gov/echo/echo_rest_services.get_facilities then .get_qid — public, no key (documentation: https://echo.epa.gov/tools/web-services/facility-search-all-data) |
| What this Actor reads | One get_facilities GET with p_st, p_ct, p_zip, p_ncs, p_med, p_act and a fixed qcolumns list, which answers a QueryID and ECHO's own match counts; then get_qid pages of 1,000 facilities, at most one request per second |
| Refresh cadence | ECHO refreshes its facility data weekly (data pulled from the program systems ICIS-Air, ICIS-NPDES, RCRAInfo, SDWIS; see https://echo.epa.gov/resources/echo-data/about-the-data). The Actor reads live on every run; fetched_at on each row is the fetch time |
| Copyright | Works of the United States Government are not subject to copyright in the U.S. (17 U.S.C. §105). The data are public; please cite EPA ECHO as the source |
| Known caveats | ECHO refuses result sets above its query-set limit — a whole large state (e.g. NC alone = 118,707 facilities) fails with ECHO's "Queryset Limit would be exceeded" message; add a city, ZIP, NAICS or program. ECHO silently ignores filters it does not know and returns 0 rows for an unknown state, so the Actor validates state, ZIP and NAICS itself. Many facilities carry no compliance status, inspection or penalty data (nulls) — ECHO only holds what the program systems report. Counts follow ECHO's windows: inspections, enforcement and penalties over 5 years, quarters in noncompliance over 3 years (12 quarters). EPA's own caveats on data quality apply: https://echo.epa.gov/resources/echo-data/known-data-problems |
Honesty note: the rows are ECHO's own columns renamed and converted (strings to numbers, Y/N and 1/0 to booleans, MM/DD/YYYY to ISO dates) — nothing is inferred, scored or classified by this Actor, and a run stops with an error rather than guess when ECHO's shape changes; the violation filter is cross-checked against ECHO's own count.
Identification: the requests carry a product-token User-Agent and the operator's
contact address in the standard From: header (RFC 9110 §10.1.2).
Input
| Field | Type | Meaning |
|---|---|---|
state | USPS code | e.g. NC. Required unless zip is given |
city | string | Optional, as ECHO records it (case-insensitive); needs state |
zip | 5 digits | Optional |
naics | 2–6 digits | Optional NAICS code or prefix (62 = health care) |
program | select | all, air, water, hazardous_waste, drinking_water |
only_with_violations | boolean | Keep only facilities with a violation identified in the last 3 years (ECHO ViolFlag) |
active_only | boolean | ECHO p_act=Y |
max_records | integer | Default 500, at most 20,000 |
request_interval_ms | integer | Default 1000 (floor 250) |
contact_email | string | Sent in the From: header |
Example — hazardous-waste handlers in Houston with a violation in the last three years:
{ "state": "TX", "city": "Houston", "program": "hazardous_waste", "only_with_violations": true, "max_records": 2000 }
Output (dataset row)
registry_id (FRS), facility_name, address, city, state, zip, county, county_fips,
epa_region, latitude, longitude, naics_codes, sic_codes, active, major,
program_air, program_water, program_hazardous_waste, program_drinking_water,
program_tri, program_ghg, air_permit_ids, npdes_permit_ids, rcra_ids, sdwa_ids,
tri_ids, caa_permit_types, cwa_permit_types, rcra_permit_types, compliance_status,
caa_compliance_status, cwa_compliance_status, rcra_compliance_status,
sdwa_compliance_status, violation_3yr, current_violation,
current_significant_violation, significant_noncompliance, programs_with_snc,
quarters_noncompliance_3yr, compliance_history_3yr (ECHO's 12-character quarter string),
inspections_5yr, last_inspection_date, days_since_last_inspection,
informal_actions_5yr, formal_actions_5yr, last_formal_action_date, penalties_5yr_usd,
penalty_count_5yr, last_penalty_date, last_penalty_usd, echo_url (detailed facility
report), fetched_at, source.
A run summary (filters, ECHO's query id and its own counts — matches, current violations,
3-year violations, inspections, penalties — pages, requests, whether the pay-per-event
budget stopped the run) is stored as RUN_SUMMARY in the run's key-value store.
Pricing (pay per event)
| Event | Price |
|---|---|
run-start — once per run | $0.10 |
record — per row written | $0.005 |
The default pull (≤ 500 rows) costs at most $2.60; 2,000 facilities cost $10.10. Rows stop when your run's maximum charge is reached; the run summary says so.
Operator
Steelyard Ventures LLC (RetrainMap) — info@steelyardclinical.com. Not affiliated with the U.S. EPA. The Actor writes only to its own dataset and key-value store; it stores no credentials and sends nothing else.