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.
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 'https://data.epa.gov/efservice/tri_facility/state_abbr/CA/rows/0:1/JSON'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);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())[
{
"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,
"standardizeParameters
| Parameter | Type | Required | Description |
|---|---|---|---|
<table> | path | Required | Database table name. tri_facility |
<column>/<value> | path | Optional | Column filter as consecutive path segments. state_abbr/CA |
rows/<start>:<end> | path | Optional | Row range — always include this. rows/0:9 |
<format> | path | Required | JSON, 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
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
CSV to JSON Converter
Convert CSV to a JSON array of objects online. Header-row detection, comma/semicolon/tab delimiters and pretty-printed output — 100% in your browser.
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.