# EPA Fuel Programs Registered Companies and Facilities (`tehsnarf/epa-fuel-programs-registration-lists`) Actor

Download and normalize EPA's official daily-updated Part 80 Fuel Programs registered company/facility list.

- **URL**: https://apify.com/tehsnarf/epa-fuel-programs-registration-lists.md
- **Developed by:** [Chris Hoover](https://apify.com/tehsnarf) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

## EPA Fuel Programs Registered Companies and Facilities

Downloads and normalizes EPA's official, daily-updated Part 80 Fuel Programs registration list of companies and facilities (refiners, importers, blenders, terminals) into a clean, filterable dataset — no HTML scraping, no selector drift, straight from EPA's own report endpoint.

### What it does

- Fetches EPA's "Part 80: EPA Fuel Programs Registered Company/Facility ID List (xls) (Updated Daily)" report
- Parses the legacy `.xls` workbook's `Part 80 Company Information` sheet (~13,500 rows)
- Normalizes company vs. facility address/city/state/zip fields (the source file duplicates these column names)
- Applies optional state, program-type, and company-name filters
- Charges/stops per Apify's pay-per-event budget, same as every other dataset-item Actor in this account

### Use cases

1. Compliance analysts checking which companies/facilities are registered under a given EPA fuel program (e.g. Renewable Fuel Standard, Gasoline, Diesel)
2. Fuels-market researchers building a state-by-state or region-by-region view of registered refiners/importers/blenders
3. Procurement or vendor-risk teams verifying a counterparty's EPA fuel-program registration status before contracting

### Input

- `maxItems`: maximum number of rows to return (default 100, up to 20,000 — the full file has ~13,500 rows)
- `stateFilter`: optional array of 2-letter state codes; matches either the company's or the facility's state
- `programTypeContains`: optional substring filter on registered program types (e.g. `"Renewable Fuel Standard"`, `"Gasoline"`, `"Diesel"`)
- `companyNameContains`: optional substring filter on company name

### Output fields

| Field | Type | Description |
|---|---|---|
| `companyId` | string | EPA internal company ID |
| `companyName` | string | Registered company name |
| `companyAddress` | string | Company street address |
| `companyCity` | string | Company city |
| `companyState` | string | Company state |
| `companyPostalCode` | string | Company postal code |
| `programTypes` | string | Registered fuel programs (comma-separated) |
| `businessActivities` | string | Registered business activities (comma-separated) |
| `otaqProgramId` | string | OTAQREG program registration ID |
| `otaqReportingId` | string | OTAQ reporting ID(s), comma-separated |
| `facilityName` | string | Registered facility name (blank if company-level only) |
| `facilityAddress` | string | Facility street address |
| `facilityCity` | string | Facility city |
| `facilityState` | string | Facility state |
| `facilityPostalCode` | string | Facility postal code |
| `facilityType` | string | Facility fuel/product type |
| `facilityActivities` | string | Registered facility activities |
| `offRoadOnly` | string | `Y`/`N`/blank — fuel only sold for off-road use flag |
| `sourceUrl` | string | The EPA report URL this row was pulled from |
| `updateCadence` | string | `daily` — EPA's stated update frequency |
| `crawlTimestamp` | string | ISO-8601 timestamp this row was fetched |

### Example output

```json
{
  "companyId": "4701",
  "companyName": "121 POINT BREEZE MANAGEMENT CORP",
  "companyAddress": "6310 W PASSYUNK AVE",
  "companyCity": "PHILADELPHIA",
  "companyState": "PA",
  "companyPostalCode": "19153",
  "programTypes": "Diesel, Gasoline",
  "businessActivities": "Truck Loading Terminal/Locomotive Marker Facility, Oxygenate Blender, Refiner",
  "otaqProgramId": "OTAQREG10032131",
  "otaqReportingId": "21060, 01101",
  "facilityName": "POINT BREEZE TERMINAL",
  "facilityAddress": "6310 W. PASSYUNK AVENUE",
  "facilityCity": "PHILADELPHIA",
  "facilityState": "PA",
  "facilityPostalCode": "19153",
  "facilityType": "Gas/Ethanol",
  "facilityActivities": "Oxygenate Blender, Refinery",
  "offRoadOnly": "Y",
  "sourceUrl": "https://cdxoarapps.epa.gov/oar-otaq-reg-III/rest/public/reports/Part80FuelsProgramsList",
  "updateCadence": "daily",
  "crawlTimestamp": "2026-08-12T08:15:04.758842+00:00"
}
```

### Pricing

$4 per 1,000 results.

| Results | Cost |
|---|---|
| 100 | $0.40 |
| 500 | $2.00 |
| 1,000 | $4.00 |
| 5,000 | $20.00 |

### Notes

- Single-request Actor: the entire dataset is one EPA-hosted file, refreshed daily, so there's no pagination or per-item fetching — just one download and a local parse.
- Scope: covers EPA's Part 80 registered company/facility list only. Part 79 registered fuels/fuel additives (the separate gasoline/diesel/biodiesel/detergent/E15 additive lists) were evaluated and descoped from v1 — see `design.md` for why.

# Actor input Schema

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

Maximum number of rows to return (the full daily file has ~13,500 rows)

## `stateFilter` (type: `array`):

Optional 2-letter US state codes; matches either company or facility state

## `programTypeContains` (type: `string`):

Optional substring filter on registered program types (e.g. Renewable Fuel Standard, Gasoline, Diesel)

## `companyNameContains` (type: `string`):

Optional substring filter on company name

## Actor input object example

```json
{
  "maxItems": 100,
  "stateFilter": [],
  "programTypeContains": "",
  "companyNameContains": ""
}
```

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

// Run the Actor and wait for it to finish
const run = await client.actor("tehsnarf/epa-fuel-programs-registration-lists").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("tehsnarf/epa-fuel-programs-registration-lists").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 tehsnarf/epa-fuel-programs-registration-lists --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tehsnarf/epa-fuel-programs-registration-lists"
        }
    }
}

```

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/DCKWmC8iwlKcdu868/builds/exzNp0Nn7feJyM3vJ/openapi.json
