Skip to content

Week 1 — What free football data can still tell you

Published: 2026-08-29 · Snapshot: 2026-W35 · Claim level: L1 (descriptive)


The question, registered before the data was pulled

Of the free, public football data that exists today, how much can actually support an analytical claim, and how much only looks like it can?

I wanted to start this project by measuring fouls and cards. Before writing any model, I checked what data was available. That check turned out to be the more interesting result, so it is Week 1.

Why this question, this week

Two things changed recently and neither is widely understood.

FBref lost its Opta licence on 20 January 2026. Expected goals, possession, passing, progressive actions and defensive actions were removed site-wide, including from historical archives. Pressures had already gone in the October 2022 provider switch. For years FBref was the default free source for anyone doing public football analysis. Most of what made it useful is gone.

What remains is smaller than it looks. football-data.co.uk is now the most complete free source of match-level football statistics. Its documentation describes a file that no longer exists.

So rather than assume, I measured.

Data

I probed the CSV header of every league-season file across 11 European top divisions and 26 seasons (2000-01 to 2025-26): 286 league-season files. Each probe streams only the first line, so the whole audit costs kilobytes.

The result is committed as a Parquet snapshot with a manifest recording the source URL, fetch time, row count, schema hash and a SHA-256 of the bytes. Every number below is re-derivable from that snapshot offline.

Four findings

1. Match statistics were never backfilled

Coverage timeline

Fouls and cards arrived league by league across seventeen years. England and Scotland from 2000-01; Italy and Spain from 2005-06; France from 2007-08; the Netherlands, Portugal and Turkey only from 2017-18; Belgium and Greece only from 2019-20.

179 of 286 league-season files carry fouls and cards. The other 107 exist, download fine, and parse fine. They simply have no football in them.

This matters more than it sounds. A researcher pulling "twenty-six seasons of Portuguese football" gets twenty-six files and nine seasons of data, with no error raised anywhere in that process.

2. Germany's series is interrupted, not late

Germany has fouls and cards in 2000-01 and 2001-02, nothing in 2002-03, and continuous coverage from 2003-04. The same two early seasons are the only German files that carry a referee column.

So Germany's record was richer twenty-five years ago than it was three years later, and was only partly restored. A naive "first season with data" rule reports Germany as starting in 2003 and silently discards two real seasons.

3. Referee coverage narrowed rather than grew

League Referee named
England 2000–2025, continuous
Scotland 2000–2025, except 2012-13
Germany 2000–2001 only
Italy 2005–2006 only
Spain, France, Portugal, Netherlands, Belgium, Turkey, Greece never

Two associations had it and lost it. This is a hard constraint on what can be studied: the disciplinary literature is unanimous that referee identity is a first-order confounder — Dawson et al. (2007) find significant referee-to-referee inconsistency in card issuance — and in nine of eleven leagues we cannot observe it at all.

4. The files doubled in width while the football stayed flat

Width versus football

Median columns per file went from 25 in 2000 to 131 in 2025. Columns that describe what happened in the match went from 0 to 12, and have not moved since 2007.

Everything else is betting odds.

The site is explicitly a betting-data resource and has never claimed otherwise, so this is not a complaint. It is an illustration of how a data source grows in the direction its users pull it. If you are not the paying use case, your columns are the ones that stop being maintained. Offsides, woodwork and bookings points were all present in 2000-01 and dropped. Free-kicks-conceded survived to 2017-18. All four are still in the documentation today.

What this means for the project

  • The analytic window is per league, not global. Portugal supports nine seasons of discipline analysis, England twenty-six.
  • Referee effects can be estimated directly in England and Scotland only. Everywhere else they must be conditioned out. That is possible because both teams in a match face the same referee, so a within-match comparison removes referee strictness exactly without ever observing it. That is the model this project will use, and it exists because of a data constraint rather than a statistical preference.
  • Any metric depending on possession, pressures, passing or event location is not available from free sources for current seasons. Not difficult to obtain: absent. That list is in the README so no future contributor builds on a column that does not exist.

Confounders and limits

This is an audit of column presence, not data quality. A column being present does not mean it is correct, complete, or consistently defined across leagues. Two known definitional traps already identified: English and Scottish yellow-card counts exclude the first yellow of a second-bookable offence, while other countries count both; and the yellow-card column counts all yellows — dissent, time-wasting, bench cards — while the natural denominator for a card rate is fouls alone.

I have not verified row-level completeness within files. That is a separate audit, and it is next.

The data lesson

A file that downloads is not a file that answers your question, and nothing in your pipeline will tell you the difference.

Every one of those 107 empty league-seasons returns HTTP 200, parses without warning, and yields a DataFrame. You get a result, it looks plausible, and it is built on nothing.

The general form is a dependency you did not know you had, maintained by someone with no obligation to your use case, changing on a schedule you do not control. FBref's users discovered this in January. Provenance metadata is what turns that from a silent failure into a loud one: a schema hash and a row count per fetch would have caught every case above on the first run.

Where the machine got it wrong

This project uses language models for literature search, code drafting and hypothesis generation, and distrusts them structurally for anything that is a number, a citation or a claim. The reasoning is in AI_WORKFLOW.md. Week 1 produced the first worked example, and it went exactly the way that document predicts.

The bibliography below is checked in CI by resolving every DOI through content negotiation and comparing the registered title against the title claimed. On its first run it failed, on a reference written for this report. The DOI for the Phatak et al. paper had been recorded by construction rather than by lookup, and 10.2478/hukin-2021-0102 registers a paper about circuit training in prepubertal boys. The real one is -0095.

That failure mode is worth being precise about. A fabricated citation is easy to catch, because nothing resolves. A real identifier pointing at the wrong work resolves perfectly, looks correct in every rendered bibliography, and is what any process that half-remembers a reference will produce. Checking that a DOI exists is not enough. The check has to compare what came back against what was claimed, and it stays in CI for that reason.

Tri-anchor

Nothing is published here without all three.

Anchor Source
Data This project's own audit of 286 league-season files, snapshot 2026-W35, committed
Football Dawson et al. (2007) on referee inconsistency; Phatak et al. (2021) on why discipline metrics are inseparable from league context
Data science Gebru et al. (2021), Datasheets for Datasets; Wilkinson et al. (2016), FAIR principles
AI practice AI_WORKFLOW.md, and the CI citation check described above

References

Reproduce this

git clone https://github.com/vidigalp/tactical-football-analytics
cd tactical-football-analytics
uv sync --all-extras --dev

# Figures and facts, entirely from the committed snapshot — no network needed
uv run python scripts/build_week01.py

# Re-run the audit against the live site
uv run python scripts/run_audit.py --from 2000 --to 2025

Next

The row-level completeness audit, then the first properly powered discipline model: England and Scotland with referee effects estimated directly, everywhere else with referee conditioned out within match.