Price API

Free JSON day-ahead prices for all Nordic areas and Germany. No sign-up, no keys, no tracking.

Try it live

curl -s "https://nordicenergypulse.com/api/public/v1/prices/current?area=FI"

Endpoints

Base URL https://nordicenergypulse.com/api/public/v1 · GET only · times in UTC ISO 8601 with a start_local copy in the area's timezone.

GET /api/public/v1/prices/current

Price right now (15-minute slot when available), plus the hourly average and change vs. the last 7 days.

ParameterValuesNotes
areaFI, SE1…SE4, NO1…NO5, DK1, DK2, DERequired

GET /api/public/v1/prices/today

All of today's prices, tomorrow's once the full day is published (otherwise null), day stats and the cheapest 1–4 hour windows.

ParameterValuesNotes
areaArea codeRequired
resolution1h | 15minOptional, default 1h. Norway (NO1–NO5) is always hourly; 15min returns hourly prices with resolution "1h".

GET /api/public/v1/prices/history

Daily average, minimum and maximum price.

ParameterValuesNotes
areaArea codeRequired
days7 | 14 | 30 | 90 | 180 | 365Optional, default 30

GET /api/public/v1/areas

Every supported area with timezone, currency, VAT rate and available resolutions (e.g. ["1h"] for Norway).

Price fields

  • eur_per_mwh — wholesale price, no VAT.
  • eur_cents_per_kwh / _incl_vat — euro cents per kWh.
  • local_per_kwh / _incl_vat — EUR, SEK, NOK or DKK per kWh (daily ECB rate).
  • VAT: FI 25.5%, SE/NO/DK 25%, NO4 0%, DE 19%. Grid fees and contract margins are not included.

Examples

Home Assistant

# configuration.yaml
sensor:
  - platform: rest
    name: Spot price FI
    resource: https://nordicenergypulse.com/api/public/v1/prices/current?area=FI
    scan_interval: 300
    value_template: "{{ value_json.current.eur_cents_per_kwh_incl_vat }}"
    unit_of_measurement: "c/kWh"
    json_attributes:
      - current
      - delta_vs_seven_day_average_pct

Python

import requests

r = requests.get("https://nordicenergypulse.com/api/public/v1/prices/today",
                 params={"area": "SE3", "resolution": "1h"}, timeout=10)
r.raise_for_status()
data = r.json()
best = data["cheapest_windows"][2]  # 3-hour window
print(best["start_local"], best["average_eur_cents_per_kwh_incl_vat"])

JavaScript

const res = await fetch("https://nordicenergypulse.com/api/public/v1/prices/current?area=NO1");
const { current } = await res.json();
console.log(current.local_per_kwh_incl_vat, "NOK/kWh");

Fair use and errors

  • Send a normal User-Agent header (as any browser, Python or Home Assistant client does) — requests without one, or with an empty one, are refused before reaching the API.
  • 60 valid requests per minute per client, counted across all servers. Rejected requests (400) don't use up this allowance but have their own limit. Over the limit you get HTTP 429 with a Retry-After header.
  • Give each parameter once — repeating one (e.g. two area values) returns 400 duplicate_parameter. Paths are lowercase; other spellings are redirected.
  • Responses are cached (current 1 min, today 1–5 min, history 30 min) and send an ETag — polling every 5 minutes is plenty.
  • Errors are JSON: { "error": { "status", "code", "message" } } — 400 invalid parameter, 404 unknown endpoint, 405 wrong method, 503 source unavailable.
  • CORS is open, so the API works directly from browser apps. No personal data is collected or stored.
  • Please credit "Nordic Energy Pulse" when you show the data publicly.