Free, open football data for 2026/27 — 75 competitions as clean CSV files, refreshed every day.
Match results, upcoming fixtures, half-time scores, goal minutes and detailed match statistics — shots, shots on target, fouls, yellow/red cards and corners (including first- and second-half corner splits) — for the Premier League, La Liga, Serie A, Bundesliga and Ligue 1, the UEFA Champions/Europa/Conference Leagues, and 70 more competitions across Europe, South America, North America, Asia and Oceania.
One fixed schema across every league. No API key, no signup, no rate limits,
no paid feed — plain UTF-8 CSV you can curl, load with pandas/DuckDB/R, or
commit into your own project.
curl -O https://raw.githubusercontent.com/oladeeayo/open-matchday/master/data/ENG_1_premier-league/results_2627.csvSeason code: folder and file names use
2627= 2026/27. Calendar-year competitions (Brazil, Argentina, Mexico, USA, Japan, China) run Jan–Dec and therefore also contain their early-2026 matches.
- Get the data
- Quick start
- What you get
- Find your competition
- Data dictionary
- Coverage and freshness
- How it is built
- Limitations
- License and attribution
- Need more advanced data?
- Citation
- Repository layout
Four ways, pick whichever fits you:
1. One-off download — no git needed. Grab the whole dataset as a ZIP:
https://github.com/oladeeayo/open-matchday/archive/refs/heads/master.zip
2. Single file with curl.
curl -O https://raw.githubusercontent.com/oladeeayo/open-matchday/master/data/ESP_1_la-liga/results_2627.csv3. Shallow clone (only the current state, no history):
git clone --depth 1 https://github.com/oladeeayo/open-matchday.git4. Hotlink via CDN. jsDelivr mirrors the repository with edge caching — friendlier for web apps and repeated reads:
https://cdn.jsdelivr.net/gh/oladeeayo/open-matchday@master/data/ENG_1_premier-league/results_2627.csv
For reproducible research, pin a commit SHA instead of master:
git rev-parse HEAD
# then use .../open-matchday/<sha>/data/...import pandas as pd
BASE = "https://raw.githubusercontent.com/oladeeayo/open-matchday/master/data"
df = pd.read_csv(f"{BASE}/ENG_1_premier-league/results_2627.csv")
df[df.gw == 6] # one gameweek
df[df.home == "Arsenal"] # one team
df.groupby("home")["ft_home"].sum().sort_values(ascending=False) # home goalsSELECT home,
count(*) AS played,
sum(ft_home) AS goals_for,
avg(home_corners) AS avg_corners
FROM read_csv_auto(
'https://raw.githubusercontent.com/oladeeayo/open-matchday/master/data/ENG_1_premier-league/results_2627.csv'
)
GROUP BY home
ORDER BY goals_for DESC;df <- read.csv("https://raw.githubusercontent.com/oladeeayo/open-matchday/master/data/ESP_1_la-liga/results_2627.csv")
subset(df, home == "Real Madrid")| Competitions | 75 (see LEAGUE_INDEX.md) |
| Finished matches | 8,500+ result rows and growing daily |
| Upcoming fixtures | 9,100+ fixture rows |
| Goal events | 1,900+ goal rows (top-5 leagues, Germany 1–3, UEFA) |
| Format | UTF-8 CSV, one folder per competition, fixed header |
| Update cadence | Daily at 00:00 UTC via GitHub Actions |
| Access | ZIP download, git clone, raw GitHub, jsDelivr CDN |
| Cost | Free for informational, non-commercial use |
Every competition folder contains:
data/ENG_1_premier-league/
results_2627.csv finished matches — score, HT, stats, corners, goal minutes
fixtures_2627.csv upcoming matches — gw, date, time, home, away
goals_2627.csv goal-by-goal detail (only where a provider supplies it)
Folder names follow <COUNTRY>_<TIER>_<league-slug>:
| Folder | Competition |
|---|---|
ENG_1_premier-league |
Premier League |
ESP_1_la-liga |
La Liga |
GER_1_bundesliga |
Bundesliga |
ITA_1_serie-a |
Serie A |
FRA_1_ligue-1 |
Ligue 1 |
NED_1_eredivisie |
Eredivisie |
POR_1_primeira-liga |
Primeira Liga |
BEL_1_pro-league |
Belgian Pro League |
TUR_1_super-lig |
Süper Lig |
GRE_1_super-league |
Super League Greece |
UEFA_1_champions-league |
UEFA Champions League |
ENG_2_championship |
EFL Championship |
BRA_1_serie-a |
Brasileirão Série A |
USA_1_mls |
Major League Soccer |
The complete list of all 75 competitions, with the source used for each, is in LEAGUE_INDEX.md.
Full field-by-field documentation (types, nullability, sources, examples): DATA_DICTIONARY.md.
results_<season>.csv in brief:
| Column | Type | Meaning |
|---|---|---|
gw |
int | Gameweek / matchday (true round where the provider supplies one) |
date |
YYYY-MM-DD |
Match date (UTC) |
time |
HH:MM |
Kickoff, CET-1 convention; blank when unknown |
home, away |
text | Team names in provider spelling |
ft_home, ft_away, ft_result |
int, int, H/D/A |
Full-time score and result |
ht_home, ht_away, ht_result |
int, int, H/D/A |
Half-time score (blank when unavailable) |
home_shots … away_red |
int | Shots, shots on target, fouls, corners, cards (blank when unavailable) |
home_corners_1h, away_corners_1h |
int | First-half corners — top-10 leagues only |
home_corners_2h, away_corners_2h |
int | Second-half corners — top-10 leagues only |
goal_minutes |
text | Comma-separated goal minutes, e.g. "12,45,90" |
source |
text | openligadb, fixturedl, espn, fd.co.uk or soccerway |
fixtures_<season>.csv has gw, date, time, home, away and no scores.
goals_<season>.csv has gw, date, home, away, minute, score_home, score_away, scorer.
Coverage is deliberately uneven: every competition has results and fixtures, but detailed stats depend on which free provider covers that league.
| Data | Coverage |
|---|---|
| Results + fixtures | All 75 competitions (cups gain fixtures round by round) |
| Half-time scores | ~20% of result rows (football-data.co.uk and OpenLigaDB leagues) |
| Shots / fouls / cards | ~19% of result rows (football-data.co.uk leagues) |
| Corner totals | ~19% of result rows |
| Corner 1H + 2H splits | Every played match in the top-10 leagues (784 rows and growing) |
| Goal minutes | ~8% of result rows (top-5, Germany 1–3, UEFA) |
- Updated daily at 00:00 UTC by GitHub Actions; a red run means the dataset was not published, so what you see here always passes validation.
- football-data.co.uk supplies match statistics and may lag by a gameweek or two; scores are refreshed daily from fresher sources.
- The last build timestamp and per-league counts live in build_summary.json.
- Fixture lists are complete where a provider publishes a full-season spine; other competitions grow as schedules are released.
A small Python pipeline (standard library only, no dependencies) merges several keyless free sources into one normalised record per match, then publishes the generated CSVs to this repository daily:
fixturedownload.com ─┐
OpenLigaDB ──────────┤
ESPN site API ───────┼─► merge / normalise / dedupe ─► data/<league>/*.csv
football-data.co.uk ─┤
Fotmob ──────────────┤
Soccerway ───────────┘
Merge priority is OpenLigaDB > fixturedownload > ESPN > football-data.co.uk > Soccerway, with fuzzy team-name matching, ambiguity guards and postponement
handling. The top-10 leagues additionally get per-match corner totals and
half-by-half splits from FotMob. The build pipeline itself runs in a private
repository; this one stays focused on the published data and its documentation.
- Not live. Scores refresh once a day; do not use this for in-play data.
- Nulls are real. Blank means "no free source provided it", never zero.
- Derived gameweeks. Only OpenLigaDB and fixturedownload supply official
round numbers; elsewhere
gwis clustered into Mon–Sun weeks. - Provider spelling. Team names follow the winning source; the same club can appear under a different spelling in another competition.
- Kickoff times use a fixed CET-1 offset, so summer fixtures can be one hour off local time.
- No xG, lineups, injuries, odds or play-by-play. Goals are available as minutes (and scorers for German leagues), not full event data.
- Coverage varies. Check the per-competition table in LEAGUE_INDEX.md before relying on a stat for a league.
This compilation is shared for informational, non-commercial use.
- You may use it in personal projects, research, journalism, dashboards and open-source tools, with attribution.
- You may not sell it, sub-license it, charge for access, or present it as a commercial data feed.
- Attribute by linking to this repository and naming
open-matchdayas the source. - Provider rights remain with the providers. football-data.co.uk, ESPN, FotMob, Soccerway, OpenLigaDB and fixturedownload have their own terms; this repository's compilation does not override them. Read DISCLAIMER.md before redistributing.
There is no OSI-approved license file because the upstream data is non-commercial; the terms above and in DISCLAIMER.md are the license.
The published CSVs are deliberately broad and free. If you need something more sophisticated or advanced — xG, lineups, per-shot events, historical seasons, odds, a bespoke export for your model or study — here's how to reach out:
- Open an issue for questions, data requests, or ideas. This is the best first step: we can scope what you need, and the answer stays visible to everyone who wants the same thing.
- Open a pull request when you already have a concrete fix or addition — a correction backed by an official source, a new competition, or a schema improvement. Keep the CSV schema stable and describe your source in the PR.
- For research collaborations or larger custom datasets, open an issue and say what you're building; we'll work out the details there.
Feature requests are welcome — this dataset grows because users ask for things.
If you use this dataset in published work, cite the repository. A machine-readable record is provided in CITATION.cff.
@misc{openmatchday2026,
title = {open-matchday: free 2026/27 football results, fixtures and match statistics},
author = {{open-matchday contributors}},
year = {2026},
howpublished = {\url{https://github.com/oladeeayo/open-matchday}},
note = {Season 2026/27, accessed 2026-10-28}
}data/<COUNTRY>_<TIER>_<league-slug>/
results_<season>.csv finished matches
fixtures_<season>.csv upcoming matches
goals_<season>.csv goal events (where available)
build_summary.json per-league row counts and errors from the last build
LEAGUE_INDEX.md generated index of all 75 competitions
DATA_DICTIONARY.md field-by-field schema reference
CITATION.cff citation metadata
DISCLAIMER.md provider terms, data rights, no-warranty notice
Not affiliated with any league, club, federation or commercial data provider.