Where to Find Historical Sports Data Across Sports

Historical sports data comes from open datasets maintained by communities and researchers, public statistics websites, sports data APIs, betting odds archives, and paid providers. For each sport, separate results, detailed stats, and historical odds, since they often come from different sources. Combining them reliably requires consistent team and player identifiers, dates, and time zones.

Three kinds of historical data

Results data records who played, when, and the score. Detailed stats data records play-by-play, events, or player statistics. Odds data records prices over time. Many projects need all three, and they rarely come from one place.

American football

Open play-by-play data for the NFL, maintained by the community and accessible through packages such as nflverse tools, covers many seasons with advanced metrics such as expected points added. College football has community-maintained data sources as well. The NFL's own Big Data Bowl releases tracking data for competition use.

Baseball

Baseball has some of the richest open historical data. Long-running databases cover season and career statistics going back over a century, and pitch-level data from the league's tracking systems is publicly accessible for recent seasons through official and community tools. This makes baseball a strong starting point for modelling.

Soccer

Results and basic match statistics for major leagues are available from public sites and community datasets, some including historical odds from several bookmakers. Event data with shot locations is available freely for selected competitions from some providers, and commercially for broader coverage. Expected goals data is published by several public sites for top leagues.

Mexican and other leagues

Coverage of leagues outside the biggest European and American competitions, such as Liga MX, is thinner in open data. Public results sites and commercial providers are usually the best sources, and you may need to build your own dataset over time.

Tennis

Community-maintained datasets cover ATP and WTA match results with player rankings and match statistics going back decades, and some public sites provide historical match odds. Point-by-point data exists for some matches through community projects.

Historical odds

Historical odds are harder to obtain than results. Sources include public sites that publish closing odds for major soccer leagues and tennis, betting exchanges that sell historical market data, and odds API providers with archives. Check whether data includes opening, closing, or intermediate prices, and from which books.

APIs versus downloads

Static downloads suit research on past seasons. APIs suit ongoing collection and automation. Many projects combine both: a historical download to start, then an API to keep the dataset current.

Combining sources

Team and player names differ across sources, dates may be local or in UTC, and abbreviations vary. Build mapping tables with stable identifiers, normalise dates and time zones, and validate joins by checking that scores match across sources. Normalising multi-sport odds and results across sources is the core problem Parlay Ledger addresses.

Licences and terms

Open datasets have licences that may restrict commercial use or require attribution. Public websites often prohibit scraping. Commercial providers set terms for storage and redistribution. Read terms before building anything public or commercial.

Quality checks

Check for missing games, duplicated rows, postponed and rescheduled matches, abandoned games, and changes in statistic definitions over time. Spot-check a sample against official results.

Basketball and hockey

Although the question focused on other sports, basketball and hockey also have rich historical data. Official league statistics sites publish box scores and play-by-play, and community packages make them accessible for analysis. Historical odds for these sports are available from odds data providers and some public archives.

Storing historical data

Keep raw downloads unchanged and transform them in a reproducible pipeline. Store each record with source, retrieval date, and identifiers. Use a database rather than many spreadsheets once datasets grow, and partition by sport and season.

Starting small

Begin with one sport and one league, combine results and closing odds for several seasons, and validate the joins. Then add detailed stats and other leagues. A small, clean dataset is more useful than a large, inconsistent one.

Postponements and neutral venues

Rescheduled matches, neutral-venue games, and abandoned fixtures complicate historical data. Record the original and actual dates, the venue, and whether a result was awarded rather than played. These details matter for modelling home advantage and rest.

What historical data means in practice

Gather results, stats, and odds separately, join them with stable identifiers, check quality, and respect every source's licence and terms.

Keeping data current

Historical datasets go stale quickly during a season. Schedule regular updates from APIs or source sites, re-run validation checks after each update, and version your dataset so models can be traced to the exact data they were trained on. Automating these steps early saves considerable effort once several sports are involved.

Asking for data help

When requesting data recommendations, state the sports, leagues, seasons, and level of detail needed.

This page describes data sources and their limits, and is not betting advice.

Frequently asked questions

Where can I get free historical sports data?
Community-maintained open datasets cover many sports, including NFL play-by-play, baseball statistics, tennis results, and soccer results with some historical odds. Public statistics websites and free tiers of sports data APIs are other options. Check each source's licence before commercial use.
Where can I find historical betting odds?
Public sites publish closing odds for some major soccer leagues and tennis, betting exchanges offer historical market data to account holders, and odds API providers sell archives. Coverage of opening and intermediate prices is more limited than closing prices. Collecting your own is often necessary.
How do I combine data from different sports sources?
Create mapping tables with stable team and player identifiers, normalise dates and time zones, and validate joins by checking scores match across sources. Keep raw data unchanged and apply transformations in a reproducible pipeline. Document every mapping decision so it can be reviewed later.