VOLTSTACKBUILDER GUIDE
ELEXON · NESO · GB POWER
BUILDER GUIDE · ELEXON BMRS AND NESO DATA PORTAL

Elexon BMRS and the NESO Data Portal: API requests for the imbalance price, NIV, generation and demand

Reviewed , against the code that runs Voltstack's Elexon and NESO readers

THE SHORT ANSWER

Elexon BMRS data is free and needs no API key: send GET requests to https://data.elexon.co.uk/bmrs/api/v1, for example /balancing/settlement/system-prices/2026-11-05 for the GB imbalance price and net imbalance volume of every half-hour that day, and read the NESO Data Portal, also without a key, through its CKAN API at https://api.neso.energy/api/3/action/.

The system sell price and system buy price are one number since 5 Nov 2015. A positive net imbalance volume means the system was short, a negative one long. The system-prices endpoint serves the indicative price from the balancing mechanism run; the price each settlement run set is on /market-reports/best-view-prices. As of 7 Nov 2026, settlement days from 1 Oct 2026 reach Final Reconciliation about seven months later, not 14, and that is planned to fall to four months for settlement days from 1 Apr 2027. Working requests in curl and Python follow, then the traps we met reading these feeds every day.

BUILDER GUIDEREVIEWED: 7 NOV 2026SOURCES: ELEXON INSIGHTS SOLUTION · NESO DATA PORTALAUTHOR: Voltstack Intelligence
GB imbalance price and system direction · indicative, as Elexon publishes it (BM run)

Settlement periods 29 to 34 of 12 Nov 2026, as Elexon published them when this page read them at 17:36 UK. In period 34, starting 16:30 UK, the system price was £175.18/MWh and the net imbalance volume -36 MWh, so the system was long.

SP 29 · 14:00 UK
£215.00
NIV +397 MWh · short
SP 30 · 14:30 UK
£215.00
NIV +229 MWh · short
SP 31 · 15:00 UK
£145.00
NIV -102 MWh · long
SP 32 · 15:30 UK
£229.00
NIV +142 MWh · short
SP 33 · 16:00 UK
£150.00
NIV -422 MWh · long
SP 34 · 16:30 UK
£175.18
NIV -36 MWh · long

This reading of Elexon is more than an hour old, so its figures are hidden. Elexon publishes the current system price on bmrs.elexon.co.uk.

Source: Elexon Insights Solution, system prices (DISEBSP, the balancing mechanism run), settlement day 12 Nov 2026. The page reads Elexon at most once every 30 minutes, and the time above is when it did. When the page loads, when it is restored from the back button and when its tab comes back into view, a browser with JavaScript hides the figures if that reading is more than an hour old; without JavaScript they stay, under that time. Prices in £/MWh; direction is the sign of the net imbalance volume (positive short, negative long; a NIV that rounds to zero at one decimal is shown as balanced). Indicative: the settlement runs come later and their prices are on best-view-prices, as section 05 explains. Contains BMRS data © Elexon Limited copyright and database right 2026. BMRS data licence.

If you would rather not run the parser

Voltstack reads Elexon's system prices and generation by fuel, and NESO's day-ahead wind and demand forecasts, and names the source on each. It shows the GB system price beside the imbalance prices of other European zones. The 14-day trial opens the workspace; the Voltstack API is in early access, with keys issued on request.

Start a 14-day free trialRequest early access →

The button opens a 14-day free trial sign-up. Sign-up needs a work email.

The button opens the early-access request on our home page.

01 · BMRS, Insights, NESO

BMRS, BM Reports and the NESO Data Portal: which is which

  • BMRS is the Balancing Mechanism Reporting Service, Elexon's record of the GB balancing mechanism, imbalance settlement, generation and demand. Elexon runs it under the Balancing and Settlement Code (BSC).
  • BM Reports (bmreports.com) was the legacy BMRS website and API. Elexon replaced it with the Insights Solution and switched the old service off on 31 May 2024. The website is bmrs.elexon.co.uk, the API is https://data.elexon.co.uk/bmrs/api/v1 and the documentation is the Insights developer portal. Elexon also offers IRIS, a free push service, for data the moment it lands.
  • The NESO Data Portal is the National Energy System Operator's open data: demand and wind forecasts, historic demand, balancing services and constraint costs. NESO took over from National Grid ESO in October 2024. The portal is at neso.energy/data-portal and its API at https://api.neso.energy/api/3/action/.

