A single REST interface for European power, gas, carbon and weather fundamentals — day-ahead prices, cross-border flows, generation mix, gas storage, LNG send-out and pipeline flows — delivered with a transparent live-vs-fallback data contract built for REMIT II-grade auditability.
The Voltstack Data API exposes the same European energy fundamentals that power the Voltstack Analytics terminal. Every endpoint returns JSON over HTTPS, designed for two patterns: low-latency polling for live desks, and scheduled pulls for analytics pipelines. The API is read-only and spans four domains:
All endpoints sit under one versioned base path. The major version is pinned in the path; additive changes (new fields, new zones) ship without a version bump.
Base URL https://api.voltstack.energy/v1 Protocol HTTPS only (TLS 1.2+) Format application/json; charset=utf-8 Methods GET (read-only)
The /v1 surface is read-only, and every call to it should carry a data API key. As at this revision the surface is key-gated in full: a request with no key is refused on every documented path, current feeds and history alike. Which paths will require a key in the longer run is being revised, and this revision does not state that. The revision before 1.5 described a keyless surface with the history endpoints as the single exception; that is not what is deployed, and rather than replace it with a per-path scope that is itself in flux, the claim stays withdrawn. Key every request: that holds whichever way the scope settles, and it is what an integration has to build against. Ask data@voltstack.energy before you rely on anything narrower.
A data API key is a token of the form vsk_live_<key_id>_<secret> — a ten-character public
lookup handle and a forty-character secret, both base62. It is presented in the X-API-Key header; an
Authorization: Bearer header carrying the same token is also accepted. Keys are issued on request at
research@voltstack.energy. Server-side each key is a row carrying its own identity, so keys are issued, listed,
rotated and deactivated individually and usage is attributed per key; a configured DATA_API_KEYS list is
honoured alongside them as a break-glass path. Only the SHA-256 digest of the secret is held at rest, and comparison
is constant-time, so a key cannot be recovered from the store and cannot be guessed by timing.
Every issued key also carries one or more scopes, fixed when the key is issued: history covers
the settled-history endpoints under /v1/history, current covers every other documented path (live power,
gas, weather and benchmark feeds), and all covers both. A valid key presented on an endpoint outside its
scopes is refused with 403 and error: "insufficient-scope". This is a different refusal from
the 401 above: the credential itself verified, the grant is what falls short, so re-presenting the same key cannot
succeed. The refusal names the scope the endpoint requires and the scopes the key was granted; it never echoes the key.
Keys honoured through the break-glass DATA_API_KEYS list carry no scope restriction. To extend an issued
key's scopes, write to research@voltstack.energy.
# Keyed request curl "https://api.voltstack.energy/v1/history/day-ahead?zone=DE_LU&from=2026-01-01&to=2026-07-01" \ -H "X-API-Key: vsk_live_<key_id>_<secret>" # A missing or unrecognised key returns 401: { "error": "api-key-required", "detail": "This endpoint requires a data API key in the X-API-Key header. Request one at research@voltstack.energy." } # A valid key presented outside its scopes returns 403: { "error": "insufficient-scope", "detail": "This API key does not carry the 'history' scope required by this endpoint (granted: current). To extend the key's scopes, contact research@voltstack.energy." }
Every response is wrapped in a uniform envelope — the core of Voltstack's data-integrity model. Each payload declares whether the value is live upstream data or a transparent fallback, when it was sourced, and whether it was cached. Consumers never receive a silently stale or fabricated value.
{
"source": "entsoe", // canonical upstream identifier
"live": true, // true = real upstream; false = treat as fallback
"data": { /* domain payload */ },
"fetchedAt": 1781622120092, // epoch ms the value was obtained
"cached": false, // served from the server-side TTL cache
"reason": null, // when live=false: "no-token" | "upstream-error" | "rate-limited" | "disabled"
"meta": { // per-payload provenance
"upstream": "ENTSO-E Transparency (A44)",
"unit": "EUR/MWh (zone currency)", "timezone": "UTC",
"completeness": 0.998, // [0,1] fraction of expected points arrived (history)
"gaps": [], // timestamp ranges with missing data (history)
"dataAgeSeconds": 642 // seconds since the persisted data last changed
}
}
| Field | Type | Description |
|---|---|---|
| source | string | Canonical upstream (e.g. entsoe, gie-agsi, entsog, elexon, open-meteo). |
| live | boolean | true = current upstream data; false signals fallback — inspect reason. |
| data | object | Domain payload (§6). null when live is false and no cached value exists. |
| fetchedAt | integer | Unix epoch milliseconds (UTC) the upstream value was obtained. |
| cached | boolean | Served from cache vs a fresh upstream fetch. |
| lastGood | boolean | Optional. true when the payload is real data served from a retained last-good copy (a prior successful fetch) rather than a fresh upstream read; live stays true and fetchedAt/dataAgeSeconds carry the copy's real age. |
| reason | string | Present only when live is false: no-token · upstream-error · rate-limited · disabled (Data Dictionary §27). |
| meta | object | Provenance block: upstream source name, unit, timezone (always UTC); on archive-backed payloads, completeness [0,1], gaps[] and dataAgeSeconds (seconds since the persisted data last changed, recomputed on every response including cache hits); on multi-area payloads, a per-area areaStatus diagnostic (e.g. ok · stale · estimator · no-data). |
| Concern | Convention |
|---|---|
| Timestamps | Unix epoch ms, UTC. Delivery slots / gas days also returned as ISO-8601 dates. |
| Power price units | Currency per MWh — EUR (Continental/Nordic), GBP (GB). |
| Gas / LNG units | GWh/d for flows & send-out; % full and TWh for storage. |
| Flow / generation | MW. Cross-border flows signed (+ normal direction, − reversed). |
| Resolution | Day-ahead is resolution-aware (PT60M & PT15M); value returned is the slot covering "now". |
| Change fields | Day-ahead price change = day-on-day move vs the same delivery hour yesterday. |
| History windows | from / to as ISO dates (UTC), window capped at 3 years. When real coverage starts later than from, the payload declares it via oldestAvailable rather than silently returning a shorter series. |
Current day-ahead power price per bidding zone with day-on-day change, as two zone-keyed maps. 11 zones: DE-LU, FR, NL, BE, AT, NO1, NO2, SE3, DK1, ES, IT-North — all priced in EUR/MWh. GB is not in this payload: ENTSO-E's A44 series carries nothing for GB, and the GB auction curve is served by the n2ex-dayahead history endpoint below.
{ "prices": { "DE_LU": 72.87, "FR": 58.11, "NL": 69.40 },
"changes": { "DE_LU": -3.63, "FR": 2.40, "NL": -1.05 } }
changes is the day-on-day move vs the same delivery slot the previous day. Source: ENTSO-E (A44). Refresh: ≤5 min.
Physical cross-border electricity flows for 12 interconnectors (IFA1/2, NSL, BritNed, Nemo, Viking, FR–DE, DE–NL, DE–AT, NO–SE, ES–FR, FR–IT), as a map of interconnector id to signed net flow in MW.
{ "flows": { "IFA_1": 2000, "NSL": -1310, "FR_DE": 852, "ES_FR": -405 } }
Source: ENTSO-E (A11). Flow is signed, net of both directions at the border: positive = the link's normal direction, negative = reversed. Ids and normal directions are tabulated in the Data Dictionary §2a; capacities and utilisation are not part of this payload.
Actual generation by fuel, hourly. Countries: DE, FR, GB, ES, IT, NL, NO, SE, PL. range = 1D (default) · 1W · 1M, served from the settled archive; GB (Elexon) is 1D. Multi-day ranges label hours as MM/DD HH:00.
{ "country":"DE", "hours":[
{ "hour":"09:00", "nuclear":0, "coal":2626, "gas":1159,
"biomass":2152, "hydro":1639, "solar":41620, "wind":2009 } ]}
Sources: ENTSO-E (A75); Elexon FUELHH (GB). Generation in MW.
Aggregate and country gas storage (EU + DE, IT, FR, NL, AT). % full, TWh inventory and working capacity.
{ "aggregate":{ "currentLevel":44.7, "currentVolume":506, "workingCapacity":1131, "gasDayStart":"2026-06-15" },
"countries":[ { "id":"GIE_DE", "currentPct":36.8 } ] }
Source: GIE AGSI+. One value per gas day.
LNG terminal send-out (regasification to grid) and tank fullness. EU + ES, FR, NL, IT, BE.
{ "aggregate":{ "sendOut":3924, "sendOutUtil":49.5, "fullness":56.8, "dtrs":7936 },
"countries":[ { "id":"NL", "sendOut":773, "fullness":50.3 } ] }
Source: GIE ALSI+. Send-out in GWh/d — the LNG-to-grid demand signal.
Physical pipeline flows at major EU import arteries (Norway, Algeria, Azerbaijan/TAP, TurkStream), latest complete gas day.
{ "points":[ { "id":"mazara", "label":"Mazara del Vallo", "source":"Algeria", "flow":651 } ],
"total":3088, "gasDayStart":"2026-06-16" }
Source: ENTSOG Transparency Platform. Flows in GWh/d.
Temperature, wind and precipitation forecast with HDD/CDD for demand modelling. 16 regions across Europe & the US.
{ "EU_DE":[ { "date":"2026-06-16", "forecastHigh":22, "forecastLow":10,
"deviation":-2.6, "hdd":1.8, "cdd":0, "windSpeed":13, "precipProb":8 } ]}
Source: ECMWF / Open-Meteo.
Real supply stack: installed capacity per fuel (ENTSO-E A68, yearly), currently active derates from outage messages (A77/A80), and the latest actual demand (A65). Live only when all three inputs are real — covered for DE, FR, ES, IT, NL, NO, SE, PL. Marginal costs are modeled assumptions, never a market quote.
{ "country":"DE", "capacityYear":2026, "demandMw":58400, "demandAt":"2026-07-17T09:00:00Z",
"clearingPrice":68, "totalAvailableMw":151200, "stack":[
{ "fuel":"gas", "installedMw":31800, "unavailableMw":2400, "availableMw":29400, "marginalCost":68 } ]}
Settled day-ahead price history per bidding zone from the archive (ENTSO-E A44) — the same series behind the live day-ahead endpoint, ~2 years deep and extended daily. Resolution follows the market (PT60M / PT15M, inferred per window); meta carries completeness and gaps.
{ "zone":"DE_LU", "oldestAvailable":"2024-07-17",
"points":[ { "t":1767225600000, "p":74.31 } ]}
Realized volatility derived from the settled day-ahead series: rolling 7/30/90-day sample standard deviation of day-over-day changes in the zone's daily baseload price, in ccy/MWh, never annualized. A derived measure, not a vendor series — EU power has no free options data, and log returns are unusable on prices that go negative.
{ "zone":"DE_LU", "oldestAvailable":"2024-07-17", "points":[
{ "date":"2026-07-16", "dateMs":1784160000000, "vol7d":9.8, "vol30d":12.4, "vol90d":15.1 } ]}
EU aggregate storage history (GIE AGSI+, held from 2015) with a real five-year band: for each display day, min/max/avg of the same calendar day across the five prior years — never the display window compared against itself.
{ "oldestAvailable":"2015-01-01", "points":[ { "date":"2026-07-16", "level":62.4,
"fiveYearAvg":68.1, "fiveYearMin":54.2, "fiveYearMax":77.9 } ]}
EU aggregate LNG send-out (GWh/d) and tank fullness (%) day by day (GIE ALSI+, held from 2015). Deliberately no five-year band: send-out is arbitrage-driven, so a seasonal "normal range" would overclaim.
{ "oldestAvailable":"2015-01-01", "points":[ { "date":"2026-07-16", "sendOut":3910, "fullness":55.9 } ]}
Benchmark commodity price history (FRED): Brent & WTI (USD/bbl, daily), Henry Hub (USD/MMBtu, daily), EU gas import price (USD/MMBtu, monthly), Australian coal (USD/mt, monthly). Held from 2015; oldestAvailable is declared per series, since cadences clamp at different depths.
{ "series":[ { "id":"brent", "freq":"daily", "points":[ { "t":"2026-07-16", "v":78.4 } ] } ],
"oldestAvailable":{ "brent":"2015-01-02", "eu_gas":"2015-01-01" } }
The dislocation surface: physical constraint and event data behind the price series. Field-level detail for every payload is in the Data Dictionary §14–25. None of these endpoints carries a simulated fallback — when an upstream has nothing, the envelope says so.
Latest settled imbalance price per control area (ENTSO-E A85; deficit price on dual-category areas). The four German
control areas come from the netztransparenz AEP estimator and are tagged estimator in meta.areaStatus.
German uniform imbalance price (AEP estimator, the near-real-time reBAP proxy): latest 15-minute value plus today's series. Source: netztransparenz.de.
German redispatch: today's energy and measure count vs the trailing 30-day median, most-instructed plants, latest measures, and the live NRV system balance. Source: netztransparenz.de. Event archive from 2024-07.
German balancing market: aFRR/mFRR capacity clearing prices per 4-h block, the PICASSO/MARI cross-border marginal price vs DE_LU day-ahead, and firings of the TSOs' own scarcity flag. Sources: regelleistung.net · netztransparenz.de.
Core FBMC constraint radar: binding CNECs ranked by shadow price for the freshest delivery day, plus per-border MaxBex tightness vs the 30-day median of daily minima. Source: JAO Publication Tool. MaxBex archive 365d+, extended daily; the Nordic flow-based domain is ingested to the same store and available via bulk extract.
REMIT urgent market messages, latest version per event, newest first, with active-now MW aggregates by area. Versions are retained as republished. Source: Nord Pool REMIT UMM.
French nuclear availability: forward D+90 curve derived from unit outage filings (fleet nominal minus deepest active outage per unit) plus the underlying outages. Source: ENTSO-E A77/A80, derived.
Norwegian reservoir fill vs the historical min/median/max band for the same ISO week, week-over-week delta, and the national deviation expressed in TWh. Source: NVE Magasinstatistikk, weekly, history from 1995.
GB balancing mechanism: accepted offer/bid spread vs MID, top-of-stack prices, NESO wind forecast-vs-outturn delta, next demand forecast, and today's most-dispatched units. Sources: Elexon Insights (BOD/BOALF/MID) · NESO Data Portal.
GB gas physicals: instantaneous entry flows by terminal, actual linepack with same-time-yesterday delta, demand by category, and the D-1 published NTS demand forecast. Source: National Gas Transmission Data Portal.
Forecast instability per zone and variable: D+1 run-to-run deltas and ensemble spread, percentile-ranked against each series' own trailing distribution, with honest history-day counts. Vintage-native: forecast runs cannot be backfilled.
GB N2EX settled day-ahead auction history (GBP/MWh) — the GB auction curve ENTSO-E never carries. oldestAvailable reports the true archive start; depth accrues daily. Source: Nord Pool N2EX data portal.
DE battery revenue index for the reference 1 MW / 2 MWh configuration: monthly EUR/MW by stream (perfect-foresight arbitrage, aFRR/mFRR/FCR capacity) with per-stream archive starts. Methodology published.
Same engine, caller-supplied battery configuration (power, energy, round-trip efficiency, cycles/day). Beyond the surface access in §03, this endpoint additionally requires the calling tenant to be on a Professional or Enterprise plan.
Nightly reconciliation verdicts for the settled day-ahead archive against SMARD (Bundesnetzagentur) and Energy-Charts (Fraunhofer ISE): mean absolute difference and pass/fail per zone. Plain payload, not the standard envelope; also rendered on the public /status page.
Server-side caching is matched to each upstream's true publication cadence — polling faster than the TTL simply returns
the cached value with cached:true.
| Domain | Cache TTL | Underlying cadence |
|---|---|---|
| power/day-ahead | 5 min | Daily auction; 15-min delivery slots |
| power/flows | 5 min | Intraday physical flows |
| power/generation | 15 min | Realised actuals (≈1h lag) |
| gas/storage · gas/lng | 6 h | One value per gas day |
| gas/pipeline-flows | 6 h | Settled daily flows (D+1) |
| weather | 30 min | Several model runs per day |
| power/merit-order | 15 min | Capacity yearly · derates event-driven · load hourly |
| history/day-ahead | 15 min | Settled archive, extended daily |
| history/gas-storage · lng-terminals · realized-vol | 3 h | One value per gas / trading day |
| history/commodities | 6 h | FRED updates at most daily |
There is currently no per-key rate limit on the /v1 surface: the server-side TTL cache is the effective throttle,
and polling faster than the TTL only returns cached values. Upstream back-off surfaces as 200 with
live:false and reason:"rate-limited", never as a 429 from Voltstack. Fair use applies
during early access.
A transport error is a non-2xx status; a data fallback is 200 with live:false. A
request for a feed whose upstream is briefly unavailable still returns 200 with a reason, so
pipelines degrade gracefully rather than break.
| Status | Meaning |
|---|---|
| 200 | Success. Inspect live / reason for provenance. |
| 400 | Invalid zone/region/country parameter, or a malformed/out-of-order date range. JSON body, e.g. { "error": "unknown zone" }. |
| 401 | Missing or invalid data API key. Any /v1 endpoint may return this, not the history endpoints alone — as at this revision the /v1 surface is key-gated in full, and a request carrying no key is refused on every documented path, current feeds included. Build every call keyed (§3). Body: error: "api-key-required" with a detail string naming the key-request address. A valid key that is short on scope is a 403, below, never a 401. |
| 403 | Valid key, insufficient scope. The presented key verified but does not carry the scope this endpoint requires — keys are scoped history, current or all (§3), and the settled-history endpoints under /v1/history need history while every other documented path needs current. Body: error: "insufficient-scope" with a detail naming the required scope and the key's granted scopes, never the key itself. Retrying cannot succeed; scope extensions at research@voltstack.energy. |
| 404 | Unknown endpoint path. |
| 5xx | Voltstack-side error. Safe to retry with backoff. |
| Domain | Coverage | Source | Status |
|---|---|---|---|
| Day-ahead price | 11 bidding zones | ENTSO-E | LIVE |
| Cross-border flows | 12 interconnectors | ENTSO-E | LIVE |
| Generation mix | 9 countries · 7 fuels | ENTSO-E · Elexon (GB) | LIVE |
| Gas storage | EU + 6 countries | GIE AGSI+ | LIVE |
| LNG send-out | EU + 5 countries | GIE ALSI+ | LIVE |
| Pipeline flows | 8 import arteries | ENTSOG | LIVE |
| Weather / HDD-CDD | 16 regions | ECMWF / Open-Meteo | LIVE |
| Day-ahead history | 11 zones · ~2 yr settled (GB via N2EX) | ENTSO-E A44 (archive) | LIVE |
| Realized volatility | 11 zones · 7/30/90-day windows | Derived from settled A44 | LIVE |
| Merit-order stack | 8 countries · capacity, derates, demand | ENTSO-E A68 / A77+A80 / A65 | LIVE |
| Gas storage history | EU agg + 5-yr band · since 2015 | GIE AGSI+ (archive) | LIVE |
| LNG send-out history | EU aggregate · since 2015 | GIE ALSI+ (archive) | LIVE |
| Commodity benchmarks | 5 series · since 2015 | FRED | LIVE |
| Imbalance prices | 5 EU areas + DE (uniform reBAP proxy) | ENTSO-E A85 · netztransparenz | LIVE |
| DE grid & balancing stress | Redispatch, NRV, capacity prices, CBMP, scarcity flag | netztransparenz · regelleistung.net | LIVE |
| Flow-based constraints | Core domain served · Nordic stored | JAO Publication Tool | LIVE |
| REMIT urgent messages | Versioned event stream | Nord Pool UMM | LIVE |
| FR nuclear availability | Forward D+90 derived curve | ENTSO-E A77/A80 | LIVE |
| Nordic hydro balance | Weekly · history from 1995 | NVE | LIVE |
| GB balancing mechanism | Acceptances, MID spread, wind delta | Elexon · NESO | LIVE |
| GB gas physicals + N2EX auction | Flows, linepack, forecast · GB auction history | National Gas · Nord Pool N2EX | LIVE |
| Forecast risk + DE BESS index + cross-validation | Vintage-native · public benchmark · nightly verdicts | Open-Meteo · derived · SMARD/Energy-Charts | LIVE |
| EUA primary auctions | EU ETS auction clearing prices · history from 2020 | EEX (licensed) | LIVE * |
| FR generation forecast | Wind, solar & aggregate · per horizon (D-1 / intraday / nowcast) | RTE (France) | LIVE * |
| EUA / UKA spot & forwards | EU ETS · UK ETS | Exchange-licensed | ENTERPRISE |
| TTF / NBP gas curves | Forward term structure | Exchange-licensed | ENTERPRISE |
| Brent / WTI oil | Forward term structure | Exchange-licensed | ENTERPRISE |
v1.8 · 2026-08-27: §03 documents key scopes (history, current, all) and the 403 refusal a valid key receives on an endpoint its scopes do not cover, with the served insufficient-scope body printed; §08 gains the matching 403 row and the 401 row now points the short-scope case at it. Documentation catch-up: the shipped gate already refused short-scoped keys this way, and no behaviour changed in this revision. v1.7 · 2026-08-09: the §06 de-bess entry said "Public, no auth", which contradicted §03 inside this document and was false against the shipped gate, measured 401 unkeyed on every documented /v1 path. Removed: no §06 entry now states its own access rule, because access is set for the surface and §03 is where it is stated. The de-bess/custom entry now says its Professional-plan requirement is additional to §03 rather than an alternative to it. v1.6 · 2026-08-08: the §08 401 row said "history endpoints only", which v1.5 left standing when §03 withdrew the same claim. Every documented /v1 path refuses a keyless request, current feeds included, so §08 now says so and §03 states the observed gating rather than staying silent on it. The "keyless /v1" wording in the v1.3 note below is superseded on both counts. v1.5 · 2026-08-08: §03 withdraws the keyless-surface scope claim, which production replaced, and documents the shipped key mechanics instead (vsk_live_ token format, per-key identity, hashed at rest); the 401 example now prints the body the service actually returns. §09 corrects gas storage to six countries and weather to sixteen regions, and the §06 weather line follows; in each case one served id had never been documented, and the data dictionary §7 and §27 now name it. v1.4 · 2026-07-31: document version and date published as machine-readable meta tags (voltstack-doc-version, voltstack-doc-updated) and printed in the page header; the PDF edition is served alongside the HTML at /docs/. v1.3 — 2026-07-31: authentication rewritten to the shipped key model (keyless /v1; X-API-Key on history endpoints); day-ahead and flows payload examples corrected to the served shapes; error and rate-limit semantics corrected; envelope lastGood, areaStatus and the real reason enum documented; EUA primary auctions and the RTE FR generation forecast added to coverage. Specification subject to change during early access. Field names and coverage reflect the platform as at 2026-07-31. © 2026 Voltstack.