How we compute carbon intensity
The full math behind api.energymap.in's gCO₂eq/kWh number — emission factors, fuel buckets, production vs consumption accounting, rooftop solar, worked examples. And why a single grid can honestly be reported as 826 or 550 gCO₂eq/kWh at the same hour.
Early customers compared our Western-zone number (826 gCO₂eq/kWh) against other public carbon-intensity dashboards for India and noted that other sources report much lower values for the same zone at the same hour. The honest question: which one is right?
Carbon intensity has four independent methodology axes. Same grid, same hour, same fuel mix — answer ranges from ~500 to ~830 gCO₂eq/kWh depending on which defaults you picked.
This post is the long answer. It walks through every decision that goes into a gCO₂eq/kWh number, shows the math for a real hour of Indian grid data, and documents the query params we added so customers can match whichever convention their board / methodology / auditor expects.
The number is a choice
Carbon intensity sounds like a physical quantity. It isn't — not without four further qualifiers:
- Which emission factors? Lifecycle (with upstream fuel chain and manufacturing LCA) or direct combustion only (what comes out of the smokestack)? The two values for Indian coal differ by ~130 gCO₂/kWh.
- Production or consumption? CI of what's generated inside the zone, or CI of what's consumed (blended with net imports from neighbouring zones)? Western India imports solar-heavy power from the South — consumption CI is 50–150 g/kWh lower than production CI in daylight hours.
- Grid-connected only, or with behind-the-meter? Rooftop solar doesn't show up in any grid dispatch feed, but it offsets thermal demand every bit as much as utility-scale solar. Skipping it biases CI upwards ~20–40 g/kWh on a normal day.
- What granularity of hourly fuel mix? Different data sources (CEA DGR2 daily, NPP MERIT real-time, SLDC feeds, modelled allocations) produce different fuel shares for the same zone/hour. We document our canonical pipeline here.
No single answer is “correct.” The right answer is the one whose methodology is documented and whose knobs match your use case. We publish both defaults and all four axes as query parameters on /developer/v1/carbon-intensity/*.
The core formula
Every CI value we publish comes from one formula applied at (timestamp, scope, scope_key):
CI(gCO₂eq/kWh) = Σ_f (mw_f × ef_f) / Σ_f mw_f
where:
f = fuel bucket (thermal, gas, hydro, nuclear, solar, wind, renewable)
mw_f = generation from fuel f at this hour, in MW (= MWh/hour)
ef_f = emission factor for fuel f, in kg CO₂eq / MWh
(numerically identical to gCO₂eq / kWh)That's the weighted mean of per-fuel emission factors, where the weights are each fuel's share of the hour's total generation. Simple — but every input needs documentation.
Emission factor tables
We publish two well-documented tables and let you pick via ?factors=.
| Fuel bucket | Lifecycle (default) | Direct (IPCC AR5) |
|---|---|---|
| thermal (coal + lignite) | 950 | 820 |
| gas (CCGT + GT) | 420 | 490 |
| nuclear | 12 | 0 |
| hydro | 24 | 0 |
| solar | 45 | 0 |
| wind | 11 | 0 |
| renewable (biomass etc.) | 30 | 230 |
Why the two differ, fuel by fuel:
- Thermal: 950 vs 820. CEA v18 weights India's actual fleet mix (still subcritical-dominant) and includes upstream coal-chain emissions — mine methane venting, rail transport, coal-bed dust. IPCC direct is just the stack: C + O₂ → CO₂, nothing else.
- Gas: 420 vs 490. Counter-intuitive! Lifecycle gas is lower because Indian CCGT fleet runs at higher efficiency than the IPCC AR5 global median. Both numbers include fugitive methane — CH₄ upstream emissions dominate gas lifecycle CI.
- Hydro / solar / wind / nuclear: zero under “direct”. No combustion happens, so direct emissions are truly zero. Lifecycle values (24, 45, 11, 12 respectively) capture manufacturing + construction amortised over plant lifetime. Public dashboards that use the direct-combustion convention treat these as zero, which is why their reported CI can be lower than ours even when the underlying RE share is identical.
- Biomass (renewable bucket): 30 vs 230. Deep disagreement in the field. IPCC “carbon neutral” conventions vary; we report conservatively in the direct view because India's biomass plants often co-fire coal.
Our fuel buckets
We collapse every station in the fleet into exactly seven buckets. This is more aggregation than some platforms publish — not because we don't have the granularity, but because inter-platform comparability demands it.
thermal ← coal, lignite, diesel gas ← natural gas (CCGT, GT), naphtha, liquid fuel nuclear ← PHWR + PWR hydro ← large hydro, small hydro, pumped storage solar ← utility-scale PV (grid-connected) wind ← onshore wind (India has no offshore yet) renewable ← biomass, bagasse, biogas, waste-to-energy
Fossil-liquid fuels (diesel, naphtha) fall into thermal rather than gas because their emission factors are closer to coal than to natural gas. This is standard industry practice; the IEEFA, CEA, and IEA all do the same.
Production vs consumption
Two different questions hide behind “the carbon intensity of Western India”:
- Production CI: what is the emissions-per-kWh of electricity generated inside the zone? Sum the fuel mix × emission factors; divide by total.
- Consumption CI: what is the emissions-per-kWh of electricity actually consumed inside the zone — i.e. accounting for power imported via interstate corridors? Blend local generation CI with the CI of imports.
For Indian regional grids this is not a small correction. Western India is a net importer from the Southern zone (huge wind + solar) during daylight. A ~5 GW inter-regional inflow carrying ~400 gCO₂/kWh displaces coal-heavy local generation → consumption CI can be 80–150 g/kWh below production CI.
Our simplification: blend in the national CI at the same hour as the “import source” (rather than tracking which specific zone the power came from). This is an approximation of what a flow-tracing implementation (KGM Tellus, Tomorrow's inter-zone tracer) would produce. For India's highly-interconnected grid it lands within ~5% of the flow-traced number.
# Zone consumption-CI formula
gen_mw = Σ fuel_mw for zone Z at hour h (what the zone generates)
net_imp = Σ state_net_interstate_mw (positive = net importer)
national_ci = CI of the All-India grid at hour h (independent query)
if net_imp > 0:
consumption_ci = (gen_mw × production_ci + net_imp × national_ci)
/ (gen_mw + net_imp)
else:
consumption_ci = production_ci # net exporter: we only count what we useExpose with ?accounting=consumption on the zone endpoint.
Rooftop solar adder
India has ~17 GW of rooftop solar installed under the PM-Surya Ghar + net-metering schemes (MNRE dashboard, Q1 2026). None of it shows up in CEA grid-connected generation stats because it's behind the meter — it reduces net demand on the grid but the grid never sees those electrons flow.
Result: during daylight, our modelled thermal share is inflated (because it's carrying load that's actually being served by invisible rooftop solar), and our CI runs ~25–40 g/kWh too high on sunny days.
The ?include_rooftop=true parameter adds a state-level capacity-times- diurnal-curve estimate to the solar bucket:
rooftop_mw(state, hour_ist) = MNRE_capacity(state) × peak_cf(0.65) × solar_curve(hour_ist) / max(curve) where solar_curve follows a Gaussian peak at 12:00 IST, zero from 18:00 to 06:00. For zones we sum across member states; for national we sum across all states. The expanded fuel mix then feeds the same CI formula — denominator grows, CI drops.
Worked example — Western zone, 23-Apr-2026 00:00 UTC
A real hour, a real fuel mix, every number reproducible via API:
| Fuel | MW | Share | × lifecycle | × direct |
|---|---|---|---|---|
| thermal | 66,252 | 85.8% | 950 | 820 |
| wind | 3,864 | 5.0% | 11 | 0 |
| nuclear | 2,846 | 3.7% | 12 | 0 |
| hydro | 2,455 | 3.2% | 24 | 0 |
| gas | 1,708 | 2.2% | 420 | 490 |
| solar | 113 | 0.1% | 45 | 0 |
| Total | 77,238 | 100% | — | — |
Four ways to combine these — click a pill to see the math live:
CEA v18 factors + upstream fuel-chain + LCA for RE. Strictest accounting of India's fleet emissions.
| Fuel | MW | EF (lifecycle) | Contribution (g) |
|---|---|---|---|
| thermal | 66,252 | 950 | 62,939,400 |
| wind | 3,864 | 11 | 42,504 |
| nuclear | 2,846 | 12 | 34,152 |
| hydro | 2,455 | 24 | 58,920 |
| gas | 1,708 | 420 | 717,360 |
| solar | 113 | 45 | 5,085 |
| Denominator | 77,238 | ||
curl -H "X-API-Key: $KEY" \ "https://api.energymap.in/developer/v1/carbon-intensity/by-zone?zone=western&hours=0&factors=lifecycle"
Fuel-mix values from api.energymap.in/developer/v1/fuel-mix/by-zone?zone=western&hours=0, Western 23-Apr-2026 ~06:00 IST. Rooftop and net-import values are representative; the API returns per-hour actuals.
Same arithmetic, expressed as a single line per config:
CI_lifecycle_production = Σ (mw × ef_lifecycle) / 77,238 = 826.0 gCO₂eq/kWh
CI_direct_production = Σ (mw × ef_direct) / 77,238 = 714.2 gCO₂eq/kWh
CI_direct + rooftop = 55,164,380 / (77,238 + 4,700) ≈ 673.2 gCO₂eq/kWh
(Western rooftop cap ≈ 7.2 GW; peak
output ≈ 4.7 GW at solar noon)
CI_direct + rooftop + cons = 54,500-ish / 87,938 ≈ 654.6 gCO₂eq/kWh
(Western net-imports ~6 GW at noon from
Southern wind + grid-scale solar;
national direct CI at that hour ≈ 400)The same switches applied at 12:00 IST — when thermal has backed off for ~14 GW of grid solar and rooftop is at true peak — push the walkdown considerably further, into the ~450–500 gCO₂eq/kWh band that shows up on most public grid-carbon dashboards. The arithmetic is identical; the underlying fuel mix is what changes.
What we haven't solved
- Per-plant emission factors. We use fleet-weighted coal (950 lifecycle). In reality an NTPC supercritical unit emits ~780 g/kWh direct, a vintage subcritical state-genco unit ~950+. Station-level precision needs station- level data; see how the model gets there.
- Flow-traced inter-zone imports. Our consumption formula uses a single national CI as the import source. A proper flow tracer (tracking which specific zone supplied the imports) would be more accurate by a few percent, especially during hours when Southern wind dominates inter-regional flows.
- Methane fugitive emissions for gas. Active area of research. Our 420 g/kWh lifecycle number for CCGT includes a 1.8% upstream methane leak rate — roughly the US EPA estimate. India-specific leak measurements would likely shift this ±80 g/kWh.
- Imported coal. Indonesia / South Africa coal has different ash and calorific values than Jharkhand coal; we apply a single India-fleet factor. ~10% of Indian coal burn is imported; station-level factor variation would improve precision by ~20 g/kWh.
Every knob is a query param
# All four axes, same hour, same zone: curl -H "X-API-Key: $KEY" \ "https://api.energymap.in/developer/v1/carbon-intensity/by-zone?\ zone=western&hours=0&\ factors=direct&accounting=consumption&include_rooftop=true" # Response includes: # emission_factors_basis: "direct" # accounting: "consumption" # include_rooftop_solar: true # carbon_intensity_gco2_kwh: <adjusted value> # production_ci_gco2_kwh: <for comparison> # rooftop_solar_mw: <added solar> # net_interstate_mw: <import/export>
Default to the defaults (lifecycle + production + no rooftop) if you want the strictest accounting of India's fleet emissions — the biggest number, the one that makes the decarbonisation job look hardest and the scope-2 offset burden heaviest. Flip every switch if you want the direct-combustion / consumption-accounting convention used by most public grid-carbon dashboards. Both conventions are honest; the methodology just has to travel with the number.
Docs: /developer/endpoints/fuel-mix-carbon. Chart with all three toggles live: /carbon-markets.