In short: prices, balancing actions, metered outturn and settlement come from Elexon; the system operator's forecasts and its own operational datasets come from NESO.

02 · Keys and limits

Do you need an API key for Elexon or NESO? No

Elexon's developer portal says all its APIs are public and no API key is required. If a tutorial tells you to register on the Elexon Portal for a scripting key, it was written for the legacy BMRS API, which no longer answers. The NESO Data Portal's API needs no key either.

  • Elexon: the BMRS API terms give, as an example of misuse, calling the API more than once in a half hour for data that only updates half-hourly. Poll a half-hourly dataset once per period, or take IRIS if you need it the moment it is published.
  • NESO: its API guidance recommends at most one request a second to the CKAN API and at most two requests a minute to the datastore API. Cache what you read.
  • Formats: Elexon answers JSON with ?format=json, with the rows under data, and also serves CSV and XML. NESO answers CKAN JSON with the rows under result.records.
03 · Elexon requests

Imbalance price, NIV, generation by fuel and demand from the Elexon API

WhatPath under /bmrs/api/v1DatasetNotes
System prices and NIV, one day/balancing/settlement/system-prices/{settlementDate}DISEBSPEvery settlement period of one UK settlement day, with the system sell and buy price and the net imbalance volume.
System prices and NIV, one period/balancing/settlement/system-prices/{settlementDate}/{settlementPeriod}DISEBSPThe same row for a single period.
Generation by fuel, half-hourly/datasets/FUELHHFUELHHAverage MW per fuel type per settlement period. Filter with settlementDateFrom and settlementDateTo, or by publish time.
Generation by fuel, five-minute/datasets/FUELINSTFUELINSTThe same fuel split at five-minute resolution, for intraday views.
Demand outturn/demand/outturnINDO, ITSDOInitial national demand and initial transmission system demand, half-hourly, from the transmission company's operational metering.

System prices and the net imbalance volume, with curl

# GB system prices and NIV for every period of one UK settlement day
curl "https://data.elexon.co.uk/bmrs/api/v1/balancing/settlement/system-prices/2026-11-05?format=json"

# One period only (period 34 of the same day)
curl "https://data.elexon.co.uk/bmrs/api/v1/balancing/settlement/system-prices/2026-11-05/34?format=json"

Generation by fuel and demand, with curl

# Half-hourly generation by fuel type (FUELHH) for one settlement day
curl "https://data.elexon.co.uk/bmrs/api/v1/datasets/FUELHH?settlementDateFrom=2026-11-05&settlementDateTo=2026-11-05&format=json"

# Initial demand outturn (INDO and ITSDO) for the same day
curl "https://data.elexon.co.uk/bmrs/api/v1/demand/outturn?settlementDateFrom=2026-11-05&settlementDateTo=2026-11-05&format=json"

The same in Python, with the system direction

The system price endpoint has no direction field. Derive it from the sign of netImbalanceVolume, as Elexon defines it: positive is short, negative is long.

import requests

BMRS = "https://data.elexon.co.uk/bmrs/api/v1"

def get(path, **params):
    params.setdefault("format", "json")
    r = requests.get(BMRS + path, params=params, timeout=30)
    r.raise_for_status()
    return r.json()["data"]

day = "2026-11-05"  # the UK settlement date, not the UTC date

for row in get(f"/balancing/settlement/system-prices/{day}"):
    niv = row["netImbalanceVolume"]
    direction = "short" if niv > 0 else "long" if niv < 0 else "balanced"
    print(row["settlementPeriod"], row["startTime"], row["systemSellPrice"],
          round(niv, 1), direction, row["createdDateTime"])
