TheRundown developer API
Historical odds API for line movement and closing lines
Pull the recorded history of a sportsbook line: every open, price change, close and reopen, each with a timestamp, for 25+ books in one JSON schema. Chart a market’s line movement, read opening and closing lines for a sport and date, and measure closing line value, with the same event, market and participant IDs as live odds.
Free: delayed pre-match main lines from three books. No credit card. Real-time REST and WebSocket require Ultra or above.
What the historical odds API returns
History is recorded per sportsbook, market, participant and line. Each change keeps its timestamp and its type, so you can see when a line opened, every move after that, when it closed and whether it reopened. Each point also says whether that line was the main line at the time, so you can follow the main spread as it moves from number to number.
In-play prices are recorded too. On the full history route, request the in-play market IDs 41, 42, 43 and 96 alongside 1, 2 and 3: that route matches market_ids literally and does not add in-play markets on its own.
| Endpoint | What it returns | Use it for |
|---|---|---|
| GET /events/{event_id}/markets/{market_id}/history | A chart-ready series for one market, oldest first, grouped by sportsbook: a timestamp, price, line and main-line flag on each point | A line movement chart for one game |
| GET /events/{event_id}/markets/history | Price-change rows for up to 12 markets, newest first, each with a change type (open, price, close or reopen); pass 1 to 3 sportsbook IDs | A full record of how a game’s markets moved |
| GET /events/{event_id}/openers and /closing | The opening or closing snapshot for one event | Closing line value on a single bet |
| GET /sports/{sport_id}/openers/{date} and /closing/{date} | Opening or closing lines for every event in a sport on a date | A nightly closing-line pull for a whole slate |
How far back the odds history goes
History starts on Starter, and each plan reads back a fixed window: 7 days on Starter, 30 days on Pro, 90 days on Ultra, 6 months on Super, 1 year on Mega, unlimited on Max. On opening and closing lines the window applies to the event date, floored to midnight UTC, and an older date returns 403 with the earliest date your key can read. Free has no history access.
Every plan from Starter includes line history, and Pro and above include opening and closing lines. Pick the plan by how far back your product needs to read, not only by request volume.
| Plan | Odds history window | Monthly price |
|---|---|---|
| Starter | 7 days | $49 a month |
| Pro | 30 days | $149 a month |
| Ultra | 90 days | $399 a month |
| Super | 6 months | $649 a month |
| Mega | 1 year | $999 a month |
| Max | Unlimited | $2,499 a month |
Chart one market’s line movement in Python
This script follows one sportsbook’s main spread for one side of a game, oldest first. It finds the side’s participant_id with /markets/participants, then passes it to the single-market history route with the sportsbook ID.
Add from and to (RFC 3339 timestamps) to narrow the window. limit defaults to 1,000 points and accepts up to 5,000, and there is no paging cursor, so narrow the window if a response reaches the limit.
import os
import requests
API = "https://therundown.io/api/v2"
HEADERS = {"X-TheRundown-Key": os.environ["THERUNDOWN_API_KEY"]}
EVENT = os.environ["EVENT_ID"] # an event inside your plan's history window
# 1. The participant_id for one side of the spread market (2)
found = requests.get(f"{API}/markets/participants",
params={"event_id": EVENT, "market_ids": "2"},
headers=HEADERS, timeout=30)
found.raise_for_status()
side = found.json()["participants"][0]
# 2. DraftKings (19) main spread history for that side, oldest first
chart = requests.get(f"{API}/events/{EVENT}/markets/2/history",
params={"participant_id": side["participant_id"],
"affiliate_ids": "19", "main_line": "true"},
headers=HEADERS, timeout=30)
chart.raise_for_status()
print(side["participant_name"])
for point in chart.json()["series"]["19"]["data"]:
print(point["t"], point["l"], point["p"])Each point carries t (timestamp), p (price, as a string), l (line) and m (main-line flag), and a closed point also carries c. A chart response counts one data point per returned point.
Backtesting and licensing
Because every open, move, close and reopen is timestamped, the history is a backtest-ready record of how lines moved. Backtesting or validating a model against TheRundown data, whether machine learning, statistical or otherwise, needs our prior written permission: email [email protected] before you start.
Free and Starter are for internal or personal use. Commercial end-user display begins on Pro.
Historical odds API pricing and plan delays
History starts on Starter at $49 a month and reads back 7 days on Starter, 30 days on Pro, 90 days on Ultra, 6 months on Super, 1 year on Mega, unlimited on Max. History responses count data points against your plan’s monthly volume like live odds, and the X-Datapoints header on each response shows what it counted.
| Monthly plan | USD/month | Odds delay | Included volume | Use and delivery |
|---|---|---|---|---|
| Free | $0 | 5 minutes | 20,000/day · 200,000/month | Three books; delayed pre-match main lines. Internal or personal use. |
| Starter | $49 | 60 seconds | 25,000,000/mo | Additional books, props, alternates and delayed in-play odds. Internal or personal use. |
| Pro | $149 | 30 seconds | 125,000,000/mo | Commercial end-user display and a 30-second odds delay. |
| Ultra | $399 | Real-time | 500,000,000/mo | Real-time REST, WebSocket, futures and supported live game data. |
Annual billing has different monthly equivalents. Monthly and annual plans stop at included data points by default; optional overage and weekly billing have separate terms. Super, Mega and Max add published volume and connection capacity; Enterprise is scoped by contract. Confirm effective API and stats access in response headers.
Historical odds API FAQ
- What is a historical odds API?
- A historical odds API returns how sportsbook lines and prices moved over time, not only the current price. TheRundown records every open, price change, close and reopen with a timestamp for 25+ books, and serves it as JSON alongside opening and closing lines.
- How far back does the odds history go?
- It depends on the plan: 7 days on Starter, 30 days on Pro, 90 days on Ultra, 6 months on Super, 1 year on Mega, unlimited on Max. Free has no history access.
- Is there a free historical odds API?
- No. A free key returns five-minute-delayed pre-match odds and no history. History starts on Starter, $49 a month, with a 7 days window.
- Does the history include every line movement?
- It includes every recorded change: the open, each price or line move, the close and any reopen, each with a timestamp and a main-line flag. In-play prices are included when you request the in-play market IDs (41, 42, 43 and 96) on the full history route.
- Can I get opening and closing lines?
- Yes. /sports/{sport_id}/openers/{date} and /sports/{sport_id}/closing/{date} return every event for a sport on a date, and /events/{event_id}/openers and /events/{event_id}/closing return one event. Pro and above include them, and your plan’s history window applies to the event date.
- Can I backtest a betting model with historical odds?
- Only with our prior written permission. Backtesting or validating a model against TheRundown data needs it, so email [email protected] before you start.
- How is historical odds data billed?
- In data points, like live odds. A chart response counts one data point per returned point, and the X-Datapoints header on every response shows what it counted. Filter by sportsbook, market and time window to keep responses small.
Build and compare
Choose the API scope that matches your application. Each guide below covers a different integration need.
Product and documentation sources checked October 13, 2026. Source, sport, event and market availability varies; catalog entries do not guarantee a priced line or a populated statistic.