Football-Data.co.uk Scraper - Results, Stats & Odds avatar

Football-Data.co.uk Scraper - Results, Stats & Odds

Pricing

from $2.67 / 1,000 matches

Go to Apify Store
Football-Data.co.uk Scraper - Results, Stats & Odds

Football-Data.co.uk Scraper - Results, Stats & Odds

Scrape 240,000+ football matches from Football-Data.co.uk: 38 competitions, results, half-time scores, shots, cards, corners, referees, xG, and 1X2 / over-under / Asian handicap odds from 22 bookmakers.

Pricing

from $2.67 / 1,000 matches

Rating

0.0

(0)

Developer

ParseForge

ParseForge

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

3 days ago

Last modified

Share

ParseForge

Football-Data.co.uk Scraper - Results, Stats & Odds

Every match Football-Data.co.uk publishes, normalised into one schema. 304,000+ played matches across 38 competitions and 34 seasons, with full-time and half-time scores, shots, corners, cards, referees, expected goals, and 1X2, over/under and Asian handicap prices from 22 bookmakers. No API key, no login, no proxy. Export to CSV, JSON, Excel, or XML.

It is the football API alternative for anyone who needs history rather than live scores: one soccer dataset covering three decades, queryable by league, season, team, referee, scoreline, or price. Football-Data.co.uk is the reference free archive for football betting research, but it ships as 726 separate CSV files across which 233 distinct column names have appeared: HomeTeam is HT in the old Greek files, FTHG is HG in the extra leagues, 15 files are Windows-1252 rather than UTF-8, and a bookmaker that quoted every match in 2007 has no column at all in 2021. This Actor reads all of it, resolves every alias, and returns one stable row per match.

Who uses itWhat they pull
Bettors and tradersClosing lines, market margin, and pre-match to closing drift
Quants and modellersDecades of results plus odds, ready to back-test
Data scientistsA labelled corpus with the market's own probability attached
Sports journalistsHead-to-head records, streaks, and league tables on demand
App and site buildersFixtures with opening prices, refreshed on a schedule

What it does

The Actor downloads the season files you select, parses them, and writes one row per match. A row can carry:

  • The match: competition, country, tier, season, date, kick-off time, both teams, full-time and half-time score.
  • 📊 Every result flag already computed: total goals, goal difference, both-teams-scored, over 0.5/1.5/2.5/3.5, clean sheets, second-half goals, comeback detection, and league points for each side.
  • 🥅 Match statistics (opt-in): referee, shots, shots on target, corners, fouls, free kicks conceded, offsides, woodwork, yellows, reds, booking points, attendance, expected goals, plus shot accuracy and conversion rate.
  • 💷 Bookmaker odds (opt-in): 1X2, over/under 2.5 and Asian handicap, pre-match and closing, from up to 22 books including Bet365, Pinnacle, William Hill, bwin, BetVictor, Ladbrokes, Betfred, BetMGM, Coral, Paddy Power, Sky Bet, 1XBet and the Betfair Exchange.
  • 📈 Market consensus (opt-in): best and average price across the whole market for each market, and how many books that average was built from.
  • 🧮 Betting analytics (opt-in): implied and margin-free probabilities, overround, fair odds, favourite and underdog, best available price, expected-value edge, Kelly fraction, steamer/drifter flags, closing line value, and the settled profit or loss of a one-unit bet on each outcome.
  • 🔁 Head-to-head and form (opt-in): the two sides' entire meeting history in that competition, and both teams' rolling record going into the match.
  • 🏆 League tables (opt-in): a full table per competition-season, with split home and away records.

What you can do with football data

📉 Back-test a betting model.

Pull twenty seasons with closing odds and betting analytics on. Every row already carries the fair probability, the margin, and the P/L of a one-unit bet, so a strategy test is a groupby away.

🎯 Measure closing line value.

Turn on closing odds and analytics, and read clvWinnerPercent per match to see whether the price you would have taken beat the close.

