US EPA ECHO Compliance & Enforcement: All States avatar

US EPA ECHO Compliance & Enforcement: All States

Pricing

from $4.00 / 1,000 facility records

Go to Apify Store
US EPA ECHO Compliance & Enforcement: All States

US EPA ECHO Compliance & Enforcement: All States

Search EPA ECHO facilities and enforcement cases in all 50 states, DC, and territories by county, program, violation, penalty, and NAICS industry, or monitor new enforcement on a schedule.

Pricing

from $4.00 / 1,000 facility records

Rating

0.0

(0)

Developer

ManiGinaM

ManiGinaM

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Security

Limited permissions

Share

Search EPA compliance and enforcement records for facilities in all 50 states, Washington DC, Puerto Rico, and the US territories by county, EPA program, violation status, penalties, industry, and date. Turn on monitor mode and schedule it to get only new enforcement actions, new penalties, and facilities whose violation status changed since your last run.

What does it do?

This Actor reads the U.S. Environmental Protection Agency's ECHO (Enforcement and Compliance History Online) weekly bulk data downloads and returns clean, normalized records you can drop into a spreadsheet, CRM, or due-diligence workflow. It can return two kinds of records:

  • Facilities: one record per EPA-regulated facility, with its address, coordinates, industry codes, Clean Air Act, Clean Water Act, RCRA, and Safe Drinking Water Act IDs, current compliance status by program, significant noncompliance flag, inspections, informal and formal enforcement actions, five-year penalty totals, and a link to the EPA Detailed Facility Report.
  • Enforcement cases: one record per federal EPA civil enforcement case, with the statute, case status, filing, lodging, settlement, and closing dates, federal and state penalties, SEP and compliance costs, docket numbers, pollutants, and a link to the EPA case report.

ECHO lists about 3.2 million regulated facilities nationwide, active and inactive. The Actor streams EPA's published files, applies every filter itself, and stops reading as soon as it has maxResults records, so there is no row limit and no search is ever too broad.

It uses EPA's official public download files, so there is no browser, no proxy, and no login involved.

Who is it for?

  • Environmental lawyers screening clients, opposing parties, and targets for violations and enforcement history.
  • Environmental consultants building Phase I and compliance-audit leads by county anywhere in the US.
  • Insurers and lenders' due-diligence teams checking a borrower's or insured's facilities before binding or closing.
  • ESG and sustainability teams tracking supplier and portfolio compliance across every state where they operate.
  • Industrial-services sales teams looking for facilities with current violations, new orders, or fresh penalties.

How to use

  1. Open the Actor in Apify Console and choose facilities or enforcement cases.
  2. Pick one or more states, or leave the list empty to search the whole country.
  3. Optionally narrow the search under Filters by county, program, violation, penalty, industry, or date.
  4. Click Start and wait for the run to finish.
  5. Open the Output tab to preview records, then export them as JSON, CSV, Excel, or XML.
  6. To watch for new enforcement, turn on monitor mode and add a schedule.

Input

FieldTypeDescription
recordTypechoicefacilities (default) or enforcementCases.
stateslist of statesTwo-letter codes for any of the 50 states, DC, PR, VI, GU, AS, and MP. Empty (default) means all of them, so set maxResults to match.
countieslist of namesCounties, parishes, boroughs, or municipios, for example Harris, Los Angeles, East Baton Rouge, or Cook. "Saint" or "St.", with or without "County", "Parish", or "Borough", in any case and with or without accents. Virginia's independent cities keep "City", for example Richmond City. A name is searched in every selected state that has it. Facility searches only. Empty means whole states.
programslist of programsCAA, CWA, RCRA, or SDWA. For cases this picks the primary law. Empty means every program.
activeOnlytrue or falseFacilities only. Skip closed and inactive facilities. Default true.
violationStatuschoiceFacilities only. any (default), currentViolation, or significantViolation.
formalEnforcementWithinYearsnumberFacilities only. Keep facilities with a formal enforcement action in the last 1 to 5 years. 0 (default) turns it off.
minPenaltyUsdnumberFacilities: five-year penalty total at or above this amount. Cases: federal plus state penalty at or above it. 0 (default) turns it off.
naicsCodeslist of codesNAICS codes or prefixes of 2 to 6 digits, for example 325 for chemicals or 324110 for refineries.
dateFromdateYYYY-MM-DD. Cases: filed, lodged, settled, or closed on or after this day. Facilities: last formal action on or after this day.
dateTodateYYYY-MM-DD, inclusive, with the same meaning as dateFrom.
maxResultsnumberMost records to publish and charge in one run. Default 1000, maximum 250,000.
onlyNewOrChangedtrue or falseMonitor mode. Outputs only records that are new or changed since the previous run of the same search.

For cases, a date range matches a case whose dateFiled, dateLodged, settlementDate, or dateClosed falls inside it, and naicsCodes matches the case's primaryNaicsCode. EPA's case files have no county, so the Actor rejects counties for case searches instead of silently returning a whole state. Facility-only filters are ignored, with a warning in the log, when you search cases.

