The betting market's record for 91 football leagues
Every bookmaker's opening and closing price on eight markets, joined to results and goal minutes. The coverage table says exactly what is there, league by league, before you pay.
- leagues
- 91 in 42 countries · ~69 found nowhere else
- seasons
- 2020-21 → 2025-26 (summer leagues → 2025)
- matches priced
- 142,330 of 146,304 in scope · 97.3%
- markets
- 1X2 ft/ht · Asian hcp · O/U ladders · BTTS · CS · HT/FT
- price rows
- 11,032,167 · avg 3.13 bookmakers per match
- absent prices
- listed, never silent · excluded_matches.csv
- All 91 leagues, every season, all markets
- Free corrected v2 and the 2026-27 edition
- Receipt and invoice by Paddle, link by email
- One league, all its seasons · check its row in the coverage table
- Name the league by replying to your receipt
- Several leagues? Seven packs cost more than the full archive
Order by email: invoice within a day, download link as soon as it is paid. Card checkout is coming. Prices exclude VAT where it applies. Students and researchers: free.
Only need Bet365 or Pinnacle closing lines for the big European divisions? football-data.co.uk publishes those free. This archive is for the other ~69 leagues nobody else keeps, and for the full ladders and opening-plus-closing timestamps.
| 1 | X | 2 | |
|---|---|---|---|
| open | 2.40 | 3.80 | 2.63 |
| close | 2.90 | 3.50 | 2.25 |
| move | +0.50 | −0.30 | −0.38 |
| home line | home open | home close | away close |
|---|---|---|---|
| -0.5 | 2.35 | 2.85 | 1.40 |
| +0.5 | 1.48 | 1.63 | 2.25 |
| + 13 more lines, O/U ladder, BTTS, correct score, HT/FT | |||
Mk1708Bi · 7 bookmakers on 1X2open_at / close_at in UTC · every price one bookmaker's listing, nothing averagedWhat is actually in it, league by league
Percentages are of all matches in scope, so a match the source never priced counts against coverage. Two capture passes exist: 28 leagues carry all eight markets on most matches; 17 leagues carry 1X2 plus the Asian-handicap ladder only. Click a column to sort.
| Share of matches carrying the market | Missing | |||||||
|---|---|---|---|---|---|---|---|---|
| League | Seasons | Matches ↓in scope | 1X2 | Asian hcpfull ladder | O/Ufull ladder | All 8every market | Booksper match, 1X2 | Unpricedno odds at all |
| Championship (England) | 6 | 3317 | 99.8% | 100% | 100% | 87.6% | 3.9 | 0% |
| League One (England) | 6 | 3317 | 99.8% | 100% | 99.8% | 19.2% | 3.88 | 0% |
| League Two (England) | 6 | 3317 | 100% | 100% | 100% | 20.1% | 3.65 | 0% |
| National League North (England) | 6 | 2840 | 99.4% | 53.8% | 95.6% | 0% | 2.62 | 0.6% |
| National League South (England) | 6 | 2793 | 88.5% | 36.6% | 0% | 0% | 2.37 | 11.5% |
| LaLiga2 (Spain) | 6 | 2778 | 99.9% | 91% | 0% | 0% | 2.83 | 0% |
| National League (England) | 5 | 2719 | 100% | 100% | 100% | 0.3% | 3.07 | 0% |
| J2 League (Japan) | 6 | 2608 | 99.8% | 100% | 99.8% | 16% | 3.23 | 0% |
| Eerste Divisie (Netherlands) | 6 | 2292 | 100% | 92.3% | 97.6% | 45.3% | 2.98 | 0% |
| Serie B (Italy) | 6 | 2290 | 100% | 100% | 100% | 95.8% | 3.91 | 0% |
| 3. Liga (Germany) | 6 | 2280 | 99.7% | 99.7% | 99.7% | 0.9% | 3.92 | 0.3% |
| Serie A (Italy) | 6 | 2280 | 100% | 92.8% | 99% | 85.6% | 3.13 | 0% |
| Serie C - Group A (Italy) | 6 | 2280 | 100% | 58% | 100% | 0% | 2.71 | 0% |
| Premier League (England) | 6 | 2280 | 99.7% | 99.9% | 100% | 82.1% | 4.06 | 0% |
| LaLiga (Spain) | 6 | 2280 | 100% | 90.7% | 0% | 0% | 2.92 | 0% |
| Serie A Betano (Brazil) | 6 | 2275 | 99.9% | 100% | 99.7% | 95.2% | 3.55 | 0% |
| Serie B (Brazil) | 6 | 2273 | 99.9% | 99.8% | 89.9% | 13.4% | 2.99 | 0.1% |
| Serie C - Group B (Italy) | 6 | 2257 | 99.9% | 58.8% | 99.8% | 0% | 2.67 | 0.1% |
| Ligue 2 (France) | 6 | 2170 | 98.5% | 98.5% | 98.5% | 93.6% | 3.68 | 1.5% |
| 1. Lig (Turkey) | 6 | 2061 | 97.4% | 96.6% | 0% | 0% | 2.68 | 2.6% |
| Ligue 1 (France) | 6 | 2060 | 99.7% | 100% | 100% | 97.2% | 3.84 | 0% |
| J1 League (Japan) | 6 | 2058 | 99.9% | 100% | 99.8% | 93.3% | 3.51 | 0% |
| Division 1 (Saudi Arabia) | 6 | 1987 | 81.2% | 34.4% | 0% | 0% | 2.69 | 18.8% |
| Primera RFEF - Group 1 (Spain) | 5 | 1938 | 97.2% | 96.1% | 97.3% | 0% | 4.27 | 2.7% |
| NB II. (Hungary) | 6 | 1926 | 65.5% | 23.3% | 61% | 0.4% | 2.3 | 1% |
Unpriced = matches in scope for which the source listed no odds at all, mostly because it throttled the collector. They ship in excluded_matches.csv with the reason and carry no price rows. The market columns are shares of all matches in scope, so an unpriced match counts against every one of them.
Season by season
| League | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 |
|---|---|---|---|---|---|---|
| Championship (England) | 552 | 552 | 552 | 552 | 552 | 557 |
| League One (England) | 552 | 552 | 552 | 552 | 552 | 557 |
| League Two (England) | 552 | 552 | 552 | 552 | 552 | 557 |
| National League North (England) | 165 | 459 | 539 | 552 | 551 | 557 |
| LaLiga2 (Spain) | 462 | 462 | 462 | 462 | 462 | 468 |
| National League (England) | · | 506 | 552 | 552 | 552 | 557 |
| J2 League (Japan) | 462 | 462 | 462 | 462 | 380 | 380 |
| National League South (England) | 140 | 370 | 477 | 467 | 488 | 531 |
| Eerste Divisie (Netherlands) | 380 | 380 | 380 | 380 | 380 | 392 |
| Serie B (Italy) | 379 | 380 | 380 | 380 | 380 | 390 |
| Serie A (Italy) | 380 | 380 | 380 | 380 | 380 | 380 |
| Premier League (England) | 380 | 380 | 380 | 380 | 380 | 380 |
| LaLiga (Spain) | 380 | 380 | 380 | 380 | 380 | 380 |
| Serie C - Group A (Italy) | 379 | 380 | 380 | 380 | 380 | 380 |
| Serie A Betano (Brazil) | 380 | 380 | 380 | 375 | 380 | 380 |
| 3. Liga (Germany) | 380 | 374 | 380 | 380 | 380 | 380 |
| Serie B (Brazil) | 378 | 380 | 380 | 380 | 373 | 380 |
| Serie C - Group B (Italy) | 380 | 377 | 380 | 380 | 380 | 357 |
| Ligue 2 (France) | 380 | 380 | 380 | 380 | 307 | 310 |
| Ligue 1 (France) | 380 | 380 | 380 | 306 | 306 | 308 |
| J1 League (Japan) | 306 | 380 | 306 | 306 | 380 | 380 |
| 1. Lig (Turkey) | 304 | 340 | 313 | 302 | 365 | 384 |
| NB II. (Hungary) | 370 | 374 | 379 | 306 | 237 | 240 |
| Primera RFEF - Group 2 (Spain) | · | 380 | 380 | 380 | 380 | 380 |
| Primera RFEF - Group 1 (Spain) | · | 363 | 382 | 380 | 380 | 380 |
| 2. Bundesliga (Germany) | 306 | 306 | 306 | 306 | 306 | 310 |
| Liga Portugal 2 (Portugal) | 306 | 306 | 306 | 306 | 306 | 310 |
| Eredivisie (Netherlands) | 306 | 306 | 306 | 306 | 306 | 309 |
| Division 1 (Poland) | 306 | 305 | 306 | 306 | 306 | 309 |
| Bundesliga (Germany) | 306 | 306 | 306 | 306 | 306 | 306 |
Show the other 61 leagues
| League | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 |
|---|---|---|---|---|---|---|
| Primavera 1 (Italy) | 220 | 301 | 299 | 306 | 376 | 280 |
| Ekstraklasa (Poland) | 240 | 306 | 306 | 306 | 306 | 306 |
| Ligue 3 (France) | 305 | 306 | 306 | 306 | 273 | 272 |
| Super League 2 (Greece) | 132 | 513 | 382 | 263 | 178 | 252 |
| Jupiler Pro League (Belgium) | 306 | 306 | 306 | 240 | 240 | 321 |
| Premier League (Egypt) | 306 | 306 | 306 | 306 | 153 | 322 |
| Ligue 1 (Algeria) | 364 | 306 | 236 | 239 | 239 | 240 |
| Division 1 (Saudi Arabia) | 192 | 334 | 272 | 257 | 266 | 292 |
| Mozzart Bet Super Liga (Serbia) | 374 | 220 | 225 | 229 | 235 | 296 |
| Chance Liga (Czech Republic) | 306 | 240 | 240 | 240 | 240 | 280 |
| Tweede Divisie (Netherlands) | 47 | 268 | 301 | 306 | 302 | 322 |
| Saudi Professional League (Saudi Arabia) | 213 | 220 | 224 | 290 | 299 | 299 |
| Segunda RFEF - Group 3 (Spain) | 174 | 265 | 243 | 274 | 274 | 292 |
| Superliga (Romania) | 240 | 240 | 240 | 240 | 240 | 321 |
| Segunda RFEF - Group 2 (Spain) | 169 | 266 | 242 | 270 | 264 | 294 |
| Segunda RFEF - Group 1 (Spain) | 159 | 274 | 236 | 270 | 262 | 294 |
| Segunda RFEF - Group 5 (Spain) | 163 | 266 | 238 | 270 | 270 | 288 |
| Segunda RFEF - Group 4 (Spain) | 158 | 269 | 249 | 268 | 264 | 284 |
| Botola Pro (Morocco) | 240 | 240 | 240 | 240 | 240 | 240 |
| Eliteserien (Norway) | 240 | 240 | 240 | 240 | 240 | 240 |
| Allsvenskan (Sweden) | 240 | 240 | 240 | 240 | 240 | 240 |
| Superettan (Sweden) | 240 | 237 | 239 | 237 | 239 | 240 |
| 2. Liga (Austria) | 240 | 237 | 221 | 240 | 240 | 224 |
| Regionalliga North (Germany) | 97 | 200 | 334 | 305 | 226 | 232 |
| ChNL (Czech Republic) | 182 | 240 | 240 | 240 | 240 | 240 |
| efbet League (Bulgaria) | 182 | 182 | 240 | 240 | 240 | 294 |
| 3. CFL - Group B (Czech Republic) | 63 | 240 | 232 | 234 | 271 | 266 |
| K League 2 (South Korea) | 135 | 173 | 220 | 234 | 234 | 273 |
| Super League (China) | 110 | 112 | 301 | 240 | 240 | 240 |
| Premiership (Scotland) | 198 | 198 | 198 | 198 | 198 | 230 |
| NB I. (Hungary) | 198 | 198 | 198 | 198 | 198 | 198 |
| Super League (Switzerland) | 180 | 180 | 179 | 198 | 198 | 230 |
| Super League (Greece) | 182 | 182 | 182 | 182 | 182 | 236 |
| K League 1 (South Korea) | 132 | 198 | 198 | 198 | 198 | 198 |
| Thai League 1 (Thailand) | · | 212 | 214 | 209 | 217 | 227 |
| Premier League (Russia) | 240 | 171 | 95 | 126 | 205 | 232 |
| Prva liga (Slovenia) | 180 | 175 | 172 | 176 | 176 | 164 |
| 3. CFL - Group A (Czech Republic) | 58 | · | 235 | 237 | 240 | 268 |
| Championship (Scotland) | 133 | 178 | 179 | 175 | 180 | 185 |
| Meistriliiga (Estonia) | 147 | 135 | 180 | 180 | 180 | 180 |
| Premier Division (Ireland) | 90 | 179 | 179 | 180 | 180 | 180 |
| Challenge League (Switzerland) | 172 | 154 | 152 | 158 | 170 | 180 |
| A-League (Australia) | 156 | 156 | 156 | 162 | 169 | 163 |
| Premier League (Azerbaijan) | 111 | 112 | 180 | 180 | 180 | 199 |
| TOPLYGA (Lithuania) | 60 | 180 | 180 | 180 | 180 | 180 |
| League Two (Scotland) | 77 | 159 | 171 | 164 | 155 | 179 |
| Division 1 (Ireland) | 88 | 135 | 140 | 180 | 180 | 180 |
| League One (Scotland) | 81 | 157 | 176 | 148 | 160 | 174 |
| Allsvenskan Women (Sweden) | 119 | 120 | 159 | 154 | 154 | 181 |
| Bundesliga (Austria) | 132 | 132 | 132 | 132 | 132 | 195 |
| Superliga (Denmark) | 132 | 132 | 132 | 132 | 132 | 193 |
| 1st Division (Denmark) | 132 | 132 | 132 | 132 | 132 | 192 |
| Virsliga (Latvia) | · | 110 | 181 | 182 | 182 | 182 |
| Ykkosliiga (Finland) | 132 | 132 | 132 | 132 | 135 | 135 |
| Veikkausliiga (Finland) | 132 | 132 | 132 | 132 | 132 | 132 |
| Bundesliga Women (Germany) | 82 | 117 | 119 | 112 | 115 | 171 |
| ISL (India) | 110 | 110 | 110 | 132 | 156 | 91 |
| Premiere Ligue Women (France) | 97 | 118 | 107 | 116 | 119 | 127 |
| Premier League (Kuwait) | 95 | 89 | 90 | 89 | 90 | 98 |
| Super League Women (Belgium) | 64 | 73 | 92 | 78 | 76 | 103 |
| Liga Portugal (Portugal) | · | · | · | · | · | 306 |
One match, as you will read it
A real row from the archive. Every price is one bookmaker's listing; nothing is averaged.
Schalke v Hertha Berlin · 2025-08-01 · germany2 2025-26 · final score 2:1 (half-time 2:0)
Full-time 1X2 — opening → closing, per bookmaker
| Bookmaker | Home | Draw | Away |
|---|---|---|---|
| bookmaker_1 | 2.60→2.75▲ | 3.45→3.45 | 2.60→2.45▼ |
| bet365 | 2.40→2.90▲ | 3.80→3.50▼ | 2.63→2.25▼ |
| bookmaker_645 | 2.30→2.80▲ | 3.50→3.55▲ | 2.60→2.40▼ |
| bookmaker_658 | 3.00→3.05▲ | 3.05→3.65▲ | 2.57→2.37▼ |
| bookmaker_759 | 2.48→2.88▲ | 3.45→3.60▲ | 2.68→2.24▼ |
| bookmaker_837 | 2.40→2.90▲ | 3.80→3.50▼ | 2.63→2.25▼ |
| bookmaker_903 | 2.40→3.00▲ | 3.85→3.45▼ | 2.60→2.40▼ |
Asian handicap ladder (home line −1.5 to +1)
| Line | Bookmaker | Home | Away |
|---|---|---|---|
| -1.5 | bet365 | 4.25→5.75▲ | 1.21→1.14▼ |
| -1.5 | bookmaker_645 | 4.00→5.00▲ | 1.16→1.14▼ |
| -1.5 | bookmaker_837 | 4.25→5.75▲ | 1.18→1.11▼ |
| -1.25 | bet365 | 3.90→5.25▲ | 1.24→1.16▼ |
| -1.25 | bookmaker_837 | 3.90→5.25▲ | 1.21→1.13▼ |
| -1 | bet365 | 3.55→4.65▲ | 1.28→1.18▼ |
| -1 | bookmaker_837 | 3.55→4.65▲ | 1.25→1.15▼ |
| -0.75 | bet365 | 2.75→3.45▲ | 1.43→1.30▼ |
| -0.75 | bookmaker_837 | 2.75→3.45▲ | 1.40→1.27▼ |
| -0.5 | bookmaker_1 | 2.40→2.75▲ | 1.55→1.43▼ |
| -0.5 | bet365 | 2.35→2.85▲ | 1.58→1.40▼ |
| -0.5 | bookmaker_645 | 2.30→2.65▲ | 1.53→1.38▼ |
| -0.5 | bookmaker_837 | 2.35→2.85▲ | 1.55→1.37▼ |
| -0.25 | bet365 | 2.08→2.50▲ | 1.73→1.50▼ |
| -0.25 | bookmaker_837 | 2.08→2.50▲ | 1.70→1.47▼ |
| 0 | bookmaker_1 | 1.80→1.95▲ | 1.95→1.75▼ |
| 0 | bet365 | 1.80→2.15▲ | 2.00→1.68▼ |
| 0 | bookmaker_837 | 1.74→2.15▲ | 1.94→1.65▼ |
| +0.25 | bet365 | 1.60→1.83▲ | 2.30→1.98▼ |
| +0.25 | bookmaker_837 | 1.57→1.77▲ | 2.30→1.92▼ |
| +0.5 | bookmaker_1 | 1.50→1.53▲ | 2.60→2.45▼ |
| +0.5 | bet365 | 1.48→1.63▲ | 2.60→2.25▼ |
| +0.5 | bookmaker_645 | 1.50→1.55▲ | 2.45→2.25▼ |
| +0.5 | bookmaker_837 | 1.45→1.60▲ | 2.60→2.25▼ |
| +0.75 | bet365 | 1.35→1.48▲ | 3.10→2.60▼ |
| +0.75 | bookmaker_837 | 1.32→1.45▲ | 3.10→2.60▼ |
| +1 | bet365 | 1.23→1.33▲ | 4.10→3.30▼ |
| +1 | bookmaker_837 | 1.20→1.30▲ | 4.10→3.30▼ |
Over/under ladder (full time, 1.5 to 3.5)
| Line | Bookmaker | Over | Under |
|---|---|---|---|
| 1.5 | bookmaker_1 | 1.15→1.20▲ | 5.50→4.80▼ |
| 1.5 | bet365 | 1.17→1.17 | 5.00→5.00 |
| 1.5 | bookmaker_645 | 1.11→1.16▲ | 5.25→4.70▼ |
| 1.5 | bookmaker_658 | 1.20→1.22▲ | 4.60→4.30▼ |
| 1.5 | bookmaker_837 | 1.13→1.13 | 5.00→5.00 |
| 1.5 | bookmaker_903 | 1.14→1.16▲ | 5.00→4.60▼ |
| 2 | bookmaker_903 | 1.21→1.24▲ | 4.00→3.70▼ |
| 2.5 | bookmaker_1 | 1.50→1.60▲ | 2.50→2.25▼ |
| 2.5 | bet365 | 1.53→1.60▲ | 2.40→2.30▼ |
| 2.5 | bookmaker_645 | 1.45→1.60▲ | 2.55→2.25▼ |
| 2.5 | bookmaker_658 | 1.62→1.65▲ | 2.32→2.25▼ |
| 2.5 | bookmaker_759 | 1.52→1.58▲ | 2.26→2.22▼ |
| 2.5 | bookmaker_837 | 1.50→1.57▲ | 2.40→2.30▼ |
| 2.5 | bookmaker_903 | 1.50→1.58▲ | 2.40→2.20▼ |
| 2.75 | bet365 | 1.78→1.78 | 2.03→2.03 |
| 2.75 | bookmaker_837 | 1.74→1.72▼ | 1.94→1.97▲ |
| 3 | bet365 | 1.85→1.98▲ | 1.95→1.83▼ |
| 3 | bookmaker_837 | 1.79→1.89▲ | 1.89→1.79▼ |
| 3 | bookmaker_903 | 1.80→1.94▲ | 1.92→1.80▼ |
| 3.5 | bookmaker_1 | 2.25→2.50▲ | 1.60→1.50▼ |
| 3.5 | bet365 | 2.25→2.38▲ | 1.57→1.53▼ |
| 3.5 | bookmaker_645 | 2.15→2.40▲ | 1.60→1.53▼ |
| 3.5 | bookmaker_658 | 2.40→2.60▲ | 1.57→1.50▼ |
| 3.5 | bookmaker_759 | 2.08→2.30▲ | 1.68→1.54▼ |
| 3.5 | bookmaker_837 | 2.25→2.38▲ | 1.54→1.50▼ |
| 3.5 | bookmaker_903 | 2.25→2.40▲ | 1.58→1.52▼ |
Grey = opening price (first listed), bold = closing price (last before kick-off), ▲▼ = closing above or below the opening price. This match also carries half-time 1X2 and over/under, both-teams-to-score, 41 correct-score cells and 9 half-time/full-time combinations. Bookmakers without a confirmed name appear as bookmaker_<id>.
Format
Seven plain CSV tables in one zip, plus the same tables as Parquet, one row per match × market × line × bookmaker. Every odds row names its match (league, season, date, teams, final score) so each file reads on its own; the 8-character match id joins to the results table for kick-off time, half-time score and goal minutes. Rows are sorted by match, line and bookmaker; timestamps come as unix seconds and as ISO. The raw source envelope is not part of the bundle; the flat tables are the product. Full column definitions ship as DATA_DICTIONARY.md inside every download.
op_id,league,league_name,country,season,match_date,home_team,away_team,ht_result,ft_result,home_goals,away_goals,result,n_markets,n_books_1x2,has_ah,has_ou Mk1708Bi,germany2,2. Bundesliga,Germany,2025-2026,2025-08-01,Schalke,Hertha Berlin,2:0,2:1,2,1,H,8,7,true,true
op_id,league,season,match_date,home_team,away_team,ft_result,bookmaker_id,bookmaker,line,open_home,open_away,close_home,close_away,open_ts,close_ts,open_at,close_at,move_home,move_away Mk1708Bi,germany2,2025-2026,2025-08-01,Schalke,Hertha Berlin,2:1,1,bookmaker_1,-0.5,2.4,1.55,2.75,1.43,1751890017,1754036623,2025-07-07T12:06:57Z,2025-08-01T08:23:43Z,up,down Mk1708Bi,germany2,2025-2026,2025-08-01,Schalke,Hertha Berlin,2:1,16,bet365,-0.5,2.35,1.58,2.85,1.4,1751898026,1754072816,2025-07-07T14:20:26Z,2025-08-01T18:26:56Z,up,up Mk1708Bi,germany2,2025-2026,2025-08-01,Schalke,Hertha Berlin,2:1,1,bookmaker_1,0.5,1.5,2.6,1.53,2.45,1751890017,1754036623,2025-07-07T12:06:57Z,2025-08-01T08:23:43Z,up,up Mk1708Bi,germany2,2025-2026,2025-08-01,Schalke,Hertha Berlin,2:1,16,bet365,0.5,1.48,2.6,1.63,2.25,1751898026,1754072937,2025-07-07T14:20:26Z,2025-08-01T18:28:57Z,down,up
{"league":"germany2","season":"2025-2026","date":"2025-08-01","op_id":"Mk1708Bi",
"home":"Schalke","away":"Hertha Berlin",
"markets":{"ft_1x2":{"E-1-2-0-0-0":{"odds":{"16":{"0":2.9,"1":3.5,"2":2.25}},
"openingOdd":{"16":{"0":2.4,"1":3.8,"2":2.63}},
"changeTime":{"16":{"0":1754070076,...}}, ...}},
"ft_ah":{"E-5-2-0--0.5-0":{"handicapValue":-0.5,"odds":{"16":{"0":2.85,"1":1.4}}, ...},
"E-5-2-0-0.5-0":{"handicapValue":0.5,"odds":{"16":[1.63,2.25]}, ...}, ...},
"ft_ou":{...},"ht_ou":{...},"ft_cs":{...},"ft_htft":{...},"ft_bts":{...}},
"missing":[],"errors":{},"throttled":false}| matches | league, season, date, kick-off, teams, HT/FT score, goals, result, first-goal minute, all goal minutes, markets present, bookmakers on 1X2 |
| every odds table | match id, league, season, date, teams, final score, bookmaker id + name, open/close timestamps (unix + ISO) |
| odds_1x2 | scope (ft/ht), opening and closing home/draw/away |
| odds_ah | home line (−0.5 = home −0.5 / away +0.5), opening and closing home/away |
| odds_ou | scope (ft/ht), total line, opening and closing over/under |
| odds_bts | both teams to score, yes/no, opening and closing |
| odds_cs | correct score cell, single opening and closing price |
| odds_htft | half-time/full-time combination, single opening and closing price |
| bookmakers · leagues · coverage_league_season · excluded_matches | the lookup tables, and every in-scope match that carries no prices with the reason |
Limitations, stated up front
- · Thin bookmaker set. Prices come from a small set of European and US-licensed bookmakers: 3.13 per match on average, fewer in small leagues and older seasons. No Pinnacle, no exchanges, no in-play prices. Bookmakers whose name is not yet confirmed appear as bookmaker_<id>.
- · Not every market on every match. Asian-handicap ladder on 77%, over/under ladder on 69%, all eight markets on 32% of matches in scope. For 17 leagues only 1X2 and Asian handicap were captured (Premier League (Russia), Saudi Professional League (Saudi Arabia), Championship (Scotland), Premiership (Scotland), League One (Scotland), League Two (Scotland), Segunda RFEF - Group 5 (Spain), Mozzart Bet Super Liga (Serbia), LaLiga (Spain), LaLiga2 (Spain), Allsvenskan (Sweden), Superettan (Sweden), Super League (Switzerland), Challenge League (Switzerland), Thai League 1 (Thailand), 1. Lig (Turkey), Bundesliga Women (Germany)); that is a capture limit, not proof the other markets did not exist.
- · Absence is listed, never silent. 3,974 matches in scope (2.7%) returned no prices from the source, mostly throttling during collection. They ship in excluded_matches.csv with the reason and carry no odds rows.
- · Opening means first listed, closing means last before kick-off. There is no tick history between the two, only the direction of the last move.
- · Provenance. Prices are bookmakers' publicly displayed listings compiled from odds-comparison pages, provided as historical statistics, not as an offer to bet. Football Charts is not affiliated with any bookmaker or comparison site.
Try before you buy
Two complete league-seasons in exactly the paid layout: a rich one with all eight markets and a thin one with 1X2 and over/under from two or three bookmakers, so you see both ends of the archive.
Academic and commercial use
The two paid packs are at the top of the page. Two more ways in:
Academic · free
Students and researchers get the archive free for non-commercial work, with a citation ("Data by football-charts.com"). Tell us the institution and the project.
Commercial, feeds and API
Redistribution, embedding in a product that exposes the data, or ongoing API access to the archive are licensed separately, by quote. API access to the archive seasons is coming; register interest and you hear first.
Questions
How is the archive delivered, and how big is it?
Which bookmakers are in it?
Why pay when football-data.co.uk is free?
What are the matches without prices?
How were the prices checked?
Refunds and licence
How it was built
Match results, goal minutes and match ids come from Football Charts' own results pipeline for 91 leagues. For each match the archive keeps every bookmaker's listed opening and closing price for eight markets as shown on public odds-comparison pages, captured after full time. Rows are de-duplicated by match id, classified as priced, throttled, unlisted or errored, and joined to results; the checks above run over the whole archive before a release, and the coverage table on this page is generated from that run.
