← 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, SEC climate disclosures, 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 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)
eGRID2024 preliminary data 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:

For SEC climate disclosures and CDP reporting, you need the location-based number at minimum. The market-based number can be reported alongside it.

Which reporting frameworks require Scope 2? SEC climate rules (for large/accelerated filers, when material), CDP Climate questionnaire, CSRD (EU), GHG Protocol, and most voluntary carbon disclosure programs.

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.

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