Open election data · built with AI agents

Official election results, systematised at scale with AI agents.

A large and growing effort to standardise the world's electoral data: agents read what each electoral authority publishes and rebuild it as one table per contest — 42 countries and 318 elections so far, every candidate and every unit down to the ballot box, checked against the authority's own totals.

Try Chile, France, South Korea — or browse every candidate.

Agents at work · 42 pipelines, one per authority35 of 42 reconciled to the official total
wrote taiwan.pyTaiwan · 8 elections · 17,795 polling stationsreconciled to the vote

An agent writes each pipeline: it reads what the authority publishes, rebuilds it as one table per contest and reconciles it against the authority's own total. See how the agents work →

Sub-national results · 41National totals only · 1

Drag to spin · click a country to open its profile

Coverage

Elections in the observatory by country, office and year. Hover a cell for the election; see the data page for what each row is built from.

Country40s50s60s70s80s90s000102030405060708091011121314151617181920212223242526
Argentina 6
Australia 7
Belgium 5
Bolivia 3
Brazil 3
Canada 3
Chile 5039
Colombia 2
Czechia 7
Denmark 6
Egypt 3
El Salvador 2
Estonia 3
Finland 7
France 57
Germany 2
Ghana 2
India 3
Indonesia 3
Iran 2
Italy 48244768
Japan 4
Kenya 2
Mexico 1
Netherlands 9
New Zealand 1
Nigeria 3
Norway 6
Paraguay 1
Peru 2
Romania 2
Russia 2
South Africa 2
South Korea 4
Spain 20
Sweden 6
Switzerland 5
Taiwan 8
Tunisia 1
Ukraine 3
United Kingdom 5
United States 7
PresidentialLower houseSenateReferendumEuropeanRegionalGovernorsMunicipalCouncilsOtherSplit cells: several offices that year.Before 2000, one cell per decade; the number is how many elections it holds.

Datasets

Everything the site draws is a file you can take. Each row below is one published product, with the unit it is observed at and the years it covers; the full specification, the licence and the citation are on the data page.

Country index (JSON) ↓
DatasetUnit of observationCoverageSizeGet it
Country indexevery election summarised in one fileOne row per election42 countries · 1948–2026318 electionsJSON
Election filescandidates, parties and the vote of every unit at every levelCandidate × unit318 elections6.4M unit recordsJSON
Candidate profilesone person, every candidacy they stood inOne file per candidateProfiled candidatesVotes, share and rank by regionJSON
Geographiesthe boundaries the maps are drawn from, already simplifiedOne file per map layerRegions, provinces, communesLon/lat ringsJSON

Files are served pre-compressed: a browser that accepts Brotli gets the stored bytes untouched, so an election of eight thousand municipalities travels in a couple of hundred kilobytes.

AI agents working for transparency and democracy

Elections are too complex for one person to systematise. Agents do the repetitive part; the electoral authority decides.

Every authority publishes its returns in its own shape and changes it between elections. What that means in practice is below: one real record from one source, the script that read it, and the ledger of every country in the observatory — what the authority publishes, what the observatory writes, and what it was checked against before anything was written.

  • 42scripts, one per authority: 14,832 lines of Python, all in the open
  • 7source formats, from a JSON API to fixed-width records with no header
  • 35/42countries reconciled against the authority's own declaration, 15 of them to the vote
  • 0numbers produced by a model: every share is a sum of published returns
The crew — five roles, four gatesagents/ in the repo ↗
Nothing checkable → the run stops here, with the reason.G1Any candidate outside its bound → nothing is written.G2Map join below 95% unexplained → the layer doesn't ship.G3Anything red → fix or revert. Never merge red.G4Takes a country, office and years. Runs the four phases in order and enforces every gate.country-leadentry · orchestratorProbes what the authority publishes: URLs, formats, grain, rounds, and the declaration to check against.1source-scoutphase 1Writes Pipelines/countries/<country>.py and reconciles every candidate against the certified total.2pipeline-smithphase 2Registers flags, boundaries, levels, dates and the ledger row that turn tables into a profile.3geo-wirerphase 3Rebuilds everything, runs the suite, checks the joins, updates the docs.4release-verifierphase 4A person reads every pipeline and every discrepancy note before it is merged; the repository history shows who did what.mergehuman reviewstarts runcountry-lead supervises every phase
step 1 of 6 · entry · orchestrator
country-lead

