27,831 European matches on the 2.5 goals line.
The total-goals market across 15 leagues: score, OVER/UNDER result (never a push), xG, Bet365 and Pinnacle pre-match odds, and three closing levels.
Choose your option
Same columns for every season. The price covers the file as it is at purchase time, unless marked “updated”.
One season
One full season of all 15 leagues.
Download link valid 72 h, 5 downloads
Buy season 2025-26All seasons
2021 → 2026, plus the start of 2026-27.
- 27,831 matches, one file per season + a combined file
- 2026-27 included up to Oct 21, 2026 (frozen)
- Joins our other football files on match_id
Download link valid 72 h, 5 downloads
Buy — €29Football Complete Pack
All 3 datasets, all seasons.
- 1X2 & Results
- Over/Under 2.5
- Machine Learning
Over 2.5: league by league
Across every season in the file, the share of matches with 3+ goals in each of the 15 leagues.
| LEAGUE | MATCHES | Over 2.5 | Under 2.5 |
|---|---|---|---|
| Bundesliga | 1,584 | 61.4% | 38.6% |
| Eredivisie | 1,611 | 59.9% | 40.1% |
| 2. Bundesliga | 1,602 | 59.1% | 40.9% |
| Premier League | 1,970 | 56.5% | 43.5% |
| Süper Lig | 1,793 | 54.4% | 45.6% |
| Jupiler Pro League | 1,619 | 54.0% | 46.0% |
| Ligue 1 | 1,741 | 53.9% | 46.1% |
| Liga Portugal | 1,602 | 51.2% | 48.8% |
| Serie A | 1,970 | 49.3% | 50.7% |
| Super League (GRE) | 1,237 | 48.3% | 51.7% |
| Championship | 2,892 | 48.2% | 51.8% |
| LaLiga | 1,989 | 47.8% | 52.2% |
| Serie B | 1,970 | 45.4% | 54.6% |
| Ligue 2 | 1,831 | 45.3% | 54.7% |
| LaLiga2 | 2,420 | 43.3% | 56.7% |
Built for modelers
One row per match, a match_id key shared by all our football files, several odds levels side by side.
Backtest Over 2.5
Pre-match and closing odds against the result, league by league.
df = pd.read_parquet("football_ou25_all_seasons.parquet")
df.groupby("league").over25_result.value_counts(normalize=True)Measure line-shopping value
Best closing price versus market average.
(df.max_close_over25 / df.avg_close_over25 - 1).describe()Link to xG
Provider or computed xG (labelled) against total goals.
df[["home_xg", "away_xg", "total_goals"]].corr()Every column shows its fill rate.
Pinnacle closing thins out from October 2025 and stops on 2026-01-16, when the public source stopped publishing it. Market-average closing covers every season; best closing is the best price of each outcome, not available everywhere at once: an upper bound. We state it instead of filling the gaps. Since August 2025 the source's market-average and best closing carry higher margins and the best no longer includes Pinnacle: do not chain seasons at those prices without accounting for it (measured in the README).
Bet365 and Pinnacle “pre-match” odds are a weekly snapshot: neither opening nor closing. xG is labelled row by row: official provider or computed by ProbWin from shots (46.6% provider xG).
Cleaning (September 2026): team spellings unified, the same match recorded twice one day apart removed, and 22 mislabelled 2026-27 rows removed (Portuguese duplicates tagged LaLiga, Scottish matches tagged LaLiga2).
What's in the file — and what isn't
Included
- Final score, total goals, OVER/UNDER result
- Labelled xG (provider or ProbWin)
- Bet365 and Pinnacle pre-match odds
- Pinnacle close, market average, best price
- Fair probability per outcome + best price vs fair price
Not included
- Pinnacle closing after 2026-01-16
- Opening odds
- Cups and European competitions
- Other goal lines
Every column, with its fill rate
Measured on the delivered file. 100% = no missing values.
Match
match_id key, season, league, date, teams
Result
Final score, total goals, OVER / UNDER
xG
Expected goals, labelled source
Pre-match odds
Bet365 and Pinnacle, weekly pre-match snapshot
Closing
Pinnacle close (to 2026-01-16), market average, best price
ProbWin layer
Fair probability without margin (Pinnacle close, else market average) and best price vs fair price
The file, exactly as you'll get it
Six real rows, main columns. Download 50 free rows with every column to check it fits your pipeline.
| match_date | league | home_team | away_team | total_goals | over25_result | home_xg | away_xg | b365_over25 | b365_under25 | pinnacle_close_over25 | pinnacle_close_under25 | max_close_over25 | max_close_under25 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2024-08-24 | E1 | Sunderland | Burnley | 1 | UNDER | 0.73 | 0.13 | 1.9 | 1.95 | 2.0 | 1.88 | 2.13 | 1.92 |
| 2024-08-28 | I2 | Juve Stabia | Mantova | 1 | UNDER | 0.91 | 1.24 | 2.1 | 1.7 | 2.17 | 1.75 | 2.19 | 1.8 |
| 2024-11-01 | F2 | Dunkerque | Amiens | 4 | OVER | 2.36 | 1.82 | 2.15 | 1.67 | 2.23 | 1.7 | 2.32 | 1.77 |
| 2024-12-15 | P1 | AVS | Benfica | 2 | UNDER | 0.77 | 0.73 | 1.53 | 2.4 | 1.58 | 2.46 | 1.58 | 2.58 |
| 2024-12-15 | I1 | Parma Calcio | Hellas Verona | 5 | OVER | 2.31 | 3.7 | 1.73 | 2.1 | 1.88 | 2.04 | 1.88 | 2.12 |
| 2025-05-17 | P1 | Farense | Santa Clara | 3 | OVER | 1.56 | 1.27 | 2.5 | 1.5 | 2.3 | 1.65 | 2.37 | 1.65 |
Before you buy
Which leagues?
England (Premier League, Championship), Spain (LaLiga, LaLiga2), Germany (Bundesliga, 2. Bundesliga), Italy (Serie A, Serie B), France (Ligue 1, Ligue 2), Netherlands (Eredivisie), Portugal (Liga Portugal), Belgium (Jupiler Pro League), Turkey (Süper Lig), Greece (Super League).
How do I get the file?
Right after payment a download link appears on screen and is emailed to you. The archive contains CSV and Parquet files plus a README documenting every column.
Can I use it in a commercial product?
Yes for your models, analyses and tools, commercial ones included. Reselling or redistributing the files themselves is not allowed.
A question before buying?
Email [email protected] — the founder answers, usually the same day.