Glossary
A reference for the domain concepts and project-specific terms used throughout
smard-cli. The SMARD domain is German; this glossary gives the English term
used in the CLI/library (where one exists) alongside the original German.
Translation table (the labels the
filterscatalogue carries). The CLI’s filter labels are German with an English gloss in parentheses:
German English Stromerzeugung (electricity) generation Stromverbrauch (electricity) consumption Residuallast residual load Großhandelspreis wholesale price Prognose forecast Braunkohle / Steinkohle lignite / hard coal Kernenergie nuclear Wasserkraft / Pumpspeicher hydropower / pumped storage Erdgas natural gas Photovoltaik photovoltaics
SMARD & the platform
SMARD — Strommarktdaten (“electricity market data”). The German power-market
data platform operated by the Bundesnetzagentur (the Federal Network Agency)
at smard.de. It publishes electricity generation,
consumption, residual load and wholesale market prices.
Bundesnetzagentur (BNetzA). The German Federal Network Agency, regulator of the electricity, gas, telecommunications, post and railway markets, and operator of SMARD.
chart-data API. The open, no-authentication HTTP interface this tool wraps.
It is not a query API but a static file tree: for each
(filter, region, resolution) combination SMARD publishes an index of
available window timestamps plus one data file per window. The base URL is
https://www.smard.de.
Read-only, no auth. The chart-data endpoints require no API key. This client
only performs GET requests and never writes. No credential header is ever
constructed. Redirects are not followed — a 3xx surfaces as a
SmardApiError — and only http:/https: base URLs are accepted (enforced by the
--base-url parser, the request engine and the default transport). See
DEVELOPING.md “Design notes” for the network policy and the deliberate
redirect divergence from the workspace blueprint.
The request triple
Almost every data call is addressed by three coordinates — a filter, a region and a resolution — plus, for a specific window, a timestamp.
filter. A numeric series id identifying what time series you want
(e.g. 410 = total grid load, 4068 = photovoltaic generation,
4169 = DE/LU wholesale price). The API accepts any integer filter id, so
the CLI and client accept any non-negative integer; the bundled FILTERS catalogue (see
smard filters) documents the well-known ones but is not exhaustive.
region. A market or grid area code. See smard regions; the valid set
(RegionValues) is DE, AT, LU, DE-LU, DE-AT-LU, 50Hertz, Amprion,
TenneT, TransnetBW, APG, Creos.
resolution. The temporal granularity of a series: one of hour,
quarterhour, day, week, month, year (ResolutionValues). See
smard resolutions.
timestamp. An epoch-millisecond value marking the start of one data
window. Obtain valid values from smard timestamps; pass one to series. Each
data file covers a fixed window (e.g. one week of hourly values).
Filter groups
The FILTERS catalogue tags each documented filter with one of four groups
(FilterGroupValues; smard filters --group <group>, or filtersByGroup(group) in
the library — an unknown group is an error there too, not an empty list):
generation (Stromerzeugung). Realised electricity generation by source, e.g.
Braunkohle/lignite (1223), Kernenergie/nuclear (1224), Wind Offshore
(1225), Wasserkraft/hydropower (1226), Biomasse (4066), Wind Onshore
(4067), Photovoltaik (4068), Steinkohle/hard coal (4069),
Pumpspeicher/pumped storage (4070), Erdgas/natural gas (4071).
consumption (Stromverbrauch). Total grid load (410), residual load
(4359) and pumped-storage consumption (4387).
forecast (Prognose). Forecasted generation, e.g. Wind Offshore (3791),
Wind Onshore (123), Photovoltaik (125), combined Wind & PV (5097) and
total (122).
price (Großhandelspreis). Day-ahead wholesale market prices for Germany/
Luxembourg (4169) and neighbouring bidding zones (e.g. Austria 4170,
France 254, Netherlands 256, Switzerland 259). Since 1 October 2025 the
day-ahead market sets a price per quarter-hour, and the hour series holds the
mean of the four quarter-hour prices (before that, the quarterhour series
repeats the hourly price). The next day’s prices are published after the midday
auction, so from the afternoon on the newest window already contains tomorrow’s
values.
Regions in detail
DE / AT / LU. Germany, Austria and Luxembourg.
DE-LU. The German–Luxembourg bidding zone, the price area used for most current wholesale-price series.
DE-AT-LU. The former combined Germany–Austria–Luxembourg bidding zone (split in 2018), used for historical data.
TSO control areas (Regelzonen). 50Hertz, Amprion, TenneT and
TransnetBW are the four German transmission-system-operator control areas.
APG / Creos. The Austrian (Austrian Power Grid) and Luxembourg (Creos) TSOs.
Resolutions
hour / quarterhour / day / week / month / year. The supported aggregation
intervals for a series. quarterhour (15-minute) is also the granularity of the
richer table_data response.
Time zone of the periods. Timestamps are UTC epoch milliseconds, but SMARD’s
periods follow the Europe/Berlin calendar: a day, week (Monday), month or
year point starts at Berlin midnight, i.e. 22:00Z (summer) or 23:00Z (winter) on the
previous UTC day, and its value is the sum over the Berlin day, week, month or year
(a 23- or 25-hour day at a DST switch). Label such a point with its Berlin date
(TZ=Europe/Berlin + jq’s strflocaltime("%Y-%m-%d")), never with its UTC date
(todate), which names the previous day: the value for Sunday 04.10.2026 has the
timestamp 2026-10-03T22:00:00Z.
Data shapes
index (TimestampIndex). The response of an index_{resolution}.json
request: { timestamps: number[] } — the epoch-millisecond start of each
available data window. Surfaced by client.timestamps() / smard timestamps.
series (SeriesResult). The response of a chart_data request:
{ meta_data, series } where series is an array of SeriesPoints. Returned by
client.series() / client.latest().
SeriesPoint. A single [timestampMs, value] tuple. The second element is
null for a gap (no data for that point).
SeriesMetaData (meta_data). { version, created } — the data version and
its creation time accompanying a series/table response.
table_data (TableResult). A richer quarter-hour response
(smard table). Its series is an array of TableSeriesEntry objects, each
nesting the actual points under a values array of TablePoints.
TablePoint. { timestamp, versions } — one quarter-hour point carrying
multiple versioned values.
TableVersion. One versioned value of a table point: { value, name }. Note
that name identifies the data version and is a number at runtime, not a
label string. Either field may be null.
Units & semantics
MWh — megawatt-hour. The unit for generation and consumption series (energy per window). Note: values are unitless numbers in the JSON; the unit is implied by the chosen filter.
EUR/MWh — euro per megawatt-hour. The unit for the wholesale-price filters
(the price group).
Residual load (Residuallast). Total grid load minus generation from
fluctuating renewables (wind + solar) — the load that must be met by other
sources. Filter 4359.
Total grid load (Gesamtstromverbrauch). Overall electricity consumption in a
region. Filter 410.
Window / data file. The fixed time span covered by one *_{timestamp}.json
data file (e.g. one week of hourly values). To read the newest data you fetch
the index, take the last timestamp, then fetch that file — what latest does in
one call.
Commands & methods
timestamps. smard timestamps <filter> <region> <resolution> /
client.timestamps(...) — list a series’ available window timestamps.
series. smard series <filter> <region> <resolution> <timestamp> /
client.series(...) — fetch one window’s data.
latest. smard latest <filter> <region> <resolution> /
client.latest(...) — convenience that reads the index, picks the newest
timestamp and fetches that window in one call.
table. smard table <filter> <region> <timestamp> /
client.tableData(...) — quarter-hour table_data for one window. There is no
discovery endpoint for table_data, and SMARD seems to have stopped publishing it:
checked 2026-09-26, windows from 2021 to October 2023 answer (keyed by the weekly
window starts timestamps lists), every window from December 2024 on returns a
404. A 404 from table for a recent window is therefore expected.
filters / regions / resolutions. Catalogue commands that print the
documented filter ids (optionally one --group), the valid region codes and the
valid resolution values — served locally from the bundled enums, no network call.
Log record. Every diagnostic line the CLI writes to stderr: a timestamp, a level
(ERROR, WARN, INFO) and a topic smard.<area>, as text (log4j style) or with
--log-format jsonl as one JSON object per line. The areas: cli (usage errors,
commander’s messages, unexpected errors), api (the API’s answers: an error status such
as the 404 for a window without data, and a malformed answer — not JSON, the wrong
shape, an unknown charset), http (the connection, the cleartext warning, and one WARN per retry before it waits) and output
(a failed write to stdout). A record is always one line; control characters in it are
escaped.
Library & internals. Terms for the TypeScript client and its internals —
SmardClient, the request engine, transport, retry/backoff, error types,FILTERS/RegionValues/ResolutionValues, and the validation boundary — now live in DEVELOPING.md.