API · versie 1

Externe API

Haal marktprijzen, het leveranciersoverzicht en, met een eigen sleutel, de gegevens van één dossier programmatisch op. Dezelfde berekeningen als de website.

Bereikbaarheid. De API is voorlopig enkel bereikbaar binnen het Tailscale-netwerk van SEF (basis-URL hieronder, poort 8443). Op een echte server volgt een openbaar adres; het pad /api/v1 en het contract blijven dan gelijk. Een sleutel vraag je via contact.

Snelstart

export SEF_URL="https://energie-vlaanderen.tamarin-newton.ts.net:8443"
export SEF_SLEUTEL="sef_..."

curl -s -H "Authorization: Bearer $SEF_SLEUTEL" "$SEF_URL/api/v1/status"
curl -s -H "Authorization: Bearer $SEF_SLEUTEL" \
     "$SEF_URL/api/v1/leveranciers/overzicht?energie=Elektriciteit"

Het volledige contract (parameters en antwoorden) staat in openapi-extern.json (OpenAPI 3).

Authenticatie en scopes

Elke aanvraag draagt Authorization: Bearer <sleutel>. Een sleutel begint met sef_ en hoort bij één account en één dossier. Hij is standaard 365 dagen geldig, kan elk moment worden ingetrokken en werkt niet meer zodra het account de toegang tot het dossier verliest. Behandel hem als een wachtwoord: niet in code, URL's of logs.

ScopeGeeft toegang tot
publiekPublieke marktdata: prijzen, leveranciersoverzicht, netbeheerders, nieuws, status. Geen persoonsgegevens.
dossier:lezenHet dossier van de sleutel lezen: aansluitingen, verbruik, contractperiodes, simulaties, vergelijkingen.
dossier:uitvoerenEen simulatie of contractvergelijking starten op dat dossier.

Endpoints

Alle paden staan onder /api/v1. Wat hier niet staat (aanmelden, accountbeheer, uploaden, wissen, facturen) bestaat extern niet.

MethodePadScopeWat
GET/api/v1/statuspubliekGrove status voor de publieke statuspagina: geen fouttekst, geen host.
GET/api/v1/nieuwspubliekGoedgekeurd energienieuws, nieuwste eerst (ADR-0032). Enkel titel,
GET/api/v1/tariefsignalenpubliekTariefsignalen bij één resultaat (ADR-0033): `geldt` = een aangekondigde
GET/api/v1/prijzen/indexenpubliekAlle marktindexreeksen met gerealiseerde maandwaarden, meest gebruikte eerst.
GET/api/v1/prijzen/indexpubliekMaandwaarden (€/MWh, gerealiseerd) van één reeks. Onbekende reeks -> 404.
GET/api/v1/prijzen/verlooppubliekGemiddelde zuivere energieprijs per maand (c€/kWh, excl. btw) van het
GET/api/v1/leveranciers/overzichtpubliekBewaarde rangschikking van de laatste nachtelijke run op het
GET/api/v1/netbeheerders/vergelijkingpubliekJaarlijkse meerkost per netbeheerder t.o.v. de goedkoopste, per
GET/api/v1/mij/aansluitingendossier:lezenAansluitingen van de gebruiker, met EAN-masker en meetbereik.
GET/api/v1/mij/verbruikdossier:lezenAfname en injectie per maand of dag, lokale tijd, half-open [van, tot).
GET/api/v1/mij/contractperiodesdossier:lezenAlle contractperiodes, met de prijs van elke afgesloten periode
GET/api/v1/mij/prijsdossier:lezenAll-in prijs per kWh (EUR incl. btw) van het huidige
GET/api/v1/mij/simulatie-optiesdossier:lezenKeuzes voor het simulatieformulier: batterijmodellen (Marstek-lijn
GET/api/v1/mij/simulatiesdossier:lezenBewaarde simulaties van de gebruiker, nieuwste eerst (ADR-0044).
POST/api/v1/mij/simulatiesdossier:uitvoerenSimuleert batterij, extra panelen, een elektrische wagen en/of een
GET/api/v1/mij/simulaties/{run_id}dossier:lezenEén eigen simulatie met haar samenvatting (null bij simulaties van vóór
GET/api/v1/mij/vergelijkingendossier:lezenDe laatste contractvergelijkingen van de gebruiker, nieuwste eerst.
POST/api/v1/mij/vergelijkingendossier:uitvoerenZet een contractvergelijking op de eigen meetdata in de wachtrij.
GET/api/v1/mij/vergelijkingen/{opdracht_id}dossier:lezenStatus van één eigen vergelijking; als ze klaar is ook de rangschikking.
POST/api/v1/mij/aansluitingen/{aansluiting_id}/meetwaardendossier:schrijvenKwartierwaarden uit een P1-poort (Home Assistant) op een bestaande

Conventies

Fouten

Fouten zijn application/problem+json met een stabiele code en een correlation_id.

StatusCodeBetekenis
401NIET_GEMACHTIGDSleutel ontbreekt, is ongeldig, verlopen of ingetrokken.
403SCOPE_ONVOLDOENDEDe sleutel mist de vereiste scope.
404NIET_GEVONDENOnbekende route, onbekend object of geen toegang tot het dossier.
422INVOER_ONGELDIG e.a.Ongeldige parameters; de code zegt welke.
429TE_VEEL_AANVRAGENMeer dan 60 aanvragen per minuut met deze sleutel, of meer dan 2 POST-aanvragen (simulatie of vergelijking starten) per minuut; wacht de seconden uit Retry-After.
429SIMULATIE_BEZIG, TE_VEEL_OPDRACHTEN, WACHTRIJ_VOLEen berekening loopt al of de wachtrij is vol; probeer later opnieuw.

Probeer een 401, 403, 404 of 422 niet automatisch opnieuw; een 429 wel, na Retry-After.

Een contractvergelijking starten

Een vergelijking loopt asynchroon (seconden tot een minuut). Per dossier loopt hoogstens één opdracht tegelijk: een tweede POST geeft de lopende terug (nieuw: false).

# 1. starten: 202 met het opdracht-id
curl -s -X POST -H "Authorization: Bearer $SEF_SLEUTEL" -H "Content-Type: application/json" \
     -d '{"energie": "elektriciteit"}' "$SEF_URL/api/v1/mij/vergelijkingen"

# 2. status opvragen tot "klaar" of "fout" (wachtend, bezig, klaar, fout)
curl -s -H "Authorization: Bearer $SEF_SLEUTEL" "$SEF_URL/api/v1/mij/vergelijkingen/<id>"

Peil niet vaker dan om de paar seconden.