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.

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

votes.csv · votes.json

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

members.csv · members.json

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

groups.csv · groups.json

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.

Dataset
Scope

Loading…