🏭 EPA ECHO Enforcement Scraper avatar

🏭 EPA ECHO Enforcement Scraper

Pricing

from $10.00 / 1,000 results

Go to Apify Store
🏭 EPA ECHO Enforcement Scraper

🏭 EPA ECHO Enforcement Scraper

Extract official environmental compliance records, legal case histories, and penalty fines from the EPA ECHO database for ESG risk models.

Pricing

from $10.00 / 1,000 results

Rating

0.0

(0)

Developer

太郎 山田

太郎 山田

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Categories

Share

EPA Enforcement Digest | ECHO Compliance Risk Monitor

Extract comprehensive environmental records and facility details directly from the EPA Enforcement and Compliance History Online (ECHO) database. Designed for data engineers, ESG analysts, and legal tech developers, this scraper provides a highly reliable way to pull structured government data into your own applications. Instead of manually navigating complex federal websites or paying for expensive third-party data feeds, use this tool to programmatically search and collect official enforcement information.

You can easily configure the scraper with specific URLs or keyword search targets to track corporate entities and individual facilities. Schedule the tool to run on a daily or weekly basis to ensure your internal databases, AI models, or ESG platforms are always updated with the latest compliance data. This automated pipeline makes it trivial to monitor new enforcement cases and corporate compliance screeners at scale.

The scraper captures granular, hard-to-parse details directly from the EPA ECHO platform. Every time you run an extraction, the scraped results will include the agency docket number, specific document types, detailed violation severity classifications, exact penalty amounts, and direct links to the original government source. Export your final data in JSON, CSV, or Excel formats to integrate directly with your tools. Whether you are building an environmental risk monitor or a public accountability dashboard, this tool delivers the accurate, timely data you need to drive critical business logic.

Store Quickstart

  • Add one or more targets[] entries.
  • For facility/company watches, use facilitySearch and/or complianceScreener.
  • For narrow enforcement feeds, use caseSearch with a state/region and a date window.
  • Keep the same snapshotKey across recurring runs so deltas remain comparable.

Key Features

  • 🏛️ Government-sourced — Pulls directly from official agency feeds — no third-party aggregators
  • ⏱️ Timely digests — Daily/weekly rollups of new filings, rulings, or actions
  • 🔍 Keyword watchlists — Flag items matching your compliance/legal watch terms
  • 📊 Structured metadata — Agency, date, docket, document type, link — all dataset-ready
  • 📡 Webhook alerts — Push to legal/compliance teams the moment new items match watchlist

Use Cases

WhoWhy
DevelopersAutomate recurring data fetches without building custom scrapers
Data teamsPipe structured output into analytics warehouses
Ops teamsMonitor changes via webhook alerts
Product managersTrack competitor/market signals without engineering time

Input

