Skip to main content
Historical Odds API

Historical Odds for Backtesting and Models

Closing lines from the bookmakers you pick, with the final score attached. Pull a whole league season in a handful of requests, or one event at a time, from the same API key you use for live odds.

Last updated

Closing odds since
Dec 2025
Per bulk request
366 days
Bookmakers per request
30
Leagues per request
10

A Month of Closing Lines in One Request

/v3/historical/closing-lines returns every settled event in the window with its closing odds and final score. Events with no odds from your bookmakers still appear, with an empty bookmakers object, so a missing price never looks like a missing match.

Request
curl "https://api.odds-api.io/v3/historical/closing-lines?apiKey=YOUR_API_KEY\
&sport=football&leagues=england-premier-league,spain-la-liga\
&from=2026-01-01T00:00:00Z&to=2026-01-31T23:59:59Z\
&markets=ML&bookmakers=Bet365,Unibet&limit=100"
Response (trimmed)
[
  {
    "id": 123456,
    "home": "Arsenal",
    "away": "Chelsea",
    "date": "2026-01-14T20:00:00Z",
    "status": "settled",
    "league": { "name": "England - Premier League", "slug": "england-premier-league" },
    "scores": { "home": 2, "away": 1 },
    "bookmakers": {
      "Bet365": [
        {
          "name": "ML",
          "updatedAt": "2026-01-14T19:58:12Z",
          "odds": [{ "home": "2.10", "draw": "3.40", "away": "3.60" }]
        }
      ]
    }
  }
]

Historical Endpoints

Four historical endpoints and one for line movement. The API reference has every parameter.

GET/v3/historical/closing-lines
Closing odds for many events at once: up to 10 leagues, 366 days, 30 bookmakers and the markets you name.Paid plans
GET/v3/historical/odds
Closing odds and the final score for one finished event, for up to 30 bookmakers.Every plan
GET/v3/historical/events
Settled fixtures and final scores for one league over up to 31 days.Every plan
GET/v3/historical/events/search
Settled events by team name across all leagues, newest first.Every plan
GET/v3/odds/movements
Pre-match line movement for one market: the opening price, the latest price and the changes in between.Every plan

Download a Season in Three Steps

  1. 1

    Pick the leagues and dates

    Choose a sport, up to 10 league slugs and a date range of up to 366 days, so a whole season fits in one sweep.

  2. 2

    Name the markets and bookmakers

    markets and bookmakers are required on the bulk endpoint, up to 30 bookmakers. Any name from /v3/bookmakers works, and odds come back under that same name.

  3. 3

    Page through the season

    Each response holds up to 100 settled events. Add skip until a page comes back short. A 240-match season is three requests.

What Developers Build With It

Backtest a betting model

Run a model over a past season and compare its prices with what each bookmaker closed at, with the final score in the same response.

Measure closing line value

Compare the price you took with the close. The movement history gives you the opening price too, so you can see how far the line travelled.

Build a training dataset

Pull closing odds for five leagues over a season in about 20 requests instead of roughly 1,900 one-per-match calls, as JSON you can load straight into a dataframe.

Data Depth and Limits

The event lists and bulk closing lines return settled events only. Market names match the ones /v3/odds serves, so historical and live data join on the same keys.

Closing odds history
Since December 2025
Date span, bulk closing lines
366 days
Date span, events and search
31 days
Leagues per bulk request
10
Bookmakers per request
30
Events per bulk response
100, page with skip
Format
JSON over REST

Historical Odds API FAQ

How far back does the historical odds data go?

Closing odds go back to December 2025. Older fixtures and final scores are still available from /v3/historical/events, but the odds endpoints return those events with an empty bookmakers object.

Which endpoint should I use for a whole season?

/v3/historical/closing-lines. It takes up to 10 leagues and 366 days per request and returns up to 100 settled events per page. Pulling five leagues for a season one event at a time is roughly 1,900 requests; the bulk endpoint returns the same data in about 20.

Is historical odds data included in my plan?

/v3/historical/events, /v3/historical/events/search and /v3/historical/odds are available on every plan. /v3/historical/closing-lines needs a paid plan. New free keys are paused, so Solo at £49/month is the cheapest way to start.

Which markets and bookmakers are covered?

Closing odds are stored for settled events across every bookmaker and market we cover. Market names depend on the sport: most use ML, Totals and Spread, tennis uses Totals (Games) and Spread (Games), and baseball names its first five innings in full. Call /v3/markets?sport=<sport> for the exact names, and /v3/historical/odds without a markets filter to see everything one event carries.

Do you have line movements, or only closing odds?

/v3/odds/movements returns the opening price, the latest price and the changes in between for one market line. History is pre-match only and is recorded for a fixed list of bookmakers, which the docs list in full. It is available on every plan.

Are unsettled or cancelled matches included?

/v3/historical/events, /v3/historical/events/search and /v3/historical/closing-lines list settled events only, so a finished match that has not settled in our pipeline yet does not appear there. /v3/historical/odds returns the event status, so check it. For an explicit answer on every event, including cancelled ones, use the bet settlement API.

Start Your Backtest

Historical data comes with the same key as live odds from 450+ bookmakers. Plans from £49/month.