Scope 2 emissions are indirect greenhouse gas emissions from purchased electricity. If your company buys electricity from the grid, you have Scope 2 emissions. This guide shows you exactly how to calculate them using EPA data and the location-based method (required by the GHG Protocol, SEC climate disclosures, CDP, and CSRD).
That's the whole formula. The hard part is getting the right emission factor for your location.
1 Gather electricity consumption data
Get kWh consumed from utility bills, energy management systems, or meter readings. You need this per facility, per year (or per reporting period).
Typical US household: ~10,500 kWh/year. Typical small office: 50,000–200,000 kWh/year. Data center: 1M+ kWh/year.
2 Find the emission factor for each facility's location
In the US, the authoritative source is EPA eGRID. The EPA divides the US grid into 27 subregions, each with a different emission rate based on the local generation mix.
The problem: the EPA publishes factors by subregion (CAMX, RFCW, ERCT...), not by ZIP code or address. You need to know which subregion your facility is in.
Option A: Look it up manually using EPA Power Profiler (one ZIP at a time).
Option B: Use the Emission Factors API to get the factor by ZIP code programmatically:
curl "https://emission-factors.com/api/lookup?zip=94105"
# → { "candidates": [{
# "subregion": "CAMX",
# "co2e_kg_per_kwh": 0.195037,
# "co2e_lb_per_mwh": 429.983
# }] }
# For preliminary eGRID2024 data, add ?year=2024:
curl "https://emission-factors.com/api/lookup?zip=94105&year=2024"
# → co2e_kg_per_kwh: 0.183795 (CAMX, preliminary)
?year=2024 to any lookup or calculate request. The 2024 factors are generated from EPA's open-source eGRID R pipeline (Cornerstone Data, CC-BY-4.0, Zenodo). Average change vs. 2023: -1.8% CO2e across subregions. Default remains eGRID2023 Rev 2 (official EPA release).
3 Multiply
For each facility: kWh × emission factor = kg CO₂e
Example: A San Francisco office consuming 200,000 kWh/year in subregion CAMX:
200,000 kWh × 0.195037 kg CO₂e/kWh = 39,007 kg CO₂e = 39.0 tonnes CO₂e
Or use the API to do the calculation directly:
curl -X POST "https://emission-factors.com/api/calculate" \
-H "Content-Type: application/json" \
-d '{"zip": "94105", "kwh": 200000}'
# → { "candidates": [{ "co2e_kg": 39007.4 }] }
4 Sum across all facilities
Add up the CO₂e for all locations. That's your total Scope 2 (location-based) emissions.
For multiple facilities, use the batch endpoint (up to 100 ZIPs per request) or the bulk CSV upload:
curl -X POST "https://emission-factors.com/api/lookup/batch" \
-H "Content-Type: application/json" \
-d '["94105", "10001", "60601", "78701", "98101"]'
| Facility | ZIP | Subregion | kWh/year | EF (kg/kWh) | CO₂e (kg) |
|---|---|---|---|---|---|
| HQ (San Francisco) | 94105 | CAMX | 200,000 | 0.1950 | 39,007 |
| NYC Office | 10001 | NYCW | 150,000 | 0.3927 | 58,904 |
| Chicago Warehouse | 60601 | RFCW | 500,000 | 0.4155 | 207,758 |
| Austin Lab | 78701 | ERCT | 100,000 | 0.3341 | 33,413 |
| Seattle Office | 98101 | NWPP | 80,000 | 0.2882 | 23,052 |
| Total Scope 2 (location-based) | 362,134 kg | ||||
| = 362.1 tonnes CO₂e | |||||
import requests
facilities = [
{"name": "HQ", "zip": "94105", "kwh": 200000},
{"name": "NYC", "zip": "10001", "kwh": 150000},
{"name": "Chicago", "zip": "60601", "kwh": 500000},
]
total = 0
for f in facilities:
r = requests.post(
"https://emission-factors.com/api/calculate",
json={"zip": f["zip"], "kwh": f["kwh"]}
)
co2e = r.json()["candidates"][0]["co2e_kg"]
total += co2e
print(f"{f['name']}: {co2e:,.1f} kg CO₂e")
print(f"\nTotal Scope 2: {total:,.1f} kg ({total/1000:,.1f} tonnes)")
const facilities = [
{ name: 'HQ', zip: '94105', kwh: 200000 },
{ name: 'NYC', zip: '10001', kwh: 150000 },
{ name: 'Chicago', zip: '60601', kwh: 500000 },
];
let total = 0;
for (const f of facilities) {
const res = await fetch('https://emission-factors.com/api/calculate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ zip: f.zip, kwh: f.kwh }),
});
const { candidates } = await res.json();
total += candidates[0].co2e_kg;
console.log(`${f.name}: ${candidates[0].co2e_kg.toFixed(1)} kg CO₂e`);
}
console.log(`\nTotal Scope 2: ${(total/1000).toFixed(1)} tonnes CO₂e`);
Free API - no key, no signup. Get emission factors by ZIP code for all 27 US subregions.
Read the API docs →The GHG Protocol requires companies to report Scope 2 using both methods:
For SEC climate disclosures and CDP reporting, you need the location-based number at minimum. The market-based number can be reported alongside it.
kg/kWh = lb/MWh × 0.45359237 / 1000.All emission factors in this guide are from EPA eGRID2023 Rev 2, Table 1: eGRID Subregion Output Emission Rates. See the complete subregion table for all 27 subregions.
Preliminary eGRID2024 factors are also available via the API (?year=2024). These are generated from EPA's open-source eGRID R pipeline by Cornerstone Data (CC-BY-4.0). They show an average -1.8% CO2e change vs. 2023, with notable shifts in NYUP (+12.3%), SPNO (-9.6%), NWPP (-8.3%), and CAMX (-5.8%).
emission-factors.com is an independent service. Not affiliated with the EPA. Terms · Privacy · Subregion table · kWh to CO₂ calculator