🧠 Train a match-outcome model.

Combine results, shots, expected goals and team form into a feature table without joining four sources by hand — the form block is computed as of kick-off, so there is no leakage from the future.

🔎 Find market inefficiencies.

Filter on bookmaker margin, favourite side, or steamers over a threshold, and look at how often the drift was right.

📅 Track this week's fixtures.

Switch to the fixtures dataset and schedule it: upcoming matches with the current opening prices from every book that has quoted them.

Why choose this scraper

What you get
Nothing to authenticateNo API key, no account, no cookie. The source is public static hosting.
No proxy costMeasured HTTP 200 on every surface with a bare request. There is no proxy line on your bill.
38 competitions in one run22 European divisions, the biggest back to 1993/94, plus 16 more from Argentina to Japan.
Every legacy column resolvedOld alias names, retired bookmakers, and the 15 Windows-1252 files all land in the same schema.
Opt-in extras, off by defaultTen separate blocks, each its own checkbox. Leave them off and you are never billed for them.
Filters cut before billingFilters run on the complete match, so you can filter on shots or margin without buying those columns.
Pick by countryOne checkbox brings in every tier that country has, and a per-competition cap keeps one league from eating the run.
Signals already computedFair probabilities, margin, CLV, form and head-to-head, ready to sort.
Odds in your formatDecimal, fractional on the traditional UK ladder, or American.

How it compares

Be clear about the trade-off before you pick this one.

The source CSVs are free. Football-Data.co.uk hands anyone 726 files at no cost, and if you want one season of one league you should just download it. What you are paying for here is the other 725 files: the alias resolution, the encoding fallback, the filters, the computed analytics, the head-to-head and form indexes, and a scheduled run that keeps a warehouse table current without you maintaining a parser.

The only other Actor on this source takes four inputs — one league, one season, an odds on/off switch, and a row cap.

FeatureParseForgecrawlerbros/football-data-uk-scraperDownloading the CSVs yourself
Leagues per run38, any number at onceOneAny, by hand
Seasons per runAny range, 1993/94 onwardOneAny, by hand
Per-bookmaker odds resolved by name22 booksOne on/off switchRaw column names
Closing odds and pre-match driftYesNoRaw columns only
Computed probabilities, margin, CLVYesNoNo
Head-to-head and pre-match formYesNoNo
League tablesYesNoNo
Legacy alias columns resolvedYesNoNo
Upcoming fixtures with pricesYesNoYes, separate file
Filters42NoneNone
Price per 1,000 matches$3.00Per dataset itemFree

If your job is "download E0 for 2024/25 once", the free CSV wins and you should take it.

What a match looks like

Every match returns as one JSON row: 52 base columns plus one nested object per block you enabled. Here is a real record from a run with every block on, trimmed to four bookmakers:

