EPA ECHO Enforcement Scraper
Pricing
from $8.00 / 1,000 results
EPA ECHO Enforcement Scraper
Extract official environmental compliance records, legal case histories, and penalty fines from the EPA ECHO database for ESG risk models.
EPA ECHO Enforcement Watch Scraper
Use this actor to monitor public EPA ECHO facility, compliance, and enforcement-case records for EHS and diligence review workflows. Input facility names, states, FRS IDs, case searches, or target watchlists; get source-linked digest rows for changed or action-needed records. This actor is informational only and does not provide professional advice, certification, or opaque scoring.
Store Quickstart
- Add one or more
targets[]entries. - For facility/company watches, use
facilitySearchand/orcomplianceScreener. - For narrow enforcement feeds, use
caseSearchwith a state/region and a date window. - Keep the same
snapshotKeyacross 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
| Who | Why |
|---|---|
| Developers | Automate recurring data fetches without building custom scrapers |
| Data teams | Pipe structured output into analytics warehouses |
| Ops teams | Monitor changes via webhook alerts |
| Product managers | Track competitor/market signals without engineering time |
Input
| Field | Type | Default | Description |
|---|---|---|---|
| targets | array | prefilled | List of watched facilities, company footprints, or case feeds. Shared target-level selectors (frsId, facilityName, state |
| requestTimeoutSeconds | integer | 30 | Maximum time to wait for one EPA ECHO web-service request. |
| userAgent | string | — | Optional custom User-Agent string for public EPA ECHO requests. |
| delivery | string | "dataset" | dataset writes selected target rows to the dataset. webhook posts the digest JSON. email is reserved for a future path. |
| datasetMode | string | "changes_only" | Controls which target rows are persisted: action-needed only, changed/initial/partial/error rows, or every row. |
| webhookUrl | string | — | POST destination when delivery=webhook. |
| notifyOnNoChange | boolean | false | When true, webhook delivery still fires even when no selected target changed. |
| snapshotKey | string | "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}
Input Examples
Example: Single-target audit
{"targets": ["example-target-1"],"maxResultsPerTarget": 30}
Example: Bulk portfolio
{"targets": ["target-1","target-2","target-3"],"maxResultsPerTarget": 50,"snapshotKey": "epa-enforcement-digest-state"}
Example: Recurring delta watch
{"targets": ["target-1"],"snapshotKey": "epa-enforcement-digest-state","emitChangedOnly": true}
Output
| Field | Type | Description |
|---|---|---|
meta | object | |
recurringDigest | object | |
actionNeeded | array | |
results | array | |
actionNeeded[].targetId | string | |
actionNeeded[].targetName | string | |
actionNeeded[].owner | string | |
actionNeeded[].severity | string | |
actionNeeded[].status | string | |
actionNeeded[].riskScore | number | |
actionNeeded[].reason | string | |
actionNeeded[].signals | array | |
actionNeeded[].recommendedActions | array | |
actionNeeded[].executiveSummary | string |
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 ApifyClientclient = 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
watchKeywordsgenerously — false positives are cheap to triage, false negatives miss filings. - Pair with
regulatory-change-monitorfor 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.
Related Actors
Government & Regulatory cluster — explore related Apify tools:
- FDA Warning Letters Digest | Summary-First Feed — Monitor public FDA warning letters with one summary-first digest row per configured feed.
- Federal Register Digest | Agency Rule & Notice Monitor — Monitor Federal Register documents — rules, proposed rules, and notices — per configured agency feed.
- Government Contract Award Monitor | Award & Competitor Watch — Monitor public-sector contract award notices for new wins, notable awardees, incumbent recompetes, and competitor signals — one digest row per configured feed without brittle broad crawling.
- Grants.gov Funding Digest | Opportunity Watch & Signal Digest — Monitor Grants.
- NHTSA Vehicle Recall Digest | Recalls + Complaints Watch — Monitor official NHTSA vehicle recall and complaint endpoints for watched model-family, VIN, and manufacturer feeds.
- Product Safety Recall Digest | CPSC + openFDA Alerts — Monitor CPSC saferproducts.
- Regulatory Change Monitor API — Monitor official regulator update feeds, government bulletin pages, and public compliance notices with one action-oriented digest row per monitored source.
- OFAC Sanctions Change Digest | SDN List Monitor — Monitor the OFAC SDN (Specially Designated Nationals) sanctions list for additions and removals.
- Tariff Trade Change Digest | Federal Register + HTS Monitor — Monitor U.
- Treasury Fiscal Data Digest | Debt, Rates & Budget Monitor — Monitor the U.
- USPTO Patent Monitor API | JSON + Webhook — Search and monitor US patent filings with multi-source fallback.
- Campaign Finance & Lobbying Digest | FEC + LDA Watch — Monitor official FEC OpenFEC committee reports and LDA.
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.
Compliance Guardrails
This actor is independently operated and has no source-agency affiliation, sponsorship, or approval. It uses public data from EPA ECHO web services and public datasets (https://echo.epa.gov/tools/web-services). Results are informational only and may be delayed, incomplete, amended, withdrawn, or superseded by the source. Verify all records with the linked official source before relying on them.
- Use EPA ECHO web services/data endpoints, not UI scraping.
- No professional advice, certification, or opaque scoring.
- Output source fields transparently with official source URLs and retrieval timestamps.