{"openapi":"3.1.0","info":{"title":"Vooluhind API","version":"1.0.0","summary":"Estonian (Nord Pool EE) day-ahead electricity prices and a probabilistic price forecast.","description":"Free, no-key JSON API for Estonia's hourly electricity market price: settled Nord Pool day-ahead prices plus Vooluhind's probabilistic model forecast (p10/p50/p90) for the public window — settled hours + 48 h of model lead, capped at 72 h from now. The model itself reaches further ahead; the tail past `freeUntil` is available on request (info@vooluhind.ee). All timestamps are unix seconds at the top of a UTC hour, with an ISO 8601 twin. Prices come in two units: `eurMwh`/`p*` are EUR/MWh excluding VAT (the market's unit); `eurKwh`/`p*Kwh` are EUR/kWh including 22% Estonian VAT (the consumer unit). Grid fees and excise are never included. Responses are edge-cached for ~60 s; polling more often than once a minute gains nothing. Please rate-limit clients well under 10 req/s. Attribution when republishing: “Vooluhind (vooluhind.ee)”. Data is informational and unofficial.","contact":{"name":"Vooluhind","email":"info@vooluhind.ee","url":"https://vooluhind.ee/en/api"}},"servers":[{"url":"https://vooluhind.ee"}],"paths":{"/api/v1/forecast":{"get":{"operationId":"getForecast","summary":"Upcoming prices: settled day-ahead + model forecast","description":"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.","responses":{"200":{"description":"The current public forecast window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastResponse"}}}},"400":{"description":"A query string was supplied. This endpoint accepts none."}}}},"/api/series":{"get":{"operationId":"getSeries","summary":"Dashboard series: price history + continuous forecast","description":"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":[{"name":"days","in":"query","required":false,"description":"History window in days, 2–14 (values outside are clamped; default 14). Must match ^\\d{1,2}$ — anything else is rejected with 400.","schema":{"type":"string","pattern":"^\\d{1,2}$"}}],"responses":{"200":{"description":"History + forecast series and dashboard summary fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeriesResponse"}}}},"400":{"description":"`days` did not match ^\\d{1,2}$."}}}}},"components":{"schemas":{"ForecastResponse":{"type":"object","description":"The /api/v1/forecast payload.","required":["zone","currency","now","madeAt","lastRefresh","freeUntil","gated","backtest","docs","dayAhead","forecast"],"properties":{"zone":{"type":"string","const":"EE","description":"Nord Pool bidding zone the data covers."},"currency":{"type":"string","const":"EUR"},"now":{"type":"integer","description":"When this response was computed, unix seconds UTC."},"madeAt":{"type":["integer","null"],"description":"When the served forecast run was produced, unix seconds UTC. Null when no forecast exists yet."},"lastRefresh":{"type":["integer","null"],"description":"When the data pipeline last ingested, unix seconds UTC."},"freeUntil":{"type":"integer","description":"Last 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."},"gated":{"type":"boolean","description":"True when the model holds forecast hours past freeUntil (a longer forecast exists)."},"backtest":{"oneOf":[{"$ref":"#/components/schemas/Backtest"},{"type":"null"}],"description":"Accuracy of the served model from a walk-forward backtest. Null while unavailable."},"docs":{"type":"string","description":"URL of the human documentation for this API."},"dayAhead":{"type":"array","items":{"$ref":"#/components/schemas/DayAheadHour"},"description":"Settled Nord Pool day-ahead prices from the current hour forward, ascending by ts. Authoritative where present."},"forecast":{"type":"array","items":{"$ref":"#/components/schemas/ForecastHour"},"description":"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."}}},"DayAheadHour":{"type":"object","description":"One settled market hour.","required":["ts","startsAt","eurMwh","eurKwh"],"properties":{"ts":{"type":"integer","description":"Hour start, unix seconds UTC."},"startsAt":{"type":"string","format":"date-time","description":"Hour start, ISO 8601 UTC (same instant as ts)."},"eurMwh":{"type":"number","description":"Settled day-ahead price, EUR/MWh, excl. VAT."},"eurKwh":{"type":"number","description":"Same price, EUR/kWh incl. 22% VAT, rounded to 4 dp."}}},"ForecastHour":{"type":"object","description":"One forecast hour. p50 is the model's conditional median; p10/p90 bound an 80% uncertainty interval that widens with horizon.","required":["ts","startsAt","p10","p50","p90","p10Kwh","p50Kwh","p90Kwh"],"properties":{"ts":{"type":"integer","description":"Hour start, unix seconds UTC."},"startsAt":{"type":"string","format":"date-time","description":"Hour start, ISO 8601 UTC (same instant as ts)."},"p10":{"type":"number","description":"10th percentile, EUR/MWh, excl. VAT."},"p50":{"type":"number","description":"Median forecast, EUR/MWh, excl. VAT."},"p90":{"type":"number","description":"90th percentile, EUR/MWh, excl. VAT."},"p10Kwh":{"type":"number","description":"p10 as EUR/kWh incl. 22% VAT, rounded to 4 dp."},"p50Kwh":{"type":"number","description":"p50 as EUR/kWh incl. 22% VAT, rounded to 4 dp."},"p90Kwh":{"type":"number","description":"p90 as EUR/kWh incl. 22% VAT, rounded to 4 dp."}}},"Backtest":{"type":"object","description":"Walk-forward backtest of the served model.","required":["mae","baselineMae","skill","horizonH"],"properties":{"mae":{"type":"number","description":"Mean absolute error of the model, EUR/MWh."},"baselineMae":{"type":"number","description":"MAE of the seasonal-naive baseline (price one week earlier), EUR/MWh."},"skill":{"type":"number","description":"1 − mae/baselineMae — the fraction of baseline error the model removes."},"horizonH":{"type":"integer","description":"Forecast horizon the numbers were measured at, hours ahead."}}},"SeriesResponse":{"type":"object","description":"The dashboard payload of /api/series. Core fields listed; the payload also carries dashboard summary fields (current, cheapest, priciest, cheapestForecast, priciestForecast) shaped for the site's own UI.","required":["now","actuals","forecast","freeUntil","gated"],"properties":{"now":{"type":"integer","description":"When this response was computed, unix seconds UTC."},"lastRefresh":{"type":["integer","null"],"description":"Last pipeline ingest, unix seconds UTC."},"madeAt":{"type":["integer","null"],"description":"When the served forecast run was produced, unix seconds UTC."},"actuals":{"type":"array","items":{"$ref":"#/components/schemas/SeriesActual"},"description":"Hourly settled prices over the requested history window, plus settled future hours."},"forecast":{"type":"array","items":{"$ref":"#/components/schemas/SeriesForecastPoint"},"description":"Continuous past→future forecast series: for each past hour, the freshest forecast made before it; for future hours, the latest run, up to freeUntil."},"backtest":{"oneOf":[{"$ref":"#/components/schemas/Backtest"},{"type":"null"}],"description":"Accuracy of the served model from a walk-forward backtest. Null while unavailable."},"freeUntil":{"type":"integer","description":"Last forecast hour served publicly, unix seconds UTC."},"gated":{"type":"boolean","description":"True when a longer forecast exists past freeUntil."}}},"SeriesActual":{"type":"object","description":"One settled market hour in the dashboard series.","required":["ts","eurMwh","eurKwh"],"properties":{"ts":{"type":"integer","description":"Hour start, unix seconds UTC."},"eurMwh":{"type":"number","description":"Settled price, EUR/MWh, excl. VAT."},"eurKwh":{"type":"number","description":"Same price, EUR/kWh incl. 22% VAT, rounded to 4 dp."}}},"SeriesForecastPoint":{"type":"object","description":"One hour of the dashboard forecast series (no ISO twin — use ts).","required":["ts","p10","p50","p90","p10Kwh","p50Kwh","p90Kwh"],"properties":{"ts":{"type":"integer","description":"Hour start, unix seconds UTC."},"p10":{"type":"number","description":"10th percentile, EUR/MWh, excl. VAT."},"p50":{"type":"number","description":"Median forecast, EUR/MWh, excl. VAT."},"p90":{"type":"number","description":"90th percentile, EUR/MWh, excl. VAT."},"p10Kwh":{"type":"number","description":"p10 as EUR/kWh incl. 22% VAT."},"p50Kwh":{"type":"number","description":"p50 as EUR/kWh incl. 22% VAT."},"p90Kwh":{"type":"number","description":"p90 as EUR/kWh incl. 22% VAT."}}}}}}