API

free · no key · CORS on · 60 req/min per IP · JSON · OpenAPI docs · openapi.json

Endpoints

GET /v1/forecast?zone=EE&resolution=15min&hours=168   # settled prices from today 00:00 + p10/p50/p90 forecast, k = horizon in days
GET /v1/prices?zone=FI&resolution=hour&start=2026-09-10&end=2026-09-14   # settled day-ahead prices (max 31 days)
GET /v1/now?zone=LV                                          # current 15-min and hourly price, next hour
GET /v1/cheapest?zone=LT&minutes=120&count=3&scope=tomorrow   # cheapest non-overlapping windows (known = settled vs forecast)
GET /v1/accuracy?zone=EE&days=14                             # cross-validated MAE and band hit rate per horizon + live MAE / hit rate
GET /v1/commentary?zone=EE&lang=et                           # written daily outlook (title + Markdown), falls back to en
GET /v1/levels?zone=EE&days=30                               # p25/p50/p75 of the last 30 days: cheap / normal / high / expensive thresholds
GET /v1/forecast?zone=EE&adjusted=false                     # pure model output; by default the online level correction (lvl, p50Model; level=false to skip) and the outlook adjustments (adj, p50Raw) are applied
GET /v1/zones · GET /v1/status                               # zones, time zones, VAT rates · data freshness
field
meaning
zone
EE FI LV LT — Nord Pool bidding zones; time zones are EET/EEST.
resolution
hour or 15min. Settled 15-minute prices exist since 2025-10-01; older history is hourly (served as four equal quarters).
eurMwh · ctKwh
Price in EUR/MWh and ct/kWh, without VAT and without network fees. Multiply by the zone's VAT rate from /v1/zones if you need gross prices.
p10 · p50 · p90
Forecast quantiles: p50 is the central estimate; the band is calibrated so that 80 % of settled prices land between p10 and p90 (conformalized quantile regression per hour block, quarter-hour bands widened separately). /v1/accuracy reports the achieved hit rate per horizon.
k
Horizon in days after the last settled local day (1 = the first day without published prices).
lvl · p50Model
Online level correction: per hour block the median error of the D+1 forecasts of the previous 7 days, added to p10/p50/p90 of every horizon when the forecast is served (level in the response lists the shift per block and the window). p50Model is the pure model value; level=false serves without this layer.
adj · p50Raw · adjRef
Expert adjustment from the written outlook (outages, cable faults — things the model cannot see) on top of the level correction: p50Raw is p50 before the delta, adjRef points into adjustments.entries. adjusted=false serves the pure model.
known
In /v1/cheapest: the whole window lies inside settled prices (true) or uses the forecast (false).
ts · startsAt
UTC epoch seconds and ISO-8601; every slot is the start of the delivery period.

Limits and caching

  • Free tier: 60 requests per minute per IP. With an X-API-Key header: 600 per minute (keys on request).
  • Responses carry Cache-Control: public, max-age=60. Settled prices change once a day (Nord Pool publishes around 13:45–14:45 EET), the forecast once an hour; poll accordingly.
  • Over the limit you get 429 with Retry-After: 60.

Accuracy

The model is a set of gradient-boosted trees per zone and horizon, trained on settled prices, calendar features and weather forecasts (wind at 100 m, temperature, solar radiation over the Baltics, Finland and Sweden), retrained weekly. /v1/accuracy returns the cross-validated mean absolute error per horizon from training and the live error of the forecasts actually published in the last days, plus how often the settled price fell inside the p10–p90 band: backtest[k].cv_cov80 on the most recent cross-validation fold (band calibrated on the earlier folds) and live[k].coverage80 on the published forecasts; the target is 80 %. The written outlook adds what the model cannot see: nuclear outages, interconnector maintenance, fuel and CO₂ prices.

/v1/accuracy?zone=EE · FI · LV · LT

Home Assistant

The Wattcast integration for Home Assistant exposes the current price, today/tomorrow averages, the cheapest windows, a price level and the full 7-day forecast as entities — one device per bidding zone. Install it through HACS as a custom repository:

  1. HACS → three-dot menu → Custom repositories → add https://github.com/SectorTll/wattcast-homeassistant, category Integration.
  2. Install Wattcast and restart Home Assistant.
  3. Settings → Devices & services → Add integration → Wattcast → pick your zone.

Entities per zone: current 15-minute and hourly price, today/tomorrow average, cheapest 1/2/3 h windows, a cheap / normal / high / expensive price level, a forecast sensor (p10/p50/p90) and the daily written outlook. Full entity list and automation examples are in the repository README.

Prefer not to use HACS? A plain REST sensor works too:

sensor:
  - platform: rest
    name: Electricity price now
    resource: https://wattcast.eu/v1/now?zone=EE
    value_template: "{{ value_json.current15min.ctKwh }}"
    unit_of_measurement: ct/kWh
    scan_interval: 900

Attribution and terms

Prices: Nord Pool day-ahead via Elering / Nord Pool Data Portal. Weather: Open-Meteo.com, CC BY 4.0. Forecast: Wattcast, unofficial and informational, no guarantee. When you show the data, attribute it as “Wattcast” with these sources. Full API terms, terms of use and privacy.