What this pack is

3 contests, 172 people, 54 poll response rows, 639 result rows and 0 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
  • 128 of 130 seats — 2 titulares had no distinguishable titular/suplente flag in the official roster at fetch time and were excluded rather than guessed
  • Legislative results are party-vote-by-uninominal-constituency (arrastre basis), not candidate-level; OEP's separata PDF does not print individual uninominal candidate names/shares in machine-readable form
  • EMPTY — no machine-readable regulator-published finance data found; OEP finances party activity mostly via public funding with no itemized machine-readable disclosure located
  • POPULATED — 5 Ipsos CIESMORI waves (May, Jul x2, Aug, Sep 2025) filed with OEP/SIFDE and published by the OEP itself. Captura Consulting, Focaliza, and Diagnosis toplines were not found published by the OEP or the pollsters themselves in a citable, non-Wikipedia machine-readable form, so none were filed rather than approximated from news coverage.
  • vote_share in this pack is a FRACTION of 1 (largest observed 0.660331), 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
# Bolivia (bol) — Cartevoir Elections pack

Built **2026-09-03** (as_of). Schema: `/workspace/elections-ingest/SCHEMA.md`.
No Wikipedia used as `source_url` anywhere in this pack.

| file | rows |
|---|---|
| `elections.csv` | 3 |
| `people.csv` | 172 |
| `money-edges.csv` | 0 |
| `polls.csv` | 54 |
| `results.csv` | 639 |

## Primary sources

### Election calendar / legal basis
- **Órgano Electoral Plurinacional (OEP) / Tribunal Supremo Electoral (TSE)** —
  https://www.oep.org.bo/ (electoral_body_url)
- **Constitución Política del Estado, art. 168** (5-year presidential term) — basis for the 2030 row

### Roster (people.csv) — titular-only slate
- **Cámara de Diputados — official member directory** — https://diputados.gob.bo/diputados-home/
  and the per-member `diputados.gob.bo/diputados/<slug>/` profile pages (party, seat type, official
  photo, titular/suplente flag read from the official photo filename). → **128 titular deputies**.
- **Cámara de Diputados — WordPress REST API** — https://diputados.gob.bo/wp-json/wp/v2/diputados
  Used only to restore **verbatim official `bio_text`** (110 of 128), joined deterministically on
  profile URL → API `link` field (128/128 URLs matched against the API; 110/128 had a bio field
  populated) — an official-id join, not a name fuzzy-match.
- **Cámara de Senadores** — parsed from the official OEP seat-assignment separata:
  `https://web.oep.org.bo/wp-content/uploads/2025/08/30-08-2025-Separata-resultados-EG2025.pdf`
  ("ASIGNACIÓN DE ESCAÑOS → SENADORAS - SENADORES" table, all 9 departments, titular column only).
  → **36 titulares** (4 per department).
- **2025 presidential tickets** — https://web.oep.org.bo/elecciones-generales-2025/nacional-2025/
  → **8** ballot-qualified candidates (Rodrigo Paz Pereira also carries `role=both`, having won and
  taken office as President).

### Results (results.csv)
- **Cómputo oficial, 1ª vuelta (2025-08-17)** — https://computo2025-1v.oep.org.bo/
  (Nacional / Exterior / Total mundial presidential scope totals, 33 rows)
- **Cómputo oficial, 2ª vuelta (2025-10-19)** — https://computo2025-2v.oep.org.bo/
  (Nacional / Exterior / Total mundial presidential runoff totals, 12 rows)
- **OEP Electoral Geography (Geoelectoral) ArcGIS REST service** —
  `https://geoelectoral.oep.org.bo/oep/rest/services/EG_2025/EG_2025_ok/MapServer/5/query`
  → department-level 1st-round presidential returns, all 9 departments × 8 parties (72 rows)
  `https://geoelectoral.oep.org.bo/oep/rest/services/EG_2025/CIRCUNSCRIPCIONES_UNINOMINALES_2025/MapServer/3/query`
  → party vote by uninominal constituency, all **63 of 63** official uninominal circunscripciones × up
  to 8 parties, with a `seats`=1 flag on the official winner per the service's own `GANADOR` field (504 rows)
  `https://geoelectoral.oep.org.bo/oep/rest/services/EleccionesGenerales2020/2daVueltaEleccionesGenerales2025/MapServer/5/query`
  → department-level runoff returns, all 9 departments × 2 finalists (18 rows)

