VOLTSTACK.ENERGY
Data API — Technical Specification
voltstack.energy | London, UK
Version 1.8 · Updated 27 August 2026
DE_LU €72.87 ▼3.63 GB £94.60 ▲14.0 EU Storage 44.7% LNG send-out 3,924 GWh/d Pipeline-in 3,088 GWh/d
European Energy Data API · v1

The European Energy Data API

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.

Document Voltstack Data API v1 — Specification
Audience Trading, quant & data-engineering teams
Status Early-access
Revision Version 1.8 · Updated 27 August 2026
Contact data@voltstack.energy  ·  API keys research@voltstack.energy
VOLTSTACK DATA API — SPECIFICATIONPRODUCT DOCUMENTATION
01 — Overview

A single interface for European fundamentals

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:

02 — Base URL & Versioning

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)
03 — Authentication

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." }
04 — The Response Envelope

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
  }
}
FieldTypeDescription
sourcestringCanonical upstream (e.g. entsoe, gie-agsi, entsog, elexon, open-meteo).
livebooleantrue = current upstream data; false signals fallback — inspect reason.
dataobjectDomain payload (§6). null when live is false and no cached value exists.
fetchedAtintegerUnix epoch milliseconds (UTC) the upstream value was obtained.
cachedbooleanServed from cache vs a fresh upstream fetch.
lastGoodbooleanOptional. 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.
reasonstringPresent only when live is false: no-token · upstream-error · rate-limited · disabled (Data Dictionary §27).
metaobjectProvenance 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).
05 — Conventions
ConcernConvention
TimestampsUnix epoch ms, UTC. Delivery slots / gas days also returned as ISO-8601 dates.
Power price unitsCurrency per MWh — EUR (Continental/Nordic), GBP (GB).
Gas / LNG unitsGWh/d for flows & send-out; % full and TWh for storage.
Flow / generationMW. Cross-border flows signed (+ normal direction, − reversed).
ResolutionDay-ahead is resolution-aware (PT60M & PT15M); value returned is the slot covering "now".
Change fieldsDay-ahead price change = day-on-day move vs the same delivery hour yesterday.
History windowsfrom / 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.
VOLTSTACK DATA API — SPECIFICATION§1–5 · OVERVIEW
06 — Endpoints
GET/v1/power/day-ahead  LIVE

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.

GET/v1/power/flows  LIVE

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.

GET/v1/power/generation?country=DE&range=1W  LIVE

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.

GET/v1/gas/storage  LIVE

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.

GET/v1/gas/lng  LIVE

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.

GET/v1/gas/pipeline-flows  LIVE

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.

GET/v1/weather?regions=EU_DE,EU_FR&days=10  LIVE

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.

VOLTSTACK DATA API — SPECIFICATION§6 · ENDPOINTS
06 — Endpoints · Merit Order & Settled History
GET/v1/power/merit-order?country=DE  LIVE

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 } ]}
GET/v1/history/day-ahead?zone=DE_LU&from=2026-01-01&to=2026-07-01  LIVE

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 } ]}
GET/v1/history/realized-vol?zone=DE_LU&from=…&to=…  LIVE

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 } ]}
GET/v1/history/gas-storage?from=…&to=…  LIVE

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 } ]}
GET/v1/history/lng-terminals?from=…&to=…  LIVE

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 } ]}
GET/v1/history/commodities?from=…&to=…  LIVE

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" } }
VOLTSTACK DATA API — SPECIFICATION§6 · MERIT ORDER & HISTORY
06 — Endpoints · Constraint & Event Layer

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.

GET/v1/power/imbalance  LIVE

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.

GET/v1/power/imbalance-de  LIVE

German uniform imbalance price (AEP estimator, the near-real-time reBAP proxy): latest 15-minute value plus today's series. Source: netztransparenz.de.

GET/v1/power/grid-stress  LIVE

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.

GET/v1/power/balancing-stress  LIVE

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.

GET/v1/power/constraints  LIVE

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.

GET/v1/power/umm  LIVE

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.

GET/v1/power/fr-nuclear  LIVE

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.

GET/v1/power/nordic-hydro  LIVE

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.

GET/v1/power/gb-balancing  LIVE

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.

GET/v1/gas/gb-system  LIVE

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.

GET/v1/weather/forecast-risk  LIVE

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.

GET/v1/history/n2ex-dayahead?from=…&to=…  LIVE

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.

GET/v1/benchmarks/de-bess  LIVE

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.

GET/v1/benchmarks/de-bess/custom  LIVE

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.

GET/v1/health/cross-checks  LIVE

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.