import pandas as pd

fuel = pd.DataFrame(get("/datasets/FUELHH", settlementDateFrom=day, settlementDateTo=day))
mix = fuel.pivot_table(index="startTime", columns="fuelType", values="generation", aggfunc="sum")

demand = pd.DataFrame(get("/demand/outturn", settlementDateFrom=day, settlementDateTo=day))
demand = demand.set_index("startTime")[["initialDemandOutturn", "initialTransmissionSystemDemandOutturn"]]

FUELHH reports interconnectors as fuel types of their own (INTFR, INTNED, INTNSL and others) beside CCGT, WIND, NUCLEAR and the rest, so drop the INT columns before you sum a generation total. INDO excludes station transformer load, pumped storage demand and interconnector demand; ITSDO includes them, so pick one and say which.

04 · Reading the answer

System sell price, system buy price and NIV: what the fields mean

The GB imbalance price, or cash-out price, is what Elexon applies to a BSC party's imbalance in each half-hour settlement period. Two names survive, the system sell price (SSP) and the system buy price (SBP), but since 5 Nov 2015, when modification P305 brought in a single imbalance price, one calculation sets both and they are equal in every period. Code that still treats them as a spread will find it always zero.

FieldWhat it holds
settlementDateThe UK settlement day (Europe/London), not the UTC date.
settlementPeriod1 to 48 on a normal day; 46 when the clocks go forward and 50 when they go back.
startTimeThe start of the period in UTC.
createdDateTimeWhen this version of the row was written. Keep it: it tells two versions of the same period apart.
systemSellPrice, systemBuyPriceThe imbalance price in £/MWh. Equal in every period since the single price came in.
netImbalanceVolumeNIV in MWh. Positive: the system was short. Negative: long.
priceDerivationCodeElexon's code for how the price was derived in that period.
reserveScarcityPriceThe reserve scarcity price used in the calculation, in £/MWh.
totalAcceptedOfferVolume, totalAcceptedBidVolumeThe accepted balancing volumes that net to the NIV, with the adjustment volumes beside them.

The system direction comes from the net imbalance volume. Where NIV is positive the system is short and the system operator would normally accept offers, raising generation or cutting demand; where it is negative the system is long and it would normally accept bids. Elexon notes that NIV itself can change in later settlement runs.

05 · Settlement runs

The settlement run timeline: II, SF, R1, R2, R3, RF and DF

Elexon does not settle a day once. It runs the settlement calculation for the whole day several times, each time with more actual meter readings in place of estimates, and invoices from the second run on. The timetable is being shortened under market-wide half-hourly settlement (MHHS milestone M16), so when each run falls depends on the settlement day. The table is as of 7 Nov 2026; Elexon's settlement calendar fixes each run's date, and timings are counted from the settlement day.

RunNameSettlement days before 1 Oct 2026From 1 Oct 2026 (approved)Planned under M16What happens
IIInterim Informationabout 5 working daysabout 5 working daysnone listed on the M16 pageCharges calculated for information only; nobody is invoiced.
SFInitial Settlementabout 15 working daysabout 15 working days7 working days, from 2 Jul 2027The first run at which parties are charged or credited.
R1First Reconciliationabout 39 working daysabout 39 working days30 working days, from 2 Jul 2027Repeats the calculation with the latest metered data.
R2Second Reconciliationabout 4 monthsabout 4 monthsnone: RF at 4 months takes its placeAs R1, with more actual readings in place of estimates.
R3Third Reconciliationabout 7 monthsnone: RF takes its placenoneAs R2.
RFFinal Reconciliationabout 14 months, or 7 months in place of R3 where 14 would end after 31 Oct 20277 months4 months, from 1 Apr 2027The last scheduled run.
DFDispute Finalup to 28 monthsup to 28 months20 months, from 2 Jul 2027Only when a trading dispute is upheld after RF.
  • Now, for settlement days from 1 Oct 2026: Final Reconciliation comes about seven months after the settlement day instead of 14, and takes the place of R3. The MHHS Migration and Cutover Advisory Group approved this on 15 Sep 2026, so the first seven-month RF run, for settlement day 1 Oct 2026, falls in May 2027. For days before 1 Oct 2026 the approved Transition Design (MHHS-DEL1590 v2.3, 14 Mar 2025) aims to finish the scheduled runs by 31 Oct 2027, four months after the cutover, unless the M16 date is deferred. A day whose 14-month RF would fall later has it brought forward to replace its R3; its R2 sits in the 2026/27 settlement calendar, which was issued unchanged, and the steering group's paper of 7 Oct 2026 names only RF replacing R3. Post-final (DF) runs for those days can still come up to 28 months after the settlement day.
  • Planned for settlement days from 1 Apr 2027: RF at four months, replacing R2, subject to the programme's decision in spring 2027.
  • Planned for settlement days from 2 Jul 2027: SF at 7 working days instead of about 15, R1 at 30 working days and DF at 20 months instead of 28, subject to the programme's decision in summer 2027.

