Ten years of football,
one schema.
Fixtures, results, lineups, events, standings and player and team statistics back to the 2016/17 season, in exactly the same shape as tonight's matches. Train on the past, run on the present, and change nothing in between.
Add a season to any endpoint: /v1/fixtures?league=39&season=2019 returns the 2019/20 Premier League. Business and Enterprise reach back 10 years, Pro 5 years, and the free tier covers the current season.
An old match, a familiar shape
curl -s "https://api.soccer-data.co/v1/fixtures?league=39&season=2019&team=50&date=2019-12-15" \ -H "X-Api-Key: $SOCCER_DATA_KEY"
Same IDs, every season
Team 50 is Manchester City in 2016 and in 2026. Join a decade of results to today's fixtures without a mapping table.
Pull whole seasons
Large requests page with a stable next cursor. Enterprise adds bulk exports and S3 drops for the full archive.
{
"get": "fixtures",
"parameters": { "league": "39", "season": "2019", "team": "50", "date": "2019-12-15" },
"results": 1,
"response": [
{
"fixture": {
"id": 157138,
"date": "2019-12-15T16:30:00+00:00",
"status": { "short": "FT", "elapsed": 90 },
"venue": { "name": "Emirates Stadium", "city": "London" }
},
"league": {
"id": 39,
"name": "Premier League",
"season": 2019,
"round": "Regular Season - 17"
},
"teams": {
"home": { "id": 42, "name": "Arsenal", "winner": false },
"away": { "id": 50, "name": "Manchester City", "winner": true }
},
"goals": { "home": 0, "away": 3 },
"score": {
"halftime": { "home": 0, "away": 3 },
"fulltime": { "home": 0, "away": 3 }
}
}
]
}
Reading the archive
league.seasonThe year the season started, so 2019 means 2019/20. Leagues that run in a calendar year, like MLS or the Brasileirão, use that year.
teams.*.idStable across every season and competition, even when a club changes its name or crest.
fixture.dateKick-off in UTC, ISO 8601, for every season. No local-time guesswork when you line up old matches.
scoreHalf-time and full-time scores, plus extra time and penalties for the matches that needed them.
nextThe cursor for the next page of a large result. Keep requesting until it comes back empty.
Where history earns its keep
Prediction models
Train on ten seasons, then score this weekend's fixtures with the same code.
Backtests
Replay old seasons match by match, with opening and closing odds alongside on Business.
Scouting
Compare a player's per-90 numbers across seasons, clubs and leagues on one set of definitions.
Records & trivia
Find the "first time since" stat, the longest unbeaten run, or the head-to-head that settles the argument.
Depth varies by competition: top divisions carry lineups, events and full statistics across all ten seasons, while older seasons of smaller competitions may have fixtures and results only.