{
"matchId": "300fd497fd08e094",
"recordType": "match",
"status": "played",
"source": "football-data.co.uk",
"sourceUrl": "https://www.football-data.co.uk/mmz4281/2526/E0.csv",
"competitionId": "E0",
"competitionName": "Premier League",
"country": "England",
"countryCode": "GB-ENG",
"tier": 1,
"leagueType": "main",
"season": "2526",
"seasonLabel": "2025/26",
"seasonStartYear": 2025,
"date": "2025-08-15",
"dateRaw": "15/08/2025",
"time": "20:00",
"dayOfWeek": "Friday",
"isWeekend": false,
"homeTeam": "Liverpool",
"awayTeam": "Bournemouth",
"fullTimeHomeGoals": 4,
"fullTimeAwayGoals": 2,
"fullTimeResult": "H",
"resultLabel": "Home win",
"scoreline": "4-2",
"winner": "Liverpool",
"loser": "Bournemouth",
"isDraw": false,
"halfTimeHomeGoals": 1,
"halfTimeAwayGoals": 0,
"halfTimeResult": "H",
"secondHalfHomeGoals": 3,
"secondHalfAwayGoals": 2,
"totalGoals": 6,
"goalDifference": 2,
"absGoalDifference": 2,
"bothTeamsScored": true,
"over05": true, "over15": true, "over25": true, "over35": true, "under25": false,
"homeCleanSheet": false,
"awayCleanSheet": false,
"homeFailedToScore": false,
"awayFailedToScore": false,
"isComeback": false,
"comebackTeam": null,
"homePoints": 3,
"awayPoints": 0,
"stats": {
"referee": "A Taylor",
"attendance": null,
"homeShots": 19,
"awayShots": 10,
"homeShotsOnTarget": 10,
"awayShotsOnTarget": 3,
"homeShotAccuracy": 0.5263,
"awayShotAccuracy": 0.3,
"homeConversionRate": 0.2105,
"awayConversionRate": 0.2,
"totalShots": 29,
"totalShotsOnTarget": 13,
"homeCorners": 6,
"awayCorners": 7,
"totalCorners": 13,
"homeFouls": 7,
"awayFouls": 10,
"homeYellowCards": 1,
"awayYellowCards": 2,
"homeRedCards": 0,
"awayRedCards": 0,
"totalCards": 3,
"homeExpectedGoals": null,
"awayExpectedGoals": null
},
"odds1x2": {
"bet365": {
"home": 1.3,
"draw": 6,
"away": 8.5
},
"pinnacle": {
"home": 1.28,
"draw": 6.56,
"away": 9.07
},
"betfairExchange": {
"home": 1.34,
"draw": 6.6,
"away": 9.4
},
"bookmakerCount": 9
},
"closingOdds": {
"bet365": {
"home": 1.29,
"draw": 6.25,
"away": 9
},
"pinnacle": {
"home": 1.29,
"draw": 6.55,
"away": 9.75
},
"bookmakerCount": 9,
"marketMax": {
"home": 1.31,
"draw": 6.6,
"away": 9.5
},
"marketAverage": {
"home": 1.29,
"draw": 6.02,
"away": 8.68
}
},
"overUnder": {
"prematch": {
"bet365": {
"over": 1.36,
"under": 3.2
},
"line": 2.5,
"marketAverage": {
"over": 1.35,
"under": 3.13
},
"bookmakerCount": 3
},
"closing": {
"bet365": {
"over": 1.36,
"under": 3.2
},
"line": 2.5,
"marketAverage": {
"over": 1.36,
"under": 3.05
},
"bookmakerCount": 3
}
},
"asianHandicap": {
"prematch": {
"bet365": {
"home": 1.83,
"away": 2.03,
"line": null
},
"line": -1.5,
"lineLabel": "Home -1.5",
"marketAverage": {
"home": 1.78,
"away": 1.99
},
"bookmakerCount": 3
},
"closing": {
"line": -1.75,
"lineLabel": "Home -1.75",
"marketAverage": {
"home": 1.94,
"away": 1.76
},
"bookmakerCount": 3
}
},
"marketConsensus": {
"maxHome": 1.34,
"maxDraw": 6.5,
"maxAway": 9.5,
"avgHome": 1.31,
"avgDraw": 5.96,
"avgAway": 8.31,
"maxClosingHome": 1.31,
"avgClosingHome": 1.29,
"bookmakersUsed1x2": null
},
"analytics": {
"referenceSource": "market average",
"referenceIsClosingPrice": false,
"bookmakersPricing": 9,
"referenceHomeOdds": 1.31,
"referenceDrawOdds": 5.96,
"referenceAwayOdds": 8.31,
"closingHomeOdds": 1.29,
"closingDrawOdds": 6.02,
"closingAwayOdds": 8.68,
"impliedProbabilityHome": 0.7634,
"overround": 0.0515,
"overroundPercent": 5.15,
"fairProbabilityHome": 0.726,
"fairProbabilityDraw": 0.1596,
"fairProbabilityAway": 0.1144,
"fairOddsHome": 1.377,
"favourite": "home",
"favouriteOdds": 1.31,
"favouriteProbability": 0.726,
"underdog": "away",
"underdogOdds": 8.31,
"favouriteWon": true,
"underdogWon": false,
"isUpset": false,
"winnerOdds": 1.31,
"profitHome": 0.31,
"profitDraw": -1,
"profitAway": -1,
"profitFavourite": 0.31,
"bestPriceHome": 1.34,
"bestValueSide": "away",
"bestValueEdgePercent": 8.72,
"bestValueKellyFraction": 0.0103,
"oddsMovementHomePercent": -1.53,
"steamerSide": "home",
"drifterSide": "away",
"closingOverround": 0.0565,
"clvWinnerPercent": 1.55
},
"headToHead": {
"meetings": 16,
"homeTeamWins": 13,
"draws": 1,
"awayTeamWins": 2,
"homeTeamWinRate": 0.8125,
"averageTotalGoals": 3.63,
"bothTeamsScoredRate": 0.3125,
"over25Rate": 0.8125,
"lastMeetingDate": "2025-02-01",
"lastMeetingScore": "0-2",
"lastMeetingWinner": "Liverpool",
"last5Results": [
"2024-09-21 Liverpool 3-0 Bournemouth",
"2025-02-01 Bournemouth 0-2 Liverpool"
],
"homeVenueMeetings": 8,
"homeVenueWins": 7
},
"form": {
"window": 6,
"home": {
"matchesPlayed": 6,
"wins": 2,
"draws": 2,
"losses": 2,
"points": 8,
"pointsPerGame": 1.33,
"goalsFor": 12,
"goalsAgainst": 10,
"goalDifference": 2,
"formString": "WWLDLD",
"currentStreak": "1D",
"unbeatenRun": 1,
"cleanSheets": 1
},
"away": {
"matchesPlayed": 6,
"wins": 2,
"draws": 2,
"losses": 2,
"points": 8,
"pointsPerGame": 1.33,
"goalsFor": 6,
"goalsAgainst": 6,
"goalDifference": 0,
"formString": "DDWLLW",
"currentStreak": "1W",
"unbeatenRun": 1,
"cleanSheets": 2
}
},
"scrapedAt": "2026-08-25T17:23:30.191Z"
}

