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
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.
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.
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.
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.
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/v1and 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.
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 underdata, and also serves CSV and XML. NESO answers CKAN JSON with the rows underresult.records.
Imbalance price, NIV, generation by fuel and demand from the Elexon API
| What | Path under /bmrs/api/v1 | Dataset | Notes |
|---|---|---|---|
| System prices and NIV, one day | /balancing/settlement/system-prices/{settlementDate} | DISEBSP | Every 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} | DISEBSP | The same row for a single period. |
| Generation by fuel, half-hourly | /datasets/FUELHH | FUELHH | Average MW per fuel type per settlement period. Filter with settlementDateFrom and settlementDateTo, or by publish time. |
| Generation by fuel, five-minute | /datasets/FUELINST | FUELINST | The same fuel split at five-minute resolution, for intraday views. |
| Demand outturn | /demand/outturn | INDO, ITSDO | Initial 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.
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.
| Field | What it holds |
|---|---|
| settlementDate | The UK settlement day (Europe/London), not the UTC date. |
| settlementPeriod | 1 to 48 on a normal day; 46 when the clocks go forward and 50 when they go back. |
| startTime | The start of the period in UTC. |
| createdDateTime | When this version of the row was written. Keep it: it tells two versions of the same period apart. |
| systemSellPrice, systemBuyPrice | The imbalance price in £/MWh. Equal in every period since the single price came in. |
| netImbalanceVolume | NIV in MWh. Positive: the system was short. Negative: long. |
| priceDerivationCode | Elexon's code for how the price was derived in that period. |
| reserveScarcityPrice | The reserve scarcity price used in the calculation, in £/MWh. |
| totalAcceptedOfferVolume, totalAcceptedBidVolume | The 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.
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.
| Run | Name | Settlement days before 1 Oct 2026 | From 1 Oct 2026 (approved) | Planned under M16 | What happens |
|---|---|---|---|---|---|
| II | Interim Information | about 5 working days | about 5 working days | none listed on the M16 page | Charges calculated for information only; nobody is invoiced. |
| SF | Initial Settlement | about 15 working days | about 15 working days | 7 working days, from 2 Jul 2027 | The first run at which parties are charged or credited. |
| R1 | First Reconciliation | about 39 working days | about 39 working days | 30 working days, from 2 Jul 2027 | Repeats the calculation with the latest metered data. |
| R2 | Second Reconciliation | about 4 months | about 4 months | none: RF at 4 months takes its place | As R1, with more actual readings in place of estimates. |
| R3 | Third Reconciliation | about 7 months | none: RF takes its place | none | As R2. |
| RF | Final Reconciliation | about 14 months, or 7 months in place of R3 where 14 would end after 31 Oct 2027 | 7 months | 4 months, from 1 Apr 2027 | The last scheduled run. |
| DF | Dispute Final | up to 28 months | up to 28 months | 20 months, from 2 Jul 2027 | Only 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.
createdDateTimetells 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.
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]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.
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.
Elexon BMRS and NESO questions
Do I need an API key for Elexon BMRS?
What is the GB imbalance price?
What does a positive net imbalance volume mean?
When is the GB imbalance price final?
How do I get NESO Data Portal data through an API?
What happened to BM Reports?
May I republish Elexon and NESO data?
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.
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.
More for builders
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.