Skip to content

History

Three endpoints, all under /v1/historical/sports/{sport}/events/{id}/, all requiring the Scale plan or above (x-plan-min: scale). Scale covers fixtures that started in the last 14 days (or have not started yet); Business covers everything recorded. The archive begins in September 2026, so an earlier fixture has nothing recorded and the response says so explicitly rather than answering with an empty list.

EndpointReturns
/oddsEvery recorded price between the opening and closing line: the full line movement.
/openersThe first price each book showed for each market.
/closingThe last price each book showed before the fixture started.

Recorded vs. not recorded

A market is either genuinely absent from the archive (not_recorded) or it was seen and never repriced (no_movement) or it moved (recorded). Those three are never collapsed into one another: an empty points array only ever means not_recorded.

Example

GET/v1/historical/sports/nfl/events/nfl:falcons-panthers:2026-09-20/odds?markets=spreads,totals
curl --request GET \
  --url "https://oddslink.app/v1/historical/sports/nfl/events/nfl:falcons-panthers:2026-09-20/odds?markets=spreads,totals" \
  --header "X-API-Key: ok_live_..."
200 OKresponse.json
{
  "id": "nfl:falcons-panthers:2026-09-20",
  "sport_key": "nfl",
  "sport_title": "NFL",
  "commence_time": "2026-09-20T17:00:00Z",
  "home_team": "Atlanta Falcons",
  "away_team": "Carolina Panthers",
  "archive_from": "2026-09-01T00:00:00Z",
  "bookmakers": [
    {
      "key": "draftkings",
      "title": "DraftKings",
      "markets": [
        {
          "key": "spreads",
          "movement": "recorded",
          "points": [
            {
              "recorded_at": "2026-09-15T14:00:03Z",
              "outcomes": [
                {
                  "name": "Atlanta Falcons",
                  "price": -110,
                  "point": 3
                },
                {
                  "name": "Carolina Panthers",
                  "price": -110,
                  "point": -3
                }
              ]
            },
            {
              "recorded_at": "2026-09-18T18:08:20Z",
              "outcomes": [
                {
                  "name": "Atlanta Falcons",
                  "price": 100,
                  "point": 2.5
                },
                {
                  "name": "Carolina Panthers",
                  "price": -120,
                  "point": -2.5
                }
              ]
            }
          ]
        },
        {
          "key": "totals",
          "movement": "no_movement",
          "points": [
            {
              "recorded_at": "2026-09-15T14:00:03Z",
              "outcomes": [
                {
                  "name": "Over",
                  "price": -108,
                  "point": 43.5
                },
                {
                  "name": "Under",
                  "price": -112,
                  "point": 43.5
                }
              ]
            }
          ]
        },
        {
          "key": "h2h_h1",
          "movement": "not_recorded",
          "points": []
        }
      ]
    }
  ],
  "unmatched_bookmakers": []
}