Glossary

Domain and technical terms you meet when using abgeordnetenwatch. For commands and options see the README; every field of every entity is described in openapi.yaml. The data is German, so labels and free text are German too.

abgeordnetenwatch.de

abgeordnetenwatch.de. A German parliamentary-monitoring platform run by Parliament Watch e.V. (Verein zur Förderung der parlamentarischen Kontrolle e.V.). Its open API v2 (https://www.abgeordnetenwatch.de/api/v2) is read-only and needs no API key.

Entity / collection. One of the API’s 18 record types. The collection name is the URL path segment that list, get and count take as <entity>; abgeordnetenwatch entities prints all 18. Names are plural, with hyphens between words (parliament-periods; election-program is singular). The entity_type inside a record is singular with underscores; committees and polls report node, topics, cities and countries taxonomy_term.

Roll-call vote (namentliche Abstimmung). A vote that records each member’s choice by name. Only these appear as polls, so the data is a selection of a parliament’s decisions.

Entities

Collection entity_type One record is
parliaments parliament the Bundestag, the EU-Parlament or one of the 16 state parliaments
parliament-periods parliament_period a legislative period or an election of one parliament
politicians politician a person
candidacies-mandates candidacy_mandate a politician’s candidacy in an election, or their seat in a period
electoral-lists electoral_list a party list for one period (name, e.g. Landesliste SPD)
constituencies constituency a constituency (Wahlkreis) with number and name
parties party a party, with full_name and short_name
fractions fraction a parliamentary group (Fraktion) in one period
election-program election_program a party’s election programme for one period; file is the PDF URL
committees node a committee (Ausschuss) of one period
committee-memberships committee_membership a mandate’s membership in a committee
polls node a roll-call vote
votes vote how one mandate voted in one poll
sidejobs sidejob a disclosed side job (Nebentätigkeit)
sidejob-organizations sidejob_organization an organisation named in side jobs
topics taxonomy_term a topic term, e.g. Gesundheit
cities taxonomy_term a city term used by side jobs and organisations
countries taxonomy_term a country term used by side jobs and organisations

Parliaments and people

Parliament (parliaments). label is the short name (Bundestag, Hessen, EU-Parlament), label_external_long the full one (Landtag Hessen). current_project references the period that is active now, which can be an election period (Berlin Wahl 2026).

Parliament period (parliament-periods). A phase of one parliament, linked to its previous_period. type is legislature (a Wahlperiode such as Bundestag 2025 - 2029, with start_date_period and end_date_period) or election (such as Bundestag Wahl 2025, with election_date).

Politician (politicians). Key fields: first_name, last_name, field_title (academic title), sex (m, f, d for diverse, or null), year_of_birth (can be null), party (current party), occupation, qid_wikidata, and abgeordnetenwatch_url (the public profile).

Candidacy / mandate (candidacies-mandates). Links a politician to a parliament_period. type is candidacy (stood in an election period such as Bundestag Wahl 2025) or mandate (held a seat in a legislature period such as Bundestag 2025 - 2029). Votes, side jobs and committee memberships belong to the mandate, so resolve a politician id to a mandate id first.

current_on. A filter on candidacies-mandates. Without it the API returns only the records current today, so a politician’s earlier mandates are missing; current_on=all returns every record, current_on=2022-01-01 those current on that date.

Electoral data (electoral_data). Embedded in a candidacy/mandate: electoral_list, list_position, constituency, constituency_result (vote share in percent) and mandate_won, which is constituency (Direktmandat), list (won via the party list) or moved_up (nachgerückt as a successor).

Fraction membership (fraction_membership). An array on a candidacy/mandate: fraction, valid_from, valid_until (null while ongoing).

Party vs. fraction. A party (parties, e.g. CDU) is not tied to a period. A fraction belongs to one period: its label says which (SPD (Berlin 2021 - 2026)) and legislature references it. Politicians carry a party; votes carry the fraction at the time of the vote.

Polls, votes and committees

Poll (polls). label (title), field_poll_date, field_accepted (true/false), field_legislature (the period), field_intro (HTML description), field_topics, field_committees. Some labels describe a rejection (Ablehnung des Antrags …), so read field_accepted together with label and field_intro.

Vote (votes). One mandate’s vote in one poll: mandate, poll, fraction, reason_no_show (e.g. maternity_protection) and vote:

vote Meaning
yes voted yes
no voted no
abstain abstained
no_show did not take part; not a no

A poll has one vote record per mandate (630 for Bundestag poll 6600), so poll=<id> can need several pages. For EU-Parlament polls only the German MEPs’ votes are recorded (96 for poll 6593).

Committee membership (committee-memberships). Links a committee (which belongs to a period through field_legislature) to a candidacy_mandate. committee_role values seen: member, alternate_member, chairperson, vice_chairperson, spokesperson, advisory_member.

Side jobs

Side job (sidejobs). An activity disclosed for one or more mandates; label describes it.

Field Meaning
mandates the mandates it is disclosed for (an array)
sidejob_organization the organisation, a reference; can be null
income the declared amount, a number
income_level the income band, a string code ("1" to "10")
interval a payment interval code ("1", "2") or null
category a category code, a numeric string (e.g. "29231")
field_city, field_country, field_topics place and topic terms
additional_information HTML free text
data_change_date, created last change (date), creation time (Unix seconds)

Band vs. amount. Older disclosures (Bundestag 2013 - 2017) carry only income_level; recent ones (Bundestag 2025 - 2029) carry both income_level and income. Don’t turn a band into an amount. Both null means disclosed without an amount.

Taxonomy term (topics, cities, countries). A vocabulary entry (label, description, parent) that records point to through field_topics, field_city and field_country.

Ids and references

id / label. Every record has a numeric id, a display label, an api_url and often an abgeordnetenwatch_url (its page on the website). get <entity> <id> fetches one record; the CLI rejects 0 and non-numeric ids.

Reference. A related record embedded as a small object with id, entity_type, label, api_url and sometimes abgeordnetenwatch_url, e.g. party on a politician. Fetch the full record with get and the reference’s id.

Filter by relation. Pass the related record’s id under the field name used in the JSON:

To get Command
a parliament’s periods list parliament-periods parliament=<id>
a politician’s candidacies and mandates list candidacies-mandates politician=<id>
a period’s candidacies and mandates list candidacies-mandates parliament_period=<id>
a period’s polls list polls field_legislature=<id>
polls on a topic list polls field_topics=<id>
all votes in a poll list votes poll=<id>
a mandate’s votes list votes mandate=<id>
a mandate’s side jobs list sidejobs mandates=<id> (plural; mandate= fails)
an organisation’s side jobs list sidejobs sidejob_organization=<id>
a mandate’s committees list committee-memberships candidacy_mandate=<id>

Filtering, sorting and paging

Filter (key=value). Positional arguments after the entity, sent as query parameters (sex=f). A parameter the collection doesn’t accept returns HTTP 500, e.g. The following parameter(s) are not valid: mandate on sidejobs.

Operator (field[op]=value). A bracket suffix on the key: eq (equal), ne (not equal), gt, gte, lt, lte (greater or less than, or equal), cn (contains, ignoring case: 'last_name[cn]=reichinnek') and sw (starts with: 'last_name[sw]=Mü'). Quote these filters so the shell leaves the brackets alone. The CLI rejects a missing =, any other operator ([in], the [entity.id] form) and a repeated key as usage errors; one field with two different operators is fine.

Sorting (--sort-by, --sort-direction). Sent as sort_by and sort_direction (asc or desc). With --sort-by alone the API sorts descending. Not every field is sortable: polls reject id but accept field_poll_date. Without --sort-by the order depends on the collection (parliaments highest id first, topics by label).

Paging (--range-start, --range-end). Sent as range_start (0-based offset) and range_end, which is the page size, not an end index. The API honours up to 1000; a larger value falls back to 100. Raise --range-start by the page size until you have meta.result.total records.

Output

Envelope (meta, data). Every response is { meta, data }; data is an array for list and an object for get. --data-only prints only data, --compact prints the JSON on one line. count prints { entity, total }, entities prints { entities: [...] }.

meta.result. For list: count (records in this page), total (all matches), range_start, range_end. For get: entity_id (the id as a string) and entity_type.

meta.status / meta.status_message. ok and an empty message on success. On an error the CLI prints the message, e.g. There is no party entity with id 99999999.

meta.abgeordnetenwatch_api. The same block on every response: version (2.9.0), changelog, licence (CC0 1.0), licence_link and documentation.

Data license

CC0 1.0. The data is dedicated to the public domain under CC0 1.0 Universal, as every response states in meta.abgeordnetenwatch_api.licence. You may use, change and redistribute it, commercially too. Attribution is not required but requested: Quelle: abgeordnetenwatch.de (https://www.abgeordnetenwatch.de) — Daten unter CC0 1.0.

Personal data. Names, votes and side-income disclosures are personal data: CC0 waives copyright, not GDPR (DSGVO) obligations. HTML fields such as field_intro can quote third-party material, and the website, logo and branding are not covered. See DATA_LICENSE.md.

Exit codes

Exit codes. 0 success (also --help and --version) · 1 API error, network or parse failure · 2 usage error (unknown entity, bad option, filter or id) · 4 HTTP 404 (unknown collection path).

HTTP 500. The API answers a missing id, a parameter it doesn’t accept and an unsortable field with HTTP 500, not 404 or 400; the CLI prints the reason and exits 1. HTTP 429 and 503 are retried automatically (--max-retries, default 2).

Library & internals. The TypeScript client, request engine, retries, redirects and error types are described in DEVELOPING.md.

View the source on GitHub →