The price each run set: Best View Prices

The system-prices endpoint stays at the indicative balancing mechanism (BM) run: it never carries the price a later settlement run set. Those prices are on the keyless /market-reports/best-view-prices endpoint, one row per settlement period with the run type (BM, II, SF, R1, R2, R3, RF, DF) and the system sell and buy price, but no NIV. Ask for one run with runType, or leave it out for the latest run held for each period. Elexon's imbalance pricing page still points to the BSC Portal for them.

# Prices by settlement run (Best View Prices), one settlement day, one run
curl "https://data.elexon.co.uk/bmrs/api/v1/market-reports/best-view-prices?startDate=2026-10-01&endDate=2026-10-01&runType=SF&format=json"

# Leave runType out for the latest run held for each period
curl "https://data.elexon.co.uk/bmrs/api/v1/market-reports/best-view-prices?startDate=2026-10-01&endDate=2026-10-01&format=json"
  • When we read both endpoints on 7 Nov 2026, the II and SF prices for settlement day 1 Oct 2026 differed from the system-prices value in 5 of 48 periods, and the RF price for 1 Aug 2025 in 2 of 48.
  • Not every run is held for every day: for 1 Aug 2025 the endpoint returned the BM, R3 and RF runs only.
  • Within the BM run, system-prices returns only the newest version of each period. When we read it on 7 Nov 2026, the periods of that day had been written about 15 to 20 minutes after each period ended, and the periods of earlier days had been written again about a day later. createdDateTime tells you which version you hold, so store it with the value.
  • Reconciliation runs replace estimated meter readings with actual ones, so they change parties' metered volumes and imbalance charges. A desk that reconciles cash-out against its own position should take the figures from the run its invoice came from.
06 · NESO requests

NESO Data Portal API: find the resource, then query it

The portal is a CKAN site. A dataset (a package) holds one or more resources, and the rows live in a resource's datastore. You ask package_show for the dataset, take the id of the resource you want, and read it with datastore_search or, for a selection and order, with datastore_search_sql. The day-ahead wind forecast is the example below.

# 1. Find the dataset and its resources (no key)
curl "https://api.neso.energy/api/3/action/package_show?id=day-ahead-wind-forecast"

# 2. Read a resource by its id
curl "https://api.neso.energy/api/3/action/datastore_search?resource_id=b2f03146-f05d-4824-a663-3a4f36090c71&limit=48"

# 3. Or ask for columns and order with SQL
curl -G "https://api.neso.energy/api/3/action/datastore_search_sql" \
  --data-urlencode 'sql=SELECT "Datetime_GMT", "Incentive_forecast" FROM "b2f03146-f05d-4824-a663-3a4f36090c71" ORDER BY "Datetime_GMT"'

In Python, resolve the resource id by name on each run rather than hard-coding it: NESO can re-upload a resource under a new id.

import requests

NESO = "https://api.neso.energy/api/3/action/"

