What this pack is

2 contests, 630 people, 2,706 poll response rows, 3,698 result rows and 1,198 money edges, built 2026-09-03.

The cycle phase shown on every contest is computed from the election date and how well that date is known. The corpus carries its own status column; it disagrees with the derived phase on 20 of the 61 contests across all twenty-two countries, so it is carried through but never read.

Money rows and result rows are held off the site at their full grain: the staged corpus is 156 MB. What is published here is the aggregate computed once at build time, and every aggregate states the number of rows it stands for.

Everything known to be wrong or limited

licence · grain · method
  • No date: GG Art.39(1) puts the next Bundestag election 46-48 months after the 21st Bundestag's constitutive session of 2025-03-25, i.e. 2029-01-26 to 2029-03-25.
  • vote_share in this pack is a FRACTION of 1 (largest observed 0.528146), not a percentage. India and Nigeria file percentages; the rest file fractions.

The pack's own record

every URL fetched, every inclusion and exclusion
SOURCES.md
# Sources — Germany (deu) elections pack

Built 2026-09-03 09:03 CT. As-of date 2026-09-03. **No Wikipedia.**

## Official election result

- Die Bundeswahlleiterin, election to the 21st Bundestag, 23 February 2025.
  - Portal: https://www.bundeswahlleiterin.de/en/bundestagswahlen/2025.html
  - Final result press release 29/25 (14 March 2025): https://www.bundeswahlleiterin.de/en/info/presse/mitteilungen/bundestagswahl-2025/29_25_endgueltiges-ergebnis.html
  - German original: https://www.bundeswahlleiterin.de/info/presse/mitteilungen/bundestagswahl-2025/29_25_endgueltiges-ergebnis.html
- Next regular election: Art. 39 GG (46–48 months after the 2025-03-25 constituent sitting) → due by **2029-03-25**. No election date has been set. `date_confidence=confirmed_official` applies to the 2025-02-23 vote; the 2029 bound is constitutional.

## Sitting roster (people.csv)

- abgeordnetenwatch.de API v2, licence **CC0 1.0**.
  - Docs: https://www.abgeordnetenwatch.de/api
  - Parliament period 161 = Bundestag 2025–2029 (legislature).
  - `GET /candidacies-mandates?parliament_period=161&type=mandate&current_on=now`
  - Politicians: `GET /politicians?id[in]=…`
  - Join key: `person_id=aw-{politician.id}` (stable AW id). Mandate `id_external_administration` is the Bundestag app `mdbID` when present.
- Deutscher Bundestag open-data member index (official biography + portrait URLs only; matched on `mdbID` = AW `id_external_administration`; one Nachrückerin matched on exact `Nachname, Vorname` because AW had not yet stored the Verwaltung id):
  - https://www.bundestag.de/xml/v2/mdb/index.xml
  - Portraits and biography pages are © Deutscher Bundestag, not CC0.

## Money (money-edges.csv)

### Side income / Nebentätigkeiten (`edge_type=side_income`, plus member-level `donation` for AW category 29232)

- abgeordnetenwatch.de API v2 `GET /sidejobs?mandates[entity.parliament_period]=161`, CC0 1.0.
  - Entity docs: https://www.abgeordnetenwatch.de/api/entitaeten/sidejob
  - Underlying publication: Bundestagsverwaltung, Verhaltensregeln / Angaben der Abgeordneten zu Nebentätigkeiten.
  - Amounts kept in **EUR as filed**. When only an Einkommensstufe (band) is published, `amount` is blank and the band is in `as_filed_note`. Bands are never turned into a point estimate.
  - Restricted to sidejobs linked to a **current** period-161 mandate so `person_id` joins `people.csv`.

### Party donations above publication threshold (`edge_type=donation`, `person_id` blank)

- Deutscher Bundestag, Fundstellenverzeichnis, Spenden über 35.000 € (§ 25 Abs. 3 Satz 3 Parteiengesetz; threshold lowered from 50.000 € on 5 March 2024).
  - 2025: https://www.bundestag.de/parlament/praesidium/parteienfinanzierung/fundstellen50000/2025
  - 2026: https://www.bundestag.de/parlament/praesidium/parteienfinanzierung/fundstellen50000/2026
- These are **party** donations, not member PACs. Do not draw them as corporate treasury gifts to an MdB.

## Polls (polls.csv)

