◐  Tolven · Energy Data

European imbalance and balancing data,
with the revisions kept.

A public API over imbalance and balancing data for the zones listed below, open without a key for the last 31 days. Built for people who backtest against it.

Quickstart → API reference
§ 01 · series

What is served,
and where.

One row per series, one column per zone.

Series NL BE DE-50HZ DE-AMPRION DE-TENNET DE-TRANSNET FR
imbalance-prices Imbalance prices · 15 min · EUR/MWh – – – –
balancing-state Balancing state · 1 min · MW
imbalance-volumes Imbalance volumes · 15 min · MWh · derived from balancing-state – – – – – –

Served zones as of 2026-11-01. The live status is the current answer.

imbalance-prices · BE

In BE both fields carry the single imbalance price.

imbalance-prices · FR

In FR the imbalance settlement period was 30 minutes until 2024-12-31T23:00Z, 15 from then. Rows before 2024-12-31T00:00Z are 30-minute; the 23 hours from 2024-12-31T00:00Z are published as 15-minute rows, each carrying its half-hour's price twice.

balancing-state · DE-50HZ, DE-AMPRION, DE-TENNET, DE-TRANSNET

In DE-50HZ, DE-AMPRION, DE-TENNET and DE-TRANSNET this is the control area's own balance. The German TSOs also publish the NRV-Saldo, their grid control cooperation's balance, signed the other way: positive there is a shortage. This field keeps ISHM's sign: positive is a surplus.

Warning · balancing-state · FR

In FR each minute carries the value of its imbalance settlement period: 30 minutes until 2024-12-31T23:00Z, 15 from then.

§ 02 · why imbalance

The series people
trade on.

Imbalance settlement is where flexibility earns, and balancing data shows how the system got there. Both are series where quality problems are expensive and invisible. A silent gap or a quietly-restated value corrupts a revenue backtest without ever throwing an error. Backtest against today's settled values and you trade on information you could not have had.

01

Gaps declared, never interpolated

The API reports missing data as a gap with a coverage envelope, never as a plausible fill. Interior absence only: the edges of coverage are not gaps. Query them at /v1/gaps.

02

A licence check on every series

Each series carries its provenance and redistribution terms. The public API serves only what is redistributable. It enforces that fail-closed, not by convention.

03

Point-in-time reads via ?as_of=

The API keeps every revision it has observed. For NL imbalance prices, observation starts 2026-06-18, the revisions_observed_from carried in every series and bulk response. Ask what was known at an instant and you get exactly that, with nothing published later leaking in. Earlier points carry the final settled value. The API rejects an earlier as_of with a 400, never an empty result. For NL imbalance prices, revisions are rare, which is what makes them dangerous. The ratio is measured on NL imbalance-prices only. Between 2026-06-18 and 2026-10-19 we observed revisions to 4 of 23,438 observations (the current count). The largest cut a settlement price by 77%, thirteen days after the interval closed. Three arrived together, within hours of an upstream outage ending. ENTSO-E's Transparency Platform serves only the latest value of each point, so nothing there tells you which period moved.

04

Resolution carried per observation

Every observation states its own resolution, an ISO 8601 duration. Balancing state is one-minute. Imbalance volumes are 15-minute across their whole history, and so are imbalance prices in NL and BE. In FR they were 30-minute until 2024-12-31. If a resolution ever changes, the API represents the change rather than resampling it away. Gap detection stays correct across it.

§ 03 · how you get it

JSON for reads.
Parquet for history.

Two views over one canonical store. /v1/series serves windowed and latest reads as JSON for anything interactive. Without a key, it reaches back 31 days. With a key, /v1/bulk serves the history as Parquet. The whole archive is one object, full.parquet, at current values. A first load is a single request, not one per month. A discovery manifest lists the monthly partitions for staying current afterwards. Frozen months keep stable URLs and ETags, so you re-download only what moved. Beside each file sits its revisions file, which carries known_at and revision, so you can apply as_of yourself without a query engine. The Parquet files are also your exit. They sit in an open format on your own disk. If Tolven ever stops, you lose the refresh, not the history.

Freshness differs by series. Each series page states how old the newest observation normally is, and when we measured it.

§ 04 · what we don't publish

No day-ahead prices,
deliberately.

There is no redistributable public source for NL day-ahead prices. They are set on EPEX SPOT, and ENTSO-E's copy is free to access but not to redistribute. SMARD's open day-ahead data covers DE-LU, AT and LU, not NL. We could not verify the downstream CC-BY claims for NL. Publishing it properly would need a distribution licence from the exchange. Rather than serve data we cannot defend, we serve none — and say so. The full licensing picture →

§ 05 · API keys

The last 31 days are free.
History takes a key.

Without a key, the API serves the last 31 days of every series, with every feature. That includes as_of reads inside the window, from each zone's point-in-time start, which its series page states. History before that window and every bulk file need a key. A key also raises the rate limits to five times the anonymous ones.

Request a key: hello@tolven.eu. The link opens an email with six short fields, one of them what you want the history for. What people use it for decides which series and zones we add next. We issue keys by hand and usually reply within a day, with a key that has an end date. If you need access for longer, or for good, say so under "For how long". We have not set prices yet. A key may cost money in future, and we will tell you before it costs you anything.