def resource_id(dataset, name):
    r = requests.get(NESO + "package_show", params={"id": dataset}, timeout=30)
    r.raise_for_status()
    return next(res["id"] for res in r.json()["result"]["resources"] if res["name"] == name)

rid = resource_id("day-ahead-wind-forecast", "Day Ahead Wind Forecast")
r = requests.get(NESO + "datastore_search", params={"resource_id": rid, "limit": 100}, timeout=30)
r.raise_for_status()
rows = r.json()["result"]["records"]
wind = [(row["Datetime_GMT"], float(row["Incentive_forecast"])) for row in rows]
07 · Traps

What the documentation does not warn you about

The settlement date is a UK day

settlementDate is the Europe/London calendar day, while startTime is UTC. In summer, period 1 of a settlement day starts at 23:00 UTC the evening before. Build the date in London time, or a request made just after midnight UTC asks for the wrong day. Just after UK midnight the new day may have no priced periods yet, so fall back to the previous day.

Not every day has 48 periods

The day the clocks go forward has 46 settlement periods and the day they go back has 50. Index by startTime, not by period number times 30 minutes.

The newest half-hour is not there at once

FUELHH stamps each period with its end as publishTime, and when we checked on 7 Nov 2026 it served a period within minutes of its end. The system price for a period lands later, about 15 to 20 minutes after the period ends. Either way, a job that asks for “today” just before midnight misses the day's last periods, so read yesterday and today together.

The system price endpoint takes a path, not a range

System prices sit at /balancing/settlement/system-prices/{settlementDate}, one UK day per request. A from and to range belongs to other datasets, and the field is systemSellPrice: there is no systemPrice field to filter on.

NESO numbers arrive as text

datastore_search_sql returned the wind forecast's values as strings when we read it on 7 Nov 2026, so convert before you compute. The “Day Ahead Wind Forecast” resource holds one day's 48 rows and is overwritten daily; earlier forecasts sit in a separate “Historic Day Ahead Wind Forecasts” resource.

NESO's day-ahead demand forecast is not half-hourly

The day-ahead national demand forecast publishes about a dozen named cardinal points a day (peaks, troughs and ramps) with local start and end times, not 48 periods. Treat each as a point in time, or use another dataset if you need a half-hourly profile.

08 · Licence

Free to read, and free to republish with the credit line

  • Elexon: the BMRS data licence lets you copy, publish, adapt and exploit the data, commercially too, on condition that you carry the line “Contains BMRS data © Elexon Limited copyright and database right” with the year and, where possible, a link to the licence. The rights end automatically if you do not. BSC parties use the data under the BSC instead.
  • Market Index Data: the licence does not cover rights Elexon is not authorised to license. The Market Index (MID) series come from the power exchanges, so leave them out unless you hold the exchange's permission.
  • NESO: NESO licenses each dataset on its page. The datasets this guide uses carry the National Energy SO Open Data Licence v1.0, with the credit “Supported by National Energy SO Open Data”.

This is our reading of the terms, not legal advice. The 2027 API ratings set Elexon and NESO beside the other European sources, with what each licence allows for AI use.

09 · Quick answers

Elexon BMRS and NESO questions

Do I need an API key for Elexon BMRS?

No. The Insights Solution API at https://data.elexon.co.uk/bmrs/api/v1 is public and needs no key. Older guides describe a key from the Elexon Portal: that belonged to the legacy BMRS API, which Elexon switched off on 31 May 2024.

What is the GB imbalance price?

It is the price Elexon applies to a BSC party's imbalance in each half-hour settlement period. It still carries two names, the system sell price and the system buy price, but since 5 Nov 2015 (modification P305) one calculation sets both, so they are equal in every period.

What does a positive net imbalance volume mean?

The system was short. Elexon defines the net imbalance volume (NIV) as positive when the system is short, which normally means the system operator accepted offers to raise generation or cut demand. Negative means the system was long, normally met by accepting bids.

When is the GB imbalance price final?