FieldTypeDefaultDescription
targetsarrayprefilledList of watched facilities, company footprints, or case feeds. Shared target-level selectors (frsId, facilityName, state
requestTimeoutSecondsinteger30Maximum time to wait for one EPA ECHO web-service request.
userAgentstringOptional custom User-Agent string for public EPA ECHO requests.
deliverystring"dataset"dataset writes selected target rows to the dataset. webhook posts the digest JSON. email is reserved for a future path.
datasetModestring"changes_only"Controls which target rows are persisted: action-needed only, changed/initial/partial/error rows, or every row.
webhookUrlstringPOST destination when delivery=webhook.
notifyOnNoChangebooleanfalseWhen true, webhook delivery still fires even when no selected target changed.
snapshotKeystring"epa-enforcement-digest-snapshots"Stable key used to load and save prior ECHO surface snapshots between recurring runs.

Input Example

{
"targets": [
{
"id": "basf-texas",
"name": "BASF Texas EPA Watch",
"criticality": "high",
"owner": "EHS / Compliance",
"tags": ["chemical", "texas", "epa"],
"facilityName": "BASF",
"state": "TX",
"facilitySearch": {
"nameMatchMode": "CONTAINS"
},
"complianceScreener": {
"years": 5,
"activeOnly": true,
"nameMatchMode": "CONTAINS",
"evidenceLimit": 5
}
},
{
"id": "delaware-afr-feed",
"name": "Delaware Administrative Formal Cases",
"criticality": "high",
"owner": "Legal / Compliance",
"tags": ["case-feed", "delaware", "enforcement"],
"caseSearch": {
"state": "DE",
"caseCategory": "AFR",
"fromDate": "01/01/2024",
"toDate": "12/31/2024",
"evidenceLimit": 5
}
}
],
"delivery": "dataset",
"datasetMode": "changes_only",
"snapshotKey": "epa-enforcement-example",
"diffMode": "line_summary",
"summaryMaxLines": 12,
"maxEvidenceItems": 5,
"concurrency": 2,
"batchDelayMs": 500,
"dryRun": false
}

Output

FieldTypeDescription
metaobject
recurringDigestobject
actionNeededarray
resultsarray
actionNeeded[].targetIdstring
actionNeeded[].targetNamestring
actionNeeded[].ownerstring
actionNeeded[].severitystring
actionNeeded[].statusstring
actionNeeded[].riskScorenumber
actionNeeded[].reasonstring
actionNeeded[].signalsarray
actionNeeded[].recommendedActionsarray
actionNeeded[].executiveSummarystring

Output Example

{
"meta": {
"generatedAt": "2026-04-06T11:39:15.914Z",
"now": "2026-04-05T12:00:00.000Z",
"input": {
"targetCount": 1,
"surfaceCount": 3,
"delivery": "dataset",
"datasetMode": "changes_only",
"diffMode": "line_summary",
"summaryMaxLines": 10,
"maxEvidenceItems": 5,
"concurrency": 2,
"batchDelayMs": 0,
"dryRun": false
},
"snapshot": {
"key": "epa-enforcement-local-proof",
"loadedFrom": "local",
"savedTo": "local"
},
"warnings": [
"surface(basf-texas-facility-search): fixture data is set; live EPA ECHO requests will be skipped",
"surface(basf-texas-compliance-screener): fixture data is set; live EPA ECHO requests will be skipped",
"surface(basf-texas-case-search): fixture data is set; live EPA ECHO requests will be skipped"
],
"totals": {
"targets": 1,
"monitoredSurfaces": 3,
"changedTargets": 1,
"initialTargets": 0,
"unchangedTargets": 0,
"partialTargets": 0,
"errorTargets": 0,
"actionNeededTargets": 1,
"changedSurfaces": 3,
"initialSurfaces": 0,
"unchangedSurfaces": 0,
"errorSurfaces": 0
},

API Usage

Run this actor programmatically using the Apify API. Replace YOUR_API_TOKEN with your token from Apify Console → Settings → Integrations.

cURL

curl -X POST "https://api.apify.com/v2/acts/taroyamada~epa-enforcement-digest/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "targets": [ { "id": "basf-texas", "name": "BASF Texas EPA Watch", "criticality": "high", "owner": "EHS / Compliance", "tags": ["chemical", "texas", "epa"], "facilityName": "BASF", "state": "TX", "facilitySearch": { "nameMatchMode": "CONTAINS" }, "complianceScreener": { "years": 5, "activeOnly": true, "nameMatchMode": "CONTAINS", "evidenceLimit": 5 } }, { "id": "delaware-afr-feed", "name": "Delaware Administrative Formal Cases", "criticality": "high", "owner": "Legal / Compliance", "tags": ["case-feed", "delaware", "enforcement"], "caseSearch": { "state": "DE", "caseCategory": "AFR", "fromDate": "01/01/2024", "toDate": "12/31/2024", "evidenceLimit": 5 } } ], "delivery": "dataset", "datasetMode": "changes_only", "snapshotKey": "epa-enforcement-example", "diffMode": "line_summary", "summaryMaxLines": 12, "maxEvidenceItems": 5, "concurrency": 2, "batchDelayMs": 500, "dryRun": false }'

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("taroyamada/epa-enforcement-digest").call(run_input={
"targets": [
{
"id": "basf-texas",
"name": "BASF Texas EPA Watch",
"criticality": "high",
"owner": "EHS / Compliance",
"tags": ["chemical", "texas", "epa"],
"facilityName": "BASF",
"state": "TX",
"facilitySearch": {
"nameMatchMode": "CONTAINS"
},
"complianceScreener": {
"years": 5,
"activeOnly": true,
"nameMatchMode": "CONTAINS",
"evidenceLimit": 5
}
},
{
"id": "delaware-afr-feed",
"name": "Delaware Administrative Formal Cases",
"criticality": "high",
"owner": "Legal / Compliance",
"tags": ["case-feed", "delaware", "enforcement"],
"caseSearch": {
"state": "DE",
"caseCategory": "AFR",
"fromDate": "01/01/2024",
"toDate": "12/31/2024",
"evidenceLimit": 5
}
}
],
"delivery": "dataset",
"datasetMode": "changes_only",
"snapshotKey": "epa-enforcement-example",
"diffMode": "line_summary",
"summaryMaxLines": 12,
"maxEvidenceItems": 5,
"concurrency": 2,
"batchDelayMs": 500,
"dryRun": false
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('taroyamada/epa-enforcement-digest').call({
"targets": [
{
"id": "basf-texas",
"name": "BASF Texas EPA Watch",
"criticality": "high",
"owner": "EHS / Compliance",
"tags": ["chemical", "texas", "epa"],
"facilityName": "BASF",
"state": "TX",
"facilitySearch": {
"nameMatchMode": "CONTAINS"
},
"complianceScreener": {
"years": 5,
"activeOnly": true,
"nameMatchMode": "CONTAINS",
"evidenceLimit": 5
}
},
{
"id": "delaware-afr-feed",
"name": "Delaware Administrative Formal Cases",
"criticality": "high",
"owner": "Legal / Compliance",
"tags": ["case-feed", "delaware", "enforcement"],
"caseSearch": {
"state": "DE",
"caseCategory": "AFR",
"fromDate": "01/01/2024",
"toDate": "12/31/2024",
"evidenceLimit": 5
}
}
],
"delivery": "dataset",
"datasetMode": "changes_only",
"snapshotKey": "epa-enforcement-example",
"diffMode": "line_summary",
"summaryMaxLines": 12,
"maxEvidenceItems": 5,
"concurrency": 2,
"batchDelayMs": 500,
"dryRun": false
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Tips & Limitations

  • Run daily for active watchlists; weekly for passive monitoring.
  • Webhook delivery works well for compliance team Slack channels — include docket URL for 1-click access.
  • Use watchKeywords generously — false positives are cheap to triage, false negatives miss filings.
  • Pair with regulatory-change-monitor for cross-agency coverage.
  • Archive Dataset rows weekly for long-term compliance evidence retention.

FAQ

How far back does history go?

This actor monitors forward-only — new items since first run. For historical data, use the agency's own search tool.

What timezones are used?

All timestamps are UTC. Use your downstream pipeline to convert to agency-local time if needed.

Does it translate non-English content?

No — original language is preserved. Use downstream translation services if needed.

Is the data official?

Yes — sourced directly from official government websites and feeds. Not a third-party aggregator.

Can I use this for legal research?

For alerting and monitoring, yes. For litigation research, cross-verify with primary sources (agency websites) — this actor is a monitoring tool, not a legal database.

Government & Regulatory cluster — explore related Apify tools:

Cost

Pay Per Event:

  • actor-start: $0.01 (flat fee per run)
  • dataset-item: $0.003 per output item

Example: 1,000 items = $0.01 + (1,000 × $0.003) = $3.01

No subscription required — you only pay for what you use.

⭐ Was this helpful?

If this actor saved you time, please leave a ★ rating on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.

Bug report or feature request? Open an issue on the Issues tab of this actor.