### Polling (polls.csv) — OEP/SIFDE-registered surveys, all Ipsos CIESMORI
- `https://web.oep.org.bo/wp-content/uploads/2025/08/informe-1ra-encuesta-ciesmori.pdf` — 1st wave (poll_id `bol-ipsos-ciesmori-2025-05-22`), fieldwork 22–26 May 2025
- `https://web.oep.org.bo/wp-content/uploads/2025/08/Informe_2da-Encuesta-Preelectoral.pdf` — 2nd wave (poll_id `bol-ipsos-ciesmori-2025-07-05`), fieldwork 5–7 Jul 2025
- `https://web.oep.org.bo/wp-content/uploads/2025/08/Informe-3ra-Encuesta-Agosto-v2fin.pdf` — 3rd wave (poll_id `bol-ipsos-ciesmori-2025-07-25`), fieldwork 25–27 Jul 2025
- `https://web.oep.org.bo/wp-content/uploads/2025/08/Informe-4ta-Encuesta-Preelectoral_v1.pdf` — 4th wave (poll_id `bol-ipsos-ciesmori-2025-08-02`), fieldwork 2–6 Aug 2025
- `https://web.oep.org.bo/wp-content/uploads/2025/10/Informe-1ra-Encuesta-2da-Vuelta.pdf` — runoff wave (poll_id `bol-ipsos-ciesmori-2025-09-18`), fieldwork 18–21 Sep 2025
All five are filed with OEP/SIFDE under art. 21 of the Reglamento de Elaboración y Difusión de Estudios
de Opinión (Res. TSE-RSP-ADM N° 232/2025) and **published by the OEP itself**, not by Ipsos directly.
Captura Consulting, Focaliza, and Diagnosis were sought but no citable, machine-readable published
topline (PDF or data table, OEP-filed or house-published) was located for any of the three — none were
filed rather than approximated from secondary news coverage.

## Money
No machine-readable regulator-published campaign-finance data was found. See HANDOFF.
HANDOFF.md
# Bolivia (bol) — HANDOFF

## Settled next-election call
| field | value |
|---|---|
| next national contest | **2030 general — year precision only** |
| `date_confidence` | **`constitutional_due`** |
| `cycle_status` | **`distant`** |
| `election_id` | `bol-gen-2030` |

`election_date` is deliberately **year-precision (`2030`)**: no month/day is set and OEP has issued no
convocatoria yet. Constitución Política del Estado art. 168 sets a 5-year presidential term; Rodrigo
Paz Pereira took office 8 Nov 2025, so the next general falls in 2030. A specific date would have been
invented, so it was not.

`cycle_status=sitting` on the two 2025 rows — confirmed by arithmetic. The runoff was **2025-10-19**,
which is **319 days** before 2026-09-03, well outside the 120-day `just_held` window. The Asamblea
Legislativa Plurinacional elected 17 Aug 2025 is live and Paz is sitting president.

## Contests filed (3)
| election_id | date | date_confidence | cycle_status | what |
|---|---|---|---|---|
| `bol-gen-2025-r1` | 2025-08-17 | confirmed_official | sitting | Presidencia + Asamblea, 1st round |
| `bol-gen-2025-r2` | 2025-10-19 | confirmed_official | sitting | Presidencial runoff — **Paz won** |
| `bol-gen-2030` | 2030 | constitutional_due | distant | next general |

No presidential ticket cleared the constitutional threshold (50%, or 40% with a 10-point lead) in the
1st round, so Bolivia's **first-ever presidential runoff** was triggered per the official OEP cómputo.

## people.csv — 172 rows
`person_id` scheme: **a slug derived from the official full name, not a numeric official id** — neither
diputados.gob.bo, the OEP senate separata, nor the OEP candidacy list expose a stable numeric id on
their public pages, so a normalized-name slug is used consistently across all 172 rows and this is a
site-scheme id, not a regulator-issued number. SAY SO to any downstream consumer.
- **128 titular deputies** (of 130 official seats) — 2 titulares had no reliable titular/suplente flag
  in the official roster at fetch time (see gap below) and were excluded rather than guessed.
- **36 titular senadores** (4 × 9 departments) from the OEP's own seat-assignment separata: PDC 16 /
  LIBRE 12 / UNIDAD 7 / APB-SUMATE 1.
- **8 presidential candidates.** Rodrigo Paz Pereira (winner) is flagged `role=both` — he is both a
  2025 `candidate` and the sitting `incumbent` president.
`bio_text`: **110 of 128 deputies** carry verbatim official biographical text, pulled from
diputados.gob.bo's own WordPress REST API and joined on profile URL (an official-id join, not a name
match) — see SOURCES.md. The remaining 18 deputies plus all senators and presidential candidates have
`bio_text` empty because no verbatim official bio was published for them.

