VOLTSTACK.ENERGY
Data Dictionary
voltstack.energy | Dublin, Ireland
Version 1.24 · Updated 25 October 2026
Reference · Data Dictionary v1.24

Data Dictionary

Field-level reference for every value the Voltstack Data API returns: name, type, unit, source and meaning, plus the controlled vocabularies for zones, interconnectors, fuels, regions and sources.

Scope Live data domains (power, gas, commodities, weather) incl. settled history, plus the constraint & event layer (§14–25)
Units SI / market-standard; see §1 conventions
Revision Version 1.24 · Updated 25 October 2026
Access One key gate, set for the /v1 surface as a whole; keys are scoped by endpoint family; de-bess/custom additionally needs a Professional plan. See the access note below
Contact data@voltstack.energy
All payloads are wrapped in the standard response envelope (source, live, data, fetchedAt, cached, lastGood, reason, meta) — see the API Specification §4. The meta block names the upstream, unit and timezone; archive-backed payloads add completeness, gaps and dataAgeSeconds; every payload that carries dataAgeSeconds, and every feed the public /status page watches, adds dataAsOf, the instant of the newest data point behind the headline values (API Specification §4); multi-area payloads add a per-area areaStatus diagnostic. lastGood: true marks real data served from a retained last-good copy rather than a fresh upstream read. This dictionary documents the data object of each endpoint.
Access. Access is set for the documented /v1 surface as a whole: one deployment setting covers every documented path, and no section below states a key rule of its own. Key every request: the presented-key check runs ahead of the surface setting, so a request carrying a valid data API key in the X-API-Key header is answered at full depth however that setting is configured, provided the key's scopes cover the endpoint and the endpoint is not paused (see the note on paused datasets, below). Keys are scoped by endpoint family (history for the settled-history endpoints, current for every other documented path, all for both), and a valid key presented on an endpoint outside its scopes is refused with 403 insufficient-scope; the refusal names the required scope and the key's granted scopes (Specification §03 and §08). As measured on 22 September 2026, a request carrying no key is answered as a labelled sample on every documented /v1 path that does not also require a signed-in tenant: the response carries an added sample block, current-data endpoints serve their standard recent window, settled history is limited to the most recent 30 days, and a history window ending at or before that floor is refused with 401 api-key-required. No documented path answers more openly than another. That statement is dated because the surface setting is deployment configuration and can be changed without any change to this document; the measurement of 9 August 2026, when every such request was refused, is superseded. A requirement beyond the key gate is a separate axis, and the API Specification states it on the endpoint that carries it: as at this revision the only one is /v1/benchmarks/de-bess/custom, which additionally requires the calling tenant to be on a Professional or Enterprise plan (Specification §06). The API Specification §03 is the authority on the access model, and where this dictionary and the specification disagree, the specification is correct. Keys: research@voltstack.energy.
Paused datasets. As at 24 September 2026, five endpoints are paused while Voltstack confirms redistribution rights with their publishers: §15 /v1/power/imbalance-de, §16 /v1/power/grid-stress and §17 /v1/power/balancing-stress (netztransparenz.de), §18 /v1/power/constraints (JAO) and §4a /v1/history/n2ex-dayahead (Nord Pool N2EX). Each answers every request with 451 and { "error": "unavailable", "reason": "This dataset is paused while we confirm redistribution rights with its publisher." }, so the fields those sections document are not served while the pause stands. §14 /v1/power/imbalance keeps its ENTSO-E areas and withholds the four German rows, which read paused in meta.areaStatus. Bulk extracts of the same datasets are paused too. The sections stay here because the endpoints return when each publisher confirms (Specification §03).
VOLTSTACK DATA DICTIONARYPRODUCT DOCUMENTATION
01 — Power · Day-Ahead Price

/v1/power/day-ahead → data.{prices, changes}

FieldTypeUnitDescription
prices[zone]numberEUR/MWhDay-ahead price for the delivery slot covering the current time, keyed by bidding-zone code (see §1a).
changes[zone]numberEUR/MWhDay-on-day move vs the same delivery slot the previous day, keyed by bidding-zone code.
Both maps are keyed by the §1a zone codes. All 11 zones price in EUR; the payload carries no per-zone currency or unit fields.

§1a — Bidding-zone codes

CodeZoneCurrencySource
DE_LUGermany–LuxembourgEURENTSO-E
FRFranceEURENTSO-E
NLNetherlandsEURENTSO-E
BEBelgiumEURENTSO-E
ATAustriaEURENTSO-E
NO_1 / NO_2Norway (Oslo / Kr.sand)EURENTSO-E
SE_3Sweden (Stockholm)EURENTSO-E
DK_1Denmark (West)EURENTSO-E
ESSpainEURENTSO-E
IT_NORTHItaly (North)EURENTSO-E
GB is not part of this endpoint: ENTSO-E's A44 series carries nothing for GB. The GB day-ahead auction curve is served by /v1/history/n2ex-dayahead (§04a, GBP/MWh); the terminal's GB price tile reads the Elexon Market Index internally.
02 — Power · Cross-Border Flows

/v1/power/flows → data.flows

FieldTypeUnitDescription
flows[id]numberMWSigned net physical flow, keyed by interconnector identifier (see §2a). Positive = the link's normal direction; negative = reversed. Net of both directions at the border.
The payload is this one map. Nameplate capacities, direction labels and utilisation are not part of it; §2a below is the reference for reading each id's sign.

§2a — Interconnector identifiers

idLinkidLink
IFA_1 / IFA_2France ↔ GBFR_DEFrance ↔ Germany
NSLNorway ↔ GBDE_NLGermany ↔ Netherlands
BRITNEDNetherlands ↔ GBDE_ATGermany ↔ Austria
NEMOBelgium ↔ GBNO_SENorway ↔ Sweden
VIKINGDenmark ↔ GBES_FRSpain ↔ France
FR_ITFrance ↔ Italy  
03 — Power · Generation Mix

/v1/power/generation?country=XX&range=1D|1W|1M → data.{range, hours[]}

FieldTypeUnitDescription
rangestring—Window the response covers: 1D (default), 1W or 1M, served from the settled A75 archive. GB (Elexon) is 1D only.
hourstringHH:00Hour label. Multi-day ranges prefix the calendar day: MM/DD HH:00.
nuclear, coal, gas,
biomass, hydro, solar, wind
numberMWAverage generation in that hour for each fuel bucket. A fuel is omitted when it has no generation/data.

§3a — Fuel-bucket mapping

BucketENTSO-E PsrTypeElexon (GB)
gasB03, B04, B06, B20CCGT, OCGT, OIL, OTHER
coalB02, B05, B07, B08COAL
nuclearB14NUCLEAR
windB18, B19WIND
hydroB10, B11, B12, B13NPSHYD, PS
biomassB01, B09, B15, B17BIOMASS
solarB16n/a (GB solar is embedded/unmetered)
VOLTSTACK DATA DICTIONARY§1–3 · POWER
History request conventions — from / to are UTC ISO dates (YYYY-MM-DD), window capped at 3 years. When real coverage starts later than from, the payload declares it via oldestAvailable instead of silently returning a shorter series. An as_of instant (Specification §06) returns §4, §4a, §11 and §12 as captured at that instant and adds pointInTime; a window with nothing captured by then comes back live:false with an empty series and one of the two as_of reasons in §27. §5 and §13 refuse as_of.
04 — Power · Day-Ahead History