Takes a country, office and years. Runs the four phases in order and enforces every gate.

gateAsks before anything ambiguous; a human reviews before merge.

agents/country-lead.md
  • No figure is ever generated by a model — every share is a sum of published returns.
  • The authority's declaration is the arbiter of every pipeline.
  • A person reads every pipeline before it is merged.
1 · What the ministry publishes06021911.DAT
022019111280799900009400463364000
  • election: type 02, 2019-11
  • round
  • province 28 · Madrid
  • municipality 079
  • district 99 = whole municipality
  • candidacy 000094, named in file 03: PSOE
  • votes
  • elected

One of 115,380 lines in the Congreso 2019-11 release: latin-1, no header, no separators. The column positions come from a Word file that travels with the data; the candidacy number resolves through a second file, the municipality name through a third.

2 · The agent's script
spain_infoelectoral.py 595 lines ↗
  • every province's municipalities sum to the ministry's own province file
  • every candidacy matches file 08, province by province
  • the national row equals the sum of the provinces
  • census, voters, blank and null ballots are carried through and checked
Nothing is written until every check passes. A gap is bounded in the code and printed on every run.
3 · What the observatory stores2019_congress.parquet
polling_id
28079
candidate
PSOE
value
463,364
rate
0.2625
rank
2
commune
Madrid
province
Madrid
region
Comunidad de Madrid
nuts_2
ES30
census
2,384,269
voters
1,765,443
valid
1,739,779

The same columns for every one of the 318 elections in the observatory, whatever the source looked like — which is what lets a reader compare Madrid with a commune in Chile or a county in Ohio.

The ledger

Every country in the observatory: what the authority publishes, the finest unit it reaches, and how the parse was checked against the authority's declaration. Verified rows first.