The system-prices endpoint serves the indicative price from the balancing mechanism run; the price each settlement run set is on /market-reports/best-view-prices. As of 7 Nov 2026, Initial Settlement (SF), the first run that is invoiced, falls about 15 working days after the settlement day, and Final Reconciliation (RF) about seven months after it for settlement days from 1 Oct 2026, down from 14 months, under MHHS milestone M16 as approved on 15 Sep 2026. RF is planned to fall to four months for settlement days from 1 Apr 2027, and SF to 7 working days, R1 to 30 working days and DF to 20 months for settlement days from 2 Jul 2027, each subject to a programme decision in 2027.

How do I get NESO Data Portal data through an API?

The NESO Data Portal runs on CKAN. Look a dataset up with package_show at https://api.neso.energy/api/3/action/, take the resource id, then query it with datastore_search or datastore_search_sql. No key is needed. NESO recommends no more than one request a second to the CKAN API and two a minute to the datastore API.

What happened to BM Reports?

BM Reports was the legacy Balancing Mechanism Reporting Service. Elexon replaced it with the Insights Solution at bmrs.elexon.co.uk and switched the old service off on 31 May 2024.

May I republish Elexon and NESO data?

With credit. Elexon's BMRS data licence allows commercial use if you carry the line “Contains BMRS data © Elexon Limited copyright and database right” with the year and, where possible, a link to the licence. It does not cover rights Elexon is not authorised to license, so leave out the Market Index (MID) series, which come from the power exchanges. NESO licenses each dataset on its page; the ones in this guide carry the National Energy SO Open Data Licence v1.0, with the credit “Supported by National Energy SO Open Data”. This is our reading of the terms, not legal advice.
Voltstack Analytics

GB balancing next to the rest of Europe, on one desk

Voltstack reads the GB system price and generation by fuel from Elexon and the day-ahead wind and demand forecasts from NESO, and sets them beside its ENTSO-E power and GIE gas series in one workspace. For NESO's forecasts it keeps each version it reads with the time it read it, since 31 Jul 2026, so you can see what the forecast said before delivery. Voltstack serves Elexon's system price as Elexon currently publishes it and keeps no earlier version of it. The 14-day trial opens the workspace; the Voltstack API is in early access, with keys issued on request.

Start a 14-day free trialRequest early access →or see the live demo

The button opens a 14-day free trial sign-up. Sign-up needs a work email.

The button opens the early-access request on our home page.

Related Voltstack Intelligence

More for builders

RATINGS · 2027 EDITION
Best European Energy Data APIs (2027)
APIs rated for builders, with the licence for AI use and how often values are corrected.
EXPLAINER
Why European Power Prices Track Gas
Merit-order pricing explained: why the marginal gas plant sets the power price in most hours.
STRUCTURAL REFERENCE
2026 European Gas & Power Data Provider Ratings
Data providers rated across price reporters, analytics platforms and alternative data.

Sources: Elexon Insights Solution and its developer portal (OpenAPI specification read 7 Nov 2026); Elexon's imbalance pricing page, the P305 modification page, its notices on switching off the legacy BMRS (31 May 2024), its market-wide half-hourly settlement programme page and its settlement run glossary; the BMRS data licence and BMRS API terms; the NESO Data Portal API guidance and the National Energy SO Open Data Licence v1.0; the MHHS Programme's M16 page, its MCAG and steering group papers of September and October 2026 and its Transition Design (MHHS-DEL1590 v2.3, 14 Mar 2025). Request paths, field names and the traps come from the code and notes behind Voltstack's own Elexon and NESO readers and from requests made on 7 Nov 2026. The live strip is Elexon's indicative system price data, read at most once every 30 minutes; the guide prints no NESO value.

Disclaimer: Produced by Voltstack Intelligence for information only. Elexon and NESO are not affiliated with Voltstack and do not endorse this guide. Both change their APIs and terms from time to time; check their own documentation before you rely on a parameter here. Corrections to research@voltstack.energy.

VOLTSTACK INTELLIGENCE · BUILDER GUIDE · REVIEWED 7 NOV 2026voltstack.energy