# UK Electricity Imbalance Prices — Elexon BMRS System Prices (`nexgensignal/uk-power-market-records`) Actor

Great Britain electricity system buy and sell (imbalance) prices, net imbalance volume and market index prices per half-hour settlement period, from Elexon's official BMRS data. Since 2015. Part of NexGen Signal — official-source data products

- **URL**: https://apify.com/nexgensignal/uk-power-market-records.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** News, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $33.50 / 1,000 bmrs price records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## UK Electricity Imbalance Prices — Elexon BMRS System Prices

**Official source. No API key. Pay per record.**

This actor gives you Great Britain's electricity **system prices** — the System Buy Price and System Sell Price that settle every half-hour of imbalance in the GB market — together with the **market index prices** that feed into them, straight from Elexon's official Balancing Mechanism Reporting Service (BMRS). Elexon runs settlement under the Balancing and Settlement Code; these are the figures the market settles on.

Two datasets are covered:

- **`systemPrices`** — one record per half-hour settlement period: System Sell Price and System Buy Price (£/MWh), net imbalance volume, reserve scarcity price, price adjustments, replacement price, accepted offer and bid volumes, and the price derivation code. Available from late 2015.
- **`marketIndex`** — one record per settlement period and provider: the short-term wholesale market index price (£/MWh) and volume. Available from 2017. In practice this is almost all the APX provider: Elexon publishes nearly every N2EX row with a price and volume of zero (all N2EX rows on sampled June days from 2018 to 2026, and all but 6 of 960 periods in 1–20 September 2026). The actor skips zero rows and never charges for them.

A normal day has 48 settlement periods; the spring clock-change day has 46 and the autumn one 50. A full month of system prices is about 1,490 records (1,488 for August 2026).

### Who buys this and for what job

- **Energy traders, suppliers and aggregators** tracking imbalance prices and net imbalance volume to manage position and imbalance risk.
- **Battery storage and flexibility operators** valuing imbalance and short-term price spreads for dispatch and revenue models.
- **Renewable generators and route-to-market providers** reconciling imbalance charges.
- **Analysts, consultants and academics** studying GB balancing costs and market tightness.
- **Data teams** building a clean half-hourly price history without paging the BMRS API day by day.

### Sample output

