// Historical data API

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.

Get your free API key → See the response
The short version

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.

// Example

An old match, a familiar shape

RequestGET
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.

Response200 OK
{
  "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 }
      }
    }
  ]
}
// Fields that matter

Reading the archive

league.season

The 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.*.id

Stable across every season and competition, even when a club changes its name or crest.

fixture.date

Kick-off in UTC, ISO 8601, for every season. No local-time guesswork when you line up old matches.

score

Half-time and full-time scores, plus extra time and penalties for the matches that needed them.

next

The cursor for the next page of a large result. Keep requesting until it comes back empty.

// What people build

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.

// Goes well with
// FAQ

Historical data questions

How far back does the data go?
Ten seasons, back to 2016/17, for the competitions we cover in depth. Smaller competitions may start later or carry less detail in their earliest seasons.
Which plan do I need?
The free tier covers the current season, Pro reaches back 5 years, and Business and Enterprise get the full 10. See pricing for the request limits on each.
Is old data in the same format as live data?
Yes. Same envelope, same field names, same IDs. A parser written for tonight's fixtures reads a 2017 fixture without changes.
Can I download everything at once?
On any paid plan you can walk a full season with the next cursor. For the whole archive in one go, Enterprise includes bulk exports and S3 drops.
Do you have historical odds too?
Yes: opening and closing lines with the movement in between, on Business and Enterprise. More on the odds API page.

Ten seasons,
one request away.

Start on the free tier: 100 requests a day, no card. Upgrade when your traffic does.

Get your free API key → See pricing