← emission-factors.com

How to Calculate Scope 2 Emissions from Electricity

A practical guide with formulas, real data, and working code · GHG Protocol compliant

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, CDP, and CSRD).

Scope 2 (location-based) = electricity consumed (kWh) × grid emission factor (kg CO₂e / kWh)

That's the whole formula. The hard part is getting the right emission factor for your location.

Step-by-step

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 eGRID2024 data (Cornerstone), add ?year=2024:
curl "https://emission-factors.com/api/lookup?zip=94105&year=2024"
# → co2e_kg_per_kwh: 0.183795 (CAMX, eGRID2024)
eGRID2024 (Cornerstone run of EPA's code) now available. Add ?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"]'

Worked example: 5-facility portfolio

FacilityZIPSubregionkWh/yearEF (kg/kWh)CO₂e (kg)
HQ (San Francisco)94105CAMX200,0000.195039,007
NYC Office10001NYCW150,0000.392758,904
Chicago Warehouse60601RFCW500,0000.4155207,758
Austin Lab78701ERCT100,0000.334133,413
Seattle Office98101NWPP80,0000.288223,052
Total Scope 2 (location-based)362,134 kg
= 362.1 tonnes CO₂e

Code examples

Python

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)")

JavaScript (Node.js)

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 →

Location-based vs. market-based

The GHG Protocol requires companies to report Scope 2 using both methods:

The GHG Protocol Scope 2 Guidance asks for both numbers (dual reporting), and CDP and California SB 253 follow it. If you buy no RECs or PPAs, market-based is simply kWh x residual mix.

Which reporting frameworks require Scope 2? California SB 253 (from 2026, for companies over $1B revenue doing business in California), CDP Climate questionnaire, CSRD (EU), the GHG Protocol, and most voluntary carbon disclosure programs. The SEC's 2024 climate rule never took effect (the SEC stopped defending it in 2025).

Common mistakes

Data source

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.

eGRID2024 factors (Cornerstone run of EPA's code) 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