Glossary
Domain and technical terms you meet when using bundesrat. For the option
reference see the README and the full cookbook in
Usage.md.
The Bundesrat
Bundesrat. One of Germany’s federal legislative bodies — the chamber through which the sixteen Länder (federal states) take part in legislation and administration at the federal level. It is not a second parliament of elected MPs: its members are members of the Länder governments.
Land / Länder. A German federal state (plural Länder). Each Land sends members to the Bundesrat and holds a bloc of votes weighted by population (3–6 each).
Member (members). A member of a Land government who sits in the Bundesrat.
Each record carries honorificTitle, firstname, name, party, state (the
Land), a url, and status flags: mitglied (one of the 69 members, as many per
Land as it has votes), brmitglied (a member or a deputy — stellvertretendes
Mitglied; 181 of 193 records on 2026-09-15), bv (Bevollmächtigter —
plenipotentiary), designiert (designated, not yet in office) — all as
"true"/"false" strings. The feed lists members, deputies and plenipotentiaries,
so filter on mitglied == "true" to get the 69 members.
Plenary sittings & agenda
Plenarsitzung / session (session). A plenary sitting of the Bundesrat. It
meets roughly every 3–4 weeks (~10 times a year). session returns the
current/next sitting with its agenda.
Tagesordnung / agenda. The list of items a sitting will decide. session
returns it as tops.
TOP (Tagesordnungspunkt) — top / tops. A single agenda item. Each carries
toptitle (e.g. “TOP 67”), topheader (a short factual label), topdrucksache
(the associated document number) and linkedtop (a cross-reference). Empty fields
are dropped, so linkedtop appears only when set. The feed lists the TOPs out of
numerical order. The feed’s HTML description (topdetail) is editorial content and
is not surfaced.
Drucksache (topdrucksache). A numbered printed paper, e.g. “Drucksache
371/26” — the document a TOP is about (a bill, regulation, motion, …). A TOP about
several lists them all in one string, joined with “; “ (“Drucksache 343/26; Drucksache
344/26”); a TOP without one (a procedural item) has no topdrucksache. Bundesrat
Drucksachen are amtliche Werke (public-domain official works); the numbers let
you look the full document up on bundesrat.de or in DIP.
Termine / appointments (appointments). Committee dates and other scheduled
events (e.g. Umfragen — written committee polls under § 43 GO BR). Surfaced as
factual calendar items (title, startdate, and stopdate/date when the feed
sets them — stopdate often is, e.g. for an Umfrage’s deadline). Both dates are
German-format, with an optional time: “25.09.2026 09:30” or “22.09.2026”; a cancelled
meeting stays listed with „entfällt” in its title.
Concepts the feeds carry but this CLI does not surface
The Bundesrat app feeds also expose the items below. Their payload is copyright-protected editorial text or images, not open data, so this CLI provides no command for them and strips their editorial fields where they overlap a surfaced feed (see DATA_LICENSE.md):
- Stimmverteilung / composition — the distribution of the 69 Bundesrat votes across the Länder. The feed is essentially the official composition graphic (an image), with no structured per-Land vote table.
- Präsidium — the Bundesrat’s presiding body (President — a Land premier, rotating yearly — and Vice-Presidents). The feed is an HTML page plus a photo.
- BundesratKOMPAKT — an editorial round-up of selected agenda items with written summaries.
- Aktuelles / news — press and news items (editorial text + press images).
- Anstehende Plenarsitzungen — the upcoming-sittings page; the dates live inside a copyright HTML fragment, with no structured date fields.
Data & format
Feed. Each command maps to one XML feed served by www.bundesrat.de — the
data behind the official Bundesrat iOS app. There is no JSON API; this CLI parses
the XML into JSON for you and projects each result down to its openly-licensed
factual fields.
?view=renderXml. The render parameter that makes the CMS return the XML
feed rather than the website’s HTML page. The CLI adds it automatically; a
“received an HTML page” error means it was lost or the feed moved (see
DEVELOPING.md).
Editorial fields (not surfaced). The raw feeds embed HTML fragments in CDATA —
detail, abstract, topdetail, the member biography detail (role / biography /
address) — plus image paths. These are copyright-protected editorial content, so the
CLI strips them; only factual fields reach the output.
amtliches Werk (§ 5 UrhG). An “official work” — laws, regulations, and here the Bundesrat’s Drucksachen/Plenarprotokolle — which carries no copyright, so it may be reused freely if left unaltered (§ 62) and with a source citation (§ 63). The rest of the website content is copyright-protected. See DATA_LICENSE.md.
CLI / technical
Exit codes. 0 success · 2 usage error · 4 not found · 6 network
failure · 1 other (incl. a non-XML/HTML-shell response). See
Usage.md.
Log record. Every diagnostic line the CLI writes to stderr: a timestamp, a level
(ERROR, WARN, INFO) and a topic bundesrat.<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, the note on an empty --party result), api
(the feed server’s answers: an error status, and a malformed answer — a feed that does
not parse, the HTML shell, the wrong shape, an empty body), http (the connection, the
cleartext warning, and one WARN per retry before it waits) and output (the -o file, stdout failures). A record is always one
line; control characters in it are escaped.
--state vs --party. --state names one of the sixteen Länder and matches
it exactly (case-insensitive); any other value (Thueringen, Bay) is a usage
error that lists the sixteen names. --party matches a substring of the party
name (case-insensitive), so grüne finds “BÜNDNIS 90/DIE GRÜNEN”; one that matches
nobody gives [] and a note on stderr. Both ignore surrounding whitespace and Unicode
form (a decomposed umlaut matches), and a blank value is a usage error. The library applies
them, after fetching the full members list: members({ state, party }), or
filterMembers(list, { state, party }) on a list already fetched.