Field counts with everything on: 52 base columns, 38 statistics, up to 22 bookmakers × 3 prices per market, 15 market-consensus columns, 56 analytics columns, 14 head-to-head columns and 27 form columns.

With League tables on, the run also writes recordType: "standing" rows: team, position, played, W/D/L, goals for and against, goal difference, points, points per game, split home and away records, clean sheets, both-teams-scored and over-2.5 counts, and recent form.

What the source actually carries

Coverage is not uniform, and the Actor does not invent columns. Measured across all 726 files:

DataAvailable fromWhere
Result, half-time score1993/94Every main league
Shots, corners, fouls, cards, referee2000/01Main leagues
Attendance, woodwork, offsides, booking points2000/01 - 2001/02 onlyEngland, Scotland, Germany
Bet365 1X2 and over/under 2.52002/03Main leagues
BetBrain market aggregates2005/06 - 2018/19Main leagues (retired since)
Pinnacle2012/13Main leagues
Extra leagues (closing odds only)2012Argentina, Brazil, MLS and 13 more
Free kicks conceded instead of fouls2017/18 - 2018/19France 2, Belgium, Greece
Kick-off time, closing odds, market max/average, Asian handicap line2019/20Main leagues
Betfair Exchange prices2024/25Main leagues
Expected goals (xG)2026/2717 of 22 main leagues

Bookmakers come and go: Bet365 prices appear in 544 of the 710 season files, Pinnacle in 308, BetMGM in only 22. The bookmakerCount on each odds block tells you how many actually priced that match.

Configure the run

Pick leagues, pick a season range, tick the blocks you want. The Input tab lists all 64 parameters, 42 of them filters.

One Premier League season, results only:

{ "leagues": ["E0"], "seasonFrom": "2025/26", "seasonTo": "2025/26" }