## money-edges.csv is EMPTY — 0 rows, by design
The OEP publishes party financing mostly as **public funding disbursements** and campaign-spending
ceilings, not itemized, machine-readable per-donor/per-candidate flows. No downloadable itemized
contributions or expenditure register (comparable to Chile's SERVEL "Reporte de Aportes") was located
for the 2025 cycle. Rather than approximate this from a PDF table of aggregate figures, the file is
shipped header-only, matching SCHEMA.md's instruction ("If money is PDF-only, leave money-edges.csv
empty and say so").

## results.csv — 639 rows, official OEP sources only
| office | election_id | rows | grain |
|---|---|---|---|
| president | `bol-gen-2025-r1` | 105 | 72 department-level (9 depts × 8 parties) + 33 national/exterior/world-total scope rows |
| lower_chamber | `bol-gen-2025-r1` | 504 | party vote in all 63/63 official uninominal circunscripciones |
| president | `bol-gen-2025-r2` | 30 | 18 department-level (9 depts × 2 finalists) + 12 national/exterior/world-total scope rows |

- Department- and constituency-level rows come from the OEP's own Geoelectoral ArcGIS REST service
  (`geoelectoral.oep.org.bo`), the same geodata OEP uses to render its own results maps.
- National/exterior/world-total scope rows come directly from the cómputo applications' JSON endpoints
  (`computo2025-1v.oep.org.bo`, `computo2025-2v.oep.org.bo`).
- **Legislative results are party-vote-by-uninominal-constituency (the "arrastre" basis for uninominal
  deputy seats), not candidate-level.** The `seats` column is set to 1 on the party the ArcGIS service's
  own `GANADOR` field names as constituency winner, 0 otherwise. `candidate` and `person_id` are blank
  on every legislative row: OEP's own service does not publish individual uninominal candidate names in
  this layer, and the 60 plurinominal (party-list) and 7 special-circumscription deputy seats are **not
  covered** at all — only the 63 uninominal seats have a machine-readable per-constituency return.
- No results for either Senate composition (that comes from the seat-assignment separata used in
  people.csv, not a votes table) — OEP does not publish a separate senatorial vote-return dataset
  distinct from the presidential ticket's department totals under Bolivia's block-vote senate rules.

## polls.csv — 54 rows, 5 published Ipsos CIESMORI waves
All five waves are OEP/SIFDE-filed under art. 21 of Res. TSE-RSP-ADM N° 232/2025 and published by the
OEP itself (not scraped from the pollster or a news aggregator):
| poll_id | rows | field dates | sample_n |
|---|---|---|---|
| `bol-ipsos-ciesmori-2025-05-22` | 13 | 22–26 May 2025 | 2,500 |
| `bol-ipsos-ciesmori-2025-07-05` | 13 | 5–7 Jul 2025 | see notes cell |
| `bol-ipsos-ciesmori-2025-07-25` | 11 | 25–27 Jul 2025 | see notes cell |
| `bol-ipsos-ciesmori-2025-08-02` | 12 | 2–6 Aug 2025 | see notes cell |
| `bol-ipsos-ciesmori-2025-09-18` | 5 | 18–21 Sep 2025 (runoff) | see notes cell |

**Captura Consulting, Focaliza, and Diagnosis produced no citable published topline** (no OEP-filed PDF,
no house-published data page) that could be located — none were filed rather than backed into from
secondary news percentages. 54 rows clears the ">=40 option-rows" floor even with only one house
represented; report the real count rather than padding with the missing three houses.

## Gaps / next steps
- Deputies: 128/130 — 2 seats missing a reliable titular/suplente flag (see SOURCES.md roster note);
  do not treat 128 as "all of the Chamber."
- Legislative results cover only the 63 uninominal seats; the 60 plurinominal + 7 special seats have no
  machine-readable per-party constituency return published by OEP in the sources checked.
- `person_id` is a name-slug, not a regulator-issued id — a future join to any OEP id space (if one is
  ever published) will require a new mapping table, not a straight column rename.
- `money-edges.csv` is intentionally empty; do not backfill it with aggregate PDF figures.

Licences on the rows

  • Cámara de Diputados de Bolivia — official site (bio verbatim from official profile)128
  • Órgano Electoral Plurinacional (OEP/TSE) — official published results45
  • All rights reserved — Ipsos CIESMORI / UNITEL; published table filed with OEP-SIFDE41
  • Órgano Electoral Plurinacional (OEP/TSE) — Separata oficial de resultados EG202536
  • All rights reserved — Ipsos CIESMORI; published table filed with OEP-SIFDE13
  • Órgano Electoral Plurinacional (OEP/TSE) — official published candidate list8