Data sources & methodology

Where the numbers come from

Every value on this dashboard is sourced from a publicly available feed operated by one of three organisations. Nothing is estimated on our side that isn't explicitly flagged.

Sources at a glance

Source What we use Cadence Typical lag
Elexon BMRS โ€” FUELINST Generation by fuel type, interconnector flows 5 min ~1โ€“3 min
Elexon BMRS โ€” Market Index Price (APXMIDP) Wholesale electricity price (ยฃ/MWh) 30 min (settlement period) 10โ€“25 min into the period
Carbon Intensity API โ€” national National gCOโ‚‚/kWh โ€” forecast and actual 30 min Forecast immediate; actual 30โ€“60 min after period end
Carbon Intensity API โ€” regional gCOโ‚‚/kWh + fuel mix for 18 DNO regions 30 min Forecast at period start (no settled actual)
NESO โ€” demand CSV National Demand (authoritative), embedded wind & solar 30 min (settlement period) Hours to a few days for the settled actual

How we combine them

The dashboard's headline values are computed like this:

Generation mix

Direct from FUELINST. We bucket Elexon's fuel-type codes (CCGT, OCGT, WIND, NUCLEAR, BIOMASS, NPSHYD, COAL, OIL, PS, BESS, OTHER) into the headline categories you see on screen. Behind-the-meter rooftop solar and small wind are not in FUELINST โ€” they come from NESO's EMBEDDED_WIND_GENERATION and EMBEDDED_SOLAR_GENERATION columns and are stacked into the appropriate fuel categories.

Wholesale price

Elexon's Market Index Price, APXMIDP data provider โ€” the volume-weighted average of APX exchange trades for the settlement period. Published 10โ€“25 minutes into each half-hour, so the Price card flips to a "for HH:MM ยท awaiting next print" state while the new period's print is pending. We never blank the card โ€” last known value stays visible.

Carbon intensity

The Carbon Intensity API's actual field if it's present, otherwise forecast. For the current half-hour, this means you usually see the forecast until ~30 min after the period closes, at which point the actual replaces it.

Demand

NESO's ND (National Demand) value with FORECAST_ACTUAL_INDICATOR = "A" if available; otherwise we derive demand from total generation + net interconnector flow using the latest FUELINST data. The derived value is accurate within ~1% but is the conservation identity, not NESO's settled figure.

Interconnectors

Per-cable flows from FUELINST (codes INTFR, INTIFA2, INTNED, INTNEM, INTNSL, INTVKL, INTIRL, INTEW, INTELEC, INTGRNL), rolled up by country. Positive = importing into GB; negative = exporting from GB.

Regional

Direct from the Carbon Intensity API's /regional endpoint. The 18 regions are the Distribution Network Operator (DNO) regions โ€” fixed by the upstream API.

Settlement periods

The British grid runs on 30-minute "settlement periods" anchored to the UTC half-hour. All of our historical storage uses unix milliseconds floored to that boundary. A period labelled 21:00 covers 21:00โ€“21:30 UTC.

Missing or late data

A settlement period's record is written incrementally as upstream feeds publish. So a row born at 22:05 may initially have only byFuel and a forecast carbon value; the price and the settled carbon arrive on subsequent ingest passes 10โ€“60 minutes later. Demand from NESO may be hours behind. None of this is hidden โ€” the dashboard flips to a stale indicator when something is behind, and the underlying data is merged in as it lands.

A separate daily job at 03:30 UTC scans the last seven days for any settlement period missing fields it should have, and backfills them from the authoritative APIs. That's the safety net for any slipped writes.

Licences & attribution

What's not here