Twenty seasons of the big five, with odds and analytics, for a back-test:

{
"leagues": ["E0", "SP1", "I1", "D1", "F1"],
"seasonFrom": "2005/06", "seasonTo": "2025/26",
"includeOdds1x2": true,
"includeClosingOdds": true,
"includeMarketConsensus": true,
"includeBettingAnalytics": true
}

Every upset at 6.00 or longer, last two seasons:

{
"leagues": ["E0", "E1", "E2", "E3"],
"upsetsOnly": true,
"upsetMinOdds": 6.0,
"includeBettingAnalytics": true
}

Matches with a sending off, filtered without buying the statistics columns:

{ "leagues": ["SP1"], "seasonFrom": "2015/16", "minRedCards": 1 }

The 2025/26 Premier League table, plus the matches it was built from:

{ "leagues": ["E0"], "seasonFrom": "2025/26", "seasonTo": "2025/26", "includeStandings": true }

This week's fixtures with the current prices:

{ "leagues": ["E0", "SP1", "I1"], "dataset": "fixtures", "includeOdds1x2": true }

Every Scottish tier, three matches each, only where at least seven books priced the game:

{
"countries": ["Scotland"],
"seasonFrom": "2024/25", "seasonTo": "2024/25",
"matchesPerLeague": 3,
"minBookmakerCount": 7,
"includeOdds1x2": true
}

Argentina and MLS, with head-to-head history:

{ "extraLeagues": ["ARG", "USA"], "seasonFrom": "2023", "includeHeadToHead": true }

Pricing

Pay-per-event. You are billed per match row written, plus a small fee for each season file downloaded and a $0.054 run-start fee. Filtered-out matches cost nothing.

EventPriceWhen it fires
Run start$0.054Once per run
Season file$0.02Each CSV downloaded for your selection
Match$0.003Each match row written
Match statistics$0.001Only with Match statistics on
Pre-match 1X2 odds$0.0015Only with Pre-match 1X2 odds on
Closing 1X2 odds$0.0015Only with Closing 1X2 odds on
Over / under odds$0.001Only with Over / under 2.5 goals on
Asian handicap odds$0.001Only with Asian handicap odds on
Market max and average$0.001Only with Market maximum and average on
Betting analytics$0.002Only with Betting analytics on
Head-to-head history$0.003Only with Head-to-head history on
Team form$0.002Only with Team form on
League table row$0.01Only with League tables on
What you collectApproximate cost
One Premier League season (380 matches)$1.21
The same season with closing odds and analytics$2.54
The same season with every block on$6.53
10,000 matches, results only$30.60

Turning on all nine per-match blocks adds $0.014 per match on top of the $0.003 base. Most runs need one or two of them.

Every block is off by default. A run that leaves them off pays the run-start fee, $0.02 per season file, and $0.003 per match. A block is billed only on the rows where it is actually returned: when the source file has no such column the block is omitted, so a 1996 match with no odds columns fires no odds event.

Free users

Free-plan runs return up to 10 matches as a preview. Upgrade your Apify plan to collect up to 1,000,000 matches per run.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the Football-Data.co.uk Scraper.
  3. Pick your leagues and season range, tick any extra blocks, and click Start.
  4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API or the ApifyClient for JavaScript and Python.

Use with AI agents (MCP)

Give an AI agent live access to the football archive through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

$claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/football-data-couk-scraper"

Then prompt it in plain language:

  • "Pull every Premier League match since 2020 where the away side won at odds above 5.00."
  • "Build me the 2025/26 Serie A table and the head-to-head record for the top two."
  • "Get this weekend's La Liga fixtures with the current Bet365 and Pinnacle prices."

Copy this into ChatGPT, Claude, or Cursor to start:

