ELECTION CASE · BR-PRES-2022 · DERIVED FROM TSE OPEN DATA
Brazil's 2022 presidential election: what the TSE files support.
Results, turnout, margin, swing and counting, read from the official files of Brazil's Superior Electoral Court (TSE). Every number states whether it is observed, derived or still unknown, and which file it came from.
- Most voted, Round 2, as % of valid votes
- 50.90%
- LULA (PT) · 60,345,999 votes
- Derived Source
dadosabertos-2022-agregado-e000545· file time - Margin over second place, Round 2
- 1.80 pp
- 2,139,645 votes · percentage points of valid votes
- Derived formula in section 3
- National swing between rounds
- -1.95 pp
- share of LULA between the two finalists, round 1 to round 2
- Derived formula in section 4
Table CSVs: results · turnout · swing by state
How to read this page
observed, derived and unknown
This case uses no synthetic data and no opinion polls. The chain is always the same: official file, observation, calculation, claim. Never file straight to "truth".
The results of this cycle are no longer in the TSE results app. The numbers come from TSE Open Data: from each ZIP only the federal entry (nominal votes and counting detail by municipality and zone) is read, with CRC-32 checked and SHA-256 recorded, and summed by state, abroad and Brazil. That is why results show as derived, never as observed.
- Observed
- A number read from an official TSE file, with its URL, download date and SHA-256 recorded in the manifest and checked again every time this page is generated.
- Derived
- A calculation on official files, such as sums by state, percentages, margin, swing and the cumulative counting share. The formula is shown right below each table.
- Unknown
- What no collected file supports yet. Each item states the reason in section 10.
No number on this page was typed by hand: the page is generated at publication from the TSE files versioned in the Evidence repository. The text gives no opinion on candidates, parties or institutions, makes no forecast and assigns no aggregate confidence score.
To check, download the manifest and compare the SHA-256 of each file with what the TSE publishes at the same URL. The dossier carries the same chain in Markdown, in Portuguese. The comparison with other cycles is in the elections index.
The case in two figures
The national result by round and the change between rounds in each state. The tables with the same numbers come next; the maps page has four more figures. See the case maps
1. Results by round
Round 1 ·
| No. | Candidate | Party | Votes | % of valid votes | Status (TSE) |
|---|---|---|---|---|---|
| 13 | LULA | PT | 57,259,504 | 48.43% | Runoff |
| 22 | JAIR BOLSONARO | PL | 51,072,345 | 43.20% | Runoff |
| 15 | SIMONE TEBET | MDB | 4,915,423 | 4.16% | Not elected |
| 12 | CIRO GOMES | PDT | 3,599,287 | 3.04% | Not elected |
| 44 | SORAYA THRONICKE | UNIÃO | 600,955 | 0.51% | Not elected |
| 30 | FELIPE D AVILA | NOVO | 559,708 | 0.47% | Not elected |
| 14 | PADRE KELMON | PTB | 81,129 | 0.07% | Not elected |
| 80 | LÉO PÉRICLES | UP | 53,519 | 0.05% | Not elected |
| 21 | SOFIA MANZANO | PCB | 45,620 | 0.04% | Not elected |
| 16 | VERA | PSTU | 25,625 | 0.02% | Not elected |
| 27 | CONSTITUINTE EYMAEL | DC | 16,604 | 0.01% | Not elected |
Round 2 ·
| No. | Candidate | Party | Votes | % of valid votes | Status (TSE) |
|---|---|---|---|---|---|
| 13 | LULA | PT | 60,345,999 | 50.90% | Elected |
| 22 | JAIR BOLSONARO | PL | 58,206,354 | 49.10% | Not elected |
Derived Source: TSE, dadosabertos-2022-agregado-e000544, dadosabertos-2022-agregado-e000545 · collected on · manifest SHA-256 9bf8dbdc34a8 · Download CSV · See the files
2. Turnout
| Measure | Round 1 | Round 2 | State |
|---|---|---|---|
| Registered voters | 156,454,011 | 156,454,011 | Derived |
| Turnout | 123,682,372 | 124,252,796 | Derived |
| Abstention | 32,770,982 | 32,200,558 | Derived |
| Valid votes | 118,229,719 | 118,552,353 | Derived |
| Blank votes | 1,964,779 | 1,769,678 | Derived |
| Null votes | 3,487,874 | 3,930,765 | Derived |
| Turnout (% of registered voters) | 79.05% | 79.42% | Derived |
| Abstention (% of registered voters) | 20.95% | 20.58% | Derived |
Formula turnout_pct = 100 * turnout / electorate; abstention_pct = 100 * abstention / electorate
Derived Source: TSE, dadosabertos-2022-agregado-e000544, dadosabertos-2022-agregado-e000545 · collected on · manifest SHA-256 9bf8dbdc34a8 · Download CSV · See the files
3. Margin
| Round | Ahead | Margin (votes) Derived | Margin (percentage points of valid votes) Derived |
|---|---|---|---|
| Round 1 | LULA | 6,187,159 | 5.23 |
| Round 2 | LULA | 2,139,645 | 1.80 |
Formula lead_votes = votes_A - votes_B; lead_pp = 100 * votes_A / valid_votes - 100 * votes_B / valid_votes
4. Change between rounds and national swing
| Measure | Change Derived |
|---|---|
| Abstention (percentage points) | -0.36 |
| Turnout (votes) | +570,424 |
| Valid votes (votes) | +322,634 |
Formula delta_abstention_pp = abstention_pct_t2 - abstention_pct_t1; delta_turnout = turnout_t2 - turnout_t1; delta_valid = valid_t2 - valid_t1
| Candidate | Round 1 votes Observed | Round 2 votes Observed | Round 1 share, between the two Derived | Round 2 share Derived | Swing (pp) Derived | Vote gain Derived |
|---|---|---|---|---|---|---|
| LULA | 57,259,504 | 60,345,999 | 52.86% | 50.90% | -1.95 | +3,086,495 |
| JAIR BOLSONARO | 51,072,345 | 58,206,354 | 47.14% | 49.10% | +1.95 | +7,134,009 |
Formula first_round_two_candidate_normalized_share = v1_A / (v1_A + v1_B); second_round_share = v2_A / valid_t2; swing_pp = 100 * (second - first); absolute_vote_gain = v2_A - v1_A
5. Swing by state
- DF-0.45
- RJ-0.86
- RR-0.96
- SP-1.39
- SE-1.43
- MA-1.44
- SC-1.46
- MT-1.58
- PE-1.64
- ES-1.66
- PA-1.71
- RO-1.71
- PB-1.80
- GO-1.82
- PR-1.84
- Abroad (ZZ)-1.85
- RN-1.90
- PI-2.00
- BA-2.03
- TO-2.03
- MS-2.05
- AC-2.19
- CE-2.23
- MG-2.35
- AL-2.37
- AM-2.57
- AP-2.63
- RS-2.73
Derived Source: TSE, dadosabertos-2022-agregado-e000544, dadosabertos-2022-agregado-e000545 · collected on · manifest SHA-256 9bf8dbdc34a8 · Download CSV · See the files
| Scope | Round 2 registered voters Observed | Swing LULA (pp) Derived | Gain LULA Derived | Swing JAIR BOLSONARO (pp) Derived | Gain JAIR BOLSONARO Derived |
|---|---|---|---|---|---|
| AC | 587,765 | -2.19 | -7,456 | +2.19 | +12,168 |
| AL | 2,325,814 | -2.37 | +2,675 | +2.37 | +66,312 |
| AM | 2,647,123 | -2.57 | -14,693 | +2.57 | +81,543 |
| AP | 550,131 | -2.63 | -7,464 | +2.63 | +12,926 |
| BA | 11,282,999 | -2.03 | +224,734 | +2.03 | +309,429 |
| CE | 6,818,192 | -2.23 | +229,536 | +2.23 | +256,650 |
| DF | 2,207,628 | -0.45 | +79,761 | +0.45 | +130,934 |
| ES | 2,922,264 | -1.66 | +29,419 | +1.66 | +122,115 |
| GO | 4,870,621 | -1.82 | +87,392 | +1.82 | +272,838 |
| MA | 5,039,307 | -1.44 | +64,971 | +1.44 | +98,888 |
| MG | 16,284,615 | -2.35 | +388,389 | +2.35 | +902,046 |
| MS | 1,996,066 | -2.05 | +11,224 | +2.05 | +86,400 |
| MT | 2,469,797 | -1.58 | +19,038 | +1.58 | +113,864 |
| PA | 6,078,857 | -1.71 | +65,354 | +1.71 | +189,222 |
| PB | 3,091,719 | -1.80 | +47,085 | +1.80 | +85,086 |
| PE | 7,015,086 | -1.64 | +82,611 | +1.64 | +167,894 |
| PI | 2,570,253 | -2.00 | +33,375 | +2.00 | +60,168 |
| PR | 8,480,626 | -1.84 | +143,113 | +1.84 | +530,731 |
| RJ | 12,827,044 | -0.86 | +309,074 | +0.86 | +572,648 |
| RN | 2,554,326 | -1.90 | +62,606 | +1.90 | +88,650 |
| RO | 1,230,172 | -1.71 | +1,155 | +1.71 | +51,930 |
| RR | 366,641 | -0.96 | -1,632 | +0.96 | +5,931 |
| RS | 8,589,684 | -2.73 | +85,179 | +2.73 | +488,162 |
| SC | 5,501,284 | -1.46 | +72,702 | +1.46 | +353,224 |
| SE | 1,671,241 | -1.43 | +34,235 | +1.43 | +42,476 |
| SP | 34,684,876 | -1.39 | +1,029,850 | +1.39 | +1,976,598 |
| TO | 1,094,302 | -2.03 | +290 | +2.03 | +32,460 |
| Abroad (ZZ) | 695,578 | -1.85 | +13,972 | +1.85 | +22,716 |
Each row uses the round 1 and round 2 snapshots of the scope; each file is listed in the sources table.
Formula first_round_two_candidate_normalized_share = v1_A / (v1_A + v1_B); second_round_share = v2_A / valid_t2; swing_pp = 100 * (second - first); absolute_vote_gain = v2_A - v1_A
6. Counting timeline
Round 1
| Order | Scope | Closed at Derived | Registered voters Derived | Cumulative share of registered voters Derived |
|---|---|---|---|---|
| 1 | DF | 2,206,996 | 1.41% | |
| 2 | ES | 2,922,379 | 3.28% | |
| 3 | RR | 366,632 | 3.51% | |
| 4 | TO | 1,094,346 | 4.21% | |
| 5 | RS | 8,589,432 | 9.70% | |
| 6 | MS | 1,995,932 | 10.98% | |
| 7 | SC | 5,501,478 | 14.49% | |
| 8 | GO | 4,870,292 | 17.61% | |
| 9 | SE | 1,671,376 | 18.68% | |
| 10 | SP | 34,684,927 | 40.85% | |
| 11 | AL | 2,326,491 | 42.33% | |
| 12 | PB | 3,092,053 | 44.31% | |
| 13 | AP | 550,165 | 44.66% | |
| 14 | AC | 587,738 | 45.04% | |
| 15 | MT | 2,469,604 | 46.61% | |
| 16 | RJ | 12,826,356 | 54.81% | |
| 17 | MG | 16,283,828 | 65.22% | |
| 18 | RO | 1,229,998 | 66.01% | |
| 19 | RN | 2,554,716 | 67.64% | |
| 20 | PE | 7,015,421 | 72.12% | |
| 21 | CE | 6,818,732 | 76.48% | |
| 22 | MA | 5,039,287 | 79.70% | |
| 23 | PA | 6,079,280 | 83.59% | |
| 24 | BA | 11,283,405 | 90.80% | |
| 25 | PR | 8,480,435 | 96.22% | |
| 26 | PI | 2,570,433 | 97.86% | |
| 27 | Abroad (ZZ) | 695,355 | 98.31% | |
| 28 | AM | 2,646,924 | 100.00% |
Formula cumulative_electorate_share = sum(electorate dos escopos fechados até t) / sum(electorate)
Formula expected_weight = electorate_i / sum(electorate); observed_weight = turnout_totalized_i / sum(turnout_totalized); bias = observed_weight - expected_weight
- Mathematically decided Unknown no source collected for this milestone
- Totalization complete Unknown no source collected for this milestone
- Result announced Unknown no source collected for this milestone
- Result proclaimed Unknown no source collected for this milestone
- Certification (diplomação) Unknown no source collected for this milestone
- Taking office Unknown no source collected for this milestone
Round 2
| Order | Scope | Closed at Derived | Registered voters Derived | Cumulative share of registered voters Derived |
|---|---|---|---|---|
| 1 | ES | 2,922,264 | 1.87% | |
| 2 | MS | 1,996,066 | 3.14% | |
| 3 | TO | 1,094,302 | 3.84% | |
| 4 | PB | 3,091,719 | 5.82% | |
| 5 | SE | 1,671,241 | 6.89% | |
| 6 | DF | 2,207,628 | 8.30% | |
| 7 | RO | 1,230,172 | 9.09% | |
| 8 | RN | 2,554,326 | 10.72% | |
| 9 | AL | 2,325,814 | 12.20% | |
| 10 | RS | 8,589,684 | 17.69% | |
| 11 | MT | 2,469,797 | 19.27% | |
| 12 | RJ | 12,827,044 | 27.47% | |
| 13 | CE | 6,818,192 | 31.83% | |
| 14 | RR | 366,641 | 32.06% | |
| 15 | PE | 7,015,086 | 36.55% | |
| 16 | SC | 5,501,284 | 40.06% | |
| 17 | GO | 4,870,621 | 43.18% | |
| 18 | SP | 34,684,876 | 65.35% | |
| 19 | MG | 16,284,615 | 75.76% | |
| 20 | BA | 11,282,999 | 82.97% | |
| 21 | PR | 8,480,626 | 88.39% | |
| 22 | MA | 5,039,307 | 91.61% | |
| 23 | PI | 2,570,253 | 93.25% | |
| 24 | AC | 587,765 | 93.63% | |
| 25 | Abroad (ZZ) | 695,578 | 94.07% | |
| 26 | AP | 550,131 | 94.42% | |
| 27 | PA | 6,078,857 | 98.31% | |
| 28 | AM | 2,647,123 | 100.00% |
Formula cumulative_electorate_share = sum(electorate dos escopos fechados até t) / sum(electorate)
Formula expected_weight = electorate_i / sum(electorate); observed_weight = turnout_totalized_i / sum(turnout_totalized); bias = observed_weight - expected_weight
- Mathematically decided Unknown no source collected for this milestone
- Totalization complete Unknown no source collected for this milestone
- Result announced Unknown no source collected for this milestone
- Result proclaimed Unknown no source collected for this milestone
- Certification (diplomação) Unknown no source collected for this milestone
- Taking office Unknown no source collected for this milestone
Marginal share between counting instants
Unknown só um instante por escopo foi coletado; o painel de evolução da totalização não foi localizado nos arquivos públicos
7. Events
No event recorded in this case: the events ledger depends on a collected official publication, and none was collected.
8. Assurances
| Category | Assurance | Method | Date | State | Source | Limits |
|---|---|---|---|---|---|---|
| Public verifiability | Resultado por município e zona publicado nos Dados Abertos do TSE Os CSV de votação nominal e de detalhe da apuração por município e zona estão publicados sem autenticação; o agregado por UF e Brasil é a soma deles. | agregacao_dos_csv_dados_abertos | Derived | dadosabertos-2022-agregado-e000544 |
|
An assurance supports what was verified, nothing more. There is no aggregate confidence score.
9. Claims
| Claim | State | Evidence | Rationale |
|---|---|---|---|
| LULA venceu o 2º turno de 2022 | Confirmed |
| Resultado consolidado do Brasil com 100% das seções e candidato marcado como eleito. |
| A abstenção do 2º turno foi menor que a do 1º | Confirmed |
| Derivado de dois snapshots observados: abstenção 20.9461% no 1º turno e 20.5815% no 2º. A variação é DERIVED; a causa não está estabelecida. |
10. What is still unknown
Unknown does not mean false: it means no collected source supports the item. Each row states the reason.
- Unknown Marginal share between counting instantssó um instante por escopo foi coletado; o painel de evolução da totalização não foi localizado nos arquivos públicos
- Unknown Finalization milestones, Round 1Mathematically decided, Totalization complete, Result announced, Result proclaimed, Certification (diplomação), Taking office: no source collected for this milestone
- Unknown Finalization milestones, Round 2Mathematically decided, Totalization complete, Result announced, Result proclaimed, Certification (diplomação), Taking office: no source collected for this milestone
11. Sources
| Id | Type | URL | Downloaded at | SHA-256 | Bytes | State |
|---|---|---|---|---|---|---|
dadosabertos-2022-agregado-e000544 | Open Data aggregate | https://cdn.tse.jus.br/estatistica/sead/odsele/votacao_candidato_munzona/votacao_candidato_munzona_2022.zip | 8df047e326cb03289d2f7d17daefc729892b519eb2c78aff33b9bc8c78169426 | 81,404 | Derived | |
dadosabertos-2022-agregado-e000545 | Open Data aggregate | https://cdn.tse.jus.br/estatistica/sead/odsele/votacao_candidato_munzona/votacao_candidato_munzona_2022.zip | b10c3c8ce251a70b45732ef2c7da23642374a73bf4013edf6bbc5d8cc92b8cbe | 23,183 | Derived |
| Id | URL | ZIP entry | Downloaded at | Entry SHA-256 | Bytes | Bytes downloaded |
|---|---|---|---|---|---|---|
dadosabertos-2022-votacao-candidato-munzona-br | https://cdn.tse.jus.br/estatistica/sead/odsele/votacao_candidato_munzona/votacao_candidato_munzona_2022.zip | votacao_candidato_munzona_2022_BR.csv | 5931b526b48afe455b14b83647b050abbbd848df04110a68ece653bef459e9a8 | 38,081,808 | 2,224,009 | |
dadosabertos-2022-detalhe-votacao-munzona-br | https://cdn.tse.jus.br/estatistica/sead/odsele/detalhe_votacao_munzona/detalhe_votacao_munzona_2022.zip | detalhe_votacao_munzona_2022_BR.csv | 9e3711999732656004bbdae2e33e5abaeff0019cfd2e1c7f2ca7d94774f7875e | 3,451,986 | 772,625 |
The whole ZIP is not downloaded: only the central directory and the federal entry, by HTTP Range, with CRC-32 checked. To check, extract the same entry from the published ZIP and compare the SHA-256. The aggregate by state and Brazil is derived (a sum of rows).
12. About this data
- What it measures
- Votes by candidate in each round, turnout (registered voters, turnout, abstention, blank and null votes), margin between the two most voted and swing between rounds, in Brazil, by state and abroad.
- Source
- Brazil's Superior Electoral Court (TSE): 2 official files, listed in the sources table with URL and SHA-256.
- Unit
- Votes (count); share of valid votes or of registered voters; percentage points (pp) for margin and swing.
- Period
- (Round 1) and (Round 2)
- Last collected
- Next scheduled collection
- Daily at 09:30 UTC (06:30 in Brasília), by the
evidence-tseengine, which checks the SHA-256 of every file. This page changes on the next site publication. - Maintained by
- Reveno Evidence ·
evidence-tseengine, owner Thiago Holtz - Evidence state
- Derived
- Version
- Collection manifest, SHA-256
9bf8dbdc34a88f3d3678f433ca3ad4500c4e2a17a5203d6a49d628b0cb6910d4 - License
- Source data license: public data from the TSE, under the court's terms. License for the Reveno text and calculations: not declared yet; until then, cite this page.
13. Download the data
What is on screen
The tables on this page as CSV, with unformatted numbers and the evidence state of every row.
The full set, with a manifest
A ZIP with every file behind the page, a README with the citation and license, and a manifest with the SHA-256 of each file.
For machines
A JSON at a stable address, with metadata, citation, tables and sources. The address does not change between publications; the content changes when the collection changes.
- Case data for machines
https://evidence.reveno.com.br/eleicoes/br-pres-2022/dados.json
- Case data for machines
14. How to cite
Short citation for a chart or table caption, or a note
TSE (2022), processed by Reveno Evidence
Full citation with URL and access date
Reveno Evidence (2026). Brazil 2022 presidential election: results and TSE evidence (BR-PRES-2022) [Data set]. Source data: Brazil's Superior Electoral Court (TSE), files collected on 2026-11-03 (UTC). Collection manifest, SHA-256 9bf8dbdc34a88f3d3678f433ca3ad4500c4e2a17a5203d6a49d628b0cb6910d4. Retrieved November 3, 2026, from https://evidence.reveno.com.br/en/elections/br-pres-2022/
BibTeX
@misc{reveno_evidence_br_pres_2022,
author = {{Reveno Evidence}},
title = {Brazil 2022 presidential election: results and TSE evidence (BR-PRES-2022)},
year = {2026},
publisher = {Reveno},
url = {https://evidence.reveno.com.br/en/elections/br-pres-2022/},
urldate = {2026-11-03},
note = {Source data: Brazil's Superior Electoral Court (TSE), files collected on 2026-11-03 (UTC). Collection manifest, SHA-256 9bf8dbdc34a88f3d3678f433ca3ad4500c4e2a17a5203d6a49d628b0cb6910d4}
}The access date is filled in with the date of this version of the page; replace it with the date you accessed it.
When you use a number, also cite the source file: id, URL and SHA-256 are in the sources table.
Source data license: public data from the TSE, under the court's terms. License for the Reveno text and calculations: not declared yet; until then, cite this page.
Ledger entries (events, assurances, claims and reasons) are recorded in Portuguese, as in the dossier.