What REST APIs the EPA actually offers for emission factors (none), what doesn't exist, and the practical options for accessing eGRID, AP-42, WebFIRE, and CHIEF data programmatically.
No. As of 2026, the EPA publishes its emission factor databases - eGRID, AP-42, WebFIRE, CHIEF, and the GHG Emission Factors Hub - as downloadable files (Excel, CSV, PDF), but does not operate a public REST API for any of them. To access EPA emission factors programmatically, you either use a third-party REST API that wraps the EPA data (such as emission-factors.com for eGRID) or parse the EPA downloads yourself.
The EPA publishes several distinct emission factor databases. Picking the right one depends entirely on what you're calculating. Here's a decision matrix:
| If you need | Use this EPA database | API exists? |
|---|---|---|
| CO2e per kWh of electricity by US location | eGRID | Third-party (emission-factors.com) |
| Combustion emissions (boilers, engines, vehicles) | AP-42 | No - download only |
| Industrial process emission factors (cement, steel, etc.) | WebFIRE | No - web search only |
| State Implementation Plan / NEI inventory data | CHIEF | No - download only |
| GHG Protocol cross-reference factors (mobile, fuel, refrigerants) | GHG Emission Factors Hub | No - PDF/Excel |
For most carbon accounting use cases (Scope 2 reporting, CDP, CSRD, SB 253), eGRID is the answer. The other databases come into play for Scope 1, air quality compliance, or specialty industrial applications.
What it is: The Emissions & Generation Resource Integrated Database. EPA aggregates emissions from every US electric power plant by 27 grid subregions and publishes annual emission factors (CO2e, CO2, CH4, N2O, NOx, SO2) plus generation mix per subregion.
Latest release: eGRID2023 Rev2, released June 2025. Preliminary eGRID2024 data became available late 2025.
What EPA provides:
eGRID2023_data.xlsx) with subregion factorsWhat EPA does NOT provide: A REST API. There is no https://api.epa.gov/egrid/... endpoint in 2026.
Practical API options for eGRID:
| Option | Cost | Signup |
|---|---|---|
| emission-factors.com (this site) | Free | None |
| Climatiq | Limited free tier, paid plans typically high three to low four figures/mo | Required |
| Build your own (parse eGRID Excel + EPA shapefiles) | Engineering time | N/A |
If you only need US Scope 2 location-based factors, the third-party wrappers are dramatically faster than building from EPA's raw downloads. The build-it-yourself path requires GIS work to map ZIPs to subregions, which is non-trivial.
What it is: The Compilation of Air Pollutant Emission Factors. Used to calculate emissions from stationary combustion sources (boilers, internal combustion engines, gas turbines), industrial processes, and certain mobile sources. The reference for Scope 1 stationary combustion, air quality permits, and Title V applications.
What EPA provides: AP-42 chapters as PDF documents on epa.gov. Each chapter is a PDF describing emission factors for a specific source category.
API status: No API. AP-42 lookup means downloading PDFs and extracting factors manually. There are no third-party REST APIs that comprehensively wrap AP-42 either - the structure is inherently document-oriented (text descriptions, tables of factors with footnotes about applicability).
Practical advice: If you need AP-42 programmatically, you're going to maintain your own internal database. Some carbon accounting platforms (Climatiq, Sphera) have AP-42-derived factors in their data layer but typically require enterprise-tier subscriptions.
What it is: The EPA's Factor Information REtrieval Data System. A web tool for searching emission factors across pollutant, source category, control technology, and other dimensions. Includes AP-42 factors plus additional industrial source data.
What EPA provides: A searchable web interface. You enter parameters (SCC code, pollutant, control device) and get back matching factors with citations.
API status: No API. WebFIRE is web-only. There is no documented WebFIRE API endpoint in 2026.
For automation: The data behind WebFIRE is published as bulk downloads on epa.gov. If you need WebFIRE-equivalent data programmatically, you download the source files and build your own search index.
What it is: The Clearinghouse for Inventories & Emissions Factors - the parent program that hosts AP-42, WebFIRE, and the National Emissions Inventory (NEI). CHIEF is more of an umbrella than a single dataset.
What EPA provides: Bulk downloads of NEI data (every several years, latest is NEI 2020), reference databases, and documentation. Available at epa.gov/chief.
API status: No public REST API for CHIEF or NEI data. Bulk download only.
What it is: EPA's annual GHG Emission Factors Hub, a consolidated reference document with factors for purchased electricity (sourced from eGRID), mobile combustion, business travel, employee commuting, and other categories most relevant to corporate Scope 1, 2, and 3 inventories.
What EPA provides: An annual PDF and Excel workbook. The 2025 update (released June 2025) is the current version for 2026 reporting.
API status: No API. The Hub is a curated reference document, not a queryable database. Some categories within it (notably purchased electricity) trace back to eGRID, which has third-party API options as covered above.
| Provider | Coverage | Free tier | Best for |
|---|---|---|---|
| emission-factors.com | EPA eGRID (US Scope 2 only) | Free, no key, no signup | US-only Scope 2, indie devs, AI agents (MCP server) |
| Climatiq | Global, multi-scope, supply chain | Limited, signup required | Enterprise platforms, global coverage, ISO-audited needs |
| Carbon Interface | Activity-based (electricity, fuel, flights) | Trial | Quick prototyping |
| CO2API | European focus, some global | Limited | EU-focused projects |
| Sphera, Persefoni, IBM Envizi | Full carbon accounting platforms | None - enterprise only | Large corporates with budget |
All examples below have been tested against the live API. The JSON output shown is the real, current response.
curl "https://emission-factors.com/api/lookup?zip=94105"
Real response (verified April 2026, eGRID2023 Rev2):
{
"zip": "94105",
"candidates": [{
"subregion": "CAMX",
"data_year": "eGRID2023 Rev2 (2025-06-12)",
"methodology": "eGRID subregion output emission rates (location-based)",
"co2e_kg_per_kwh": 0.195037,
"co2e_lb_per_mwh": 429.983,
"co2_kg_per_kwh": 0.194348,
"ch4_kg_per_kwh": 1.134e-05,
"n2o_kg_per_kwh": 1.36e-06,
"co2_nonbaseload_kg_per_kwh": 0.434679,
"nox_lb_per_mwh": 0.332,
"so2_lb_per_mwh": 0.02,
"carbon_free_pct": 54.34,
"renewable_pct": 46.36,
"generation_mix": {
"coal_pct": 2.09, "gas_pct": 42.77,
"nuclear_pct": 7.98, "hydro_pct": 14.06,
"wind_pct": 6.58, "solar_pct": 20.04,
"geothermal_pct": 3.59, "biomass_pct": 2.19,
"other_fossil_pct": 0.7, "oil_pct": 0, "other_pct": 0
}
}],
"notes": "Single-subregion ZIP"
}
import requests
API_BASE = "https://emission-factors.com"
def lookup_factor(zip_code: str) -> dict:
"""Return the primary emission factor record for a US ZIP."""
r = requests.get(
f"{API_BASE}/api/lookup",
params={"zip": zip_code},
timeout=10,
)
r.raise_for_status()
data = r.json()
if not data.get("candidates"):
raise ValueError(f"No subregion mapping for ZIP {zip_code}")
return data["candidates"][0]
def calc_scope2_kg(zip_code: str, kwh: float) -> float:
"""Location-based Scope 2 emissions in kg CO2e."""
factor = lookup_factor(zip_code)
return kwh * factor["co2e_kg_per_kwh"]
# Example - HQ in 94105 with 1.2M kWh/year
kg = calc_scope2_kg("94105", 1_200_000)
print(f"Scope 2: {kg:,.0f} kg CO2e ({kg/1000:.1f} tonnes)")
# Output: Scope 2: 234,044 kg CO2e (234.0 tonnes)
async function lookupFactor(zip: string) {
const res = await fetch(
`https://emission-factors.com/api/lookup?zip=${zip}`
);
if (!res.ok) throw new Error(`API error ${res.status}`);
const data = await res.json();
return data.candidates[0];
}
async function scope2Tonnes(zip: string, kwh: number) {
const f = await lookupFactor(zip);
return (kwh * f.co2e_kg_per_kwh) / 1000;
}
// Real numbers across grids:
// ZIP 94105 (CAMX/California): 0.1950 kg/kWh -> cleanest
// ZIP 60601 (RFCW/Ohio Valley): 0.4155 kg/kWh -> 2.1x dirtier
// ZIP 75201 (ERCT/Texas): 0.3343 kg/kWh -> 1.7x dirtier
console.log(await scope2Tonnes("94105", 1_200_000)); // 234.0
console.log(await scope2Tonnes("60601", 1_200_000)); // 498.6
console.log(await scope2Tonnes("75201", 1_200_000)); // 401.2
curl -X POST https://emission-factors.com/api/calculate \
-H "Content-Type: application/json" \
-d '{"zip": "94105", "kwh": 1200000}'
Real response:
{
"zip": "94105",
"kwh": 1200000,
"candidates": [{
"subregion": "CAMX",
"co2e_kg": 234044.4,
"co2e_lb": 515979.6,
"co2e_kg_per_kwh": 0.195037,
"co2e_lb_per_mwh": 429.983,
"data_year": "eGRID2023 Rev2 (2025-06-12)",
"methodology": "eGRID subregion output emission rates (location-based)"
}],
"notes": "Single-subregion ZIP"
}
curl -X POST https://emission-factors.com/api/lookup/batch \
-H "Content-Type: application/json" \
-d '{"zips": ["94105", "10001", "60601", "75201", "33101"]}'
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"emission-factors": {
"url": "https://emission-factors.com/mcp"
}
}
}
Restart Claude. Then ask: "What's the carbon intensity of electricity in ZIP 94105?" Claude calls the MCP server directly and returns the answer with the EPA citation. Full MCP setup guide.
The dramatic point about US grid heterogeneity - all factors below are real values from eGRID2023 Rev2 returned by the API. A 1 GWh/year facility produces:
| Location | Subregion | kg CO2e/kWh | Tonnes/year (1 GWh) | Carbon-free % |
|---|---|---|---|---|
| San Francisco, CA | CAMX | 0.1950 | 195 | 54% |
| New York, NY | NYCW | 0.3928 | 393 | ~1% |
| Dallas, TX | ERCT | 0.3343 | 334 | 37% |
| Chicago, IL | RFCW | 0.4155 | 416 | 36% |
| Detroit, MI | RFCM | 0.4426 | 443 | 21% |
| Seattle, WA | NWPP | 0.2880 | 288 | 58% |
| Atlanta, GA | SRSO | 0.3815 | 382 | ~32% |
Same kWh consumption, 2.3x range in resulting emissions depending on grid. This is exactly why national-average emission factors are misleading and ZIP-specific lookups matter for accurate Scope 2 reporting.
Historical and structural reasons. EPA's emission factor databases predate the modern REST API era and are managed by separate offices with different cadences (eGRID is annual, AP-42 chapters are revised individually). Recent EPA data modernization efforts focus on the EJScreen environmental justice tool and AirNow real-time air quality - not emission factor APIs. There has been no public roadmap from EPA to add APIs as of 2026.
Yes, as long as the underlying data is the official EPA source. emission-factors.com uses unmodified eGRID2023 Rev2 factors with the full citation chain documented. CDP, CSRD, and SB 253 reporting frameworks accept any methodology that uses the official EPA data and clearly cites the source - they don't require you to download the raw EPA file yourself.
Technically yes - eGRID data is public domain. The work is: parse the Excel workbook, build a ZIP-to-subregion mapping (requires EPA shapefiles + GIS work), keep up with annual updates, handle preliminary vs final releases. Most teams who try this end up either dropping the project or using a third-party API after a few months.
eGRID factors are annual aggregates - they don't change in real time. For real-time grid carbon intensity, you'd want APIs like WattTime, Electricity Maps, or the EPA's CAMD (Continuous Emissions Monitoring) hourly data. Those are different products from the static emission factors covered here.
If your company has Scope 1 stationary combustion (boilers, gas furnaces, etc.) you'll need AP-42 or equivalent for those sources, AND eGRID for purchased electricity (Scope 2). Most corporate inventories use both. emission-factors.com only covers eGRID.
curl https://emission-factors.com/api/lookup?zip=94105 returns the EPA eGRID emission factor for San Francisco's grid. Free, no signup. Full API docs.