Sample input, chemical plants and refineries in Houston's Harris County, Texas, and Los Angeles County, California, with a formal enforcement action in the last three years:

{
"recordType": "facilities",
"states": ["TX", "CA"],
"counties": ["Harris", "Los Angeles"],
"naicsCodes": ["325", "324"],
"formalEnforcementWithinYears": 3,
"maxResults": 500
}

Output

Each facility or case is one dataset item. This is a real facility record from ECHO, from Louisiana:

{
"recordType": "facility",
"registryId": "110013921435",
"facilityName": "ACADIA PARISH POLICE JURY - ACADIA PARISH SANITARY LANDFILL",
"street": "611 PETAL RD",
"city": "EGAN",
"state": "LA",
"zip": "70531",
"county": "ACADIA",
"countyFips": "22001",
"epaRegion": "06",
"latitude": 30.256038,
"longitude": -92.532637,
"naicsCodes": [
"562111",
"562212"
],
"sicCodes": [
"4953"
],
"programs": [
"CAA",
"CWA"
],
"active": true,
"majorFacility": true,
"federalFacility": false,
"airIds": [
"LA0000002200100143"
],
"npdesIds": [
"LA0065676"
],
"rcraIds": [],
"sdwaIds": [],
"caaPermitTypes": "Major Emissions",
"cwaPermitTypes": "Non-M",
"rcraPermitTypes": null,
"sdwaSystemTypes": null,
"complianceStatus": "Violation Identified",
"caaComplianceStatus": "No Violation Identified",
"cwaComplianceStatus": "Violation Identified",
"rcraComplianceStatus": null,
"sdwaComplianceStatus": null,
"currentViolation": true,
"significantNoncompliance": false,
"quartersInNoncompliance": 8,
"complianceHistory3yr": "VV_V_V__VVVV",
"inspectionCount": 2,
"lastInspectionDate": "2025-08-21",
"informalActionCount": 1,
"lastInformalActionDate": "2025-09-30",
"formalActionCount": 1,
"lastFormalActionDate": "2026-08-06",
"totalPenaltiesUsd": 0,
"penaltyCount": null,
"lastPenaltyDate": "2006-09-20",
"lastPenaltyAmountUsd": 9000,
"caaPenaltiesUsd": null,
"cwaPenaltiesUsd": 0,
"rcraPenaltiesUsd": null,
"enforcementActionIds": [
"LA-WECN2500447",
"LA000A0000220010014300037"
],
"detailedFacilityReportUrl": "https://echo.epa.gov/detailed-facility-report?fid=110013921435",
"changeType": "notTracked"
}

And a real enforcement case record:

{
"recordType": "enforcementCase",
"caseNumber": "06-2005-3416",
"caseName": "Saint-Gobain Containers Inc (Ardagh Glass)-3 Facilities-CAA Consent Decree (National Case)",
"activityId": "161265",
"matchedState": "LA",
"caseCategory": "Judicial",
"caseCategoryCode": "JDC",
"caseStatus": "Closed",
"caseStatusCode": "CLS",
"civilOrCriminal": "civil",
"lead": "EPA",
"primaryLaw": "CAA",
"primarySection": "165",
"laws": [
"CAA"
],
"primaryNaicsCode": "327213",
"primarySicCode": "3221",
"dateFiled": "2010-01-21",
"dateLodged": "2010-01-21",
"settlementDate": "2010-05-07",
"dateClosed": "2026-08-27",
"enforcementOutcome": "Final Order With Penalty",
"federalPenaltyUsd": 230000,
"stateLocalPenaltyUsd": 200000,
"totalPenaltyUsd": 430000,
"sepCostUsd": 250000,
"complianceActionCostUsd": 20900000,
"costRecoveryUsd": null,
"settlementCount": 1,
"courtDocketNumber": "2:10-CV-00121-TSZ",
"dojDocketNumber": "90-5-2-1-06982/1",
"pollutants": "Sulfur oxide",
"caseReportUrl": "https://echo.epa.gov/enforcement-case-report?id=06-2005-3416",
"changeType": "new"
}

You can download results as JSON, CSV, Excel, or XML, or read them through the Apify API. The dataset has a Facilities view and an Enforcement cases view.

  • Money is in US dollars as numbers. Dates are YYYY-MM-DD. Lists such as naicsCodes and npdesIds are arrays.
  • Facility counts and penalty totals cover ECHO's standard five-year window. complianceHistory3yr is ECHO's 12-quarter code string, oldest quarter first.
  • currentViolation and significantNoncompliance reflect EPA's latest quarter. Violations in ECHO are alleged until they are resolved through enforcement or the courts.
  • changeType is new or changed in monitor mode and notTracked otherwise.
  • A value the source stores in an unusable form comes through as null instead of stopping the run.

Monitor mode

