# EPA ECHO Violations Scraper (`parseforge/epa-echo-violations-scraper`) Actor

Scrapes EPA ECHO violation records filtered by state, county, ZIP code, media program, and SIC code. Returns each violation as a flat row with facility details, violation type, date, and enforcement information.

- **URL**: https://apify.com/parseforge/epa-echo-violations-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Other, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $19.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### EPA ECHO Violations Scraper

**Scrape EPA ECHO violation records by state, county, ZIP code, or media program, up to a million per run.** Each record includes the facility name, violation type, date, and enforcement details. No API key required. Export to CSV, JSON, Excel, or XML.

The EPA's Enforcement and Compliance History Online (ECHO) database holds millions of facility violation records, but its web search is slow, paginated, and hard to export in bulk. This Actor queries the public ECHO services directly, filters by geography, media program, or industry code, and returns every matching violation in a consistent, flat schema. It is built for environmental analysts, journalists, and compliance teams who need the raw data without manual clicking.

| Who uses it | What they scrape EPA ECHO for |
|---|---|
| Environmental analysts | Monitor compliance trends across facilities in a watershed or airshed. |
| Investigative journalists | Identify repeat violators and enforcement gaps in a specific region. |
| Corporate compliance officers | Benchmark a facility's record against industry peers in the same SIC code. |
| Academic researchers | Build datasets for studies on environmental justice and regulatory effectiveness. |

### What it does

This Actor collects EPA ECHO violation records filtered by state, county, ZIP code, media program, and SIC code, and returns each violation as a flat row.

- 🗺️ **Geographic filters:** narrow results to a single state, county, or ZIP code for localized analysis.
- 📋 **Media program filter:** isolate violations under the Clean Air Act, Clean Water Act, RCRA, or Safe Drinking Water Act.
- 🏭 **Industry targeting:** filter by two-digit SIC code to focus on a specific sector like chemical manufacturing or metal fabrication.
- 📊 **Bulk export:** collect up to a million records in one run and download as CSV, JSON, Excel, or XML.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

### What you can do with EPA ECHO data

**📈 Track compliance trends.**

An environmental analyst pulls five years of Clean Water Act violations for every county in California to see if enforcement actions are rising or falling.

**🗞️ Investigate local polluters.**

A reporter enters a ZIP code and the RCRA program to find hazardous waste violators near a residential neighborhood.

**🏭 Audit an industry sector.**

A compliance officer filters by SIC code 28 (chemicals) across Texas to compare their facility's violation count against competitors.

**🎓 Build a research dataset.**

A graduate student collects all Safe Drinking Water Act violations in the Midwest to correlate with demographic data for a thesis.

### Why choose this scraper

| | What you get |
|---|---|
| **No API key or registration** | Queries the public ECHO services directly with no account setup. |
| **Fixed flat schema** | Every record arrives with the same columns, ready for analysis or a database. |
| **Geography-first design** | Built around the way EPA organizes data: state, county, and ZIP. |
| **Program-specific queries** | Pull only CAA, CWA, RCRA, or SDWA violations instead of sifting through everything. |

### Configure the run

Drive the Actor with a state, optional county and ZIP code, a media program, and a two-digit SIC code prefix. Filters are applied at query time so only matching violations are returned. The Input tab lists every parameter.

A first run with the defaults:

```json
{
 "maxItems": 10
}
```

A larger pull:

```json
{
 "maxItems": 200
}
```

### Pricing

Pay-per-result: **$0.021 per result** collected. You pay only for the results written to your dataset.

