India Energy Atlas

API Reference · Enterprise · Carbon accounting

Time-Block Carbon & 24/7 Clean Power API

15-minute, state-level grid carbon intensity for India, with strict separation of average (Scope 2) and marginal (operational) signals — and a 24/7 hourly-matching engine that consumes both correctly.

Status: beta (intensity) · roadmap (24/7 matching) · ETA 2026 Q3 → Q4

Average / location-based intensity is in beta and backed by /api/intelligence/carbon-intensity-mix. Marginal signal and the 24/7 matching engine are on the roadmap. Product overview · IDCR 2026 for the data-centre 24/7 thesis.

Overview

Five endpoints split cleanly into two paths — disclosure (Scope 2) and operations (load shift, dispatch). The schema enforces the split.

Marginal vs average — non-negotiable

The schema enforces the split

Every carbon value carries an explicit signal_type: "average" | "marginal" discriminator. Clients consuming a marginal value as a Scope 2 number are rejected at the API layer. Average is for disclosure; marginal is for dispatch. Mixing them is the most common source of greenwashing exposure under BRSR audit and CBAM verification.

Authentication

X-API-Key header, Enterprise tier. See energymap.in/pricing.

GET /v1/carbon-intensity/latest/{state}

bash
curl https://api.energymap.in/v1/carbon-intensity/latest/IN-MH \
  -H 'X-API-Key: $KEY'
json
{
  "state": "IN-MH",
  "block_start_ist": "2026-05-09T11:30:00+05:30",
  "average":  { "signal_type": "average",  "kg_co2e_per_mwh": 712 },
  "marginal": { "signal_type": "marginal", "kg_co2e_per_mwh": 982 },
  "snapshot_id": "rldc-mh-2026-05-09-1130",
  "sources": ["RLDC/WRLDC", "NLDC", "IEX", "CEA"]
}

GET /v1/carbon-intensity/history

Historical 15-min series. Pass signal=average or signal=marginal explicitly.

POST /v1/scope2/location-based

Send a 15-min load profile, receive a BRSR-compliant Scope 2 number with a full audit trail. Marginal signal is unavailable on this endpoint by contract.

POST /v1/clean-power/hourly-match

Send a 15-min load profile and a contracted RE generation profile, receive 24/7 match %, an unmatched-block ledger with carbon impact per block, and recommended load-shift windows.

POST /v1/load-shift/emissions-impact

Δ-emissions in kg CO₂e for a proposed shift. Uses the marginal signal — for dispatch, not disclosure.

Restatement protocol

Any past block can be restated when its underlying RLDC schedule is corrected. Each restated value carries a restated_from block with the prior value, the restatement timestamp, and the reason. Downstream Scope 2 numbers compounded over restated blocks are also restated transitively.

FieldTypeNotes
signal_typeenumaverage | marginal — required on every value
snapshot_idstringReplay handle — fetch the underlying grid-mix snapshot
restated_fromobject?Present only on restated values
sourcesarray<string>RLDC, NLDC, IEX, CEA — with estimation flags