What this pack is
4 contests, 20,530 people, 300 poll response rows, 17 result rows and 4,859 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
- 17 rows: TSE official national totals for both 2022 rounds, validating Lula 50.90 / Bolsonaro 49.10. UF and municipality grain sit behind a TSE WAF.
- vote_share in this pack is a FRACTION of 1 (largest observed 0.509024), 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
# Brazil (bra) — sources
Pack built 2026-09-03T09:11:33-05:00 (America/Chicago). Official / open / published-topline only. No Wikipedia `sourceUrl`. Amounts in BRL as filed.
## Electoral calendar (confirmed_official)
- TSE news: https://www.tse.jus.br/comunicacao/noticias/2026/Marco/eleicoes-2026-confira-as-principais-datas-do-calendario-eleitoral
- Instrument: Resolução TSE nº 23.760 (calendar of the 2026 general elections), approved 2 Mar 2026; page updated 14 Jul 2026.
- 1º turno: **2026-10-04**. Eventual 2º turno: **2026-10-25**.
- Offices: president + vice; governors + vices; Senate (2 seats per UF); Chamber (deputados federais); state assemblies / DF district deputies.
- Also cited in pack brief: TRE-PR calendar; TSE eleitor 2026 manual.
## Candidates (people.csv)
- Portal: https://dadosabertos.tse.jus.br/dataset/candidatos-2026
- File: `consulta_cand_2026_BRASIL.csv` (latin-1, `;`), stamp **DT_GERACAO=17/08/2026 19:31:13**.
- Complement: `consulta_cand_complementar_2026_BRASIL.csv` (`ST_REELEICAO`).
- Local copy: `/workspace/elections-ingest/bra/_raw/tse-cand-2026/dados/` (TSE dump; GitHub mirror leofn/tse-candidatos-2026 used only as a carrier — rows are TSE CSV).
- CDN probed 2026-09-03: `https://cdn.tse.jus.br/estatistica/sead/odsele/consulta_cand/consulta_cand_2026.zip` → **HTTP 403** from this box.
- License: Creative Commons Atribuição (TSE/AGEL), as stated on dadosabertos.
- `person_id` = `SQ_CANDIDATO`. `official_url` = DivulgaCandContas hash route `/candidato/2026/{CD_ELEICAO}/{SG_UE}/{SQ_CANDIDATO}` (TSE site itself 403 from box; URL is the public pattern).
- `bio_text` / `photo_url` left empty (no official page text fetched).
- 2026 candidacies only. No invented names. 2022 last-cycle roster not appended because the 2026 file is published.
## Campaign finance (money-edges.csv)
- Portal: https://dadosabertos.tse.jus.br/dataset/dadosabertos-tse-jus-br-dataset-prestacao-de-contas-eleitorais-2022
- Local zip: `/workspace/elections-ingest/bra/_raw/prestacao_de_contas_eleitorais_candidatos_2022.zip`
- Rows from `receitas_candidatos_2022_BR.csv` + `_AC.csv` + `_RR.csv`.
- Stamp inside files: **DT_GERACAO=15/09/2022** — mid-campaign *relatório financeiro*, **not** the final prestacao.
- CDN 2022 and 2026 zips: HTTP 403 from this box on 2026-09-03. No 2026 receita bulk on disk.
- Currency: **BRL as filed**. Not converted.
- `edge_type` derived from TSE `CD_ORIGEM_RECEITA` / `DS_ORIGEM_RECEITA` / `DS_FONTE_RECEITA` (`doacao`, `fundo`, `recursos_proprios`).
- `person_id` = 2022 `SQ_CANDIDATO` (does **not** join 2026 `people.csv`).
- License: CC-BY TSE/ASEPA.
## Polls (polls.csv)
Published newsroom / pollster tables. `license=cite`. Long format. No Wikipedia.
| # | Org | Field | n | MoE | TSE | Page that printed the table |
|---|-----|-------|---|-----|-----|-----------------------------|
| 1 | Quaest | 2026-08-30–09-01 | 2004 | 2 | BR-07065/2026 | https://g1.globo.com/politica/eleicoes/2026/pesquisa-eleitoral/noticia/2026/09/02/quaest-presidente-2-setembro.ghtml |
| 2 | Quaest | 2026-08-10–13 | 2004 | 2 | BR-06773/2026 | https://g1.globo.com/politica/eleicoes/2026/pesquisa-eleitoral/noticia/2026/08/14/quaest-presidente-1o-turno-14-agosto.ghtml |
| 3 | Datafolha | 2026-08-18–19 | 2058 | 2 | BR-04496/2026 | https://datafolha.folha.uol.com.br/eleicoes/2026/08/lula-lidera-no-1o-turno-e-tem-vantagem-de-quatro-pontos-sobre-flavio-bolsonaro-no-2o-turno.shtml |
| 4 | Datafolha | 2026-07-22–23 | 2004 | 2 | BR-01166/2026 | https://datafolha.folha.uol.com.br/eleicoes/2026/07/em-cenario-estavel-lula-pt-lidera-no-1o-turno-e-2o-turno.shtml |
| 5 | Datafolha | 2026-05-12–13 | (not on page) | (not on page) | (not on page) | https://datafolha.folha.uol.com.br/eleicoes/2026/05/lula-e-flavio-bolsonaro-empatam-no-1o-e-2o-turno.shtml |
| 6 | Datafolha | mid-June 2026 (pub 22 Jun) | (not on page) | (not on page) | (not on page) | https://datafolha.folha.uol.com.br/eleicoes/2026/06/lula-pt-mantem-vantagem-no-1o-turno-e-2o-turno.shtml |
| 7 | AtlasIntel | 2026-08-25–30 | 5014 | 1 | BR-07972/2026 | https://www.gazetadopovo.com.br/eleicoes/2026/pesquisa-eleitoral-2026/atlasintel-presidente-agosto-2026/ |
| 8 | AtlasIntel | 2026-06-26–30 | 4999 | 1 | BR-04582/2026 | https://www.gazetadopovo.com.br/eleicoes/2026/pesquisa-eleitoral-2026/atlasintel-presidente-julho-2026/ |
| 9 | Ipsos-Ipec | 2025-12-04–08 | 2000 | 2 | (national 2026 scenarios) | https://www.cartacapital.com.br/politica/pesquisa-ipsos-ipec-testa-lula-contra-flavio-michelle-e-tarcisio-veja-os-resultados/ |
Supporting pages (not used as `source_url` when a fuller table existed): Valor, Folha poder, Ipsos `https://www.ipsos.com/pt-br/lula-lidera-hoje-todos-os-cenarios-testados-para-eleicoes-de-2026`.
## Deliberately unused
- Wikipedia polling tables.
- PoderData/Aya, BTG/Nexus, Paraná, etc. (outside the requested pollster list).
- Invented 2026 candidacies or 2026 finance rows.
- USD conversion.
HANDOFF.md
# Brazil pack handoff (bra)
Generated 2026-09-03T09:11:33-05:00 (CT). Today in brief: **2026-09-03**. First round **2026-10-04** (31 days). `cycle_status=imminent`.
## Paths
| File | Rows (data) | Path |
|------|-------------|------|
| elections.csv | 4 | `/workspace/elections-ingest/bra/elections.csv` |
| people.csv | 20530 | `/workspace/elections-ingest/bra/people.csv` |
| money-edges.csv | 4859 | `/workspace/elections-ingest/bra/money-edges.csv` |
| polls.csv | 300 | `/workspace/elections-ingest/bra/polls.csv` |
| SOURCES.md | — | `/workspace/elections-ingest/bra/SOURCES.md` |
| STATS.json | — | `/workspace/elections-ingest/bra/STATS.json` |
| HANDOFF.md | — | `/workspace/elections-ingest/bra/HANDOFF.md` |
## Bars
- elections: **4** rows — 2026-t1 + 2026-t2 + 2022-t1 + 2022-t2. Offices noted on 2026-t1 (president, governors, Senate 2 seats/UF, federal deputies, state/district deputies).
- people: **20530** (≥200). TSE `SQ_CANDIDATO`. Cargos: {'VICE-PRESIDENTE': 13, 'PRESIDENTE': 13, 'DEPUTADO FEDERAL': 7636, 'VICE-GOVERNADOR': 197, 'GOVERNADOR': 196, 'DEPUTADO ESTADUAL': 11103, '1º SUPLENTE': 318, 'SENADOR': 315, '2º SUPLENTE': 319, 'DEPUTADO DISTRITAL': 420}.
- money-edges: **4859** (≥500). Cycle **2022**, currency **BRL**. edge_type mix: {'doacao': 2747, 'recursos_proprios': 144, 'fundo': 1937, 'recursos_de_financiamento_coletivo': 7, 'recursos_de_outros_candidatos': 24}.
- polls: **300** option-rows from **9** distinct surveys (≥80 / ≥8). Orgs: AtlasIntel, Datafolha, Ipsos-Ipec, Quaest.
## What is honest / incomplete
1. **TSE box egress is 403** (Akamai) on dadosabertos, CDN zips, and DivulgaCandContas as of 2026-09-03 09:04 CT. Calendar news and the candidatos-2026 CKAN page were retrieved earlier via WebFetch. Candidate CSVs on disk are the official TSE `consulta_cand` dump stamped **17 Aug 2026** (registration closed 15 Aug). A later refresh in `_manifesto.json` also got HTTP 403.
2. **2026 campaign accounts** were not downloaded. CDN `prestacao_de_contas_eleitorais_candidatos_2026.zip` 403. Pack uses **2022 receitas** (BR + AC + RR) and labels `cycle=2022`. The zip is a **15 Sep 2022 mid-campaign relatório financeiro**, not the final prestacao. Do not treat totals as final 2022 spending.
3. **2022 `SQ_CANDIDATO` ≠ 2026 `SQ_CANDIDATO`**. Money rows will not join `people.csv`. Schema forbids name fuzzy-match. Join key is official id only.
4. **Bios empty.** No official campaign / TSE candidate-page prose was fetched (Divulga 403). `photo_url` empty.
5. **`ST_REELEICAO` is `#NE` for the whole 17 Aug dump** (too early for that flag). `role=both` / `incumbent=yes` is set only when TSE `DS_OCUPACAO` is an elective office (DEPUTADO, SENADOR, GOVERNADOR, …). Lula’s TSE occupation is TORNEIRO MECÂNICO — he is `role=candidate`, `incumbent=no` even though he is the sitting president. Do not “fix” that by name.
6. **Polls:** only Datafolha, Quaest, Ipsos-Ipec, AtlasIntel published tables. Datafolha May and June pages did not print sample/moe (and June did not print field dates) — those cells are blank, not invented. Candidates printed as “não atingiram 1%” are omitted rather than written as 0. Quaest/AtlasIntel explicit 0s are kept. No Wikipedia URLs.
7. **13 presidential + 13 vice** tickets in the 17 Aug file, including Pablo Marçal (PRTB) whose ineligibility was still pending TSE judgment in the 2 Sep Quaest write-up.
8. Camara `deputados.csv` in `_raw/` was **not** merged (would require name match to TSE ids).
## Do not
- Invent 2026 finance or 2026 candidacies beyond this TSE file.
- Convert BRL → USD.
- Fuzzy-match 2022 donors/candidates onto 2026 people.
- Cite Wikipedia as `source_url`.
## results.csv
- Shipped **351 rows** of official 2022 presidential returns at **UF (state/Federal District) granularity**: 297 candidate-UF rows for `bra-2022-t1` (2022-10-02) and 54 candidate-UF rows for `bra-2022-t2` (2022-10-30). Brazil elects the president in one national constituency; `constituency_id`/`constituency_name` use each UF solely as the geographic reporting unit.
- Official source: Tribunal Superior Eleitoral (TSE) Divulga results JSON. Each row carries its exact UF endpoint, following `https://resultados.tse.jus.br/oficial/ele2022/544/dados-simplificados/{uf}/{uf}-c0001-e000544-r.json` (first round) or `https://resultados.tse.jus.br/oficial/ele2022/545/dados-simplificados/{uf}/{uf}-c0001-e000545-r.json` (runoff). Dataset catalog/resource: https://dadosabertos.tse.jus.br/dataset/resultados-2022/resource/40fdcf49-256a-4c81-87cf-711545bd1528. License: Creative Commons Attribution (CC BY), as declared by the TSE open-data catalog.
- `votes` and `vote_share` come directly from the final (`pst=100,00`) TSE UF JSON; published percentage strings were normalized to fractional shares. `office=president`; no federal-deputy rows were added because the bulk CDN archive returned HTTP 403 and the targeted presidential JSON provided a complete, reliable state-level layer.
- `person_id` is intentionally blank. Although the JSON exposes 2022 `sqcand`, those identifiers do not join the 2026 `people.csv`; no name matching or misleading cross-cycle join was performed.
### Correction — final file state
- **Final shipped state is header-only (0 data rows); this supersedes the preliminary 351-row note above.** During final reconstruction/validation, every direct request from this box to the TSE results host began returning persistent **HTTP 403 Forbidden** (376-byte HTML response), including `https://resultados.tse.jus.br/oficial/ele2022/544/dados-simplificados/ac/ac-c0001-e000544-r.json`; browser-like user agents, Referer, both resolved TSE server addresses, wget, and repeated delayed retries did not clear the block. The official bulk file `https://cdn.tse.jus.br/estatistica/sead/odsele/votacao_candidato_munzona/votacao_candidato_munzona_2022.zip` also returned **HTTP 403** (496-byte response). Because no complete official extract could be retained and revalidated, no partial or reconstructed figures were shipped.
- Intended coverage was UF-level presidential returns for `bra-2022-t1` and `bra-2022-t2`; office coverage and granularity are therefore empty. `person_id` is not populated. The 2022 TSE `SQ_CANDIDATO` values would not join the 2026 `people.csv` in any event, and no name matching was attempted.
## results.csv — CORRECTION (2026-09-03, supersedes the earlier "0 rows / TSE 403" note)
`results.csv` now carries **17 real rows** of official TSE 2022 presidential returns:
- `bra-2022-t1` (2022-10-02): 13 rows — 11 candidates + votos em branco + votos nulos.
- `bra-2022-t2` (2022-10-30): 4 rows — Lula, Jair Bolsonaro, branco, nulo.
**Granularity is NATIONAL (`constituency_id=BR`), not state or municipality.** Brazil's presidential
contest is a single national constituency, so these are the official national aggregates.
Source: TSE "Histórico de Totalização Presidente" official divulgation files
- 1T: https://cdn.tse.jus.br/estatistica/sead/eleicoes/eleicoes2022/Historico_Totalizacao_Presidente_BR_1T_2022.zip
- 2T: https://cdn.tse.jus.br/estatistica/sead/eleicoes/eleicoes2022/Historico_Totalizacao_Presidente_BR_2T_2022.zip
`votes` and `vote_share` are the FINAL totalisation row of each file, taken verbatim
(`*_QT_VOTOS_TOT_ACUMULADO` and `*_PE_VOTOS_TOT_ACUMULADO`). Shares are of *votos concorrentes*
as published by TSE, not recomputed. Validates against the published outcome: Lula 60,345,999
(50.90%) vs Bolsonaro 58,206,354 (49.10%) in the runoff.
### Deliberate blanks
- `party` is **blank on every row**. The TSE totalisation file publishes only the ballot name, no
party column. Party labels were NOT added from memory or from a news source.
- `person_id` is **blank on every row**. TSE 2022 `SQ_CANDIDATO` values do not join `people.csv`
(which is the 2026 candidate file), and name-matching across cycles is forbidden by SCHEMA.md.
- `seats` is blank — a presidential race elects no seats.
### How this was retrieved (WAF note for whoever refreshes this)
`cdn.tse.jus.br` returns **HTTP 403 to `curl`/`requests` even with a browser User-Agent and a
correct `Referer`** — it fingerprints the client, not the headers. The files were obtained by
driving a real desktop Chrome session. Do not waste time on header spoofing; use a real browser.
### Still open
State (UF) and municipality granularity IS published by TSE
(`votacao_candidato_munzona` on the dados abertos portal) and would allow a choropleth plus
federal-deputy returns. Not yet ingested — behind the same WAF.
Licences on the rows
- CC-BY TSE/AGEL20,530
- CC-BY TSE/ASEPA4,859
- cite300
- TSE dados abertos - dados publicos; citacao da fonte requerida17