How every number on the Voltstack terminal and Data API is produced: what is measured, what is derived, what is modeled, and how each of those states is declared to you. Companion to the Data Dictionary (field-level reference) and the API Specification (transport and endpoints).
Every payload declares its own provenance through the response envelope (API Specification §4). Three states exist, and consumers can always tell which one they are looking at:
| State | Meaning | How it is declared |
|---|---|---|
| Measured | Real upstream data, passed through with unit conversion and aggregation only. | live: true; upstream named in meta.upstream. |
| Derived | Computed from measured data by a documented method (e.g. realized volatility, the five-year band). | live: true; the derivation is named in meta.upstream and specified in this guide. |
| Modeled | An assumption, not an observation (e.g. merit-order marginal costs). Never blended into measured fields. | Labeled as modeled in the payload's documentation and in the terminal UI, regardless of live status. |
When a real value cannot be served, the response is a declared fallback — live: false with a
machine-readable reason — never a stale or invented number presented as fresh. Composite figures follow an
AND-gate: a payload built from several inputs is marked live only when every input is real. The merit-order stack,
for example, requires real capacity, real derates and real demand together; two out of three is a fallback, not a
partial truth.
History endpoints are served from Voltstack's own settled archive, not from request-time calls to the upstream. An ingestion worker persists each feed's settled values on the upstream's own publication cadence; one-off backfills seed the depth. The same persisted series feeds both the live headline figure and its history — one source of truth, never two independently maintained pipelines that can disagree.
| Series | Upstream | Archive depth |
|---|---|---|
| Day-ahead prices (11 zones) | ENTSO-E A44 | ~2 years, extended daily |
| Generation by fuel (8 countries) | ENTSO-E A75 | Rolling, extended hourly |
| Installed capacity / outages / load | ENTSO-E A68 · A77+A80 · A65 | Yearly · event-driven · hourly |
| EU gas storage | GIE AGSI+ | From 2015-01-01 |
| EU LNG send-out & fullness | GIE ALSI+ | From 2015-01-01 |
| Commodity benchmarks (5 series) | FRED | From 2015-01-01 |
| GB N2EX day-ahead auction | Nord Pool N2EX portal | From 2026-05-18, accrues daily |
| Core FBMC MaxBex | JAO Publication Tool | 365-day backfill, extended daily |
| German redispatch events | netztransparenz.de | From 2024-07 |
| German settled imbalance (AEP) | netztransparenz.de | From 2022 |
| Norwegian reservoir fill | NVE Magasinstatistikk | From 1995, weekly |
| EUA primary auctions | EEX (licensed) | From 2020, auction-day cadence |
A history request never silently returns a shorter series than asked. Every history payload reports
oldestAvailable — the earliest real row held, independent of the requested window (per series for
commodities, since daily and monthly cadences clamp at different depths). When real coverage starts later than the
requested from, the terminal renders "history since X" instead of pretending the full window arrived.
meta.dataAgeSeconds counts from the moment the underlying persisted data last changed (the worker's
ingestion timestamp), not from when the response was computed. It is recomputed on every response — including cache
hits — so a cached payload never freezes or hides its own age.
The settled archive keeps one value per delivery interval; a source revision replaces it. Two capture layers sit alongside it. Event-grade series (REMIT urgent market messages, unit outages, redispatch) retain every republished version with its publication timestamp, since 2026-07-14. Since 2026-07-31 an append-only vintage sidecar also records each capture pass of the four forecast feeds (daily weather, forecast risk, the GB NESO forecast, the FR RTE forecast), keyed by the pass's capture timestamp. The as-of query API over these vintages follows in a later revision; no derivation in this guide reads vintages yet.
Day-ahead resolution is not assumed. The single day-ahead coupling moved from hourly (PT60M) to quarter-hourly (PT15M) market time units on 2025-10-01, so a history window can be hourly, quarter-hourly, or genuinely mixed. Resolution is inferred from the actual spacing between consecutive points in each response, and the quality figures follow from it:
meta.completeness — arrived points ÷ expected points for the window at the inferred resolution, in [0, 1].meta.gaps — explicit timestamp ranges where expected points are missing, rather than a silently thinner series.Long-range price charts and every derived measure in §5 use the daily baseload average: the mean of all delivery-slot prices in the UTC calendar day, whatever the underlying resolution. On the 1-day view, four quarter-hourly prices average into one hourly bar for legibility. A price, like any rate, is honestly summarized by an average over a shorter window — unlike an energy quantity (MWh), which would need summing instead.
Why not implied volatility: no freely redistributable options data exists for European power or gas, so a strike/tenor implied-vol surface cannot be built honestly. Voltstack publishes a realized measure derived from its own settled day-ahead archive instead, and labels it as such.
Why not log returns: EU day-ahead prices go negative routinely — every zone Voltstack tracks has real
negative-price hours on record. ln(P_t / P_t−1) is undefined the moment either price is zero or negative,
so the equities-style annualized log-return vol is unusable here — not merely fragile.
null until enough real changes exist before that display day — rendered as a break in
the line, never a fabricated early reading from a too-short sample.The EU gas-storage "normal range" is computed, not simulated. For each display day, the band is the min / max / average of the same calendar month-day across the five years strictly before that day's own year:
null for that one day — an honest gap, not an approximation borrowed from Feb 28 or
Mar 1.Underground storage follows a repeatable seasonal shape (inject in summer, withdraw in winter), which is what makes a five-year band a meaningful "normal range". LNG send-out does not: it is driven by spot-arbitrage economics — inter-basin price spreads, freight, and terminal slot availability. A min/max/avg band over that series would dress noise up as a norm, so the LNG history endpoint publishes the real trend only.
The merit-order curve is assembled from three measured inputs plus one clearly-labeled modeled layer:
| Input | Source | Role |
|---|---|---|
| Installed capacity per fuel | ENTSO-E A68 (yearly) | Block widths, per reference year |
| Active derates | ENTSO-E A77 + A80 outage messages | Unavailable MW, subtracted per fuel |
| Latest actual load | ENTSO-E A65 (hourly) | The demand line |
| Marginal costs | Modeled assumption | Block heights — never a market quote |
One reference year is chosen per country — the most recent calendar year any fuel reports capacity for — and only fuels with a row in that year enter the stack. Taking each fuel's own all-time-latest row independently would resurrect retired fleets (Germany's nuclear exit is the live example: a per-fuel-latest read shows a phantom ~4 GW nuclear block from pre-shutdown years). Excluding a retired fuel entirely is the honest behavior; carrying a stale figure forward is not.
Available MW per fuel = installed − the sum of currently active derates (latest version per outage message), floored at zero. Derate collection covers all eight merit-order countries (DE, FR, ES, IT, NL, NO, SE, PL). The AND-gate still applies: a zero derate read only counts as real for a country the collector actually asks about — the stack is marked live only where capacity, derates and demand are all real, and falls back otherwise.
| Fuel | EUR/MWh | Fuel | EUR/MWh |
|---|---|---|---|
| wind | 0 | biomass | 25 |
| solar | 0 | coal | 42 |
| hydro | 5 | gas | 68 |
| nuclear | 8 | oil | 120 |
Fixed short-run assumptions for ordering the stack, carried with a permanent "costs: modeled" label in the terminal regardless of live status. The indicated clearing price is the modeled cost of the marginal fuel where cumulative availability meets demand — an illustration of the stack, not a price forecast. Fuels are eight buckets: ENTSO-E reports one MW figure per production type, so gas cannot be split into CCGT/OCGT cost tiers on real data.
Server-side cache TTLs are matched to each upstream's true publication cadence — polling faster than the TTL returns
the cached value with cached: true, and meta.dataAgeSeconds keeps counting from the real
ingestion timestamp either way. TTLs per domain are tabulated in the API Specification §7.
Degree days: HDD/CDD are computed at read time from the persisted forecast against a base of 18°C (EU) / 65°F (US) by default. An optional per-request base (°C, clamped 5–30) re-bases both; the base joins the cache key so different bases never share a cached value.
Where a real input does not exist yet, the terminal falls back to simulation — and says so. The Data Sources panel groups every connector by honesty tier (Live · Awaiting Access · Simulated · Enterprise, plus an Available slot for tenant-configured custom REST integrations) so the first question it answers is what is real. A payload is either entirely real or a declared fallback; measured and simulated values are never blended inside one figure.