- wahlrecht.de published Sonntagsfrage tables (compilation). Cite **wahlrecht.de + the named pollster**.
  - Index: https://www.wahlrecht.de/umfragen/
  - Allensbach: https://www.wahlrecht.de/umfragen/allensbach.htm (IfD Allensbach / FAZ)
  - Verian (Kantar Public / Emnid): https://www.wahlrecht.de/umfragen/emnid.htm
  - Forsa: https://www.wahlrecht.de/umfragen/forsa.htm
  - Forschungsgruppe Wahlen: https://www.wahlrecht.de/umfragen/politbarometer.htm
  - GMS: https://www.wahlrecht.de/umfragen/gms.htm
  - Infratest dimap: https://www.wahlrecht.de/umfragen/dimap.htm
  - INSA: https://www.wahlrecht.de/umfragen/insa.htm
  - YouGov: https://www.wahlrecht.de/umfragen/yougov.htm
- Scope: surveys **published on or after 2025-02-24** (after the 21st Bundestag election). Bundestagswahl result rows on those tables are excluded.
- Figures are the institutes’ published projections. `moe` is blank — wahlrecht tables do not print a margin of error. Do not invent one.

## Licence summary

| Dataset | Licence |
|---|---|
| AW politicians, mandates, sidejobs | CC0 1.0 |
| Bundeswahlleiterin results | official government publication |
| Bundestag Fundstellen | official government publication |
| Bundestag portraits / bio URLs | © Deutscher Bundestag |
| wahlrecht.de tables | compilation; poll figures belong to the named institute |

## 2026-09-03 update — forward row (deu-bundestag-2029)

Added `deu-bundestag-2029` (no next-cycle row previously existed; audit flagged deu as missing a
forward-looking contest for the country-card chip).

