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.
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}
| Field | Type | Unit | Description |
| prices[zone] | number | EUR/MWh | Day-ahead price for the delivery slot covering the current time, keyed by bidding-zone code (see §1a). |
| changes[zone] | number | EUR/MWh | Day-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
| Code | Zone | Currency | Source |
| DE_LU | Germany–Luxembourg | EUR | ENTSO-E |
| FR | France | EUR | ENTSO-E |
| NL | Netherlands | EUR | ENTSO-E |
| BE | Belgium | EUR | ENTSO-E |
| AT | Austria | EUR | ENTSO-E |
| NO_1 / NO_2 | Norway (Oslo / Kr.sand) | EUR | ENTSO-E |
| SE_3 | Sweden (Stockholm) | EUR | ENTSO-E |
| DK_1 | Denmark (West) | EUR | ENTSO-E |
| ES | Spain | EUR | ENTSO-E |
| IT_NORTH | Italy (North) | EUR | ENTSO-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
| Field | Type | Unit | Description |
| flows[id] | number | MW | Signed 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
| id | Link | id | Link |
| IFA_1 / IFA_2 | France ↔ GB | FR_DE | France ↔ Germany |
| NSL | Norway ↔ GB | DE_NL | Germany ↔ Netherlands |
| BRITNED | Netherlands ↔ GB | DE_AT | Germany ↔ Austria |
| NEMO | Belgium ↔ GB | NO_SE | Norway ↔ Sweden |
| VIKING | Denmark ↔ GB | ES_FR | Spain ↔ France |
| FR_IT | France ↔ Italy | | |
03 — Power · Generation Mix
/v1/power/generation?country=XX&range=1D|1W|1M → data.{range, hours[]}
| Field | Type | Unit | Description |
| range | string | — | Window the response covers: 1D (default), 1W or 1M, served from the settled A75 archive. GB (Elexon) is 1D only. |
| hour | string | HH:00 | Hour label. Multi-day ranges prefix the calendar day: MM/DD HH:00. |
nuclear, coal, gas, biomass, hydro, solar, wind | number | MW | Average generation in that hour for each fuel bucket. A fuel is omitted when it has no generation/data. |
§3a — Fuel-bucket mapping
| Bucket | ENTSO-E PsrType | Elexon (GB) |
| gas | B03, B04, B06, B20 | CCGT, OCGT, OIL, OTHER |
| coal | B02, B05, B07, B08 | COAL |
| nuclear | B14 | NUCLEAR |
| wind | B18, B19 | WIND |
| hydro | B10, B11, B12, B13 | NPSHYD, PS |
| biomass | B01, B09, B15, B17 | BIOMASS |
| solar | B16 | n/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
| Field | Type | Unit | Description |
| zone | string | — | Bidding-zone code (see §1a). |
| points[].t | integer | epoch ms | Delivery-slot start (UTC). Resolution follows the market — PT60M or PT15M, inferred from point spacing per window. |
| points[].p | number | ccy/MWh | Settled day-ahead price for that slot (ENTSO-E A44 — the same series behind §1's live value). |
| oldestAvailable | string | ISO date | Earliest settled point held for the zone. Archive is ~2 years deep and extended daily. |
| pointInTime | object | — | 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
| Field | Type | Unit | Description |
| zone | string | — | Fixed GB series — no zone parameter. |
| points[].t | integer | epoch ms | Delivery-slot start (UTC); resolution inferred from point spacing, as §4. |
| points[].p | number | GBP/MWh | Settled N2EX day-ahead auction price for that slot. |
| oldestAvailable | string | ISO date | True archive start, reported rather than silently truncated. |
| pointInTime | object | — | 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
| Field | Type | Unit | Description |
| zone | string | — | Bidding-zone code (see §1a). |
| points[].date / dateMs | string / integer | ISO date / epoch ms | Display day (UTC). |
| points[].vol7d, vol30d, vol90d | number | null | ccy/MWh | Rolling 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. |
| oldestAvailable | string | ISO date | Earliest 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
| Field | Type | Unit | Description |
| country | string | — | DE or FR live today; capacity coverage DE, FR, ES, IT, NL, NO, SE, PL. |
| capacityYear | integer | year | ENTSO-E reference year of the capacity figures. Fuels retired before that year are excluded entirely, never carried forward stale. |
| stack[].fuel | string | — | wind · solar · hydro · nuclear · biomass · coal · gas · oil, in ascending modeled cost. |
| stack[].installedMw | number | MW | Installed capacity (A68). |
| stack[].unavailableMw | number | MW | Sum of currently active derates from outage messages (A77/A80). |
| stack[].availableMw | number | MW | installedMw − unavailableMw, floored at 0. |
| stack[].marginalCost | number | EUR/MWh | Modeled assumption, not a market quote — carried regardless of live status. |
| demandMw / demandAt | number / string | MW / ISO | Latest actual load (A65) and its delivery timestamp. |
| clearingPrice | number | EUR/MWh | Modeled cost of the marginal fuel where the cumulative stack meets demand. |
| totalAvailableMw | number | MW | Sum 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[]}
| Field | Type | Unit | Description |
| aggregate.currentLevel | number | % | EU aggregate storage fullness. |
| aggregate.currentVolume | number | TWh | Working gas in store. |
| aggregate.workingCapacity | number | TWh | Total working capacity. |
| aggregate.gasDayStart | string | ISO date | Gas day the value applies to. |
| countries[].id | string | — | GIE_DE, GIE_IT, GIE_FR, GIE_NL, GIE_AT, GIE_UK. |
| countries[].currentPct | number | % | Country storage fullness. |
| countries[].basis | object | — | 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[]}
| Field | Type | Unit | Description |
| aggregate.sendOut | number | GWh/d | LNG regasified and sent out to the grid — the LNG demand signal. |
| aggregate.sendOutUtil | number | % | Send-out vs declared max send-out capacity (dtrs). |
| aggregate.fullness | number | % | LNG tank inventory vs declared max inventory. |
| aggregate.dtrs | number | GWh/d | Declared total reference send-out (max capacity). |
| countries[].id | string | — | ES, FR, NL, IT, BE. |
| countries[].sendOut | number | GWh/d | Country send-out. |
| countries[].fullness | number | % | Country tank fullness. |
09 — Gas · Pipeline Flows
/v1/gas/pipeline-flows → data.{points[], total, gasDayStart}
| Field | Type | Unit | Description |
| points[].id | string | — | Artery key (e.g. dornum, mazara, tap, turkstream). |
| points[].label | string | — | Interconnection-point name. |
| points[].source | string | — | Supply origin: Norway · Algeria · Azerbaijan · TurkStream. |
| points[].flow | number | GWh/d | Physical entry flow, latest complete gas day. |
| points[].gasDay | string | ISO date | Gas 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. |
| total | number | GWh/d | Sum across all arteries. |
| gasDayStart | string | ISO date | Gas day of the values used. |
10 — Weather
/v1/weather?regions=… → data[regionId][]
| Field | Type | Unit | Description |
| date | string | ISO date | Forecast day. |
| forecastHigh / Low | number | °C / °F | Daily high / low (°C for EU regions, °F for US). |
| deviation | number | deg | High vs seasonal-normal high. |
| hdd / cdd | number | deg-days | Heating / cooling degree days (base 18°C EU, 65°F US). |
| windSpeed | number | km/h · mph | Max daily wind speed. |
| precipProb | number | % | 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
| Field | Type | Unit | Description |
| points[].date | string | ISO date | Gas day (UTC). |
| points[].level | number | % | 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 / Max | number | 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. |
| oldestAvailable | string | ISO date | Earliest row held for the requested area. History from 2015-01-01. |
| pointInTime | object | — | 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
| Field | Type | Unit | Description |
| points[].date | string | ISO date | Gas day (UTC). |
| points[].sendOut | number | null | GWh/d | EU aggregate LNG send-out (GIE ALSI+). |
| points[].fullness | number | null | % | EU aggregate tank fullness. |
| oldestAvailable | string | ISO date | Earliest EU aggregate row held. History from 2015-01-01. |
| pointInTime | object | — | 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
| Field | Type | Unit | Description |
| series[].id | string | — | Series identifier (see §13a). |
| series[].freq | string | — | daily or monthly — read from the stored cadence, per series. |
| series[].points[].t / .v | string / number | ISO date / see §13a | Observation date and value, ascending. |
| oldestAvailable | object | — | Earliest row held, keyed per series id — cadences clamp at different depths. History from 2015-01-01. |
§13a — Benchmark series
| id | Benchmark | FRED series | Unit | Cadence |
| brent | Brent crude | DCOILBRENTEU | USD/bbl | Daily |
| wti | WTI crude | DCOILWTICO | USD/bbl | Daily |
| henryhub | Henry Hub natural gas | DHHNGSP | USD/MMBtu | Daily |
| eu_gas | EU natural gas import price | PNGASEUUSDM | USD/MMBtu | Monthly |
| coal | Australian thermal coal | PCOALAUUSDM | USD/mt | Monthly |
13b — Carbon · EUA Primary Auctions (EEX)
/v1/carbon/eua-auctions → data
| Field | Type | Unit | Description |
| auctions[] | array | — | One row per auction over the last 400 days, oldest first; fields below. |
| auctions[].day | string | ISO date | Auction day. |
| auctions[].zone | string | — | Auctioning entity: EU, DE, PL or NIR. |
| auctions[].cleared | boolean | — | false when EEX published the auction as cancelled: it did not clear. |
| auctions[].price | number | null | EUR/tCO2 | Auction clearing price; null whenever no price cleared. |
| auctions[].volume | number | null | tCO2 | Volume auctioned. |
| auctions[].coverRatio | number | null | ratio | Total bids over the volume auctioned, as EEX publishes it. |
| auctions[].bidders | number | null | count | Total number of bidders. |
| latestByZone | object | — | The newest cleared auction per entity, with the fields above. |
| oldestAvailable | string | ISO date | The first auction day held, across all time. History from 2020. |
| zoneCadence | object | days | Per 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
| Field | Type | Unit | Description |
| areas[id].price | number | EUR/MWh | Latest settled imbalance price for the area. Keys are country codes or DE_* control areas. |
| areas[id].at | integer | epoch ms | Start 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
| Field | Type | Unit | Description |
| price | number | EUR/MWh | Latest published 15-minute AEP estimator value — the near-real-time reBAP proxy. |
| at | integer | epoch ms | Interval start (UTC). |
| series[].t / .v | integer / number | epoch ms / EUR/MWh | Today'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
| Field | Type | Unit | Description |
| todayMwh / todayMeasures | number | MWh / count | Today's redispatch energy and measure count (UTC day). |
| activeNow | integer | count | Measures whose window covers this instant. |
| median30dMwh | number | null | MWh | Median daily redispatch energy over the trailing 30 days — today's norm. |
| nrvLatestMw / nrvLatestAt | number | null / string | MW / ISO | Live 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
| Field | Type | Unit | Description |
| afrrCapacity[] / mfrrCapacity[] | array | EUR/MW | product (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[] | array | EUR/MWh | at, 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
| Field | Type | Unit | Description |
| todayDate | string | ISO date | Today's date in London, the GB settlement day, not the UTC date. topUnits covers this day. |
| bmMidSpread / bmMidSpreadAt | number | null / string | null | GBP/MWh / ISO | bm_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 / topOfStackBid | number | null | GBP/MWh | bm_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. |
| midLatest | number | null | GBP/MWh | mid_price_GB at bmMidSpreadAt: Elexon's Market Index Price for that period, volume weighted across its data providers. |
| windForecastLatest / windOutturnLatest / windDeltaLatest | number | null | MW | NESO's day-ahead wind forecast, Elexon's wind outturn, and the outturn minus the forecast (gb_wind_forecast_delta_GB), all at windDeltaAt. |
| windDeltaAt | string | null | ISO | Start of the newest settlement period with a wind delta, where the three wind figures are read. |
| nextDemandForecast | object | null | MW / ISO | at, value: the first NESO demand forecast point after now (neso_demand_forecast_GB). |
| topUnits[] | array | MW / GBP/MWh | unit, 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
| Field | Type | Unit | Description |
| day / dayLabel | string | ISO date / — | Delivery day shown: tomorrow once SDAC results land (~13:00 CET), else today. |
| totalBoundMtus | integer | count | Distinct 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[] | array | MW | border ("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
| Field | Type | Unit | Description |
| 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 / activeNowMw | integer / number | count / MW | Events whose unavailability window covers this instant, and their summed MW. |
| topAreas[] | array | MW | area, 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
| Field | Type | Unit | Description |
| fleetMw | number | MW | Nominal nuclear fleet capacity constant the curve is derived against. |
| todayMw / weekAgoMw | number | null | MW | Available capacity today and seven days ago. |
| curve[] | array | MW | day, availableMw — forward availability curve, today through D+90. |
| minPoint | object | null | MW | Deepest 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
| Field | Type | Unit | Description |
| filiere | string | — | 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. |
| horizon | string | — | 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. |
| unit | string | — | 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[] | array | MW | startMs, 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
| Field | Type | Unit | Description |
| areas[] | array | % · pp | area, weekStart, fillPct, minPct, medianPct, maxPct, deviationPp, weekOverWeekPp — current reservoir fill vs the historical min/median/max band for the same ISO week. |
| nationalDeviationTwh | number | null | TWh | National deviation expressed in energy (deviation × national reservoir capacity) — traders think in TWh, not percent. |
| nationalCapacityTwh | number | TWh | NVE 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
| Field | Type | Unit | Description |
| asOf | string | null | ISO | Timestamp of the freshest instantaneous reading. |
| supplyTotalMcmD / demandTotalMcmD | number | null | mcm/d | System-wide supply and demand totals. |
| linepackMscm / linepackDayAgoMscm | number | null | mscm | Actual NTS linepack and the same-time-yesterday value (matched within a ±2 h window, never an arbitrarily old point). |
| entryPoints[] | array | mcm/d | site, slug, flowMcmD — instantaneous flow by terminal/entry point. |
| demandByCategory[] | array | mcm/d | category, flowMcmD — LDZ, power stations, industrial, interconnector, storage. |
| demandForecast[] | array | GWh/d | gasDay, 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
| Field | Type | Unit | Description |
| 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. |
| eventCount | integer | count | Length 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. |
| activeNowCount | integer | count | Messages whose eventStatus is Active and whose window covers asOfMs (start inclusive, stop exclusive). |
| activeNowUnavailable[] | array | per unit | unit, 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. |
| asOfMs | integer | epoch ms | The 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
| Field | Type | Unit | Description |
| messageId | string | — | Gassco's REMIT message id, e.g. 2026-304__________________003; the trailing number increments with each revision of the same event. |
| title | string | — | The Atom entry title, e.g. 2026-304 PLANNED event at Troll. |
| detailsUrl | string | URL | Gassco's own page for the message. It sits behind the site's click-through disclaimer; carried for a human reader, never fetched by Voltstack. |
| atomId | string | — | The Atom entry id (urn:uuid:…). A revision arrives as a new entry with a new id. |
| eventStatus | string | — | REMIT vocabulary verbatim, e.g. Active, Dismissed. Only Active messages count toward the active-now figures. |
| eventType | string | — | REMIT vocabulary verbatim, e.g. Other unavailability, Gas treatment plant unavailability. Not mapped onto any numeric code list. |
| unavailabilityType | string | — | Verbatim: Planned or Unplanned. |
| unavailabilityReason | string | — | Gassco's stated reason, verbatim, e.g. Yearly maintenance, Process problems. |
| eventStartMs / eventStopMs | integer | null | epoch ms | The unavailability window. Gassco publishes local-offset stamps; both are converted to instants, never read as wall clock. |
| publishedAtMs | integer | null | epoch ms | The message's own publicationDateTime, with the Atom entry's updated as the fallback. Never the fetch time. |
| capacity | object | null | capacity.unit | unit, 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[] | array | EIC | Balancing-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 / participantEic | string | — | 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[]
| Field | Type | Unit | Description |
| zone / day | string | — | Zone id and the forecast day evaluated. |
| variables[].deltaSigned / deltaAbs | number | null | per variable | D+1 run-to-run forecast change (signed and absolute) for temperature, wind, solar. |
| variables[].deltaPercentile | number | null | % | Today's |delta| ranked against the series' own trailing 30-day distribution. |
| variables[].spread / spreadPercentile | number | null | per variable / % | Ensemble spread and its percentile rank. |
| variables[].deltaHistoryDays / spreadHistoryDays | integer | days | How 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
| Field | Type | Unit | Description |
| config | object | — | Reference battery: powerMw 1, energyMwh 2, roundTripEfficiency 0.9, cyclesPerDay 1.5. |
| months[] | array | EUR/MW | month, arbitrageEur, afrrCapacityEur, mfrrCapacityEur, fcrCapacityEur, combinedEur plus per-stream day counts — monthly revenue per MW by stream. |
| monthToDate | object | null | EUR/MW | The current month's running figure. |
| imbalanceContext[] | array | — | Monthly AEP context (not a modeled revenue stream in this version). |
| oldestAvailable | object | ISO date | Archive 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
| Field | Type | Unit | Description |
| checks[].series / zone | string | — | Verdict series and its human label, e.g. DE_LU vs SMARD. |
| checks[].day | string | ISO date | Delivery day reconciled. |
| checks[].meanAbsDiff | number | EUR/MWh | Mean absolute difference between the Voltstack archive and the reference for that day. |
| checks[].pass / checkedAt | boolean / string | — / ISO | Verdict 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.
| source | Provider | Domains | Cadence |
| entsoe | ENTSO-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, load | Intraday / hourly / yearly |
| elexon | Elexon BMRS (Insights) | GB price & generation | Half-hourly |
| gie-agsi | GIE AGSI+ | Gas storage | Daily (per gas day) |
| gie-alsi | GIE ALSI+ | LNG send-out & inventory | Daily (per gas day) |
| entsog | ENTSOG Transparency Platform | Gas pipeline flows | Daily (settled D+1) |
| fred | FRED — Federal Reserve Bank of St. Louis | Commodity benchmarks (oil, gas, coal) | Daily / monthly |
| open-meteo | Open-Meteo / ECMWF | Weather, HDD/CDD, forecast risk | Several runs/day |
| jao-constraints | JAO Publication Tool (Core FBMC) | Binding CNECs, shadow prices, MaxBex; paused on the API since 24 Sep 2026 | Daily (SDAC results ~13:00 CET) |
| netztransparenz | netztransparenz.de (shared German TSO portal) | AEP/reBAP imbalance, redispatch, NRV, CBMP, scarcity flag; paused on the API since 24 Sep 2026 | 15-min, near-real-time |
| regelleistung-capacity | regelleistung.net | FCR/aFRR/mFRR capacity clearing prices | Daily auctions |
| umm-events | Nord Pool REMIT UMM | Urgent market messages (outages, unavailability) | Continuous, versioned |
| nve-hydro | NVE Magasinstatistikk (NLOD licence) | Norwegian reservoir fill, history from 1995 | Weekly |
| national-gas | National Gas Transmission Data Portal (open data) | GB entry flows, linepack, demand, NTS forecast | Instantaneous, multiple updates/day |
| gassco | Gassco 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.no | Norwegian field & terminal unavailability events (§22a); no flows | Event-driven; read on a 15 min TTL, retained copy up to 24 h |
| gassco-nominations | Gassco 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.no | Norwegian aggregated daily exit nominations, nine exit points and the NCS total, stored for the workspace and served on no endpoint of this surface | Five-minute updates, read every 20 min |
| cross-validate | SMARD (Bundesnetzagentur, CC BY 4.0) · Energy-Charts (Fraunhofer ISE) | Independent day-ahead reconciliation verdicts | Nightly |
| de-bess | Voltstack derived (ENTSO-E A44 · regelleistung.net · netztransparenz AEP) | DE battery revenue index | Daily |
| n2ex-dayahead | Nord Pool N2EX data portal | GB day-ahead settled auction prices; paused on the API since 24 Sep 2026 | Daily |
| elexon-bm | Elexon Insights (BOD/BOALF/MID) | GB balancing mechanism: acceptances, top-of-stack, BM-vs-MID spread | Half-hourly settlement periods |
| neso-forecast | NESO Data Portal | GB day-ahead wind + demand forecast, wind-vs-outturn delta | Daily forecast, intraday outturn |
| entsoe-ida | ENTSO-E intraday auctions (IDA1–3) | IDA prices + DA–IDA spread; ES only (sole voluntary publisher) | Three auctions/day |
| jao-nordic | JAO Publication Tool (Nordic FBMC) | Nordic MaxBex + net positions, stored; bulk extract paused since 24 Sep 2026 | Daily (SDAC results) |
| eex-eua-auction | EEX primary auction reports (licensed 2026-07-29 for primary-auction results only; spot & futures excluded); attribution Source: EEX | EU ETS EUA primary-auction results (§13b); history from 2020; cancelled auctions carried as first-class rows | Auction-day (EU ~every 2 days · NIR ~yearly; per-zone freshness on meta.areaStatus) |
| rte | RTE (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-order | Voltstack settled archive | All §4–6, §11–13 and archive-backed §14–25 endpoints; the originating provider is named in meta.upstream | Extended daily by the ingestion worker |
27 — Enumerations
reason (when live = false)
| Value | Meaning |
| no-token | Upstream credential not configured server-side; the feed upgrades the moment its key lands. |
| upstream-error | Upstream API failed, timed out, or returned unparseable data. |
| rate-limited | Request backed off to respect an upstream limit. |
| bad-request | The 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. |
| disabled | Feed explicitly turned off via a server-side flag. |
| as-of-nothing-captured | An 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-implausible | An 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
| Code | Symbol | Applies 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