| Results collected | Approximate cost |
|---|---|
| 100 results | $2.10 |
| 1,000 results | $21.00 |
| 10,000 results | $210.00 |

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 results as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 results per run.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [EPA ECHO Violations Scraper](https://apify.com/parseforge/epa-echo-violations-scraper?fpr=vmoqkp).
3. Set your inputs and any filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent live access to EPA ECHO through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=parseforge/epa-echo-violations-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### Troubleshooting

**Why am I getting no results?**

Check that your county name matches the EPA's spelling exactly (e.g., 'Los Angeles' not 'LA County'). Try broadening the search by removing the county or SIC code filter, or switching the media program to 'All Programs'.

**The run is taking too long.**

Large queries can take time because the EPA's public services are rate-limited. Reduce the maxItems or narrow your filters to a smaller geography. The Actor processes records sequentially to respect the source.

**I entered a ZIP code but got results from a different area.**

The EPA ECHO service uses ZIP codes as a proximity search, not an exact boundary. If you need precise geographic results, add a county filter or verify the ZIP is correct for your target area.

**Some fields are empty in my results.**

Not every violation record contains every field. The EPA database has gaps, especially for older records or facilities that did not report certain details. This is expected and reflects the source data.

**The Actor failed with an error.**

The EPA ECHO services occasionally experience downtime. Wait a few minutes and retry. If the error persists, check that your input values are valid (a real two-letter state code, a numeric ZIP, and a recognized SIC prefix).

### FAQ

| Question | Answer |
|---|---|
| What is EPA ECHO? | ECHO is the Enforcement and Compliance History Online database maintained by the U.S. Environmental Protection Agency. It contains compliance and enforcement records for regulated facilities across the United States. |
| Do I need an API key or EPA account to use this Actor? | No. This Actor queries the public ECHO web services directly. You do not need to register with the EPA or obtain any credentials. |
| What violation types can I filter by? | You can filter by media program: Clean Air Act (CAA), Clean Water Act (CWA), RCRA hazardous waste, Safe Drinking Water Act (SDWA), or all programs combined. |
| Can I search by ZIP code alone? | Yes. You can enter a ZIP code without a county. If you leave both county and ZIP empty, the Actor uses a default large-city ZIP for the selected state. |
| What is an SIC code and how do I use it? | The Standard Industrial Classification (SIC) code identifies a facility's industry. Enter a two-digit prefix like '28' for chemical manufacturing to filter violations to that sector. |
| How many records can I scrape in one run? | Free users can scrape up to 10 records. Paid Apify users can set the maximum up to 1,000,000 records per run. |
| What data fields are included in each violation record? | Each row includes the facility name, location, violation type, date, enforcement action details, and the media program. The exact field list is visible in the sample output on the Actor's page. |
| Can I scrape multiple states at once? | The Actor accepts one state per run. To collect data for multiple states, run the Actor once per state or use an Apify task schedule. |
| Is the data updated in real time? | The Actor pulls data directly from the live EPA ECHO services each time it runs, so you always get the current records available in the public database. |
| What export formats are supported? | You can export your dataset as CSV, JSON, Excel, or XML from the Apify platform after the run completes. |

### Related actors

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by U.S. Environmental Protection Agency. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

# Actor input Schema

## `maxItems` (type: `integer`):

Free users: 10. Paid users: optional, max 1,000,000.

## `state` (type: `string`):

Two-letter US state code.

## `county` (type: `string`):

County name (e.g. "Los Angeles"). Optional.

## `zip` (type: `string`):

US ZIP code to narrow the EPA ECHO query (defaults to a large city ZIP for the selected state when county is empty).

## `mediaType` (type: `string`):

EPA program filter.

## `sicCode` (type: `string`):

SIC industry code prefix. Optional.

## Actor input object example

```json
{
  "maxItems": 10,
  "state": "CA",
  "mediaType": "all"
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/epa-echo-violations-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "maxItems": 10 }

# Run the Actor and wait for it to finish
run = client.actor("parseforge/epa-echo-violations-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10
}' |
apify call parseforge/epa-echo-violations-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/epa-echo-violations-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/PsbWgpRkia3vyFUqY/builds/W87Qzrj4sYt1WNLBg/openapi.json