to the votewithin a stated boundread as published
CountryWhat the authority publishesFinest unitChecked against the declarationCode
Taiwan8 elections · 19962024CSV archiveThe Central Election Commission's election database: every election since 1994 in one archive, five CSVs each, from the nation down to the polling station17,795 polling stationsTo the voteAll eight presidential elections 1996–2024 reproduce the archive's own national row and the Commission's declaration to the vote, candidate by candidate; valid ballots too.taiwan.py331 lines
Australia7 elections · 20072025CSV archiveOne CSV per state of every candidate's first preferences at every polling place, plus division totals by vote type8,959 polling placesTo the votePolling places sum to the AEC's own ordinary-vote total, to the vote, for every candidate in every division. Postal and pre-poll ballots are counted centrally and reported as such.australia_aec.py241 lines
Finland7 elections · 19992023JSON APIStatistics Finland's StatFin table 13sw: each party's vote in every municipality, every constituency and the country, seven Eduskunta elections 1999-2023452 municipalitiesTo the voteMunicipalities and constituencies are two partitions of the same ballots and each sums to the office's own national row, to the vote; every municipality also sums to its own total. Municipality codes carry the 2023 constituency division in every year, so the vaalipiiri column is a stable grouping rather than the district of the day before 2023.finland_statfin.py337 lines
Denmark6 elections · 20072026JSON APIStatistics Denmark's StatBank: every party's vote, the valid and invalid ballots and the electorate of all 98 municipalities, six Folketing elections 2007-202699 municipalitiesTo the voteEvery municipality's parties sum to its own header of valid votes, to the vote, in all six elections, and every national share lands within the decimal the office publishes its own shares to. Seats reconcile to the 175 Danish mandates; the four Faroese and Greenlandic ones are elected apart and are not in this table.denmark_dst.py296 lines
Norway6 elections · 20052025JSON APIStatistics Norway's StatBank table 08092: approved votes by party in every municipality, county and valgdistrikt, six Storting elections 2005-2025433 municipalitiesTo the voteMunicipalities sum to the office's national row party by party, and the municipalities of every NUTS 3 county sum to the valgdistrikt rows that county is the union of — which is what validates the 2021 and 2025 municipality codes, whose county no older list carries. SSB's 2009 national row is one vote above its own municipalities; that vote is the source's.norway.py298 lines
Sweden6 elections · 20022022JSON APIStatistics Sweden's ME0104 election statistics: every party's vote in all 290 municipalities and 29 valkretsar, plus the invalid ballots and the electors who did not vote, six Riksdag elections 2002-2022290 municipalitiesTo the voteMunicipalities and valkretsar are two partitions of the same electorate and each sums to the office's own national row, to the vote. Seats reconcile to 349. Only the eight parties with seats since 1973 are named; the rest are the office's own 'övriga partier'.sweden_scb.py273 lines
Belgium5 elections · 20072024JSON APIThe IBZ results API, one response per level per election: every party's vote in every electoral canton, five Chamber elections 2007-2024231 cantonsTo the voteEvery party, the valid votes, the blank votes and the register reconcile to the vote against the API's own certified national record in all five years. The vote from abroad, the postal cantons and Rhode-Saint-Genèse are off-map, folded into their province.belgium.py528 lines
Switzerland5 elections · 20072023CSV archiveThe Federal Statistical Office's candidate-level CSV (2007–2015) and its open election data by commune (2019, 2023)2,143 communesTo the vote2007–2015 notebook-era conversion at canton level; 2019 and 2023 from the BFS party-strength appendix (2,143 communes, party votes), communes summing to the cantons and seats to the 200 of the National Council.switzerland.py+1 more184 lines
United Kingdom5 elections · 20102024JSON APIThe Commons' own results database: one candidacies.csv per general election, as declared by the returning officers650 constituenciesTo the voteGeneral elections 2010–2024; every constituency's candidates sum to its own valid-vote count and the constituencies to the national total, to the vote. Map level is the 12 ITL1 regions (stable across the 2024 redraw); constituencies are the drill-down level.united_kingdom.py188 lines
Bolivia3 elections · 20202025JSON APIEach election's own cómputo portal: the per-mesa CSV arrives base64-encoded inside a JSON envelope34,156 mesasTo the voteEvery candidacy is reconciled to the vote against the OEP's published national totals before anything is written.bolivia.py275 lines
Canada3 elections · 20152021CSV archiveOne CSV per electoral district with every candidate's vote at each of ~70,000 polls, plus the district table73,502 pollsTo the voteEvery candidate's polls sum to Elections Canada's own table 12, to the vote, in every district. Nothing is written on a mismatch.canada_elections.py362 lines
Indonesia3 elections · 20142024PDF · transcribedA PDF decree per election on a portal that is re-platformed every cycle; the provincial table transcribed on Wikipedia39 provincesTo the voteAll three elections reproduce the KPU's certified totals to the vote, every ticket. Provinces are the KPU's of the year: 33, 34 and 38.indonesia.py297 lines
Ukraine3 elections · 20142019PDF · transcribedThe CEC's per-commission portal (no bulk download); the oblast tables transcribed26 oblastsTo the votePresidential 2014 (one round) and 2019 (both rounds) across 24 oblasts plus Kyiv city and the vote from abroad (off-map). No voting in Crimea, Sevastopol or occupied Donbas in either. 2019 reconciles to the vote; 2014's named candidates too, ten minors under 0.5% absent from the oblast table.ukraine.py305 lines
Germany2 elections · 20212025CSV archiveThe 2021 Wahlbezirk results CSV, which the open-data portal no longer offers, and the 2025 Wahlkreis open-data release read straight from the Bundeswahlleiterin94,235 WahlbezirkeTo the vote2021 is a notebook-era conversion at Wahlbezirk level; 2025 takes the final Zweitstimmen by Wahlkreis (299), each adding to its own valid total and the Wahlkreise through the 16 Länder to the national row, to the vote.germany.py+1 more309 lines
Ghana2 elections · 20202024PDF · transcribedThe EC's regional summary sheets (JS-driven pages, no file URLs); the regional table transcribed16 regionsTo the votePresidential 2020 and 2024 across the 16 regions; every candidate reconciles to the EC's figures to the vote, except GCPP's Lartey in 2020 (3,564 votes, absent from the regional table). 2016 excluded: its regional table names only the top two.ghana.py252 lines
Italy48 elections · 19482024zipThe ministry's own bulk open data: one ZIP per Camera and per Senato election with list votes per comune (semicolon CSV) plus the abroad vote8,126 comuniWithin 0.5%Camera 1948–2022 (19 elections) by comune, mapped onto the 20 regioni, every one joining its polygon in every year. List votes where the ministry publishes them; Valle d'Aosta votes its deputy by FPTP so it stands as persons there in 1994–2001/2018/2022; the 2018–2022 candidate-only ballots are redistributed across the candidate's lists per college (art. 59-bis DPR 361/1957). 1994–2001 name the circoscrizione and no province, so the region comes from the circoscrizione and the city pieces the ministry publishes one per college ("Napoli - Vomero", "Parte di Comune BOLOGNA") are put back into their comune. Anchors reconcile to the vote (2008 PdL within 602 votes, 2018 to the ministry Liv_Naz and to the ballot on blank papers); 1948 lands 0.4% short of the published totals. Replaces the old preference-vote tables, whose totals exceeded the valid vote. The Senate carries the same nineteen days on its own regional geography, reconciled region by region against the ministry's candidate file (2018 to its national list file, -0.008%, and to the ballot on blank papers); four holes in the ministry's own tables are named in the pipeline rather than papered over — 1948 Trentino-Alto Adige, 1953 Gorizia, Rome in 1968 and 1979, Chioggia in 1992. The ten European elections since 1979 ride on the same comune grain, each reconciled against the second table its own ZIP carries — exact in 2009, 2014 and 2019, within 0.7% in the years whose reference file also counts the vote cast abroad — and 2024, whose section-level release is partial, against the declared national total of the leading list (+0.02%).italy.py+2 more1,822 lines
Spain20 elections · 20002019Fixed-width recordsFixed-width .DAT records, latin-1, no header, in a layout documented in a Word file; 20 elections of ~8,100 municipalities8,131 municipalitiesWithin 0.5%Reconciled candidacy by candidacy and province by province against the ministry's own province file. Twelve of twenty releases agree to the vote; the rest differ by the vote from abroad, counted at the province and never assigned to a municipality.spain_infoelectoral.py595 lines
Netherlands9 elections · 20022025JSON APIThe Kiesraad databank's JSON, one document per municipality per election, nine elections496 municipalitiesWithin 0.5%Eight of nine elections agree with the Kiesraad's national document to the vote, party by party. 2017 carries 8,797 more valid votes than the national row: corrections applied after recounts and never pushed back down.netherlands_kiesraad.py233 lines
Czechia7 elections · 20022025CSV archiveThe Statistical Office's open data: the T/4 tally of every polling district as CSV, with code lists and the candidate register, seven elections 2002–202514,894 polling districtsWithin 0.01%Every list is summed over ~14,900 districts and checked against the Office's certified XML; six elections match to the vote, 2017's election-night files differ from the court-corrected result by 14 votes on one list.czechia.py302 lines
United States7 elections · 20002024CSV archiveMEDSL's county files for 2000–2016 and its 2024 precinct release, summed to counties3,155 countiesWithin 1%2024: 2,920 counties in 46 states, 93.3% of the vote, reconciled to 0.02% against MEDSL's state totals; five states whose precinct file does not add up are left out. 2000–2016 sit within 0.5% of the FEC popular vote.united_states_medsl.py351 lines
Argentina6 elections · 20152025CSV archiveThe provisional count as one CSV per election, 1.2 GB unzipped, by mesa108,131 mesasWithin 0.5 ptEvery candidate's share lands within 0.22 points of the definitive result; the mesa file covers 96.6–99.4% of the definitive vote.argentina_dine.py389 lines
Japan4 elections · 20212024CSV archiveY. Yanai's academic mirror of the official returns: one row per SMD candidate per district plus PR votes per block and party, with the MIC certified xls tables as arbiter289 districtsWithin 0.2%House of Representatives 2021 and 2024 as separate SMD (289 districts, kanji names canonical, no romanization) and PR-block tables; every party reconciles against the MIC certified totals within 0.2% (totals within 13 votes), and SMD districts are not comparable across the 2022 redistricting.japan.py718 lines
South Korea4 elections · 20122025PDF · transcribedA portal that answers only to a browser session; the province-level declaration transcribed17 provinces and citiesWithin 0.2%All 36 candidates across four elections are checked; 2012, 2022 and 2025 match to the vote, 2017 is off by −10 and +30 votes for two candidates under 0.1%.south_korea.py301 lines
Egypt3 elections · 20122014PDF · transcribedArabic PDFs and press conferences; the governorate table transcribed on Wikipedia is the machine-readable form27 governoratesWithin 5%2014 reproduces the declaration to the vote, 27 governorates plus 141 out-of-country committees. The 2012 first round is the Judges for Egypt count, 2.5–4.1% low: sound shares, unofficial levels.egypt.py278 lines
India3 elections · 20092024CSV archiveThe ECI's constituency detailed results, curated as open CSVs by the India Data Portal (EVM + postal votes per candidate)543 constituenciesWithin 0.1%Lok Sabha 2009, 2019 and 2024 (post-2008 delimitation; 2004 and the incomplete 2014 compilation excluded). Top parties reconcile within 0.1%; constituency winners are marked elected, drawing the hemicycle. NOTA rides as a null ballot. 2009 carries 541 of 543 seats, 2024 542 (Surat unopposed).india.py196 lines
Nigeria3 elections · 20152023PDF · transcribedScanned result forms and press releases; the state table of the declaration transcribed37 statesWithin 0.2%2015 and 2019 reproduce the declaration to the vote. 2023's state figures sum 790 votes over the declared total, 0.17% at worst per candidate, printed on every run.nigeria.py265 lines
Colombia2 elections · 20222022JSON APIThe Registraduría's preconteo JSONs, one document per puesto, fetched with a thread pool and cached13,217 puestosWithin 1%Presidential 2022 both rounds across 13,261 puestos: every puesto's tickets sum to its own valid count, top tickets within 1% of the published preconteo. The consulate vote is an off-map unit.colombia.py279 lines
El Salvador2 elections · 20192024PDF · transcribedThe TSE's results portal (offline since the count, cited via the Wayback Machine); the department tables transcribed15 departmentsWithin 2%Presidential 2019 and 2024 across the 14 departments plus the exterior vote (off-map). 2024 reconciles to the vote up to one ballot; 2019's Calleja department figures sum 1.26% short of the national table.el_salvador.py255 lines
Iran2 elections · 20242024PDF · transcribedThe Interior Ministry's count via state media (no data file); the provincial tables transcribed31 provincesWithin 1%2024 both rounds across the 31 provinces. First round reconciles to the vote; the runoff provinces sum 0.2–0.6% short. Candidates grouped by wing (Reformists/Principlists); shown as published returns with the vetting caveat in the script.iran.py261 lines
Kenya2 elections · 20172022PDF · transcribedScanned Forms 34A/34B on the IEBC portal (images, not data); the 2017 county tallies transcribed, the 2022 county file compiled from the IEBC's gazette notices and declaration49 countiesWithin 0.5%2017 is the annulled August count as announced (counties +0.03% over the national table). 2022 reconciles to the vote for all four tickets; the diaspora and 2017 prisons tallies are off-map units.kenya.py345 lines
Peru2 elections · 20212021CSV archiveOne zipped CSV per round on the open-data platform, with a dictionary naming the vote columns86,254 mesasWithin 0.5%Every mesa must sum to its own valid-vote count and every candidate to ONPE's declared total. The first round is exact for all eighteen candidates; the runoff is 0.005% short of the proclamation.peru_onpe.py239 lines
Russia2 elections · 20182024PDF · transcribedThe CEC's Russian-language database (captcha-gated bulk access); 2018 subject figures transcribed, 2024 precinct and remote-e-voting tallies parsed by observers and republished by electoral.graphics87 federal subjectsWithin 6%2018 reconciles within 0.5% per candidate; 2024 covers 95% of the declared valid vote (hidden DEG regions and occupied territories). Shown as the published returns, with the integrity caveat in the pipeline docstring.russia.py377 lines
South Africa2 elections · 20192024CSV archiveThe IEC's downloadable report data: every party's vote in ~23,000 voting districts, with electorate and spoilt ballots23,289 voting districtsWithin 1%Reconciled against the IEC declaration (2019 ANC 10,026,475 to the vote); the voting-district file omits the special and foreign votes folded into the declaration.south_africa.py198 lines
Paraguay1 election · 20232023SpreadsheetsThe TSJE's open-data workbook on datos.gov.py: one row per mesa with every list's votes12,233 mesasWithin 0.5%Presidential 2023 across 12,259 mesas: every ticket within 0.5% of the definitive cómputo (the workbook is the TREP snapshot). Null/blank ride as spoilt ballots; the exterior vote is off-map.paraguay.py178 lines
Tunisia1 election · 20242024PDF · transcribedISIE press releases and PDFs; the governorate table transcribed25 governoratesWithin 0.5%2024 presidential across the 24 governorates plus the diaspora (off-map). Governorate cells sum 4,000 short of the table's own Saied total (0.16%), bounded and printed.tunisia.py236 lines
France57 elections · 19992026Spreadsheets43 data.gouv.fr resources at bureau-de-vote level, in five different column layouts across 27 years70,082 bureaux de voteAs publishedThe Ministère de l'Intérieur's own files, resolved through the data.gouv.fr API and read as published; 57 election-rounds across nine offices.france_datagouv.py+2 more1,262 lines
Chile50 elections · 19582025SpreadsheetsMesa-level ZIPs, one Excel workbook per region, a 30-year presidential workbook and ~7,000 static commune pages on the historical site46,639 mesasAs publishedSERVEL's own tables, read as published; the control-sum rows the workbooks carry are dropped rather than trusted. 50 elections across nine offices.chile_2025_servel.py+8 more940 lines
Brazil3 elections · 20182022CSV archiveThe TSE open-data ZIP of votes by municipality and electoral zone; the CDN refuses scripted downloads6,240 zonesAs publishedNotebook-era conversion; not yet reconciled against the TSE declaration.brazil.py56 lines
Estonia3 elections · 20152024HTML pagesTwelve district result pages on valimised.eenational totalsAs publishedNotebook-era conversion; the committee's own district pages read as published.estonia.py54 lines
Romania2 elections · 20092009JSON APIThe AEP's data endpoint, scraped by polling station21,706 polling stationsAs publishedNotebook-era conversion; not yet reconciled against the AEP declaration.romania.py61 lines
Mexico1 election · 20182018CSV archiveINE's pipe-delimited cómputos base, one row per casilla156,458 casillasAs publishedNotebook-era conversion; not yet reconciled against INE's declaration.mexico.py79 lines
New Zealand1 election · 20232023CSV archiveOne CSV per electorate of voting-place results2,789 voting placesAs publishedNotebook-era conversion; not yet reconciled against the Commission's declaration.new_zealand.py86 lines

A person reads and signs off every script and every discrepancy note before it is merged; the repository history shows who did what. Read how the agents work and where the limits are, or the source audit with every URL and its verification date.