# RCRA Enforcement Response Leads (`lukehunter/rcra-enforcement-radar`) Actor

Deduplicated recent RCRA enforcement actions joined to EPA's own evaluation and violation evidence, filterable by state and minimum penalty, with an optional filter for unresolved linked violations. One flat row per action, ready for CRM or Sheets.

- **URL**: https://apify.com/lukehunter/rcra-enforcement-radar.md
- **Developed by:** [Luke Hunter](https://apify.com/lukehunter) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 enforcement opportunities

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## RCRA Enforcement Response Leads — find facilities with fresh action + unresolved linked violations

**For environmental compliance consultants, remediation vendors and environmental BD teams who need fresh hazardous-waste response opportunities.** One run returns EPA ECHO RCRA enforcement actions, deduplicated and joined to their linked evaluations and violations, with actions flagged where a linked violation has no source return-to-compliance date.
Pay-per-result: **$0.02 per delivered action — 100 leads = $2.00.**
Try it free with Apify's monthly platform credit.

That unresolved-linked-violation signal is the commercial shortcut: consultants, remediation/compliance vendors and environmental BD teams can focus research on recent enforcement events where the linked source record does not yet show a return-to-compliance date. It is deliberately named `derivedUnresolvedLinkedViolationCount`—it is a workflow signal, **not** a claim that a facility is currently out of compliance.

### Quick start (2 minutes)

1. Open the **Input** tab (no EPA account or key needed — the source is public).
2. Use this prefill for recent Texas/Louisiana actions with unresolved linked violations:

```json
{"lookbackDays":30,"states":["TX","LA"],"requireUnresolvedLinkedViolation":true,"minPenaltyUsd":5000,"maxItems":100}
```

3. Click **Start**. Export the resulting shortlist to CSV/JSON, or pull it via the API into your CRM.

### Why this is different

Most EPA ECHO Actors are facility searches, flat violation feeds or generic change monitors. This Actor is RCRA-specific and **action-first**: it joins EPA's evaluation → violation → enforcement linkage, collapses duplicate action rows, counts linked violations missing a source return-to-compliance date, and can filter to only those events. You get a shortlist for response research rather than another facility dump.

### Use cases

- **Weekly consulting lead feed:** schedule after EPA's weekly refresh and keep only recent actions with linked violations lacking `ACTUAL_RTC_DATE`.
- **Remediation/compliance BD triage:** rank action-level records by unresolved-linked-violation count, recency and source-reported penalty.
- **Territory monitoring:** watch selected states for new RCRA enforcement response work.
- **Evidence-backed account research:** open the ECHO facility link with action, evaluation and violation context already joined.
- **Legal/risk research:** analyze recent RCRA actions without mistaking a facility-level summary for the underlying linked event evidence.

### How it works

EPA publishes separate RCRA Pipeline evaluation, violation and enforcement tables linked by `ISN_RCR_EVAL`. The Actor downloads the official ZIP, validates product-critical columns, joins those tables, groups repeated enforcement rows by `ENF_KEY` (with a deterministic source-fact fallback), derives unresolved-linked-violation signals from blank `ACTUAL_RTC_DATE`, sorts the most actionable records first, then returns at most `maxItems` rows.

### Input

| Field | Default | Meaning |
|---|---:|---|
| `lookbackDays` | 90 | Enforcement action lookback, 1–3650 days. |
| `states` | `[]` | Up to 15 two-letter activity states; empty = nationwide. |
| `minPenaltyUsd` | 0 | Minimum source-reported penalty. Positive values exclude missing penalties. |
| `requireUnresolvedLinkedViolation` | false | Keep only actions linked to ≥1 violation whose source `ACTUAL_RTC_DATE` is blank. |
| `maxItems` | 250 | Hard result and billing cap, max 5000. |

```json
{"lookbackDays":30,"states":["TX","LA"],"requireUnresolvedLinkedViolation":true,"minPenaltyUsd":5000,"maxItems":100}
```

### Output

Commercially useful fields include source facts (`facilityName`, `rcraFacilityId`, `enforcementActionType`, `enforcementActionDate`, `penaltyAmountUsd`, linked violation/evaluation types and dates) plus explicitly derived workflow fields: `derivedUnresolvedLinkedViolationCount`, `derivedHasUnresolvedLinkedViolation`, `derivedViolationCount`, `derivedEvaluationCount`, `derivedDaysSinceEnforcement`, and `derivedLatestEvaluationDate`. Every row also carries source/provenance links and the ECHO refresh key.

Illustrative only:

```json
{"opportunityId":"example-action","rcraFacilityId":"TXD000000001","facilityName":"EXAMPLE FACILITY","activityState":"TX","enforcementActionType":"Notice Of Violation","enforcementActionDate":"2026-09-10","penaltyAmountUsd":12500,"violationTypes":"262.A; 265.B","returnToComplianceDates":null,"derivedViolationCount":2,"derivedUnresolvedLinkedViolationCount":2,"derivedHasUnresolvedLinkedViolation":true}
```

| Field | Value (illustrative) |
|---|---|
| `facilityName` | `EXAMPLE FACILITY` |
| `activityState` | `TX` |
| `enforcementActionType` | `Notice Of Violation` |
| `enforcementActionDate` | `2026-09-10` |
| `penaltyAmountUsd` | `12500` |
| `violationTypes` | `262.A; 265.B` |
| `derivedUnresolvedLinkedViolationCount` | `2` |
| `derivedHasUnresolvedLinkedViolation` | `true` |

### Source facts vs derived signals

`penaltyAmountUsd`, action/evaluation/violation types and dates, and `ACTUAL_RTC_DATE` originate in EPA data. `derivedUnresolvedLinkedViolationCount` counts distinct linked violation records whose source `ACTUAL_RTC_DATE` is blank. Blank does **not** prove ongoing noncompliance; it may reflect reporting timing or data quality. The Actor does not infer severity, revenue, propensity to buy, legal status or remediation need.

### API usage

```bash
curl "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=$APIFY_TOKEN" -X POST -H "Content-Type: application/json" -d '{"lookbackDays":30,"states":["TX"],"requireUnresolvedLinkedViolation":true,"maxItems":100}'
```

### Run it weekly

EPA documents the RCRA Pipeline as weekly refreshed, with the refresh run date embedded in `ISN_RCR_EVAL`, so this is built for a weekly cadence:

1. Set your `states`/`requireUnresolvedLinkedViolation`/`minPenaltyUsd` filters, then click **Schedule** on the run page (or create one under **Schedules** in the Apify Console).
2. Run it weekly with a short `lookbackDays` (7-30) to surface fresh response-research candidates each time.
3. Use `opportunityId` as your dedupe key when routing the flat output to CRM, Sheets or downstream automation.

### Data source and trust

Official source: EPA ECHO RCRA Pipeline bulk download. EPA documents that the pipeline explicitly links evaluations to violations and enforcement actions through `ISN_RCR_EVAL`, and that the national ECHO downloads refresh weekly. Required columns are asserted so schema drift fails loudly.

### Reliability

Bounded 429/5xx retry/backoff, HTTP timeout, archive byte cap, ZIP validation, strict CSV/schema checks, action deduplication and hard result cap. A zero-result run fails loudly before delivery and billing.

### Pricing and cost control

One pay-per-event charge of **$0.02 per delivered, deduplicated enforcement action row** (`enforcement-opportunity`). Benchmarked 2026-09-24 against comparable EPA ECHO/RCRA Store Actors (`data/market/store-2026-09-21.jsonl.gz`): EPA RCRA Hazardous Waste Generator Rollup ($0.008), EPA ECHO Enforcement Scraper ($0.008), EPA ECHO Scraper - Facilities, Violations & Compliance Leads ($0.005), EPA Facility & Enforcement Scraper ($0.00999) and EPA ECHO Enforcement Scraper - Violations API ($0.05). $0.02 sits above the median of that set to reflect the multi-table join, deduplication and derived-signal work this Actor does that a flat facility/violation feed does not. Delivery is budget-aware: each batch is cut to what the run's spending limit still covers before it is pushed, so a row is never delivered without being billed for (see `src/charging.js`). `maxItems` caps output and requested billing. A zero-result run fails loudly and charges nothing.

### Limitations

Public regulatory data, not legal advice. EPA/state reporting can lag. A missing `ACTUAL_RTC_DATE` is a source-data condition, not proof of present noncompliance. Missing penalties are `null`, not zero (verified live 2026-09-24: penalty amounts are populated on a small minority of rows in a typical run). Live end-to-end validation performed 2026-09-24 from GitHub Actions (this dev environment has no general egress): the EPA ZIP is reachable (~53 MB), all three pipeline tables parse with every required column present, and prefill-shaped queries return rows nationwide over 7/30/90-day windows.

### FAQ

**Is this another EPA facility scraper?** No. The product object is a recent RCRA enforcement action with its linked evaluation/violation evidence and an optional unresolved-linked-violation workflow filter.

**Does `derivedHasUnresolvedLinkedViolation` mean the facility is currently violating RCRA?** No. It means at least one linked violation record has no source `ACTUAL_RTC_DATE` in the downloaded EPA data.

**Why not use EPA ECHO directly?** You can. This Actor is for buyers who want the multi-table join, action deduplication, commercial filtering, flat export and scheduled automation already done.

**What if nothing matches?** The run fails loudly and charges nothing.

### Related Actors

Other data tools from the same developer, built to the same standard: official or public sources, hard cost caps, and honest documentation of limits.

- **[Federal Register Rule Effective-Date Radar](https://apify.com/lukehunter/federal-rule-effective-date-radar)**: final federal rules about to take effect, with citations, dockets and urgency.
- **[Chicago Contract Recompete & Extension Radar](https://apify.com/lukehunter/chicago-contract-expiration-radar)**: expiring City of Chicago contracts with extension history, for recompete prospecting.
- **[Bank Branch Closings & Merger Radar (FDIC)](https://apify.com/lukehunter/bank-branch-merger-radar)**: new US bank branch closings, openings and mergers from the FDIC.
- **[Chicago New Business License Radar](https://apify.com/lukehunter/chicago-new-business-license-radar)**: newly licensed Chicago businesses as opening leads, grouped by category.
- **[NYC FDNY Contractor Leads & Hearing Radar](https://apify.com/lukehunter/fdny-violation-radar)**: fresh NYC fire-code summonses routed by remediation trade, with hearing dates.
- **[Emerging Federal Contractor Radar](https://apify.com/lukehunter/emerging-federal-contractor-radar)**: companies that just won their first federal contracts, from USAspending.gov.
- **[Hospital Price Transparency Enforcement Leads](https://apify.com/lukehunter/hospital-price-transparency-enforcement-leads)**: hospitals with recent CMS price transparency warning notices, CAP requests and CMP notices.
- **[Hospital Ownership Change Radar](https://apify.com/lukehunter/hospital-chow-radar)**: hospitals that just changed owner, with buyer, seller and effective date from CMS filings.
- **[New Healthcare Organization NPI Radar](https://apify.com/lukehunter/new-healthcare-organization-npi-radar)**: newly registered healthcare organizations from CMS's weekly NPI file, by provider type.
- **[County Multifamily Building Permits Surge Radar](https://apify.com/lukehunter/county-multifamily-permit-surge-radar)**: U.S. counties where 5+ unit apartment permits are surging year over year.
- **[Zillow ZIP Code Property Search Scraper](https://apify.com/lukehunter/zillow-zip-scraper)**: for-sale listings by ZIP code with prices, price cuts and days on Zillow.
- **[Walmart Category Scraper](https://apify.com/lukehunter/walmart-category-scraper)**: product names, prices, was-prices and ratings from Walmart category pages.

# Actor input Schema

## `lookbackDays` (type: `integer`):

Include EPA RCRA enforcement actions taken within this many days before today, 1-3650, default 90.

## `states` (type: `array`):

Two-letter state codes to include (e.g. TX, LA), up to 15. Leave empty for nationwide results.

## `minPenaltyUsd` (type: `number`):

Only include enforcement actions whose published penalty is at least this many US dollars, 0-1000000000, default 0. 0 includes actions with no published penalty.

## `requireUnresolvedLinkedViolation` (type: `boolean`):

Keep only enforcement actions linked by EPA to at least one violation whose ACTUAL\_RTC\_DATE is blank. This is a derived workflow filter, not a claim of current noncompliance.

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

Hard cap on delivered opportunities, and therefore on billable events for this run, 1-5000, default 250.

## Actor input object example

```json
{
  "lookbackDays": 90,
  "minPenaltyUsd": 0,
  "requireUnresolvedLinkedViolation": false,
  "maxItems": 250
}
```

# Actor output Schema

## `opportunities` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("lukehunter/rcra-enforcement-radar").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("lukehunter/rcra-enforcement-radar").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 '{}' |
apify call lukehunter/rcra-enforcement-radar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lukehunter/rcra-enforcement-radar"
        }
    }
}
```

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/epOx9rrdXaQNBce93/builds/G10OqmfbycGumYFx5/openapi.json
