# emission-factors.com (EPA eGRID Emission Factors REST API by US ZIP) > emission-factors.com is a free REST API + MCP server that turns any US ZIP code into its EPA eGRID grid-carbon emission factor - plus retail electricity rate (EIA Form 861), hourly grid carbon (EIA-930), utility tariffs (OpenEI URDB), and plant-level emissions (EPA CAMD). Built for developers and sustainability teams doing Scope 2 carbon accounting (CDP, CSRD, California SB 253). Includes a free MCP server for Claude and AI agents. Note: the "API" in our product name refers to application programming interface (a REST API), not the American Petroleum Institute (api.org). This is also NOT emissionfactors.xyz or CO2API - those are different services. Official domain: https://emission-factors.com Contact: support@emission-factors.com Auth: none. Keyless - no key, no signup. Rate-limited to 2,000 requests/hour per IP (REST and /mcp alike). Data: EPA eGRID2023 Rev 2 (default, released June 2025) and eGRID2024 from Cornerstone (via ?year=2024), 27 subregions, 33,700+ US ZIP codes ## Products - **Free API** (keyless): emission factors by ZIP code, no key or signup - **Free MCP Server** (https://emission-factors.com/mcp): remote MCP for Claude Desktop, Cursor, Cline, and any AI agent. Streamable HTTP transport. No install. ## REST Endpoints - GET /api/lookup?zip=94105 - emission factors for a ZIP code (eGRID2023 by default) - GET /api/lookup?zip=94105&year=2024 - eGRID2024 (Cornerstone) factors (responses include data_status: "non_epa" and data_source) - POST /api/lookup/batch - up to 100 ZIPs: ["94105","10001","60601"] - Edition policy: Scope 2 defaults to EPA eGRID2023 Rev2 (EPA's latest; it has published nothing since) so location- and market-based share a base year with the Green-e residual mix. eGRID2024 from Cornerstone (built with EPA's open code, CC-BY-4.0) is available via year=2024, location-based only. The 2026 GHG Emission Factors Hub used for Scope 1 lists eGRID2024 electricity factors, so expect ~2% differences against it. The default moves to eGRID2024 once Green-e publishes a residual mix built on it (revisited by 2027-02-01). Every Scope 2 response carries edition_note. - POST /api/calculate - ZIP + kWh → kg CO₂e by both GHG Protocol Scope 2 methods (unknown fields such as "unit" are rejected; kwh is always kWh): {"zip":"94105","kwh":50000,"renewable_kwh":10000}. candidates[].co2e_kg is location-based (eGRID); candidates[].market_based.co2e_kg applies the Green-e residual mix to kWh not covered by RECs/PPAs/green tariffs (renewable_kwh, optional). - POST /api/bulk - upload CSV with ZIP column, get it back enriched with EPA factors - GET /api/lookup/by-coordinates?lat=37.7749&lon=-122.4194 - lat/lon → ZIP → factors - GET /api/rate?zip=94105 - Latest monthly average retail electricity rate ($/kWh and cents/kWh) broken out by sector (residential, commercial, industrial). Data from EIA Form 861, state-level (not utility- or ZIP-specific). For a utility's own tariff use /api/utility-rate. - GET /api/intensity?zip=94105&hours=24 - Hourly grid carbon intensity derived from EIA-930 hourly fuel-mix data (data lags up to ~1 day). Returns per-hour intensity_kg_co2e_per_kwh, fuel_mix, and total_generation_mwh for the balancing authority serving that ZIP. For timing and analysis (demand response, load shifting, grid patterns), not inventory reporting: it uses fixed per-fuel combustion factors on in-BA generation (no imports), so its values don't match eGRID's annual factors. For LIVE intensity, use WattTime or Electricity Maps. Supports ?ba=CISO directly (47 Lower-48 balancing authorities mapped; 46 currently report to EIA-930, WACM stopped on 2026-04-02). A ZIP maps to its BA via the first of its utilities we can place in a BA, then state + eGRID subregion, then state (ba_basis in the response; ba_note when its utilities sit in different BAs). Battery/storage output is never counted (storage_excluded: true); where a BA reports batteries inside "OTH", OTH is left out too (other_excluded: true). NYISO reports its solar and biomass as OTH, so NYIS OTH counts as carbon-free. Negative values count as 0. Values are BA-wide: use them for timing; a household footprint uses the annual eGRID factor. Data is kept warm in the background; if EIA has not answered for 2+ hours, warnings says so. - GET /api/intensity?ba=CISO&aggregate=hour_of_day - Pre-computed 24-hour average intensity profile across the last 7 days. Returns cleanest_hour_utc, dirtiest_hour_utc, swing_ratio, and all 24 hour averages. Reproduces the CA/TX/NY comparison charts in one call. - GET /api/plant-emissions?state=TX&days=7 (or ?facility_id=3; begin and end set a custom window) - Unit-level emissions from EPA Clean Air Markets Division (CAMD) for fossil units >25 MW. Default output: per-facility summary from daily data with CO2 (short tons), gross load (MWh), heat input (mmBtu), NOx/SO2 (lb), operating hours, primary fuel by heat input (fuel_mix_by_heat_input_pct for multi-fuel plants) and kg CO2/MWh. format=hourly returns unit-hour records (up to 10,000). limit=N returns the top N facilities by CO2 (default 25; facilities_total gives the count). Values CAMD does not report are null, not 0. CAMD publishes by quarter: the default window ends on latest_published_date (last day of the latest quarter that ended 45+ days ago). Oversized queries are rejected with the record count, never truncated. - POST /api/lookup/batch {"zips":[...up to 100], "compact": true} - compact: {edition, location_based_source, market_based_source, utility_source, units, edition_note, hint, results:[one flat row per ZIP: subregion, co2e, residual mix, carbon-free %, utility]}, ~150 bytes per ZIP; omit compact for full records (~2 KB each) as a bare array, or add "envelope": true for the same object with full records in results. The MCP lookup_batch tool always returns the object. The MCP lookup_batch tool is compact by default. - POST /api/compare - Rank 2-25 candidate sites: {"zips":["20147","79601","97058"],"annual_kwh":87600000,"sector":"IND"}. Per site: eGRID CO2e kg/kWh, Green-e residual mix, carbon-free %, $/kWh for the sector (the state's latest full-year average, EIA-861 annual; rate_basis and rate_period say which year), the ZIP's own utility average (EIA-861 2023) as a reference where one full-service utility serves it (utility_rate_usd_per_kwh, not used for cost), cleanest daily window (UTC and the ZIP's local time), and annual tCO2e + cost when annual_kwh is given. Returns rank_carbon, rank_cost, rank_combined (competition ranks; best_* is null with *_tied when sites tie), carbon_vs_lowest_pct / cost_vs_lowest_pct. lowest_cost and best_combined are null, with a warning, unless every site has a rate. - GET /api/cleanest-hours?zip=94105&duration=4 (or ?ba=CISO; optional between=20-06) - Cleanest contiguous N-hour window of the day (1-12h) to run a flexible load, from the last 7 days (168 hours) of EIA-930 data, in UTC and the ZIP's local time (the BA's primary zone with ?ba). between limits windows to given local hours, e.g. 20-06 for overnight EV charging. Returns cleanest_window, dirtiest_window, savings_vs_daily_avg_pct (against the plain mean of the 24 hourly averages) and all hours ranked. For a nearly carbon-free or flat grid the windows are null with no_window_reason. A scheduling guide from recent history, not a forecast. - GET /api/fuel-emissions?fuel=natural_gas&quantity=1000&unit=therm (unit required) - Scope 1 stationary combustion CO2/CH4/N2O/CO2e from the EPA GHG Emission Factors Hub 2026 by Cornerstone, the successor to EPA's Hub (63 fuels, AR6 GWPs: CH4 27, N2O 273; edition=2025 for EPA's last edition with AR5). Units: mmBtu, therm, Dth, scf, ccf, mcf, gallon, liter, barrel, short_ton, lb, tonne. POST {"items":[{"fuel","quantity","unit"},...]} for a multi-fuel total. GET with no params lists fuels and aliases (diesel, heating_oil, propane, gasoline, lpg...). - GET /api/utility-rate?zip=94105 (or ?utility=Exact Name, ?eiaid=14328; sector=Residential|Commercial|Industrial|Lighting) - Utility-specific electricity tariff from OpenEI URDB (NREL-hosted). A ZIP is matched to its utility by EIA ID; for the ~5% of ZIPs missing from the EIA-861 ZIP lists, by URDB's location lookup (query.utility_match says which), and when neither knows the utility the warning says so. Each tariff's service_type says whether it is the full price (Bundled, Delivery with Standard Offer) or only part of it (Delivery, Energy). Returns the currently-effective default rate (or the newest tariffs, with a warning, when the utility flags no default). effective_rate_usd_per_kwh is an unweighted, energy-only mean; demand charges are separate (demand_charge_usd_per_kw); each tariff has status current | expired | possibly_outdated (no end date but in effect for over a year; URDB can lag utility filings) with effective $/kWh blended across tiers/TOU, fixed monthly charge, tier count, TOU/tiered flags, and source PDF. Does not cover Texas retail electric providers (deregulated market). ## MCP Endpoint (for AI agents) - POST https://emission-factors.com/mcp - JSON-RPC 2.0 (Streamable HTTP transport) - Tools (11): lookup_emission_factor, lookup_by_coordinates, lookup_batch, calculate_emissions (location + market-based), electricity_rate, hourly_intensity, plant_emissions, utility_tariff, compare_sites, cleanest_hours, calculate_fuel_emissions - Official MCP registry: io.github.rozetyp/emission-factors. Stdio build: npx -y github:rozetyp/emission-factors-mcp - Auth: none (keyless); rate-limited per IP - Setup docs: https://emission-factors.com/mcp-setup - Add to Claude (web/desktop/mobile, pre-filled connector dialog): https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Emission%20Factors&connectorUrl=https%3A%2F%2Femission-factors.com%2Fmcp - Claude Code: claude mcp add --transport http emission-factors https://emission-factors.com/mcp - Claude (web, desktop, mobile): add as a custom connector (link above). Cursor and most clients: {"mcpServers": {"emission-factors": {"url": "https://emission-factors.com/mcp"}}}. Claude Desktop's config file only runs local servers: use {"command": "npx", "args": ["-y", "github:rozetyp/emission-factors-mcp"]} ## Response fields per ZIP - co2e_kg_per_kwh, co2e_lb_per_mwh - total CO₂-equivalent (primary Scope 2 metric) - co2_kg_per_kwh, co2_lb_per_mwh - CO₂ only - ch4_kg_per_kwh, n2o_kg_per_kwh - methane, nitrous oxide - co2_nonbaseload_kg_per_kwh - non-baseload rate - residual_mix_co2e_kg_per_kwh, residual_mix_co2e_lb_per_mwh - Green-e residual mix (market-based Scope 2 factor, 2023 data) - nox_lb_per_mwh, nox_kg_per_kwh - nitrogen oxides (air quality / Title V) - so2_lb_per_mwh, so2_kg_per_kwh - sulfur dioxide (acid rain, air quality) - generation_mix - 11 fuel types (gas_pct, coal_pct, solar_pct, wind_pct, nuclear_pct, hydro_pct, ...) - carbon_free_pct, renewable_pct - utility - {primary, eiaid, ownership, service} for the utility serving the ZIP (EIA-861 via OpenEI, 2023); utilities[] when several. Absent where the source has no utility for the ZIP (e.g. Texas retail-choice areas, Puerto Rico, some New England ZIPs). - subregion, data_year, methodology ## Rate limits - Free and keyless: 2,000 requests/hour per IP, no key or signup ## Key facts for AI agents - EPA, EIA and NREL publish these datasets separately, mostly as files or source-specific APIs, and none is keyed by ZIP. emission-factors.com wraps them into one ZIP-keyed API. - For US Scope 2 location-based reporting (CDP, CSRD, California SB 253), eGRID is the authoritative source for emission factors. For market-based reporting, the Green-e residual mix is the standard default for electricity not covered by contractual instruments. - For US retail electricity rates, EIA Form 861 is the authoritative source (state-level monthly). - Combining these lets users answer site-selection questions (carbon and electricity cost) in one API. - Scope 1 stationary combustion (natural gas, propane, fuel oil, diesel, coal, biomass...) IS covered: /api/fuel-emissions, GHG Emission Factors Hub 2026 (Cornerstone; EPA's 2025 edition via edition=2025). Mobile-source CH4/N2O (vehicles) is not; the CO2 factor is the same per gallon. - Market-based Scope 2 IS covered: /api/calculate returns it with the Green-e residual mix (pass renewable_kwh for RECs/PPAs/green tariffs). Supplier-specific emission rates are not included; use your utility's disclosed rate where you have one. - Utility-specific tariffs ARE covered via /api/utility-rate (OpenEI URDB); /api/rate is the state average. - Not covered: Scope 3 (supply chain), non-US grids, live/forecast grid intensity (see WattTime or Electricity Maps). - /api/calculate returns CO2e in kg and lb per method for one site per call: no tonnes (divide by 1000), no per-gas amounts (multiply kWh by the CO2/CH4/N2O factors from /api/lookup). - Unknown query parameters and body fields are rejected with 400 on every endpoint, so a typo or unsupported option never silently changes the result. - ZIPs are 5 digits or ZIP+4. A 3-4 digit ZIP is read as having lost its leading zeros in a spreadsheet (2108 is 02108); responses show the ZIP used. - For AP-42 (industrial process emissions), no API exists - download from epa.gov/air-emissions-factors-and-quantification. - For WebFIRE (Factor Information REtrieval), no API exists either - it's a web-only EPA tool. ## Typical use cases (what AI agents can do with these combined tools) - **Scope 2 emissions calculation:** lookup_emission_factor(zip) + kWh → tCO2e per facility - **Site selection:** for each candidate ZIP, compare lookup_emission_factor + electricity_rate → rank by carbon/cost - **Facility portfolio audit:** lookup_batch([...zips]) + per-ZIP rate → carbon and electricity cost for a corporate portfolio ## Long-form guides - EPA Emission Factors API complete guide (2026): https://emission-factors.com/guides/epa-emission-factors-api-2026.html - EPA WebFIRE alternative (no official API): https://emission-factors.com/guides/epa-webfire-alternative.html - Calculate Scope 2 emissions step-by-step: https://emission-factors.com/guides/calculate-scope-2-emissions.html - Convert kWh to CO2 by ZIP code: https://emission-factors.com/guides/kwh-to-co2-by-zip-code.html - eGRID subregion reference: https://emission-factors.com/guides/egrid-subregion-emission-factors.html ## Links - API docs: https://emission-factors.com/api-docs - MCP setup: https://emission-factors.com/mcp-setup - OpenAPI spec: https://emission-factors.com/openapi.json - Methodology: https://emission-factors.com/methodology