Skip to main content
Vooluhind

Vooluhind API

Vooluhind's data is open in machine-readable form: a free JSON API with no key and no registration. It serves settled Nord Pool EE day-ahead hourly prices and our model's probabilistic price forecast (p10/p50/p90) over the public window.

The API is built for integrations — home automation, charging schedules, dashboards. Responses are CORS-enabled, so browser apps can call it directly.

Quick start

curl https://vooluhind.ee/api/v1/forecast

Example response (trimmed):

{
  "zone": "EE",
  "currency": "EUR",
  "now": 1786371234,
  "madeAt": 1786347000,
  "lastRefresh": 1786368000,
  "freeUntil": 1786554000,
  "gated": true,
  "backtest": { "mae": 18.4, "baselineMae": 27.9, "skill": 0.34, "horizonH": 24 },
  "docs": "https://vooluhind.ee/en/api",
  "dayAhead": [
    { "ts": 1786374000, "startsAt": "2026-08-10T15:00:00.000Z", "eurMwh": 91.4, "eurKwh": 0.1115 }
  ],
  "forecast": [
    { "ts": 1786377600, "startsAt": "2026-08-10T16:00:00.000Z",
      "p10": 62.1, "p50": 95.3, "p90": 148.7,
      "p10Kwh": 0.0758, "p50Kwh": 0.1163, "p90Kwh": 0.1814 }
  ]
}

Concepts