Set onlyNewOrChanged to true and add a schedule, for example every Monday at 7 AM Central, since ECHO refreshes about weekly. The Actor remembers each record's enforcement history for that exact search in a named key-value store. The first run outputs every matching record as new. Later runs output only new records and records whose history moved. Unchanged records are skipped and you are not charged for them.

  • A facility counts as changed when its current violation or significant noncompliance flag flips, or when it gets a new informal action, formal action, or penalty. A new inspection on its own does not count.
  • A case counts as changed when its status, settlement date, closing date, outcome, or penalties change.
  • History is keyed on every filter except maxResults. State, county, program, and code order do not matter. If you change a filter, including a date you move forward each week, the Actor starts a fresh history and reports every match as new again. Keep the filters fixed for a monitor.
  • Set maxResults high enough to cover every record you want watched.
  • Two schedules running the same search at the same time share one history, and the run that finishes last wins.

Pricing

This Actor uses pay-per-event pricing.

  • Facility record: $4.00 per 1,000 facilities delivered to your dataset ($0.004 each).
  • Enforcement case record: $4.00 per 1,000 cases delivered to your dataset ($0.004 each).
  • Actor start: Apify's standard start event ($0.00005).
  • There is no separate charge per dataset item.

Examples:

  • A weekly monitor for a few counties usually delivers a handful of new or changed records, so it costs pennies a month.
  • 100 Harris County, Texas, facilities with a current violation cost $0.40.
  • 10,000 facilities across several states cost $40.
  • Every federal EPA enforcement case in California, about 5,500 records, costs about $22.

You can cap any run with Apify's maximum charge setting. The Actor stops cleanly when your limit is reached, and you are only charged for records that actually reach your dataset.

Estimated compute cost

Default memory is 512 MB, and the Actor stays under about 160 MB. Facility searches stream EPA's ECHO Exporter file, about 450 MB compressed, from the top and stop once maxResults records are found. A run that fills its limit early, such as 100 Harris County facilities with a current violation, reads a small part of the file and finishes in about a minute for well under $0.01 in Apify compute. A run that has to read the whole file, such as every facility in a small state or a filter that matches few rows, takes about 2 to 4 minutes, roughly $0.01 to $0.03 in compute on top of the event charges. Case searches download EPA's 82 MB case file once and take about a minute, well under $0.01 in compute.

Data source and freshness

Data comes from EPA's ECHO data downloads at https://echo.epa.gov/files/echodownloads/, published by the U.S. Environmental Protection Agency for anyone with larger data needs. EPA refreshes these files about weekly, and state-reported data can trail what a state agency shows on its own site.

  • Facility records come from the ECHO Exporter (echo_exporter.zip), the same facility summary that powers ECHO's facility search.
  • Case records come from the ICIS Federal Enforcement and Compliance (FE&C) download (case_downloads.zip), joined across its facility, penalty, statute, milestone, pollutant, and docket tables. This file holds federal EPA civil cases only, so state-lead cases and criminal cases are not included.

If EPA's download is down or refuses a request, the run fails with a short message and keeps every record it already delivered. If EPA publishes a new weekly file while a run is being resumed on another server, the run stops instead of mixing two files. Run it again later.

The Actor follows echo.epa.gov's robots.txt, which allows its download folder and asks for 10 seconds between requests. It identifies itself with a descriptive User-Agent, waits at least 10 seconds between requests, backs off and retries on errors, and resumes a dropped download where it stopped instead of starting over.

Data source: U.S. Environmental Protection Agency, Enforcement and Compliance History Online (ECHO), https://echo.epa.gov.

ECHO is a public U.S. government service, and EPA publishes this data for anyone to search and download. The data is provided as is, without any guarantee that it is complete, current, or free of errors, and violations are alleged until resolved. It is not legal advice, a site assessment, or an EPA determination, so confirm anything important against ECHO and the responsible state agency. This Actor is an independent tool and is not affiliated with or endorsed by the U.S. Environmental Protection Agency or any state agency.

API and integrations

You can start this Actor and read its results with the Apify API, the Apify Python and JavaScript clients, or the Apify CLI. The API returns each run's dataset in the same formats as the Console.

Apify integrations can pass results on when a run finishes, for example to Google Sheets, Slack, Zapier, Make, or your own webhook. Set them up on the Actor's Integrations tab, and pair them with a schedule for a hands-off feed.

FAQ

Do I need an EPA account or API key? No. The Actor reads the public files EPA publishes on its ECHO data downloads page.

Why are cases not filtered by county? EPA's case download has no county field. Search facilities by county, then look up their enforcementActionIds, or filter cases by state, program, industry, and date.

Why are there no state-lead or criminal cases? The Actor used to read them from ECHO's search services at echodata.epa.gov, but that host's robots.txt now disallows all automated access. EPA's bulk case download, which robots.txt allows, covers federal EPA civil cases only. Facility records still include state inspections, actions, and penalties that states report to EPA.

What is the difference between totalPenaltiesUsd on a facility and totalPenaltyUsd on a case? The facility figure is everything assessed against that facility in the last five years. The case figure is the federal plus state or local penalty in that one case, whenever it happened.

Feedback and custom requests

Found a bug, a wrong value, or a source that changed? Open an issue in the Issues tab on this Actor's page. Need another field, filter, or source, or a version built for your team? Describe it in the Issues tab as a custom request.