# EPA FRS Facility Registry Scraper (`parseforge/epa-frs-facility-registry-scraper`) Actor

Scrapes EPA FRS facility records by US state or territory and optional program system. Returns each facility as a flat row with registry ID, name, address, and program interests.

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

## Pricing

from $3.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 FRS Facility Registry Scraper

**Scrape EPA FRS facility records for any US state or territory, up to a million per run.** Each facility comes with its registry ID, name, address, and program interests. No API key or login. Export to CSV, JSON, Excel, or XML.

The EPA Facility Registry Service (FRS) is the master list of regulated facilities in the United States, but its public query tool is slow and hard to export. This Actor reads the FRS facility search directly, filtered by state and optional EPA program system, and returns each match in one flat row. You get the same data the EPA publishes, ready for analysis.

| Who uses it | What they scrape EPA FRS Facility Registry for |
|---|---|
| Environmental consultants | Building a list of regulated facilities in a state for compliance audits |
| Market researchers | Identifying industrial sites by environmental program participation |
| Data journalists | Mapping pollution sources and permit holders for investigative stories |
| Regulatory analysts | Tracking which facilities fall under specific EPA programs |

### What it does

This Actor collects EPA FRS facility records by US state or territory and optional program system, and returns each facility as a flat row.

- 🗺️ **State or territory filter:** choose any US state, DC, Puerto Rico, or other territory.
- 🏭 **Program system filter:** narrow to NPDES, RCRA, TRI, air, drinking water, and more.
- 📦 **Bulk export:** pull up to 1,000,000 facilities per run, then 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 FRS Facility Registry data

**📋 Build a state compliance list.**

An environmental consultant selects California and the RCRAINFO program to get every hazardous waste facility in the state for a client audit.

**🗺️ Map pollution sources.**

A data journalist pulls all TRI facilities in Texas and joins the addresses to census data to show which communities host toxic emitters.

**🏭 Find permit holders.**

A market researcher filters for NPDES in Ohio to identify industrial water users for a wastewater treatment sales campaign.

**📊 Track program coverage.**

A regulatory analyst runs the Actor for all states with no program filter to count how many facilities appear in each EPA system.

### Why choose this scraper

|  | What you get |
|---|---|
| **No API key** | The FRS public API requires registration and has rate limits. This Actor reads the public search directly. |
| **One flat row per facility** | Registry ID, name, address, and program interests land in a fixed schema, ready for spreadsheets. |
| **Program-level filtering** | Target only NPDES water permits, RCRA hazardous waste, TRI toxics, or any of 18 program systems. |

### How it compares

No other Store actor targets EPA FRS Facility Registry the same way, so the honest comparison is with the alternatives teams actually weigh.

| | EPA FRS Facility Registry Scraper | Build it in-house | By hand |
|---|---|---|---|
| Setup | Run it now, zero config | Days of engineering | None, but hours per pull |
| When EPA FRS Facility Registry changes | Maintained for you | You fix it | You re-learn the page |
| Proxies, retries, anti-bot | Built in | Your problem | Browser only |
| Output | Fixed JSON schema, CSV/Excel export | Whatever you build | Copy-paste |
| Cost | Pay per result | Engineering time | Analyst hours |

### Configure the run

Drive the Actor with a state or territory code and an optional EPA program system acronym. Filters run as each facility is read, so only matches reach your dataset. 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.004 per result** collected. You pay only for the results written to your dataset.

| Results collected | Approximate cost |
|---|---|
| 100 results | $0.40 |
| 1,000 results | $4.00 |
| 10,000 results | $40.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 FRS Facility Registry Scraper](https://apify.com/parseforge/epa-frs-facility-registry-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 FRS Facility Registry 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-frs-facility-registry-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 the state code is correct and that the program system filter is not too narrow. Some states have few facilities in certain programs. Try setting the program filter to Any.

**The run stops before reaching my maxItems.**

The Actor stops when it has collected all facilities that match your filters. If the state has fewer facilities than your maxItems, you will get all of them.

**I get an error about the state code.**

Use the two-letter USPS code, such as CA for California or PR for Puerto Rico. The input dropdown lists all valid codes.

**The dataset has duplicate facilities.**

A facility can appear in multiple program systems, but the Actor returns one row per facility. If you see duplicates, check that you did not run the same state twice and merge the datasets.

**Can I get more than 1,000,000 facilities?**

The maximum is 1,000,000 per run. If you need more, split the work by state or program and run multiple times, then merge the results.

### FAQ

| Question | Answer |
|---|---|
| What is the EPA FRS? | The Facility Registry Service is the EPA's central database of facilities regulated under environmental statutes. It assigns a unique FRS ID to each site and links it to program systems like NPDES, RCRA, and TRI. |
| Do I need an EPA API key? | No. This Actor reads the public FRS facility search directly, so you can run it without registering for an EPA account or dealing with rate limits. |
| Can I filter by facility name or address? | The current input only supports state and program system filters. If you need name or address search, contact support and we can add it. |
| What does the program system filter do? | It limits results to facilities that participate in a specific EPA program, such as NPDES for water discharge permits or RCRAINFO for hazardous waste. Leave it on Any to include all facilities. |
| How many facilities can I get in one run? | You can set the maximum up to 1,000,000. The actual number depends on how many facilities exist in the selected state and program. |
| Which states and territories are supported? | All 50 states, the District of Columbia, Puerto Rico, the US Virgin Islands, Guam, American Samoa, and the Northern Mariana Islands. |
| What fields are returned for each facility? | Each row includes the FRS registry ID, facility name, address, city, state, ZIP, and the program systems the facility is linked to. The exact field list is shown in the sample output. |
| Can I export the data? | Yes. After the run, download the dataset as CSV, JSON, Excel, or XML from the Apify platform. |
| Is this the same data as EPA ECHO? | ECHO is a separate EPA system focused on enforcement and compliance. FRS is the underlying facility registry. This Actor scrapes FRS, not ECHO. |
| How often is the data updated? | The Actor reads live data from the EPA FRS search each time it runs, so you always get the current registry. |

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

## `stateCode` (type: `string`):

US state or territory to pull regulated facilities for.

## `programAcronym` (type: `string`):

Optional EPA program system to filter facilities by. Leave on Any to include all programs.

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

Maximum number of facilities to collect per run.

## Actor input object example

```json
{
  "stateCode": "CA",
  "programAcronym": "",
  "maxItems": 10
}
```

# Actor output Schema

## `results` (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 = {
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/epa-frs-facility-registry-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-frs-facility-registry-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-frs-facility-registry-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/epa-frs-facility-registry-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/krvQVhgbgz7Bm2XVk/builds/w3AdfgapmZxSL5jKW/openapi.json