Units
eurMwh and p10/p50/p90 are EUR/MWh excluding VAT (the market's unit). eurKwh and p*Kwh are EUR/kWh including 22% Estonian VAT (the consumer unit). Grid fees and excise are never included.
Timestamps
ts is unix seconds at the top of a UTC hour; startsAt is the same instant in ISO 8601. Hours are UTC — Estonian local time is UTC+2/+3.
The public window (freeUntil)
Forecast hours are served up to freeUntil: settled market hours + 48 h of model lead, capped at 72 h from now. The model itself reaches further — when gated is true, a longer forecast exists and is available on request: info@vooluhind.ee.
Caching and limits
Responses are edge-cached for ~60 s; polling more often returns nothing fresher. The data moves once a day (~14:00 Estonian time, when Nord Pool publishes next-day prices) and hourly for the forecast. Keep clients well under 10 req/s.
Attribution
When republishing the data, credit the source: “Vooluhind (vooluhind.ee)”. The data is informational and unofficial.

Endpoints

The reference below is generated from the OpenAPI specification.

GET/api/v1/forecast

Upcoming prices: settled day-ahead + model forecast

The integration endpoint. Returns settled Nord Pool EE day-ahead prices from the current hour forward, and the model's p10/p50/p90 forecast for strictly-future hours up to `freeUntil`. Where both cover an hour, the settled price is authoritative. Takes no query parameters — any query string is rejected with 400.

Response fields ForecastResponse

FieldTypeDescription
zone"EE"Nord Pool bidding zone the data covers.
currency"EUR"
nowintegerWhen this response was computed, unix seconds UTC.
madeAtinteger | nullWhen the served forecast run was produced, unix seconds UTC. Null when no forecast exists yet.
lastRefreshinteger | nullWhen the data pipeline last ingested, unix seconds UTC.
freeUntilintegerLast forecast hour served publicly, unix seconds UTC: the newest settled day-ahead hour + 48 h of model lead, capped at 72 h from now. The model's further hours are withheld — available on request.
gatedbooleanTrue when the model holds forecast hours past freeUntil (a longer forecast exists).
backtestBacktest | nullAccuracy of the served model from a walk-forward backtest. Null while unavailable.
docsstringURL of the human documentation for this API.
dayAheadDayAheadHour[]Settled Nord Pool day-ahead prices from the current hour forward, ascending by ts. Authoritative where present.
forecastForecastHour[]Model forecast for strictly-future hours up to freeUntil, ascending by ts. Overlaps the settled tail of dayAhead; prefer the settled price where both exist.

GET/api/series

Dashboard series: price history + continuous forecast

The payload behind the vooluhind.ee dashboard, exposed as the machine-readable dataset distribution. Includes up to 14 days of price history and the continuous past→future forecast series (for past hours: what the model predicted at the time). Shaped for the site's own chart — for integrations prefer /api/v1/forecast, whose shape is versioned.

Parameters

  • days (query, optional) History window in days, 2–14 (values outside are clamped; default 14). Must match ^\d{1,2}$ — anything else is rejected with 400.

Response fields SeriesResponse

FieldTypeDescription
nowintegerWhen this response was computed, unix seconds UTC.
lastRefreshinteger | nullLast pipeline ingest, unix seconds UTC.
madeAtinteger | nullWhen the served forecast run was produced, unix seconds UTC.
actualsSeriesActual[]Hourly settled prices over the requested history window, plus settled future hours.
forecastSeriesForecastPoint[]Continuous past→future forecast series: for each past hour, the freshest forecast made before it; for future hours, the latest run, up to freeUntil.
backtestBacktest | nullAccuracy of the served model from a walk-forward backtest. Null while unavailable.
freeUntilintegerLast forecast hour served publicly, unix seconds UTC.
gatedbooleanTrue when a longer forecast exists past freeUntil.

Data types

Field tables are generated from the same OpenAPI spec served at /api/openapi.json.

DayAheadHour

One settled market hour.

FieldTypeDescription
tsintegerHour start, unix seconds UTC.
startsAtstringHour start, ISO 8601 UTC (same instant as ts).
eurMwhnumberSettled day-ahead price, EUR/MWh, excl. VAT.
eurKwhnumberSame price, EUR/kWh incl. 22% VAT, rounded to 4 dp.

ForecastHour

One forecast hour. p50 is the model's conditional median; p10/p90 bound an 80% uncertainty interval that widens with horizon.

FieldTypeDescription
tsintegerHour start, unix seconds UTC.
startsAtstringHour start, ISO 8601 UTC (same instant as ts).
p10number10th percentile, EUR/MWh, excl. VAT.
p50numberMedian forecast, EUR/MWh, excl. VAT.
p90number90th percentile, EUR/MWh, excl. VAT.
p10Kwhnumberp10 as EUR/kWh incl. 22% VAT, rounded to 4 dp.
p50Kwhnumberp50 as EUR/kWh incl. 22% VAT, rounded to 4 dp.
p90Kwhnumberp90 as EUR/kWh incl. 22% VAT, rounded to 4 dp.

Backtest

Walk-forward backtest of the served model.

FieldTypeDescription
maenumberMean absolute error of the model, EUR/MWh.
baselineMaenumberMAE of the seasonal-naive baseline (price one week earlier), EUR/MWh.
skillnumber1 − mae/baselineMae — the fraction of baseline error the model removes.
horizonHintegerForecast horizon the numbers were measured at, hours ahead.

SeriesActual

One settled market hour in the dashboard series.

FieldTypeDescription
tsintegerHour start, unix seconds UTC.
eurMwhnumberSettled price, EUR/MWh, excl. VAT.
eurKwhnumberSame price, EUR/kWh incl. 22% VAT, rounded to 4 dp.

SeriesForecastPoint

One hour of the dashboard forecast series (no ISO twin — use ts).

FieldTypeDescription
tsintegerHour start, unix seconds UTC.
p10number10th percentile, EUR/MWh, excl. VAT.
p50numberMedian forecast, EUR/MWh, excl. VAT.
p90number90th percentile, EUR/MWh, excl. VAT.
p10Kwhnumberp10 as EUR/kWh incl. 22% VAT.
p50Kwhnumberp50 as EUR/kWh incl. 22% VAT.
p90Kwhnumberp90 as EUR/kWh incl. 22% VAT.

OpenAPI specification

The whole API is described as an OpenAPI 3.1 document — import it into Postman or Insomnia, or generate a client for your language:

https://vooluhind.ee/api/openapi.json (OpenAPI 3.1, v1.0.0)