- Die Bundeswahlleiterin, "Bundestagswahl 2029" (official page computing the Art. 39(1) GG window
  for the 22nd Bundestag election): https://www.bundeswahlleiterin.de/en/bundestagswahlen/2029.html
  (German original: https://www.bundeswahlleiterin.de/bundestagswahlen/2029.html). States the window
  as Friday 26 January 2029 to Sunday 25 March 2029; no polling day has been set as of 2026-09-03.
- Grundgesetz Art. 39, official federal law text (Bundesministerium der Justiz /
  gesetze-im-internet.de): https://www.gesetze-im-internet.de/gg/art_39.html — "Die Neuwahl findet
  frühestens sechsundvierzig, spätestens achtundvierzig Monate nach Beginn der Wahlperiode statt."
- Deutscher Bundestag, official confirmation that the 21st Bundestag's constitutive session
  (konstituierende Sitzung — start of the current Wahlperiode) was held 25 March 2025:
  https://www.bundestag.de/dokumente/textarchiv/2025/kw13-de-konstituierende-sitzung-1056494
- `election_date` left blank; `date_confidence=constitutional_due`. No confirmed_official or
  announced_media date exists yet for the 2029 election. No Wikipedia used.
HANDOFF.md
# HANDOFF — Germany (deu) sitting Bundestag pack

**For Cartevoir.** Built 2026-09-03 09:10 CT. Today 2026-09-03.
This is a **LIVE legislature card** (like the US Congress map), not an upcoming-election card.

`cycle_status=sitting`. Last national vote 2025-02-23. Next regular election due by 2029-03-25 (Art. 39 GG). No date has been called.

## Files

| File | Rows (data) | Role |
|---|---:|---|
| `elections.csv` | 1 | 21st Bundestag contest |
| `people.csv` | 630 | current MdB |
| `money-edges.csv` | 1198 | side_income + party donations |
| `polls.csv` | 2706 | Sonntagsfrage option-rows (344 surveys) |
| `SOURCES.md` | — | citations |
| `STATS.json` | — | machine counts |
| `HANDOFF.md` | — | this file |

Paths: `/workspace/elections-ingest/deu/`

## How to join

- Profile card: `people.person_id` (`aw-{abgeordnetenwatch politician id}`).
- Official Bundestag biography / portrait: `official_url`, `photo_url` (from Bundestag `mdb/index.xml`, matched on official `mdbID` = AW `id_external_administration`).
- Money on a member: `money-edges.person_id` = `people.person_id`, `edge_type=side_income` (and a few member-level `donation` rows from AW category 29232).
- Party-level Fundstellen donations: `person_id` **blank**, `committee_name` = party as published. Do **not** attach these to an MdB and do **not** label them corporate treasury gifts to a candidate.
- Polls: `election_id=deu-bundestag-2025`. Long format; group by `poll_id`.

## Epistemic rules (do not “fix” in the app)

- Amounts are **EUR as filed**. Never convert to USD. Never turn an Einkommensstufe band into a euro point estimate (`amount` is blank in that case; the band is in `as_filed_note`).
- 18 list-only MdB had no AW electoral_list/constituency; `district` filled as `Landesliste {Land}` from Bundestag mdb/index.xml via official mdbID.
- `bio_text` is empty: no verbatim official biography was pulled (would be 630 extra Bundestag XML fetches). Use `party` + `district` + official bio URL.
- `moe` is empty: not published on the wahlrecht tables. Do not invent ±2–3 pp.
- No Wikipedia `source_url`.
- People were **not** fuzzy-matched across money and roster. Sidejobs join through the AW mandate id already on the job. Fundstellen donations have no person.
- One sitting MdB (Katrin Zschau, Nachrückerin 2026-07-20) lacked an AW Verwaltung id at pull time; her Bundestag portrait/bio URL used an exact `Nachname, Vorname` match against the official Aktiv index. Documented here so it is not treated as a money join.

## Coverage

- Current MdB: **630** (AW current_on=now, period 161). Statutory size 630.
- Photos: 630 / official bio URLs: 630.
- Party codes on the roster: {'AfD': 151, 'CDU': 164, 'CSU': 44, 'GRÜNE': 85, 'LINKE': 63, 'SPD': 120, 'SSW': 1, 'parteilos': 2}.
- Money: {'side_income': 930, 'donation': 268} — 1198 rows have a numeric `amount`.
- Polls: 344 surveys, 2706 option-rows, pollsters ['Allensbach', 'Forsa', 'Forschungsgruppe Wahlen', 'GMS', 'INSA', 'Infratest dimap', 'Verian', 'YouGov'].

## What this pack is not

- Not a 2029 campaign card.
- Not constituency shapefiles (Bundeswahlleiterin GIS is a later layer).
- Not a full Vermögensverzeichnis / asset-declaration dump (AW sidejobs are Nebentätigkeiten, not a US-style asset table).
- Not member PACs — Germany does not publish FEC-style candidate committees. Party donations sit on the party.

## Rebuild

`python3 /workspace/elections-ingest/deu/_build_deu.py`  
Fair-use: AW is 30 req/min. Cached JSON under `/tmp/deu-raw/` is reused.

## 2026-09-03 — added forward row deu-bundestag-2029

Audit found deu had zero forward-looking rows (no chip-triggering next-cycle contest), unlike 20 of
22 other packs. Appended one row to `elections.csv` (now 2 data rows; did not touch the existing
`deu-bundestag-2025` row or any other file).

- **Row added:** `deu-bundestag-2029` — 22nd Bundestag election.
- **Date:** left **blank**. Grundgesetz Art. 39(1) only guarantees a window, not a day: the Neuwahl
  must occur 46–48 months after the start of the current Wahlperiode. The 21st Bundestag's Wahlperiode
  began with its constitutive session on **2025-03-25** (bundestag.de). Die Bundeswahlleiterin's own
  2029 election page computes the resulting window as **Friday 26 January 2029 to Sunday 25 March
  2029** and states no polling day has been fixed. Writing a specific day would be a guess, so
  `election_date` is blank and the window lives in the row's `notes`, per project convention
  (`date_confidence=constitutional_due`).
- **cycle_status:** `sitting` — Germany remains a live sitting legislature (630 MdB roster, money and
  polls already attached to `deu-bundestag-2025`) and the next vote is unscheduled/>365 days out,
  matching the schema definition of `sitting` exactly (same treatment as `can-hoc-next` in the Canada
  pack).
- **No second row added.** Considered a European Parliament row for Germany; none of the other EU
  packs in this project (fra, nld, irl, swe) carry an EP row, and no EP 2029 date has been officially
  set yet either, so adding one would be padding a layer this project does not use. Also considered
  whether the 2029 window could be defended at month precision — it spans parts of January, February
  and March, so no month-level date is defensible either; left blank as instructed.
- **Sources:** see `SOURCES.md` 2026-09-03 section — Bundeswahlleiterin 2029 page, Grundgesetz Art. 39
  official text (gesetze-im-internet.de), Bundestag.de constitutive-session confirmation. No Wikipedia.
- **STATS.json:** `counts.elections` recomputed to **2** directly from the file on disk.

Licences on the rows

  • CLEA R18 cite Kollman et al.3,698
  • Compiled by wahlrecht.de; figures as published by the named pollster2,706
  • CC0-1.0 (abgeordnetenwatch; source Bundestagsverwaltung Nebentätigkeiten)966
  • roster CC0-1.0 (abgeordnetenwatch); official_url/photo Deutscher Bundestag630
  • Deutscher Bundestag Fundstellenverzeichnis (amtliche Veröffentlichung)232