Estonia mFRR clearing prices
Manually-activated Frequency Restoration Reserve (mFRR) energy clearing prices for the Estonian bidding zone. One value per 15-minute Market Time Unit, per direction (up or down). Sourced from Elering and the Baltic Transparency Dashboard, refreshed hourly.
Endpoints
- Latest (rolling 7-day):
https://public-data.volton.energy/v1/mfrr-clearing-price/latest.json - Per-day archive:
https://public-data.volton.energy/v1/mfrr-clearing-price/{YYYY-MM-DD}.json— immutable, available from2024-10-09
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 | Activation direction: up = TSO buys energy from BSP, down = TSO sells back. |
price_eur_mwh |
number | EUR/MWh | yes | Marginal clearing price for activated balancing energy in this direction. Null when no activation cleared in this MTU. |
Top-level response: { schema_version, generated_at, meta, rows: [...] }
Code samples
curl
curl https://public-data.volton.energy/v1/mfrr-clearing-price/latest.json
DuckDB
SELECT * FROM read_json_auto(
'https://public-data.volton.energy/v1/mfrr-clearing-price/latest.json',
records = false
);
Python (pandas)
import pandas as pd
resp = pd.read_json('https://public-data.volton.energy/v1/mfrr-clearing-price/latest.json')
df = pd.DataFrame(resp['rows'])
R (jsonlite)
library(jsonlite)
data <- fromJSON('https://public-data.volton.energy/v1/mfrr-clearing-price/latest.json')
df <- data$rows
JavaScript (fetch)
const r = await fetch('https://public-data.volton.energy/v1/mfrr-clearing-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-clearing-price/latest.json")),
Rows = Source[rows],
AsTable = Table.FromRecords(Rows)
in
AsTable
Methodology
Each row represents the marginal clearing price set by the Common Merit Order List that mFRR activations cleared at, for a single 15-minute MTU and a single direction. Up = system was short of energy and mFRR ramped generation up; down = system was long and mFRR ramped generation down.
Estonia joined the EU MARI platform on 9 October 2024. Since then, Baltic mFRR clearing prices are derived from the cross-border MARI auction rather than the legacy Baltic-only auction. Prices are capped at ±10 000 EUR/MWh by MARI and have hit the cap multiple times during scarcity events.
Prices may be null for an MTU when no activation occurred in that direction.
FAQ
- Why are some prices very high or very low?
- During system scarcity (low wind, large generator outage, interconnector trip) the marginal mFRR bid that clears can be expensive — bids near the platform cap of 10 000 EUR/MWh have settled on multiple occasions in 2025–2026. Negative prices occur when the system is oversupplied and downward mFRR is cheap to procure.
- How does this compare to the day-ahead spot price?
- Day-ahead is forecast-based and clears once at noon for every hour of the next day. mFRR is real-time activation: it covers the gap between the day-ahead forecast and what actually happened, so it usually moves more than spot during balancing events.
- Can I download the underlying data?
- Yes — see the developer API page for stable JSON URLs. Data is published under CC-BY-4.0; please cite Volton and the upstream source (Elering / Baltic Transparency Dashboard).
License + citation
Source: Elering / Baltic Transparency Dashboard via Volton, CC-BY-4.0. CC-BY-4.0.
Volton Technology OÜ (2026). Estonia mFRR clearing prices.
CC-BY-4.0. https://public-data.volton.energy/mfrr-clearing-price/