VOLTSTACK DATA API — SPECIFICATION§6 · CONSTRAINT & EVENT LAYER
07 — Caching, Rate Limits & Freshness

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.

DomainCache TTLUnderlying cadence
power/day-ahead5 minDaily auction; 15-min delivery slots
power/flows5 minIntraday physical flows
power/generation15 minRealised actuals (≈1h lag)
gas/storage · gas/lng6 hOne value per gas day
gas/pipeline-flows6 hSettled daily flows (D+1)
weather30 minSeveral model runs per day
power/merit-order15 minCapacity yearly · derates event-driven · load hourly
history/day-ahead15 minSettled archive, extended daily
history/gas-storage · lng-terminals · realized-vol3 hOne value per gas / trading day
history/commodities6 hFRED 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.

08 — Errors

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.

StatusMeaning
200Success. Inspect live / reason for provenance.
400Invalid zone/region/country parameter, or a malformed/out-of-order date range. JSON body, e.g. { "error": "unknown zone" }.
401Missing 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.
403Valid 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.
404Unknown endpoint path.
5xxVoltstack-side error. Safe to retry with backoff.
09 — Coverage Matrix
DomainCoverageSourceStatus
Day-ahead price11 bidding zonesENTSO-ELIVE
Cross-border flows12 interconnectorsENTSO-ELIVE
Generation mix9 countries · 7 fuelsENTSO-E · Elexon (GB)LIVE
Gas storageEU + 6 countriesGIE AGSI+LIVE
LNG send-outEU + 5 countriesGIE ALSI+LIVE
Pipeline flows8 import arteriesENTSOGLIVE
Weather / HDD-CDD16 regionsECMWF / Open-MeteoLIVE
Day-ahead history11 zones · ~2 yr settled (GB via N2EX)ENTSO-E A44 (archive)LIVE
Realized volatility11 zones · 7/30/90-day windowsDerived from settled A44LIVE
Merit-order stack8 countries · capacity, derates, demandENTSO-E A68 / A77+A80 / A65LIVE
Gas storage historyEU agg + 5-yr band · since 2015GIE AGSI+ (archive)LIVE
LNG send-out historyEU aggregate · since 2015GIE ALSI+ (archive)LIVE
Commodity benchmarks5 series · since 2015FREDLIVE
Imbalance prices5 EU areas + DE (uniform reBAP proxy)ENTSO-E A85 · netztransparenzLIVE
DE grid & balancing stressRedispatch, NRV, capacity prices, CBMP, scarcity flagnetztransparenz · regelleistung.netLIVE
Flow-based constraintsCore domain served · Nordic storedJAO Publication ToolLIVE
REMIT urgent messagesVersioned event streamNord Pool UMMLIVE
FR nuclear availabilityForward D+90 derived curveENTSO-E A77/A80LIVE
Nordic hydro balanceWeekly · history from 1995NVELIVE
GB balancing mechanismAcceptances, MID spread, wind deltaElexon · NESOLIVE
GB gas physicals + N2EX auctionFlows, linepack, forecast · GB auction historyNational Gas · Nord Pool N2EXLIVE
Forecast risk + DE BESS index + cross-validationVintage-native · public benchmark · nightly verdictsOpen-Meteo · derived · SMARD/Energy-ChartsLIVE
EUA primary auctionsEU ETS auction clearing prices · history from 2020EEX (licensed)LIVE *
FR generation forecastWind, solar & aggregate · per horizon (D-1 / intraday / nowcast)RTE (France)LIVE *
EUA / UKA spot & forwardsEU ETS · UK ETSExchange-licensedENTERPRISE
TTF / NBP gas curvesForward term structureExchange-licensedENTERPRISE
Brent / WTI oilForward term structureExchange-licensedENTERPRISE
* EUA primary auctions and the FR generation forecast are live in the terminal today and not yet exposed under /v1; their /v1 paths follow in a later revision. The EEX licence covers primary-auction results only — spot and futures are excluded and remain enterprise-entitled.
Enterprise feeds (exchange-licensed forward curves and carbon) are provisioned per-tenant under the client's own market-data entitlements, surfaced through the identical envelope and schema conventions.
Point-in-time capture. Event-grade series (REMIT UMMs, unit outages, redispatch) are version-captured — every republished version retained with its publication timestamp — since 2026-07-14. Since 2026-07-31 an append-only vintage sidecar also records each capture pass of the four forecast feeds (weather, forecast risk, GB NESO forecast, FR RTE forecast), keyed by capture timestamp. The as-of query API over these vintages follows in a later revision and is not yet part of this surface.

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.

VOLTSTACK DATA API — SPECIFICATIONdata@voltstack.energy