Appendix B
Football data sources
Six football data sources compared: what each one covers, what it costs, and what its licence actually lets you do.
Chapter 22 opened the cupboard and showed you what was on the shelves. This appendix is the full stock list: one page per major source, what it covers, what it costs, what its small print says, and how it has broken before. Every entry below is accurate as this book went to press, checked against the fact-check register and, where the register flagged a gap, flagged again here rather than guessed at. Treat every line as a snapshot, not a promise. Before you build anything on a source named here, read that source's own current documentation and note the date you checked it; that single habit is worth more than the rest of this appendix put together.
1. Football-data.co.uk
Coverage. English football back to the 1993/94 season; major European leagues from around 2000/01; pre-match odds bookmaker by bookmaker across a dozen or more firms, nearly as far back, covering match result, Over/Under 2.5 goals and Asian handicap markets alike.
Format. Free downloadable CSV, one file per league per season. Columns include date, teams, full-time and half-time score, referee, and per-bookmaker odds for each market, with Avg (mean price across firms collected that week) and Max (best single price on each outcome) summary columns. Some recent seasons add a genuine closing-price column, marked with a C suffix (B365CH, PSCH).
Licence. Free for personal use, per the site's own notes file. Long associated with the analyst and author Joseph Buchdahl (Chapters 12, 14, 15).
Traps. The unsuffixed odds columns are Friday-afternoon or Tuesday-afternoon snapshots, not closing prices; the exact season the C-suffixed closing columns begin is not confirmed by this book's fact-check register . The Max column stitches together the best home, draw and away price from three different books; its implied probabilities can sum to under 100 per cent, which looks like an arbitrage and rarely is one you could actually strike. Team names are not standardised across seasons ("Man United" against "Man Utd", "Nott'm Forest" against "Nottingham Forest").
Loading recipe. Download the season file. Map every team-name variant to one canonical ID before any join. Treat unsuffixed odds as a snapshot, never a closing price, until you have confirmed the C-suffix convention against the current notes.txt. Sum the Avg column's implied probabilities before trusting anything the Max column appears to offer; on the specimen prices worked in Chapter 22 (2.10, 3.40, 3.60), that sum comes to 1.0481, a 4.8 per cent overround, entirely ordinary for a high-street average.
2. FBref
Coverage. Results, fixtures, standard statistics and squad records across most major leagues and many minor ones. Counting stats (goals, cards, appearances, minutes) run deep; advanced, model-derived statistics (expected goals and similar) depend entirely on whichever provider currently licenses the site.
Format. Browsable tables, run by Sports Reference, with a CSV export available per table.
Licence. Free to browse. No blanket permission for commercial redistribution of scraped data; check the site's current terms before building a product on it, not just a spreadsheet for yourself.
Traps, date-stamped. FBref ran on StatsBomb's data until Stats Perform's Opta feed replaced it, announced 25 October 2022. On 20 January 2026, Sports Reference removed Opta's advanced statistics, including expected goals, with immediate effect, after a dispute between the two companies; the removal was reported within days by The IX Sports and the analyst Ricardo Heredia. Counting stats survived both changes untouched, because they rest on the referee's report and the matchsheet, not a vendor's proprietary model. Check FBref's current advanced-stats offering before relying on it ; assume nothing carried over from any account of it written before January 2026, this book's own included.
Loading recipe. Use FBref for counting stats and fixture lists with confidence. Before pulling any advanced or model-derived column, read the page's own footnote for its current data source, note that date, and calendar a recheck; do not assume the schema you see today is the schema a scraper written six months ago still expects.
3. StatsBomb Open Data
Coverage. Full event-level data for a curated set of historic competitions: Lionel Messi's entire recorded La Liga career, the men's World Cups of 2018 and 2022, Euro 2020 with 360 freeze-frame tracking, Arsenal's 2003/04 Invincibles season, and a run of Women's Super League seasons.
Format. JSON event files in a public repository, with free tutorials and a Python library (statsbombpy) built for loading them.
Licence. Free for non-commercial and research use under StatsBomb's own published open-data terms; commercial use needs a separate arrangement with the company.
Traps. Not current and not comprehensive across every league or season; it will tell you nothing about next Saturday. Its strength is learning event-based modelling or testing a method against a season everybody already knows the answer to, not live use.
Loading recipe. Install statsbombpy, or work directly from the repository, and filter by competition and season ID. Tag every shot with its source before merging it with any other provider's data; expected-goals values are not directly comparable across providers, a point Chapter 19 makes at length, and a blended dataset with no source tag will quietly average two different models together without telling you.
4. Understat
Coverage. Free per-shot expected goals for the "Big 5" European leagues plus Russia, dating back to the 2014/15 season.
Format. Shot-level data generated by Understat's own neural network model, not licensed from a data provider, with two well-used community scraping packages built around it (understatr for R, understat for Python).
Licence. Publicly published on the Understat site. There is no official public API, so ordinary scraping etiquette and the site's own terms apply.
Traps. These are Understat's own model's numbers, not Opta's or StatsBomb's; the same shot can carry a materially different expected-goals value depending on whose model produced it, and Understat's figures will not match either commercial provider for that reason alone. Coverage stops firmly at the Big 5 plus Russia.
Loading recipe. Install the relevant community package and pull by league and season. Tag every row with "Understat" as its expected-goals source, so it is never silently blended with a different provider's model further down your pipeline.
5. API-Football and similar aggregators
Coverage. Results, fixtures, odds and some statistics packaged across a wide range of competitions worldwide.
Format. JSON delivered via a REST API, on a tiered subscription.
Licence. A modest free allowance for testing, shaped by a daily request limit, then paid plans that scale with request volume and league coverage.
Traps. The free tier's request limit bites fast once you are pulling more than one league at a time. Coverage depth and odds-market breadth vary considerably by competition, so confirm exactly what a given paid tier includes before you commit to it.
Loading recipe. Register on the free tier first and confirm your actual competitions and markets are included at the tier you intend to pay for. Build your ingestion code to respect the published rate limit from the outset, rather than discovering it the day your pipeline gets throttled.
6. Enterprise feeds (Opta, StatsBomb's commercial product, Wyscout, Sportradar)
Coverage. Full coverage by competition and season, including in-play event streaming.
Format. Proprietary feeds and APIs, delivered under contract.
Licence. Licensed by competition and season to broadcasters, clubs and betting syndicates, not sold as a one-off download.
Traps. What a syndicate at this tier is actually buying is not a better spreadsheet than a careful reader's own; it is faster delivery, wider coverage, a contractual service level, an account manager to complain to, and a guarantee the feed will not simply vanish on a Tuesday, which is precisely the guarantee this appendix's free sources cannot offer at any price. Chapter 26 describes the syndicate scale at which this tier gets used.
Loading recipe. Not applicable to the individual reader building their own model; noted here for completeness, and so the size of the gap between the free tier and the professional one is never a mystery.
The standing instruction
Every source in this directory is a courtesy, not a contract, and the FBref entry above proves it twice over in the space of four years. Free infrastructure changes on a schedule nobody consults authors, or readers, about. Before you build anything, however small, on any source named here: open that source's own current documentation, read its notes file rather than somebody else's summary of it (including this one), and write down the date you checked. When the schema moves, and eventually it will, that date is the difference between noticing calmly and finding out the hard way, at midnight, wondering why your row count looks short.
None of this is a reason to distrust free data generally; it is a reason to date-stamp it specifically. The sources above have, between them, underwritten a large share of the football analytics work published anywhere, this book included, and most of that work holds up perfectly well once you know which numbers are counting facts (durable) and which are somebody's proprietary model output (liable to move house without warning). Keep the two apart in your own head, and in your own database's source column, and you will spend far less of your life debugging a spreadsheet than the punter who assumed a free column would simply stay put.
This is reference lifted from the book. The chapters are where the arithmetic gets built and argued for.
Out now · free to read on Kindle Unlimited