Use the Apify Actor "parseforge/football-data-couk-scraper" to collect football results and betting odds from Football-Data.co.uk. Input: { "leagues": ["E0"], "extraLeagues": [], "seasonFrom": "2020/21", "seasonTo": "2025/26", "includeOdds1x2": true, "includeBettingAnalytics": true, "maxItems": 500 }. League codes: E0-E3/EC England, SC0-SC3 Scotland, D1/D2 Germany, I1/I2 Italy, SP1/SP2 Spain, F1/F2 France, N1 Netherlands, B1 Belgium, P1 Portugal, T1 Turkey, G1 Greece. Extra league codes: ARG AUT BRA CHN DNK FIN IRL JPN MEX NOR POL ROU RUS SWE SWZ USA. Every extra block is off by default and billed separately. Call it with the ApifyClient and my APIFY_TOKEN.

Troubleshooting

Why are the odds columns empty?

The season predates them. Bet365 prices start in 2002/03, Pinnacle in 2012/13, closing odds and market averages in 2019/20, and the extra leagues carry closing odds only. Check bookmakerCount — zero means the file had no book for that match.

Why are there no shots or cards?

Match statistics start in 2000/01 and the extra leagues never carry them. The block is simply absent on those rows rather than filled with nulls.

Why did my filter return nothing?

Most filters read a column that only exists in some seasons. minAttendance only matches 2000/01 and 2001/02 English, Scottish and German matches; oddsMovement needs closing odds, so 2019/20 onward; minExpectedGoals needs 2026/27.

A league-season came back empty.

Not every division ran in every season. The National League starts in 2005/06, Scottish League One and Two in 1997/98, and Football-Data sometimes publishes a division late — the German Bundesliga file for a new season can lag the others by weeks. The Actor logs the missing file and carries on.

Why is a fixtures run returning old matches?

The main fixtures.csv is refreshed with the week's games. The extra-league fixtures file is updated on Football-Data's own schedule and can sit stale for months; the Actor warns when it does.

Head-to-head or form is slow.

Both blocks index the entire archive of every competition you selected — that is up to 726 downloads before the first row is written. Narrow the leagues if you only need a few.

Team names do not match my other source.

Football-Data uses short forms: Man United, Nott'm Forest, Ath Madrid, Paris SG, Bayern Munich. They are stable across seasons, which makes them good join keys, but they are not the clubs' full names.

FAQ

QuestionAnswer
Do I need an API key or an account?No. Football-Data.co.uk serves these files anonymously.
Do I need a proxy?No. Measured HTTP 200 on every surface without one. A proxy option exists if your own network blocks the site.
How far back does it go?1993/94 for the biggest divisions, 2012 for the extra leagues.
How many matches are there in total?304,000+ played matches across 38 competitions.
Which bookmakers are included?Up to 22, depending on the season. Bet365, Pinnacle, William Hill, bwin, Interwetten, BetVictor, VC Bet, Ladbrokes, Betfred, BetMGM, Coral, Paddy Power, Sky Bet, Betfair, Betfair Exchange, 1XBet, Gamebookers, Sportingbet, Stan James, Blue Square, Stanleybet and Sporting Odds.
Does it include expected goals?Yes, where the source has it — Football-Data started publishing xG in 2026/27.
Can I get league tables?Yes, with the League tables checkbox. They are built from every match in the files the run downloaded, so a filtered run still returns a real table.
Is the form block leak-free?Yes. Form and head-to-head are computed only from matches played before that kick-off.
Can I get odds in American or fractional format?Yes, with Odds format. Analytics stay decimal so the maths keeps working.
Why is this not free, when the CSVs are?You are paying for the parsing, the alias resolution, the analytics, and a run you can schedule. If one file is all you need, take the free CSV.
How many matches per run?Free plan: 10. Paid: up to 1,000,000.
Is this an official Football-Data.co.uk product?No. It is unofficial and reads only public files.

Browse the full ParseForge collection for more scrapers.

🆘 Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Football-Data.co.uk or any bookmaker named in this page. It collects only publicly available files. You are responsible for using the data in compliance with the source's terms and applicable laws. Gambling carries risk — nothing here is betting advice.