![Sample output — UK Electricity Imbalance Prices](https://api.apify.com/v2/key-value-stores/IXCaMKjxSmUTLHhmq/records/uk-power-market-records.png)

```json
{
  "record_id": "BMRS:SP:2026-09-28:6",
  "dataset": "systemPrices",
  "settlement_date": "2026-09-28",
  "settlement_period": 6,
  "start_time_utc": "2026-09-28T01:30:00Z",
  "settlementDate": "2026-09-28",
  "settlementPeriod": 6,
  "startTime": "2026-09-28T01:30:00Z",
  "createdDateTime": "2026-09-28T02:19:03Z",
  "systemSellPrice": 125.67,
  "systemBuyPrice": 125.67,
  "bsadDefaulted": false,
  "priceDerivationCode": "N",
  "reserveScarcityPrice": 0,
  "netImbalanceVolume": -125.65138666666667,
  "sellPriceAdjustment": 0,
  "buyPriceAdjustment": 0,
  "replacementPrice": null,
  "replacementPriceReferenceVolume": null,
  "totalAcceptedOfferVolume": 613,
  "totalAcceptedBidVolume": -857.1166644444445,
  "totalAdjustmentSellVolume": 0,
  "totalAdjustmentBuyVolume": 117.5,
  "totalSystemTaggedAcceptedOfferVolume": 613,
  "totalSystemTaggedAcceptedBidVolume": -856.1166644444445,
  "totalSystemTaggedAdjustmentSellVolume": null,
  "totalSystemTaggedAdjustmentBuyVolume": 117.5,
  "api_url": "https://data.elexon.co.uk/bmrs/api/v1/balancing/settlement/system-prices/2026-09-28?format=json",
  "source": "Elexon — Balancing Mechanism Reporting Service (BMRS) Insights API (https://data.elexon.co.uk/bmrs/api/v1)",
  "licence": "BMRS open data licence — Elexon grants a 'worldwide, royalty-free, perpetual, non-exclusive licence' to copy, publish and 'exploit the BMRS Data, including commercially' (https://www.elexon.co.uk/bsc/data/balancing-mechanism-reporting-agent/copyright-licence-bmrs-data/).",
  "attribution": "Contains BMRS data © Elexon Limited copyright and database right 2026.",
  "licence_url": "https://www.elexon.co.uk/bsc/data/balancing-mechanism-reporting-agent/copyright-licence-bmrs-data/",
  "observed_at": "2026-09-28T03:54:26Z"
}
```

A market index record looks like this (provenance fields omitted):

```json
{"record_id": "BMRS:MID:APXMIDP:2026-09-28:10", "dataset": "marketIndex", "settlement_date": "2026-09-28", "settlement_period": 10, "start_time_utc": "2026-09-28T03:30:00Z", "dataProvider": "APXMIDP", "price": 137.87, "volume": 2703.55}
```

### Pricing

| Apify plan | Price per record |
|---|---|
| Free | $0.05 |
| Bronze | $0.045 |
| Silver | $0.04 |
| Gold and above | $0.0335 |

You pay only for records delivered to your dataset. `maxRecords` caps what a run can cost: 500 records cost $25 on the Free plan.

### Input

| Field | What it does | Default |
|---|---|---|
| `datasets` | `systemPrices`, `marketIndex`, or both | systemPrices |
| `lastDays` | Only settlement dates in the last N days | last 7 days if no dates are given |
| `fromDate`, `toDate` | First and last settlement date (YYYY-MM-DD) | 7 days ago → tomorrow |
| `marketIndexProviders` | `APXMIDP` and/or `N2EXMIDP` (N2EX rows are published as zero and skipped) | both |
| `maxRecords` | Maximum records delivered and billed | 500 |

Newest settlement periods come first. When both datasets are asked for, system prices are delivered first, then market index data.

Example — all August 2026 system prices:

```json
{"datasets": ["systemPrices"], "fromDate": "2026-08-01", "toDate": "2026-08-31", "maxRecords": 5000}
```

(That returned 1,488 records — 31 days × 48 periods — in 15 seconds.)

Example — market index prices for the first 20 days of September 2026:

```json
{"datasets": ["marketIndex"], "fromDate": "2026-09-01", "toDate": "2026-09-20", "maxRecords": 5000}
```

### Output

| Field | Meaning |
|---|---|
| `record_id` | `BMRS:SP:<date>:<period>` or `BMRS:MID:<provider>:<date>:<period>` |
| `dataset` | systemPrices or marketIndex |
| `settlement_date`, `settlement_period`, `start_time_utc` | The half-hour the record covers |
| Every BMRS field | Under its API name and exactly as returned: `systemSellPrice`, `systemBuyPrice`, `netImbalanceVolume`, `reserveScarcityPrice`, `priceDerivationCode`, `createdDateTime`… or `dataProvider`, `price`, `volume` |
| `api_url`, `source`, `licence`, `attribution`, `licence_url`, `observed_at` | Provenance, including Elexon's required attribution statement |

Prices are £/MWh and volumes MWh, as Elexon publishes them. Nothing is recalculated.

### Reading the system price fields

- **`systemSellPrice` / `systemBuyPrice`** — the prices at which imbalance is settled for the period. Since the single imbalance price came in, the two are normally equal; the actor keeps both exactly as Elexon publishes them.
- **`netImbalanceVolume`** — the system's net imbalance for the period in MWh, as Elexon publishes it; its sign shows whether the system was long or short.
- **`priceDerivationCode`** — Elexon's code for how the price was derived.
- **`reserveScarcityPrice`, `sellPriceAdjustment`, `buyPriceAdjustment`, `replacementPrice`** — the components and fallbacks Elexon reports alongside the price.
- **`totalAccepted…` and `totalSystemTagged…` volumes** — the accepted balancing volumes behind the price.
- **`createdDateTime`** — when this version of the period's prices was produced.

Elexon's own BMRS documentation describes each field in full.

### Tips

- **Daily feed:** schedule a run each morning with `lastDays: 1` to pick up yesterday's complete day and today so far; `record_id` stays the same for a period, so later runs can overwrite earlier values.
- **Spreads:** join `marketIndex` to `systemPrices` on `settlement_date` and `settlement_period` to compare imbalance and wholesale prices.
- **Long histories:** request a year at a time; each settlement date is one request.

### Cost guidance

A week of system prices is 336 records ($11 on Gold); a month about 1,490 ($50); a year about 17,500 ($587). Market index data is about one record per period (APX, plus the rare non-zero N2EX row), so a month is about 1,490 records; 1–20 September 2026 gave 962. A daily run with `lastDays: 1` (yesterday plus today so far) is between about 50 and 100 records — $2–$4 on Gold for system prices.

### Why imbalance prices matter

The system price is what a party pays or receives for every megawatt-hour it is out of balance in a half-hour, so it sets the value of flexibility in Great Britain. Batteries, demand response and flexible generation earn by being on the right side of it; suppliers and generators with forecasting errors pay it. A clean history of system prices, net imbalance volume and the market index is the starting point for valuing a battery, pricing a power purchase agreement's balancing risk or checking a supplier's imbalance bill.

### How a run works

The actor checks robots.txt (data.elexon.co.uk serves none — HTTP 404 — which is recorded in the run receipt as "no policy", not as permission), then asks the BMRS API for system prices one settlement date at a time and for market index data in windows of six days (the API allows at most seven per request). Records are pushed to your dataset first and charged only after they are delivered; if you set a maximum charge, the run stops cleanly when it is reached. Test runs took 3–15 seconds. Every run saves a receipt (`RUN_RECEIPT`) with the robots decision, requests made, days read and any request that failed. If the API cannot be reached after several retries, the run ends with a clear message and nothing is charged.

### Honest limitations

- **Latest settlement run only.** For each period the API returns prices from the latest settlement run available when you read it; early values can be revised in later runs, and the actor delivers what the API returns at that moment (`createdDateTime` tells you when it was produced).
- **History.** System prices start in late 2015 (1 December 2015 returned data, 1 November 2015 did not); market index data from 2017, with gaps in its first months.
- **Today is partial.** Periods that have not happened yet have no system price.
- **GB only.** Northern Ireland is part of the separate all-island market.
- **Not the full BMRS.** Balancing bids and offers, generation by fuel type and other BMRS datasets are not included.

### Licence and attribution

Elexon's BMRS open data licence (for users who are not parties to the Balancing and Settlement Code) grants "a worldwide, royalty-free, perpetual, non-exclusive licence" to copy, publish, adapt and "exploit the BMRS Data, including commercially", provided the source is acknowledged with its attribution statement and, where possible, a link to the licence. Every record carries that statement — *Contains BMRS data © Elexon Limited copyright and database right \[year]* — and the licence link. This actor is not affiliated with or endorsed by Elexon.

### Differentiation

Elexon actors on the Store — such as ninhothedev/elexon-grid-scraper and parseforge/elexon-bmrs-generation-scraper — focus on grid and generation data. This actor is built for GB price data: system buy and sell prices with every settlement field, plus the market index price and volume, by date range, with Elexon's required attribution on every record.

### The NexGen Signal family

Part of NexGen Signal — official-source data products, no API keys, pay per record. Related actors:

- [UK Renewable Project Pipeline Records — DESNZ REPD](https://apify.com/nexgensignal/uk-renewable-project-pipeline-records)
- [UK CPIH Inflation Time Series - ONS](https://apify.com/nexgensignal/uk-cpih-time-series-observations)
- [UK Retail Sales Index Monthly - ONS](https://apify.com/nexgensignal/uk-retail-sales-index-observations)
- [EU Industrial Emissions Records — EEA IED Facilities](https://apify.com/nexgensignal/eu-industrial-emissions-records)
- [National Macro Indicator Records — World Bank](https://apify.com/nexgensignal/national-macro-indicator-records)

# Actor input Schema

## `datasets` (type: `array`):

Which Elexon BMRS price data to read.

## `lastDays` (type: `integer`):

Only settlement dates in the last N days. If no dates are given at all, the last 7 days are read.

## `fromDate` (type: `string`):

Optional. First settlement date (YYYY-MM-DD). System prices go back to late 2015; market index data to 2017.

## `toDate` (type: `string`):

Optional. Last settlement date. Default tomorrow.

## `marketIndexProviders` (type: `array`):

Optional. APXMIDP and/or N2EXMIDP. Leave empty for both.

## `maxRecords` (type: `integer`):

Maximum records delivered and billed in this run. One record = one settlement period (per provider, for market index). Newest first.

## Actor input object example

```json
{
  "datasets": [
    "systemPrices",
    "marketIndex"
  ],
  "marketIndexProviders": [],
  "maxRecords": 10
}
```

# Actor output Schema

## `results` (type: `string`):

The delivered records.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "datasets": [
        "systemPrices",
        "marketIndex"
    ],
    "maxRecords": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/uk-power-market-records").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "datasets": [
        "systemPrices",
        "marketIndex",
    ],
    "maxRecords": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/uk-power-market-records").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "datasets": [
    "systemPrices",
    "marketIndex"
  ],
  "maxRecords": 10
}' |
apify call nexgensignal/uk-power-market-records --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/uk-power-market-records"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/AYRVn0Mo6ZPPjPduy/builds/5Dcbw3IWWjRfer1cD/openapi.json
