Estonia mFRR capacity prices
BBCM-cleared mFRR capacity availability prices for the Estonian bidding zone — what BSPs are paid for *being available*, separate from energy activation prices. One value per 15-minute MTU, per direction. Sourced from the Baltic Transparency Dashboard, refreshed hourly.
Endpoints
- Latest (rolling 7-day):
https://public-data.volton.energy/v1/mfrr-capacity-price/latest.json - Per-day archive:
https://public-data.volton.energy/v1/mfrr-capacity-price/{YYYY-MM-DD}.json— immutable, available from2025-02-04
Row schema
| Column | Type | Unit | Nullable | Description |
|---|---|---|---|---|
mtu_start |
string (date-time) | — | no | Market Time Unit start (ISO 8601 UTC). Each MTU is a 15-minute settlement interval. |
direction |
string enum: up | down | — | no | Reserve direction the capacity is procured for. |
price_eur_mw_h |
number | EUR/MW/h | yes | BBCM-cleared mFRR capacity availability price (paid per MW of qualified capacity per hour). Null when no capacity procured in this direction. |
Top-level response: { schema_version, generated_at, meta, rows: [...] }
Code samples
curl
curl https://public-data.volton.energy/v1/mfrr-capacity-price/latest.json
DuckDB
SELECT * FROM read_json_auto(
'https://public-data.volton.energy/v1/mfrr-capacity-price/latest.json',
records = false
);
Python (pandas)
import pandas as pd
resp = pd.read_json('https://public-data.volton.energy/v1/mfrr-capacity-price/latest.json')
df = pd.DataFrame(resp['rows'])
R (jsonlite)
library(jsonlite)
data <- fromJSON('https://public-data.volton.energy/v1/mfrr-capacity-price/latest.json')
df <- data$rows
JavaScript (fetch)
const r = await fetch('https://public-data.volton.energy/v1/mfrr-capacity-price/latest.json');
const { rows, meta } = await r.json();
Excel Power Query (M)
let
Source = Json.Document(Web.Contents("https://public-data.volton.energy/v1/mfrr-capacity-price/latest.json")),
Rows = Source[rows],
AsTable = Table.FromRecords(Rows)
in
AsTable
Methodology
Capacity prices are paid hourly to every BSP that committed reserve capacity to the TSO ahead of time, regardless of whether activation happens. They clear daily on the Baltic Balancing Capacity Market (BBCM), live since 4 February 2025 with FCR + mFRR (aFRR added 15 April 2025).
Capacity revenue is materially the bigger income stream for Estonian BSPs vs energy: a typical 1 MW BESS earns the capacity price every hour it is qualified, whereas activation only triggers in some MTUs.
Prices may be null for an MTU when no capacity was procured in that direction.
FAQ
- How does capacity differ from energy clearing price?
- Capacity = what you are paid for *being available* (the option). Energy = what you are paid when actually activated (the strike). Most Estonian BSP revenue comes from capacity, because activations are infrequent but capacity is paid every hour.
- Why €/MW/h instead of €/MWh?
- You are paid per MW of available capacity per hour. €/MW/h × hours qualified = total capacity revenue. Energy prices are €/MWh because they price actual energy delivered.
License + citation
Source: Baltic Transparency Dashboard via Volton, CC-BY-4.0. CC-BY-4.0.
Volton Technology OÜ (2026). Estonia mFRR capacity prices.
CC-BY-4.0. https://public-data.volton.energy/mfrr-capacity-price/