Download data
Open data · CC BY 4.0
All 788 files of the 10th parliamentary term with a roll-call vote, 652 of them with a final vote, and 566,273 individual votes. As CSV and JSON, straight from the European Parliament's Open Data Portal, free to reuse under CC BY 4.0.
CSV + JSON of all tables, README, datapackage.json and licence in one archive.
- openrcv-daten.zip
- votes.csv
- member_votes.csv
- openrcv-daten-alle.zip
- votes_all.csv
- member_votes_all.csv.gz
- datapackage.json
Individual tables
For an overview in Excel, votes.csv is enough; how each person voted is in member_votes, names and political groups are in members.
votes
Files with a roll-call vote, one main vote per file · 788 rows
Columns and meaning
vote_id- Unique identifier: date_VOT-ITM-number (e.g. 2026-06-17_992855). The date prefix ensures global uniqueness, since procedural agenda votes are numbered only per day.
date- Vote date (ISO 8601)
title- Title of the file
reference- Reference number (e.g. A10-0048/2026)
committee- Lead committee (abbreviation)
committee_full- Lead committee name (short name from the EP vocabulary, full official name for special and inquiry committees; BUDE/LEGI own wording)
rapporteur- Rapporteur (A-reports only)
roll_call_final_vote- true = there was a roll-call final vote; false = only roll-call amendments/procedural votes (final vote by show of hands) → no result/count
result- Result (ADOPTED / REJECTED / …)
count_for- Official number of votes in favour
count_against- Official number of votes against
count_abstention- Official number of abstentions
topics- EuroVoc topics, separated by “; ”
rollcall_count- Number of roll-call votes on the file
session- Plenary session (label)
url- Link to the detail page on openrcv.eu
member_votes
Individual member votes (incl. corrections) · 566,273 rows
member_votes.csv · member_votes.csv.gz · member_votes.json.gz
Columns and meaning
vote_id- Reference to votes.vote_id
member_id- Reference to members.member_id (EP MEP ID)
position- Position: FOR / AGAINST / ABSTENTION / EXCUSED (officially excused) / DID_NOT_VOTE (in mandate but did not vote)
position_corrected- Intended vote per official correction (empty = no correction). The official result is unaffected.
members
MEPs, current and former · 743 rows
Columns and meaning
member_id- EP MEP ID
first_name- First name
last_name- Last name
country_code- Member state (ISO-2)
country- Member state (German name)
group_code- Group code
group_label- Group (short label)
party- National party (abbreviation)
party_full- National party (full name)
groups
Political groups · 9 rows
Columns and meaning
code- Group code
label- Short label
label_full- Full name
countries
Member states · 27 rows
countries.csv · countries.json
Columns and meaning
code- ISO-2 code
name- German name
Licence and attribution
The underlying data come from the European Parliament (Open Data Portal) and are available under CC BY 4.0. When reusing, please cite the source:
Data source: European Parliament (Open Data Portal), prepared by OpenRCV (https://openrcv.eu/en/daten.html), CC BY 4.0.
There is no share-alike obligation: the data are freely reusable.
Quick start
Example with Python/pandas: analyse how a Member voted:
import pandas as pd
votes = pd.read_csv("votes.csv")
mv = pd.read_csv("member_votes.csv")
members = pd.read_csv("members.csv")
# How did MEP 124834 vote?
df = mv[mv.member_id == 124834].merge(votes, on="vote_id")
print(df[["date", "title", "position", "position_corrected"]])The same in R, without extra packages:
votes <- read.csv("votes.csv", encoding = "UTF-8")
mv <- read.csv("member_votes.csv", encoding = "UTF-8")
# How did MEP 124834 vote?
df <- merge(mv[mv$member_id == 124834, ], votes, by = "vote_id")
df[, c("date", "title", "position", "position_corrected")]Source: European Parliament open data (CC BY 4.0), prepared by OpenRCV.
Loading…