/v1/history/day-ahead?zone=XX&from=…&to=… → data

FieldTypeUnitDescription
zonestring—Bidding-zone code (see §1a).
points[].tintegerepoch msDelivery-slot start (UTC). Resolution follows the market — PT60M or PT15M, inferred from point spacing per window.
points[].pnumberccy/MWhSettled day-ahead price for that slot (ENTSO-E A44 — the same series behind §1's live value).
oldestAvailablestringISO dateEarliest settled point held for the zone. Archive is ~2 years deep and extended daily.
pointInTimeobject—Present only on an as_of read (Specification §06): asOf and captureStartedAt (ISO instants) and heldNotKnownAsOf (integer), the intervals held now that had not been captured by as_of and are left out of points. oldestAvailable is omitted on that read.
04a — Power · GB N2EX Day-Ahead History

/v1/history/n2ex-dayahead?from=…&to=… → data PAUSED

FieldTypeUnitDescription
zonestring—Fixed GB series — no zone parameter.
points[].tintegerepoch msDelivery-slot start (UTC); resolution inferred from point spacing, as §4.
points[].pnumberGBP/MWhSettled N2EX day-ahead auction price for that slot.
oldestAvailablestringISO dateTrue archive start, reported rather than silently truncated.
pointInTimeobject—As §4.
GB is §4's honest gap: ENTSO-E's A44 series carries nothing for GB, so the real GB auction curve comes from the Nord Pool N2EX data portal instead. Anonymous portal access backfills only ~2 months; depth past that accrues one day at a time from the live worker fetch. Same envelope and meta conventions as §4 (completeness, gaps, dataAgeSeconds, dataAsOf); window capped at 3 years. Paused since 24 September 2026 while Nord Pool confirms redistribution rights: the endpoint answers 451 (see the note on paused datasets under the lede).
05 — Power · Realized Volatility

/v1/history/realized-vol?zone=XX&from=…&to=… → data

FieldTypeUnitDescription
zonestring—Bidding-zone code (see §1a).
points[].date / dateMsstring / integerISO date / epoch msDisplay day (UTC).
points[].vol7d, vol30d, vol90dnumber | nullccy/MWhRolling sample standard deviation of day-over-day changes in the daily baseload price over 7/30/90-day windows. Null while real history is thinner than the window.
oldestAvailablestringISO dateEarliest settled day-ahead point held for the zone.
A derived measure computed from §4's settled series, not a vendor-provided one — no free options data exists for EU power. Never annualized; log returns are deliberately not used because EU day-ahead prices go negative.
06 — Power · Merit Order

/v1/power/merit-order?country=XX → data

FieldTypeUnitDescription
countrystring—DE or FR live today; capacity coverage DE, FR, ES, IT, NL, NO, SE, PL.
capacityYearintegeryearENTSO-E reference year of the capacity figures. Fuels retired before that year are excluded entirely, never carried forward stale.
stack[].fuelstring—wind · solar · hydro · nuclear · biomass · coal · gas · oil, in ascending modeled cost.
stack[].installedMwnumberMWInstalled capacity (A68).
stack[].unavailableMwnumberMWSum of currently active derates from outage messages (A77/A80).
stack[].availableMwnumberMWinstalledMw − unavailableMw, floored at 0.
stack[].marginalCostnumberEUR/MWhModeled assumption, not a market quote — carried regardless of live status.
demandMw / demandAtnumber / stringMW / ISOLatest actual load (A65) and its delivery timestamp.
clearingPricenumberEUR/MWhModeled cost of the marginal fuel where the cumulative stack meets demand.
totalAvailableMwnumberMWSum of availableMw across the stack.
live is true only when capacity, derates and demand are all real for the requested country. Derate collection covers all eight countries (DE, FR, ES, IT, NL, NO, SE, PL); a zone the collector has not asked about is never presented as "zero MW unavailable" — the response falls back instead.
VOLTSTACK DATA DICTIONARY§4–6 · POWER HISTORY & MERIT ORDER
07 — Gas · Storage

/v1/gas/storage → data.{aggregate, countries[]}

FieldTypeUnitDescription
aggregate.currentLevelnumber%EU aggregate storage fullness.
aggregate.currentVolumenumberTWhWorking gas in store.
aggregate.workingCapacitynumberTWhTotal working capacity.
aggregate.gasDayStartstringISO dateGas day the value applies to.
countries[].idstring—GIE_DE, GIE_IT, GIE_FR, GIE_NL, GIE_AT, GIE_UK.
countries[].currentPctnumber%Country storage fullness.
countries[].basisobject—Present only where a country's series does not measure the same thing as the others. Fields: status (estimated | confirmed), coverage (full | partial), coveragePct, note. Today GIE_UK carries it: AGSI+ "United Kingdom (Post-Brexit)" (GB*), status estimated (GIE status E, not operator-confirmed), coverage partial (medium-range sites only, GIE dataset coverage 28.64%, Rough excluded). Absent for the five EU countries, whose series are operator-confirmed over the whole working volume.
08 — Gas · LNG Terminals

/v1/gas/lng → data.{aggregate, countries[]}

FieldTypeUnitDescription
aggregate.sendOutnumberGWh/dLNG regasified and sent out to the grid — the LNG demand signal.
aggregate.sendOutUtilnumber%Send-out vs declared max send-out capacity (dtrs).
aggregate.fullnessnumber%LNG tank inventory vs declared max inventory.
aggregate.dtrsnumberGWh/dDeclared total reference send-out (max capacity).
countries[].idstring—ES, FR, NL, IT, BE.
countries[].sendOutnumberGWh/dCountry send-out.
countries[].fullnessnumber%Country tank fullness.
09 — Gas · Pipeline Flows

/v1/gas/pipeline-flows → data.{points[], total, gasDayStart}

FieldTypeUnitDescription
points[].idstring—Artery key (e.g. dornum, mazara, tap, turkstream).
points[].labelstring—Interconnection-point name.
points[].sourcestring—Supply origin: Norway · Algeria · Azerbaijan · TurkStream.
points[].flownumberGWh/dPhysical entry flow, latest complete gas day.
points[].gasDaystringISO dateGas day this point's flow belongs to. A point whose operator has stopped publishing keeps an older gas day than gasDayStart, and meta.dataAsOf reports the oldest of them.
totalnumberGWh/dSum across all arteries.
gasDayStartstringISO dateGas day of the values used.
10 — Weather

/v1/weather?regions=… → data[regionId][]

FieldTypeUnitDescription
datestringISO dateForecast day.
forecastHigh / Lownumber°C / °FDaily high / low (°C for EU regions, °F for US).
deviationnumberdegHigh vs seasonal-normal high.
hdd / cddnumberdeg-daysHeating / cooling degree days (base 18°C EU, 65°F US).
windSpeednumberkm/h · mphMax daily wind speed.
precipProbnumber%Max daily precipitation probability.
Degree-day base: 18°C (EU) / 65°F (US) by default. An optional base query parameter (°C, clamped 5–30) re-bases both HDD and CDD for the request; the base joins the server-side cache key, so different bases never share a cached value.
VOLTSTACK DATA DICTIONARY§7–10 · GAS & WEATHER
11 — Gas · Storage History

/v1/history/gas-storage?from=…&to=…[&area=EU|GIE_DE|GIE_IT|GIE_FR|GIE_NL|GIE_AT] → data

FieldTypeUnitDescription
points[].datestringISO dateGas day (UTC).
points[].levelnumber%Storage fullness for the requested area (GIE AGSI+ — the same series behind §7's live value): the EU aggregate by default, or one country's own series, banded against that country's own prior years. GIE_UK is refused with 400: its series changed basis on 2020-12-30.
points[].fiveYearAvg / Min / Maxnumber | null%Avg/min/max of the same calendar day across the five prior years — the display window is never compared against itself. Null while history is thinner than the band needs.
oldestAvailablestringISO dateEarliest row held for the requested area. History from 2015-01-01.
pointInTimeobject—As §4, for the requested area's own series and its own capture start. On that read fiveYearAvg, fiveYearMin and fiveYearMax are null: the band's years predate capture.
12 — Gas · LNG Terminal History

/v1/history/lng-terminals?from=…&to=… → data

FieldTypeUnitDescription
points[].datestringISO dateGas day (UTC).
points[].sendOutnumber | nullGWh/dEU aggregate LNG send-out (GIE ALSI+).
points[].fullnessnumber | null%EU aggregate tank fullness.
oldestAvailablestringISO dateEarliest EU aggregate row held. History from 2015-01-01.
pointInTimeobject—As §4. Both series must have been captured by as_of, or the read is refused.
Deliberately no five-year band here: LNG send-out is driven by spot-arbitrage economics, not the repeatable seasonal shape underground storage has — a min/max/avg band would overclaim a "normal range".
13 — Commodities · Benchmarks

/v1/history/commodities?from=…&to=… → data

FieldTypeUnitDescription
series[].idstring—Series identifier (see §13a).
series[].freqstring—daily or monthly — read from the stored cadence, per series.
series[].points[].t / .vstring / numberISO date / see §13aObservation date and value, ascending.
oldestAvailableobject—Earliest row held, keyed per series id — cadences clamp at different depths. History from 2015-01-01.

§13a — Benchmark series

idBenchmarkFRED seriesUnitCadence
brentBrent crudeDCOILBRENTEUUSD/bblDaily
wtiWTI crudeDCOILWTICOUSD/bblDaily
henryhubHenry Hub natural gasDHHNGSPUSD/MMBtuDaily
eu_gasEU natural gas import pricePNGASEUUSDMUSD/MMBtuMonthly
coalAustralian thermal coalPCOALAUUSDMUSD/mtMonthly
13b — Carbon · EUA Primary Auctions (EEX)

/v1/carbon/eua-auctions → data

FieldTypeUnitDescription
auctions[]array—One row per auction over the last 400 days, oldest first; fields below.
auctions[].daystringISO dateAuction day.
auctions[].zonestring—Auctioning entity: EU, DE, PL or NIR.
auctions[].clearedboolean—false when EEX published the auction as cancelled: it did not clear.
auctions[].pricenumber | nullEUR/tCO2Auction clearing price; null whenever no price cleared.
auctions[].volumenumber | nulltCO2Volume auctioned.
auctions[].coverRationumber | nullratioTotal bids over the volume auctioned, as EEX publishes it.
auctions[].biddersnumber | nullcountTotal number of bidders.
latestByZoneobject—The newest cleared auction per entity, with the fields above.
oldestAvailablestringISO dateThe first auction day held, across all time. History from 2020.
zoneCadenceobjectdaysPer entity: zone, status (live, stale or cadence-unknown), lastAuction, lastAuctionCleared, daysSinceLastAuction, auctionsObserved, gapsObserved, medianGapDays, longestGapDays, longestRecessGapDays, windowDays, windowBasis and, when the cadence is unknown, reason. Voltstack's reading of whether each entity is publishing on its own observed cadence; meta.areaStatus carries the status alone.
EEX primary auction reports (public.eex-group.com), under EEX's written permission of 29 July 2026, which covers primary auction data only: no EUA spot or futures price is served, and an auction clearing price is not one. Aviation allowance (EUAA) auctions are not ingested. Read once a day after the 09:00 to 11:00 CET auction window. Attribution: Source: EEX.
VOLTSTACK DATA DICTIONARY§11–13 · GAS HISTORY & COMMODITIES
§14–25 document the constraint & event layer — the endpoints behind the dislocation widgets. None of these carries a simulated fallback: when an upstream has nothing, the envelope says so (live:false + reason) rather than inventing a value. An empty constraint radar is information; a fake binding constraint is not.
Point-in-time capture. REMIT UMMs §19 and unit outages §20 are version-captured since 2026-07-14: every republished version our polls have seen is retained with the publisher's own timestamp. Redispatch measures §16 and GB balancing acceptances §17a are version-captured from the date /coverage shows for each of those two series, shown there even before either one holds an actual revision: every change our re-reads have seen to what the source states is retained as a later version, dated to when we captured it, since neither source gives its own publication time for a correction, so none is invented. For a GB balancing acceptance the versions follow Elexon's acceptance (BOALF) itself: the unit, acceptance number and segment start identify it, and a change to its level from or level to, segment end, national grid unit name, closing settlement period or SO, STOR or RR flag is a version. Its side and matched offer or bid price are Voltstack's own match against Elexon's bid-offer data (BOD), not part of the acceptance: they never make a version, and when better BOD data arrives they are corrected in place on the latest version, which keeps the time it was captured. Version 1 of a redispatch measure carries the measure's own window start as published_at; version 1 of a GB balancing acceptance carries Elexon's own acceptance time. Only a later version of either is dated to when we captured it. An append-only vintage sidecar records the four forecast feeds (§10 weather, §23 forecast risk, the GB NESO forecast behind §17a, the FR RTE forecast) at every capture pass since 2026-07-31, and the JAO domains behind §18 whenever a value changes. It also records the day-ahead prices behind §1, §4 and §4a, imbalance prices §14, the AEP estimator §15, NRV §16, generation §3, load, storage §7 and §11, LNG §8 and §12, and cross-border flows §2: once when a value is first captured and again whenever it changes, never on an identical re-fetch. Capture runs forward from each series' own start and is never backfilled. as_of on §4, §4a, §11 and §12 reads it.
14 — Power · Imbalance Prices

/v1/power/imbalance → data.areas

FieldTypeUnitDescription
areas[id].pricenumberEUR/MWhLatest settled imbalance price for the area. Keys are country codes or DE_* control areas.
areas[id].atintegerepoch msStart of the settled 15-minute interval (UTC).
meta.areaStatus[id]string—ok · stale (older settled interval) · estimator (DE_* only, see §15) · no-data · paused (DE_* only: the row is withheld while netztransparenz.de confirms redistribution rights).
EU areas come from ENTSO-E A85 queried per control area. Where an area still runs dual-direction pricing (e.g. FR publishes A04 excess and A05 deficit series), the deficit price is surfaced as "the" imbalance price — the number that prices a short position. The four German control areas never publish A85 to ENTSO-E at all (verified empirically); their rows come from the netztransparenz.de AEP estimator. Since 24 September 2026 those four rows are withheld from this endpoint: each is absent from areas and reads paused in meta.areaStatus, and meta.upstream names ENTSO-E alone. When ENTSO-E returns no price for any of its five areas, nothing is left to serve: the endpoint answers live: false with reason upstream-error (§27) and data: null, and any German rows it withheld still read paused in meta.areaStatus.
15 — Power · German Imbalance (AEP / reBAP)

/v1/power/imbalance-de → data PAUSED

FieldTypeUnitDescription
pricenumberEUR/MWhLatest published 15-minute AEP estimator value — the near-real-time reBAP proxy.
atintegerepoch msInterval start (UTC).
series[].t / .vinteger / numberepoch ms / EUR/MWhToday's 15-minute estimator series.
Germany settles imbalance with one uniform price across all four control areas (reBAP), published on the TSOs' shared portal netztransparenz.de — not on ENTSO-E. The estimator is near-real-time; the quality-assured settled series follows with a ~2–3 week settlement lag. The settled cross-border marginal price and the TSOs' scarcity flag are in §17. Settled archive from 2022.
16 — Power · German Grid Stress (Redispatch + NRV)

/v1/power/grid-stress → data PAUSED

FieldTypeUnitDescription
todayMwh / todayMeasuresnumberMWh / countToday's redispatch energy and measure count (UTC day).
activeNowintegercountMeasures whose window covers this instant.
median30dMwhnumber | nullMWhMedian daily redispatch energy over the trailing 30 days — today's norm.
nrvLatestMw / nrvLatestAtnumber | null / stringMW / ISOLive NRV system balance (Netzregelverbund saldo) and its interval.
daily[]array—day, measures, totalMwh — 30-day daily series.
topPlants[]array—plant, direction (increase|reduce), totalMwh, measures — today's most-instructed plants.
latest[]array—plant, direction, start, stop, meanMw, totalMwh, instructingTso — most recent measures.
Redispatch is the grid stress zonal prices hide: DE_LU clears as one zone while the TSOs pay to move generation around the internal north–south constraint. Event archive from 2024-07 (~42 TWh of measures), extended continuously.
17 — Power · German Balancing Stress

/v1/power/balancing-stress → data PAUSED

FieldTypeUnitDescription
afrrCapacity[] / mfrrCapacity[]arrayEUR/MWproduct (POS|NEG_hh_hh), direction (up|down), blockLabel (4-h block), marginalPrice, avgPrice, deliveryStart — latest capacity-auction clearing prices per product block (pay-as-cleared).
cbmpSeries[]arrayEUR/MWhat, cbmp, daPrice, spread — the PICASSO/MARI-derived cross-border marginal price (netztransparenz AEP Modul 1) against the DE_LU day-ahead price.
scarcityEvents[]array—at, nrvSaldoMw — firings of the TSOs' own binary scarcity component (AEP Knappheitskomponente).
The scarcity flag is the TSOs' own published column, not a derived heuristic — 18 flagged quarter-hours in 4.5 years of history make it a genuine rare-event regime marker (most recent real episode: 2026-04-06, reBAP −6,642.76 EUR/MWh). Pairs with §16: that section shows the TSOs physically moving generation; this one shows the price the balancing market paid.
17a — Power · GB Balancing Skew

/v1/power/gb-balancing → data

FieldTypeUnitDescription
todayDatestringISO dateToday's date in London, the GB settlement day, not the UTC date. topUnits covers this day.
bmMidSpread / bmMidSpreadAtnumber | null / string | nullGBP/MWh / ISObm_mid_spread_GB, topOfStackOffer minus midLatest, at the newest settlement period that has one, and the start of that period. topOfStackOffer, topOfStackBid and midLatest are read at the same period.
topOfStackOffer / topOfStackBidnumber | nullGBP/MWhbm_topofstack_offer_price_GB and bm_topofstack_bid_price_GB at bmMidSpreadAt: the highest matched offer price and the highest matched bid price among the acceptance segments that start in that period, placeholder prices of 9,900 and above left out. They are maxima, not the energy-weighted averages, which only the CSV export serves.
midLatestnumber | nullGBP/MWhmid_price_GB at bmMidSpreadAt: Elexon's Market Index Price for that period, volume weighted across its data providers.
windForecastLatest / windOutturnLatest / windDeltaLatestnumber | nullMWNESO's day-ahead wind forecast, Elexon's wind outturn, and the outturn minus the forecast (gb_wind_forecast_delta_GB), all at windDeltaAt.
windDeltaAtstring | nullISOStart of the newest settlement period with a wind delta, where the three wind figures are read.
nextDemandForecastobject | nullMW / ISOat, value: the first NESO demand forecast point after now (neso_demand_forecast_GB).
topUnits[]arrayMW / GBP/MWhunit, side, totalMw, acceptances, latestPrice: up to eight rows, one per unit (its National Grid name) and side, largest totalMw first. totalMw sums the absolute accepted level at the end of each of that unit's acceptance segments on that side that start today, latest version of each, to 0.1 MW; acceptances counts those segments, and latestPrice is the matched price of the one that starts last, or null.
Sources: Elexon Insights (BOD/BOALF/MID, event-grain acceptances) and the NESO Data Portal. The balancing-mechanism acceptance stream is stored event-by-event and exportable in bulk. The accepted offer and bid prices stored per settlement period (bm_accepted_offer_price_GB and bm_accepted_bid_price_GB in the export) weight each acceptance segment by the MWh it delivers inside the period, so a segment spanning two periods counts in both, and a side whose segments deliver no energy there has no value (Methodology Guide §04). Acceptance segments for a day's last periods that are made after its last pass and end by midnight are not captured. A day's last periods are numbered 45 and 46 on the 46-period day when the clocks go forward in March and 49 and 50 on the 50-period day when they go back in October, and every day starts at period 1. Before the date /coverage shows for GB balancing acceptances, a segment was weighted by its level, one spanning two periods weighed twice in the period it starts, and a day's last periods also took in the day before's segments that ran past midnight, which moved topOfStackOffer, topOfStackBid and bmMidSpread there too. Those segments went by period number, so on the day after the March change they landed in periods 45 and 46 and on the October change day in periods 47 and 48, not its last periods, while on the March change day and the day after the October change, which have no periods with those numbers, they were left unpriced. Values stored before that date may be restated by a repair.
VOLTSTACK DATA DICTIONARY§14–17a · GERMAN & GB BALANCING
18 — Power · Constraint Radar (JAO Core FBMC)

/v1/power/constraints → data PAUSED

FieldTypeUnitDescription
day / dayLabelstringISO date / —Delivery day shown: tomorrow once SDAC results land (~13:00 CET), else today.
totalBoundMtusintegercountDistinct MTUs with at least one binding CNEC that day.
constraints[]array—cnecName, direction, tso, hubFrom, hubTo, maxShadowPrice (EUR/MWh), boundMtus, worstMtu — binding flow-based network elements ranked by shadow price.
borders[]arrayMWborder ("DE → FR"), minTodayMw, medianMinMw, ratio — today's minimum MaxBex vs the 30-day median of daily minima. Ratio < 1 = tighter than usual.
MaxBex archive: 365-day backfill (~1.3M rows), extended daily from the JAO Publication Tool — where the Core flow-based grid actually binds, border by border. The Nordic flow-based domain (MaxBex, net positions) is ingested to the same store under identical conventions; a served Nordic radar follows demand. Both domains, bulk extracts included, are paused since 24 September 2026 while JAO confirms redistribution rights.
19 — Power · REMIT Outage Ticker (UMM)

/v1/power/umm → data

FieldTypeUnitDescription
events[]array—Latest version of each active urgent market message, newest publication first: externalId, version, eventType, area, assetName, assetEic, unavailableMw, eventStart, eventStop, publishedAt, status.
activeNowCount / activeNowMwinteger / numbercount / MWEvents whose unavailability window covers this instant, and their summed MW.
topAreas[]arrayMWarea, mw — largest currently-impacted areas.
Messages are versioned as republished; the latest version wins and cancelled/outdated messages drop out. Upstream: Nord Pool REMIT UMM.
20 — Power · French Nuclear Availability

/v1/power/fr-nuclear → data

FieldTypeUnitDescription
fleetMwnumberMWNominal nuclear fleet capacity constant the curve is derived against.
todayMw / weekAgoMwnumber | nullMWAvailable capacity today and seven days ago.
curve[]arrayMWday, availableMw — forward availability curve, today through D+90.
minPointobject | nullMWDeepest point of the forward curve.
outages[]array—Latest-version active nuclear unit outages behind the curve: assetName, assetEic, unavailableMw, eventStart, eventStop, eventType, version.
Derived from ENTSO-E A77/A80 unit outage filings: fleet nominal minus the day's deepest active outage per unit, summed across units — a forward curve that rebuilds on every outage revision.
20a — Power · French Generation Forecast (RTE)

/v1/power/fr-generation-forecast?filiere=…&horizon=… → data

FieldTypeUnitDescription
filierestring—The production type served: WIND_ONSHORE, WIND_OFFSHORE, SOLAR or AGGREGATED_CPC, RTE's aggregate of generation under purchase obligation. A request naming any other value is answered as WIND_ONSHORE.
horizonstring—The forecast horizon served, in RTE's own terms: CURRENT, ID (intraday), D-1, D-2 or D-3. For AGGREGATED_CPC it also names RTE's run (its sub_type) after a slash, as in D-1/DA02: DA01 and DA02 are the two day-ahead runs under D-3, D-2 and D-1; ID00 to ID02 are D-1's evening and midnight updates; ID03 to ID24 are the hourly intraday runs under ID. Without a horizon parameter, the most current one held, and for the aggregate the first run of it.
unitstring—Always MW.
availableHorizons[]array—Every horizon held in the window for this production type, most current first; for the aggregate every run held, each horizon's runs in RTE's order.
points[]arrayMWstartMs, value, resolutionMin: RTE's forecast for the interval starting at startMs (epoch ms, UTC) and lasting resolutionMin minutes, ascending.
RTE Generation Forecast API (data.rte-france.com), read into the store about every 4 hours. The window runs from 24 h before the request to 4 days after it. Every value is RTE's own, unchanged; the load factor RTE also publishes is not stored. A requested horizon with no rows, while other horizons have some, is echoed with an empty points array, never replaced by another; when the production type has no rows in the window at all, the answer is live:false with data:null and a reason. RTE publishes the purchase-obligation aggregate run by run, and every horizon served for it is one run, value for value; a horizon without a run asked of it is echoed with an empty points array, since no single RTE series answers it. The aggregate rows stored before v1.24 kept, for each interval, whichever run RTE listed last under its horizon, without the run's label, and under D-1 and ID that mixed several runs. They are served nowhere, neither here nor in the CSV export nor as recorded revisions; each run's history starts with the first read that stored it. Attribution: Source: RTE (data.rte-france.com).
21 — Power · Nordic Hydro Balance

/v1/power/nordic-hydro → data

FieldTypeUnitDescription
areas[]array% · pparea, weekStart, fillPct, minPct, medianPct, maxPct, deviationPp, weekOverWeekPp — current reservoir fill vs the historical min/median/max band for the same ISO week.
nationalDeviationTwhnumber | nullTWhNational deviation expressed in energy (deviation × national reservoir capacity) — traders think in TWh, not percent.
nationalCapacityTwhnumberTWhNVE national reservoir capacity constant.
NVE Magasinstatistikk, weekly cadence, history from 1995 — thirty years of the structural driver behind Nordic and German power.
VOLTSTACK DATA DICTIONARY§18–21 · CONSTRAINTS & FUNDAMENTALS
22 — Gas · GB Physical System

/v1/gas/gb-system → data

FieldTypeUnitDescription
asOfstring | nullISOTimestamp of the freshest instantaneous reading.
supplyTotalMcmD / demandTotalMcmDnumber | nullmcm/dSystem-wide supply and demand totals.
linepackMscm / linepackDayAgoMscmnumber | nullmscmActual NTS linepack and the same-time-yesterday value (matched within a ±2 h window, never an arbitrarily old point).
entryPoints[]arraymcm/dsite, slug, flowMcmD — instantaneous flow by terminal/entry point.
demandByCategory[]arraymcm/dcategory, flowMcmD — LDZ, power stations, industrial, interconnector, storage.
demandForecast[]arrayGWh/dgasDay, valueGwhD — D-1-published NTS demand forecast for the coming gas days.
National Gas Transmission Data Portal (open data policy). GB-only for flows by design: no Norwegian flow, linepack or nomination figure appears here or anywhere on this surface. Norwegian field and terminal unavailability events are a separate endpoint, §22a.
22a — Gas · Norwegian System Events (Gassco REMIT UMM)

/v1/gas/norway-events → data

FieldTypeUnitDescription
events[]array—Every urgent market message on the Gassco UMM Atom feed at fetch time, newest publication first; one message per row, fields in the table below. The feed is a current window, not an archive, and it can carry a superseded message beside the revision that replaced it (same asset, same window, the earlier one Dismissed). The payload does not mark that relationship, so do not aggregate over this array.
eventCountintegercountLength of events[], superseded messages included. 0 with live:true is a real reading of a quiet system, not a failure: Gassco publishes only when something happens.
activeNowCountintegercountMessages whose eventStatus is Active and whose window covers asOfMs (start inclusive, stop exclusive).
activeNowUnavailable[]arrayper unitunit, unavailable, events — unavailable capacity summed strictly within one capacity.unit across the active messages, one row per unit, largest first. Gassco states the unit per message rather than per feed, so there is no feed-level total: a feed carrying two units returns two rows and the consumer decides. Empty when nothing is active. This is the aggregate to headline.
asOfMsintegerepoch msThe instant activeNowCount and activeNowUnavailable were evaluated at. Stored with the payload: a cached or last-good response repeats the original instant rather than restating the counts as current.

§22a events[] — one REMIT urgent market message

FieldTypeUnitDescription
messageIdstring—Gassco's REMIT message id, e.g. 2026-304__________________003; the trailing number increments with each revision of the same event.
titlestring—The Atom entry title, e.g. 2026-304 PLANNED event at Troll.
detailsUrlstringURLGassco's own page for the message. It sits behind the site's click-through disclaimer; carried for a human reader, never fetched by Voltstack.
atomIdstring—The Atom entry id (urn:uuid:…). A revision arrives as a new entry with a new id.
eventStatusstring—REMIT vocabulary verbatim, e.g. Active, Dismissed. Only Active messages count toward the active-now figures.
eventTypestring—REMIT vocabulary verbatim, e.g. Other unavailability, Gas treatment plant unavailability. Not mapped onto any numeric code list.
unavailabilityTypestring—Verbatim: Planned or Unplanned.
unavailabilityReasonstring—Gassco's stated reason, verbatim, e.g. Yearly maintenance, Process problems.
eventStartMs / eventStopMsinteger | nullepoch msThe unavailability window. Gassco publishes local-offset stamps; both are converted to instants, never read as wall clock.
publishedAtMsinteger | nullepoch msThe message's own publicationDateTime, with the Atom entry's updated as the fallback. Never the fetch time.
capacityobject | nullcapacity.unitunit, unavailable, available, technical — the message's capacity block with its upstream unitMeasure carried verbatim (mcm/d on every message observed to date). Nothing is converted. null when the message carries no capacity block; such a message contributes nothing to activeNowUnavailable, not a zero.
assets[]array—Affected asset names as published, e.g. Troll, Nyhamna.
balancingZones[]arrayEICBalancing-zone EIC codes exactly as published, e.g. 21YNL----TTF---1. Raw codes with no name map: the payload does not say which zone a code denotes, and neither does this dictionary.
participant / participantEicstring—Publishing market participant and its EIC, e.g. Gassco AS / 21X-NO-A-A0A0A-2.
Source: Gassco (umm.gassco.no). ACER REMIT gas urgent market messages read from the UMM Atom feed at request time; the REMIT vocabulary (eventStatus, eventType, unavailabilityType) is carried verbatim, not mapped. Events only: Norwegian pipeline flows are not ingested here or anywhere on this surface. The aggregated exit nominations Gassco also publishes are stored for the Voltstack workspace since 24 September 2026 and appear in no payload on this surface. Fetched on a 15 minute TTL. When the upstream does not answer, a retained copy up to 24 hours old is served with lastGood:true and its original asOfMs; while such a copy exists a rate-limited upstream and a failed one produce the same envelope, and reason (rate-limited or upstream-error) appears only when no copy exists. meta.unit lists the units the payload carried, or n/a for an empty feed; meta.areaStatus.ummEvents is a constant live and carries no freshness information. Gassco publishes the data under its UMM Terms and Conditions and its Principles for Publication, both on umm.gassco.no.
23 — Weather · Forecast Risk

/v1/weather/forecast-risk → data.zones[]

FieldTypeUnitDescription
zone / daystring—Zone id and the forecast day evaluated.
variables[].deltaSigned / deltaAbsnumber | nullper variableD+1 run-to-run forecast change (signed and absolute) for temperature, wind, solar.
variables[].deltaPercentilenumber | null%Today's |delta| ranked against the series' own trailing 30-day distribution.
variables[].spread / spreadPercentilenumber | nullper variable / %Ensemble spread and its percentile rank.
variables[].deltaHistoryDays / spreadHistoryDaysintegerdaysHow much history the percentile actually stands on.
Forecast vintages cannot be backfilled, so this series is vintage-native by construction: the band grows one day at a time, and a young series reports its real day count instead of a fabricated percentile.
24 — Benchmarks · DE BESS Revenue Index

/v1/benchmarks/de-bess → data  ·  custom configs: /v1/benchmarks/de-bess/custom

FieldTypeUnitDescription
configobject—Reference battery: powerMw 1, energyMwh 2, roundTripEfficiency 0.9, cyclesPerDay 1.5.
months[]arrayEUR/MWmonth, arbitrageEur, afrrCapacityEur, mfrrCapacityEur, fcrCapacityEur, combinedEur plus per-stream day counts — monthly revenue per MW by stream.
monthToDateobject | nullEUR/MWThe current month's running figure.
imbalanceContext[]array—Monthly AEP context (not a modeled revenue stream in this version).
oldestAvailableobjectISO dateArchive start per input stream (arbitrage, aFRR, mFRR, FCR).
Arbitrage is an exact perfect-foresight optimization on settled DE_LU day-ahead prices — an upper bound, and labeled as one. Capacity legs settle at pay-as-cleared prices from regelleistung.net. Full methodology and assumption table are published with the benchmark.
25 — Data Quality · Cross-Validation

/v1/health/cross-checks → checks[]  ·  the same verdicts are also rendered on the public /status page

FieldTypeUnitDescription
checks[].series / zonestring—Verdict series and its human label, e.g. DE_LU vs SMARD.
checks[].daystringISO dateDelivery day reconciled.
checks[].meanAbsDiffnumberEUR/MWhMean absolute difference between the Voltstack archive and the reference for that day.
checks[].pass / checkedAtboolean / string— / ISOVerdict and when the harness ran.
A nightly harness reconciles the settled day-ahead archive against Bundesnetzagentur SMARD (CC BY 4.0) — an independent reference — for every zone SMARD also publishes, plus Fraunhofer ISE Energy-Charts for DE_LU as a pipeline check: Energy-Charts' price endpoint is itself SMARD-sourced (per its own license_info), so that comparison validates our plumbing rather than adding source independence. Restatement risk is measured daily, not assumed away. This endpoint returns a plain payload, not the standard envelope.
VOLTSTACK DATA DICTIONARY§22–25 · GAS PHYSICALS, RISK & BENCHMARKS
26 — Source Registry

The source field in every envelope maps to one of the following upstreams.

sourceProviderDomainsCadence
entsoeENTSO-E Transparency Platform (Web API; File Library extracts as the persisted fallback for prices, load, generation, imbalance and cross-border flows)Power prices, flows, generation, installed capacity, outages, loadIntraday / hourly / yearly
elexonElexon BMRS (Insights)GB price & generationHalf-hourly
gie-agsiGIE AGSI+Gas storageDaily (per gas day)
gie-alsiGIE ALSI+LNG send-out & inventoryDaily (per gas day)
entsogENTSOG Transparency PlatformGas pipeline flowsDaily (settled D+1)
fredFRED — Federal Reserve Bank of St. LouisCommodity benchmarks (oil, gas, coal)Daily / monthly
open-meteoOpen-Meteo / ECMWFWeather, HDD/CDD, forecast riskSeveral runs/day
jao-constraintsJAO Publication Tool (Core FBMC)Binding CNECs, shadow prices, MaxBex; paused on the API since 24 Sep 2026Daily (SDAC results ~13:00 CET)
netztransparenznetztransparenz.de (shared German TSO portal)AEP/reBAP imbalance, redispatch, NRV, CBMP, scarcity flag; paused on the API since 24 Sep 202615-min, near-real-time
regelleistung-capacityregelleistung.netFCR/aFRR/mFRR capacity clearing pricesDaily auctions
umm-eventsNord Pool REMIT UMMUrgent market messages (outages, unavailability)Continuous, versioned
nve-hydroNVE Magasinstatistikk (NLOD licence)Norwegian reservoir fill, history from 1995Weekly
national-gasNational Gas Transmission Data Portal (open data)GB entry flows, linepack, demand, NTS forecastInstantaneous, multiple updates/day
gasscoGassco REMIT UMM Atom feed (umm.gassco.no); attribution Source: Gassco (umm.gassco.no) on every surface showing the data; terms: the Gassco UMM Terms and Conditions and the Principles for Publication, both on umm.gassco.noNorwegian field & terminal unavailability events (§22a); no flowsEvent-driven; read on a 15 min TTL, retained copy up to 24 h
gassco-nominationsGassco real-time nomination Atom feed (umm.gassco.no/realTimeAtom.xml) and Gassco's exit-nomination history; attribution Source: Gassco (umm.gassco.no) on every surface showing the data; terms: the Gassco UMM Terms and Conditions and the Principles for Publication, both on umm.gassco.noNorwegian aggregated daily exit nominations, nine exit points and the NCS total, stored for the workspace and served on no endpoint of this surfaceFive-minute updates, read every 20 min
cross-validateSMARD (Bundesnetzagentur, CC BY 4.0) · Energy-Charts (Fraunhofer ISE)Independent day-ahead reconciliation verdictsNightly
de-bessVoltstack derived (ENTSO-E A44 · regelleistung.net · netztransparenz AEP)DE battery revenue indexDaily
n2ex-dayaheadNord Pool N2EX data portalGB day-ahead settled auction prices; paused on the API since 24 Sep 2026Daily
elexon-bmElexon Insights (BOD/BOALF/MID)GB balancing mechanism: acceptances, top-of-stack, BM-vs-MID spreadHalf-hourly settlement periods
neso-forecastNESO Data PortalGB day-ahead wind + demand forecast, wind-vs-outturn deltaDaily forecast, intraday outturn
entsoe-idaENTSO-E intraday auctions (IDA1–3)IDA prices + DA–IDA spread; ES only (sole voluntary publisher)Three auctions/day
jao-nordicJAO Publication Tool (Nordic FBMC)Nordic MaxBex + net positions, stored; bulk extract paused since 24 Sep 2026Daily (SDAC results)
eex-eua-auctionEEX primary auction reports (licensed 2026-07-29 for primary-auction results only; spot & futures excluded); attribution Source: EEXEU ETS EUA primary-auction results (§13b); history from 2020; cancelled auctions carried as first-class rowsAuction-day (EU ~every 2 days · NIR ~yearly; per-zone freshness on meta.areaStatus)
rteRTE (France) data portal, Generation Forecast API; values served as RTE publishes them; attribution Source: RTE (data.rte-france.com)FR wind and solar generation forecasts and RTE's purchase-obligation aggregate, per horizon from D-3 to current, the aggregate per RTE run (§20a)~4-hourly worker pass
history / merit-orderVoltstack settled archiveAll §4–6, §11–13 and archive-backed §14–25 endpoints; the originating provider is named in meta.upstreamExtended daily by the ingestion worker
27 — Enumerations

reason (when live = false)

ValueMeaning
no-tokenUpstream credential not configured server-side; the feed upgrades the moment its key lands.
upstream-errorUpstream API failed, timed out, or returned unparseable data.
rate-limitedRequest backed off to respect an upstream limit.
bad-requestThe request itself was invalid — an unknown feed or series, or a malformed parameter — and is served with an HTTP 4xx status. Correct the request; retrying unchanged will not help. Distinct from upstream-error, which reports a failure on Voltstack's side or the provider's.
disabledFeed explicitly turned off via a server-side flag.
as-of-nothing-capturedAn as_of read (§4, §4a, §11, §12) whose window held no captured value at that instant, although capture of the series had begun. Served 200 with an empty series and pointInTime; heldNotKnownAsOf counts the intervals captured later.
as-of-only-implausibleAn as_of read on §11 or §12 whose window held captured values at that instant, every one of which fails the plausibility filter the latest-value read also applies. Served as above.

currency

CodeSymbolApplies to
EUR€Continental & Nordic power, EU gas/LNG/carbon
GBP£GB power

weather region ids

EU_DE, EU_FR, EU_GB, EU_NL, EU_BE, EU_ES, EU_IT, EU_NO, EU_SE, EU_PL · ERCOT_COAST, ERCOT_NORTH, ERCOT_WEST, NE_BOSTON, MW_CHICAGO, SE_ATLANTA

merit-order fuels (§6, ascending modeled cost)

wind, solar, hydro, nuclear, biomass, coal, gas, oil

Live coverage as at 2026-07-31. Exchange-licensed forward and spot domains (EUA/UKA spot & futures, TTF/NBP gas curves, Brent/WTI oil) follow the same field conventions and are documented per-tenant on entitlement; EEX EUA primary-auction results are live and documented in §13b.
v1.24 · 2026-10-25: §20a's horizon names RTE's run for the purchase-obligation aggregate (D-1/DA02, ID/ID07), so every horizon served for it is one RTE run; before, several runs were stored under one horizon and the last one RTE listed kept for each interval. availableHorizons lists the aggregate's runs, and its rows stored before this revision are served nowhere. §26's rte row says so. Wind and solar are unchanged, and no other field, type or unit changed. v1.23 · 2026-10-25: §13b and §26's eex-eua-auction row name the attribution as Source: EEX, the line the platform shows beside the same data; Source: EEX Group belongs to the EEX DataSource data a desk brings itself. §26's rte row names RTE's purchase-obligation aggregate. No field, type or unit changed. v1.22 · 2026-10-23: new §13b documents /v1/carbon/eua-auctions, EEX's EUA primary auction results, and new §20a documents /v1/power/fr-generation-forecast, RTE's French generation forecast. §26's eex-eua-auction and rte rows point to them and name the attribution each carries; the rte row no longer says its /v1 path follows. No other field, type or unit changed. v1.21 · 2026-10-01: Publisher details: Voltstack Limited, Dublin, Ireland. No field, type or unit changed. v1.20 · 2026-09-28: the point-in-time capture note under §14's lede no longer says redispatch §16 and GB balancing §17a are version-captured with a publication timestamp since 2026-07-14, since neither source gives one. It points each at the date /coverage shows for it, says what version 1 of each carries as published_at (the measure's own window start, or Elexon's own acceptance time), and says which fields of a GB acceptance make a version and that its matched price and side are corrected in place. REMIT UMMs §19 and unit outages §20 are unchanged. §17a's note states how the accepted offer and bid prices are now weighted (each acceptance segment by the MWh it delivers inside each period), that acceptance segments for a day's last periods made after its last pass that end by midnight are not captured, how the last periods are numbered on the two clock-change days, that values before the date /coverage shows weighted a segment by its level, counted one spanning two periods twice and took in the day before's segments that ran past midnight, by period number, and that a repair may restate them. §17a's rows now name what the endpoint serves: bmMidSpread as topOfStackOffer minus midLatest (it read "accepted offer/bid spread vs the market index"), topOfStackBid as the highest matched bid (it read "lowest accepted bid price"), both top-of-stack prices as maxima rather than the energy-weighted averages, midLatest and the wind figures at bmMidSpreadAt and windDeltaAt, which gets its own row, and how topUnits' figures are made. The endpoint's fields, types and units are unchanged; the rows now give bmMidSpreadAt as string or null, and topUnits' units. The values of those series, and §17a's top-of-stack prices and spread in each day's last periods (on the day after the March change also in periods 45 and 46, and on the October change day in periods 47 and 48), changed from that date. v1.19 · 2026-09-27: §22a's note and both Gassco rows in §26 name the Gassco UMM Terms and Conditions and the Principles for Publication, both on umm.gassco.no. No field, type or unit changed. v1.18 · 2026-09-24: §14's note covers a response in which ENTSO-E returns no price for any of its five areas. Nothing is then left to serve, so the endpoint answers live false with reason upstream-error and data null, and any German rows it withheld still read paused in meta.areaStatus. It could previously come back live with an empty areas map. The reason value is the one §27 already lists. No field, type or unit changed. v1.17 · 2026-09-24: §22a no longer says the Gassco nominations are not ingested. Gassco confirmed on 15 September that they are covered, and Voltstack now stores its aggregated daily exit nominations for the workspace; they appear in no payload on this surface, and Norwegian pipeline flows are still not ingested. §26 gains the gassco-nominations source. No field, type or unit changed. v1.16 · 2026-09-24: a new note under the lede states the redistribution pause ruled on this date: §4a, §15, §16, §17 and §18 answer 451 with error "unavailable" while their publishers (Nord Pool N2EX, netztransparenz.de, JAO) confirm redistribution rights, and each carries a PAUSED mark. §14 keeps its ENTSO-E areas and withholds the four German rows, and its areaStatus vocabulary gains paused. The Access note says a key reaches full depth only on an endpoint that is not paused. §18 and §26 say the bulk extracts of the JAO domains are paused too, and §26 marks the jao-constraints, netztransparenz and n2ex-dayahead sources. No field, type or unit changed. v1.15 · 2026-09-23: §4, §4a, §11 and §12 gain pointInTime, present only on an as_of read; §11's is for the requested area, and its five-year band is null on that read. §27's reason enum gains as-of-nothing-captured and as-of-only-implausible, the 200 live:false answers for a window with nothing to serve as of the instant. The history conventions note says which endpoints answer as_of and which refuse it. The point-in-time note under §14 lists the price and fundamentals series now captured on change and no longer says the as-of API is outside the /v1 surface. No existing field, type or unit changed. v1.14 · 2026-09-23: the envelope note gains meta.dataAsOf, the newest data point behind a payload's headline values, which /status now ages each feed from; §04a names it; §09 gains points[].gasDay. v1.13 · 2026-09-23: §11 gains the optional area parameter: each of five EU countries is banded against its own prior years, and GIE_UK is refused because its series changed basis on 2020-12-30. v1.12 · 2026-09-22: the Access note described a surface that refused every request carrying no key, measured 9 August 2026. Production now answers such a request as a labelled sample, measured 22 September 2026, and the note says so in step with Specification v1.10 §03. No field, unit or endpoint changed. v1.11 · 2026-09-18: §07 gains countries[].basis; the UK storage series is re-keyed to AGSI+'s Post-Brexit dataset (GB*) and declared estimated and partial. v1.10 · 2026-09-13: new §22a documents /v1/gas/norway-events, the Gassco REMIT UMM events feed live since 13 September 2026, field by field: the per-message capacity unit and why there is no feed-level total, asOfMs as the evaluation instant the counts travel with, balancingZones as raw EIC codes with no name map, REMIT vocabulary verbatim, the empty feed as a real reading, the 15 minute TTL and 24 hour retained copy, and the caveat that events[] can carry a superseded message beside its revision so aggregation belongs on activeNowUnavailable. §22's note no longer says the Norwegian half is parked: that endpoint is GB-only for flows and points at §22a. §26 gains gassco. The header version line, which v1.9 left reading 1.8, is corrected. No existing field, type or unit changed. v1.9 · 2026-09-08: §26's entsoe row records the File Library extracts as the persisted fallback for prices, load, generation, imbalance and cross-border flows. Recorded here retrospectively; that revision shipped without a history line. No field, type or unit changed. v1.8 · 2026-08-27: §27's reason enum gains bad-request, returned with a 4xx when the caller's own parameters are invalid (an unknown feed or series, a malformed instant or window) so a keyed client can tell a request mistake from an outage; previously such requests answered 200 upstream-error, indistinguishable from a capture-pipeline failure. First served by the point-in-time vintages endpoint. No field, type or unit changed. v1.7 · 2026-08-27: the access note records the key gate's second refusal: keys are scoped by endpoint family (history, current, all), and a valid key presented on an endpoint outside its scopes is refused 403 insufficient-scope. Documentation catch-up to the shipped gate; Specification §03/§08 remains the authority on the access model. No field, type or unit changed. v1.6 · 2026-08-09: §24 no longer describes its endpoint as "public, no auth", which was false against the shipped gate, measured 401 unkeyed on every documented /v1 path. The key gate is now stated once, for the surface, in the access note under the lede, and no section carries a per-endpoint key rule; that note also records the one endpoint carrying a plan requirement beyond the key gate, which is where this dictionary and Specification §06 have to agree. §25's "public" attaches explicitly to the /status page. No field, type or unit changed. v1.5 · 2026-08-08: §7's storage country list and §27's weather region ids each gain the one id that was being served and had never been documented. No field, type or unit changed. 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: §1/§2 corrected to the served map shapes (GB pointer moved to §04a); phantom commodities-benchmarks path removed from §13; §10 degree-day base parameter documented; §25 cross-validation independence phrasing corrected; §26 gains eex-eua-auction and rte; §27 reason enum corrected; envelope note gains lastGood and areaStatus; point-in-time capture note added to §14–25. © 2026 Voltstack Limited.
VOLTSTACK DATA DICTIONARYdata@voltstack.energy