BYTETOOLS

EPA Envirofacts API

Free US EPA Envirofacts API with no key: toxic release inventory, facility permits, air and water compliance data across US environmental programmes. Tested.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-19

What is the EPA Envirofacts API?

The EPA Envirofacts API is a free, key-free US government API exposing environmental databases including the Toxics Release Inventory, facility registry, air emissions and water discharge permits.

Envirofacts provides direct query access to the EPA's underlying database tables, covering which facilities release which chemicals, their permits and their compliance history. It is unusually granular open data.

The URL structure is a REST wrapper over table queries rather than a curated API: you name the table, a column filter, a row range and an output format. That is powerful but unforgiving — you need to know the table and column names, which the EPA documents separately.

Quick facts

Base URL
https://data.epa.gov/efservice
Authentication
No API key required.
Rate limit
No published hard limit; row ranges keep responses manageable.
Pricing
Free public domain US government data.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the EPA Envirofacts API

Every request below was executed against the live API on 2026-08-19, and the response shown is the real body it returned — not an illustration.

1. Query facilities from the Toxics Release Inventory

GET https://data.epa.gov/efservice/tri_facility/state_abbr/CA/rows/0:1/JSON

curl
curl 'https://data.epa.gov/efservice/tri_facility/state_abbr/CA/rows/0:1/JSON'
JavaScript (fetch)
const res = await fetch("https://data.epa.gov/efservice/tri_facility/state_abbr/CA/rows/0:1/JSON");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://data.epa.gov/efservice/tri_facility/state_abbr/CA/rows/0:1/JSON", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
[
  {
    "tri_facility_id": "90001BCNCX935E5",
    "facility_name": "NEWARK CUSTOM PAPERBOARD",
    "street_address": "935 E 59TH ST",
    "city_name": "LOS ANGELES",
    "county_name": "LOS ANGELES",
    "state_county_fips_code": "06037",
    "state_abbr": "CA",
    "zip_code": "900011007",
    "region": "9",
    "fac_closed_ind": "1",
    "mail_name": "NEWARK CUSTOM PAPERBOARD",
    "mail_street_address": "935 E 59TH ST",
    "mail_city": "LOS ANGELES",
    "mail_state_abbr": "CA",
    "mail_province": null,
    "mail_country": null,
    "mail_zip_code": "90001-1007",
    "asgn_federal_ind": "C",
    "asgn_agency": null,
    "frs_id": null,
    "parent_co_db_num": "085653186",
    "parent_co_name": "THE NEWARK GROUP INC",
    "fac_latitude": null,
    "fac_longitude": null,
    "pref_latitude": null,
    "pref_longitude": null,
    "pref_accuracy": null,
    "pref_collect_meth": null,
    "pref_desc_category": null,
    "pref_horizontal_datum": null,
    "pref_source_scale": null,
    "pref_qa_code": null,
    "asgn_partial_ind": "0",
    "asgn_public_contact": "PAUL WOODS",
    "asgn_public_phone": "3232321108",
    "asgn_public_contact_email": "PWOODS@TNGUS.COM",
    "bia_code": null,
    "standardized_parent_company": "THE NEWARK GROUP INC",
    "asgn_public_phone_ext": null,
    "epa_registry_id": "110031000235",
    "asgn_technical_contact": null,
    "asgn_technical_phone": null,
    "asgn_technical_phone_ext": null,
    "mail": null,
    "asgn_technical_contact_email": null,
    "foreign_parent_co_name": null,
    "foreign_parent_co_db_num": null,
    "standardize

Parameters

ParameterTypeRequiredDescription
<table>pathRequiredDatabase table name. tri_facility
<column>/<value>pathOptionalColumn filter as consecutive path segments. state_abbr/CA
rows/<start>:<end>pathOptionalRow range — always include this. rows/0:9
<format>pathRequiredJSON, CSV or XML as the final segment. JSON

Response fields

tri_facility_idstring
EPA facility identifier.
facility_namestring
Facility name.
street_address / city_name / state_abbrstring
Facility location.
county_namestring
County.
(varies by table)mixed
Columns depend entirely on which table you query.

What you can build with the EPA Envirofacts API

  • Map industrial facilities and their reported chemical releases
  • Research environmental compliance history for a location
  • Support environmental justice and public health analysis
  • Build local pollution transparency tools

Common errors and how to fix them

Enormous response or timeout

No row range was specified.

Fix: Always append rows/0:99 or similar — unbounded table queries return everything.

Empty array

Wrong table or column name.

Fix: Table and column names are database identifiers; check the EPA model documentation rather than guessing.

Format defaults unexpectedly

The output format is the last path segment.

Fix: End the URL with /JSON explicitly.

EPA Envirofacts API — frequently asked questions

Is the EPA Envirofacts API free?

Yes, completely free with no API key. It is public domain US government environmental data.

How is the URL structured?

As a table query: /efservice/<table>/<column>/<value>/rows/<start>:<end>/JSON. You name the table, filter, row range and format as path segments.

Why did my query return an enormous response?

You omitted the row range. Always include rows/0:99 or similar, or the API returns every matching row in the table.

What is the Toxics Release Inventory?

A mandatory US programme requiring facilities to report annual releases of listed toxic chemicals. The tri_ tables in Envirofacts expose that data at facility level.

Tools that pair with this API

EPA Envirofacts is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-19; always check the official documentation before relying on this API in production, as terms and limits can change.