Historical odds API for backtesting and closing line value

The game-line archive holds 1.7M+ closing lines and includes history from 2005. A separate player-prop archive holds 30M+ rows, but availability varies by sport, market, bookmaker and date. Ask support to verify an exact prop scope before choosing a paid plan.

1.7M+
Game closing lines
30M+
Prop closing lines
2005
Game-line coverage starts
1,000
Free credits / month

What the historical odds API covers

Historical is split by product shape so modelers can tell prices from results - we do not derive or invent missing odds. Both archive counts are floors that grow daily. /v1/historical/stats reports live game-line numbers for free; it does not report player-prop coverage.

Closing linesSeparate game-line and prop archives

The game-line archive holds 1.7M+ closing lines and includes history from 2005, deepest in NFL and soccer. The player-prop archive holds 30M+ rows, but availability varies by sport, market, bookmaker and date. Mix game-line and prop market keys in one flat-cost call. Use dateFrom/dateTo for a prop date range, with bookmakers or a player substring to narrow it. The season filter applies to game lines only.

GET /v1/historical/sports/{sport_key}/closing-odds

Snapshotsthe-odds-api-compatible point-in-time odds

Historical odds at a timestamp, on the same date, regions, and markets parameters and response shape as the-odds-api's historical endpoint - existing code works after a base-URL change. Priced like theirs too: 10 × markets × regions per call.

GET /v1/historical/sports/{sport_key}/odds?date=…

Results + periodsMatch archive and period markets

A match/result archive for schedules, teams, and scores (rows with real prices carry has_odds=true), and a period-market archive that replays how quarter, half, and F5 lines moved state by state.

GET /v1/historical/sports/{sport_key}/matches GET /v1/historical/sports/{sport_key}/period_markets

Bulk + freeDaily exports and zero-credit sizing

Daily closing-line exports as CSV or JSON for 1 credit - the cheap path for warehouse loads. And before you spend anything, /v1/historical/stats and /v1/historical/coverage are free: live row counts, per-sport date ranges, and per-source depth for game history. These summaries do not establish the date range of a specific player prop.

GET /v1/historical/closing-lines.csv GET /v1/historical/stats

Size the archive before you sign up

Start with the free game-history summaries below. They describe game-line coverage, not the availability of each player prop. For a prop backtest, verify the league, market, bookmakers and date range you need before choosing a paid plan. Use the documentation to check your query, or ask support to confirm the requested scope.

Historical coverage map

Per-sport, per-book depth of the game-line archive - which years and which sources actually have rows. It does not report player-prop coverage.

parlay-api.com/historical-coverage →

Live archive stats

The free /v1/historical/stats endpoint: live game-line row counts and earliest/latest dates per sport and bookmaker. No key needed.

/v1/historical/stats →

Datasets

Bulk historical datasets and export options, for teams that want files rather than API calls.

parlay-api.com/datasets →

Flat-cost closing lines vs the 10× multiplier

the-odds-api's docs state that "The usage quota cost for historical odds is 10 per region per market" (their v4 guide, read 2026-08-25) - so one US snapshot with h2h, spreads, and totals costs 30 credits, per timestamp, and the endpoint is only available on paid usage plans. ParlayAPI's closing-odds archive is a flat 10 credits per call no matter how many markets you mix in - game lines and player props together - and the free tier's 1,000 monthly credits cover 100 closing-odds pulls with no card on file.

the same backtest pull, priced
# the-odds-api: 10 credits x 1 region x 3 markets = 30 credits per snapshot,
# paid plans only (their v4 guide, read 2026-08-25)
GET api.the-odds-api.com/v4/historical/sports/americanfootball_nfl/odds?regions=us&markets=h2h,spreads,totals&date=2024-10-18T12:00:00Z

# Verify the exact prop scope first, then supply your backtest date.
# ParlayAPI: whole day of closing lines, game lines + props mixed = flat 10 credits,
# works on the free tier
GET parlay-api.com/v1/historical/sports/americanfootball_nfl/closing-odds?date=${BACKTEST_DATE}&markets=h2h,spreads,totals,player_pass_yds

Where the-odds-api is the better pick

the-odds-api's historical product is a genuine strength of theirs: point-in-time snapshots at 10-minute intervals from June 2020 and 5-minute intervals from September 2022 (per the same guide, read 2026-08-25). If your research needs intraday line movement across several years - not just closing prices - that snapshot density beats our archive, whose line-movement history only starts when we began capturing a given market. Our own the-odds-api-compatible snapshot endpoint also prices the same way theirs does (10 × markets × regions); the flat pricing above is specific to the closing-line archive. Full comparison: ParlayAPI vs the-odds-api.

Quickstart: backtests and CLV

Endpoint shapes below are the real ones from the API docs. Auth is either the-odds-api-style apiKey= query param or an X-API-Key header.

curl - closing lines for a verified date and scope
# Ask support to verify the exact sport, market, bookmaker and date scope first.
BACKTEST_DATE="YOUR_VERIFIED_DATE"
PROP_DATE_FROM="YOUR_VERIFIED_START_DATE"
PROP_DATE_TO="YOUR_VERIFIED_END_DATE"

curl "https://parlay-api.com/v1/historical/sports/americanfootball_nfl/closing-odds?date=${BACKTEST_DATE}&markets=h2h,spreads,totals,player_pass_yds&bookmakers=pinnacle" \
  -H "X-API-Key: YOUR_KEY"

# request one player's prop closes for your verified date range
curl "https://parlay-api.com/v1/historical/sports/basketball_nba/closing-odds?dateFrom=${PROP_DATE_FROM}&dateTo=${PROP_DATE_TO}&markets=player_points&player=YOUR_PLAYER" \
  -H "X-API-Key: YOUR_KEY"

# free, no credits: size the game-line archive for your sport
curl "https://parlay-api.com/v1/historical/stats"
Python - the CLV loop: snapshot at bet time, grade at close
import requests

BASE = "https://parlay-api.com"
H = {"X-API-Key": "YOUR_KEY"}

# 1) When you place (or nearly place) a bet, snapshot the live price
live = requests.get(f"{BASE}/v1/sports/americanfootball_nfl/odds",
                    params={"regions": "us", "markets": "spreads"}, headers=H).json()
my_price = -108  # the price you actually took

# 2) After kickoff, pull the closing line for the same game/market/book
closes = requests.get(
    f"{BASE}/v1/historical/sports/americanfootball_nfl/closing-odds",
    params={"date": "2024-10-18", "markets": "spreads", "bookmakers": "pinnacle"},
    headers=H).json()

# 3) CLV = your price vs the closing price. Beat the close over 200+ bets
#    and the model is real. For batch grading, POST /v1/clv scores a whole
#    bet list against closing lines in one call.

SDK on GitHub: JacobiusMakes/parlay-api-python (MIT-licensed). Building with an AI agent instead? There's an official MCP server with 22 tools: pip install parlayapi-mcp.

Historical odds API - frequently asked

How far back does the historical odds data go?

The game-line archive holds 1.7M+ closing lines and includes history from 2005, deepest in NFL and soccer. The separate player-prop archive holds 30M+ rows, but availability varies by sport, market, bookmaker and date. Free historical stats and coverage endpoints describe game lines only and cannot confirm a specific player prop. Before choosing a paid plan, ask support to verify the exact league, prop market, bookmakers and date range you need.

How much do historical odds API calls cost?

A closing-odds call is a flat 10 credits, no matter how many markets you request - you can mix h2h, spreads, totals, and player prop keys in one call. For comparison, the-odds-api's docs state its historical usage cost is 10 per region per market, so a 3-market US call is 30 credits there per snapshot (their v4 guide, read 2026-08-25), and its historical endpoint is only available on paid plans. ParlayAPI's free tier includes 1,000 credits per month with no card - enough for 100 closing-odds pulls. Note our the-odds-api-compatible snapshot endpoint prices the same way theirs does (10 × markets × regions); the flat price is on the closing-line archive.

Can I backtest player props with historical closing lines?

Yes, where the requested selections are archived. The player-prop archive holds 30M+ rows, but sport, market, bookmaker and date coverage can start at different times or contain gaps. Free historical stats and coverage endpoints describe game lines only, so ask support to verify the exact prop scope before choosing a paid plan. Query /v1/historical/sports/{sport_key}/closing-odds with prop market keys like player_points or player_strikeouts, filter to a single player with the player parameter, and select the prop date range with dateFrom/dateTo. The season filter applies to game lines only. More on the player props API page.

Is the historical endpoint compatible with the-odds-api?

Yes. GET /v1/historical/sports/{sport_key}/odds mirrors the-odds-api's historical snapshot endpoint - same date, regions, and markets parameters, same response shape - so existing the-odds-api historical code works after a base-URL change. One difference you must handle: on this endpoint last_update and commence_time are nullable, and are null on most rows today; a null means the capture time was not recorded, never that the price is bad.

How do I compute closing line value (CLV) with the API?

Snapshot your price at bet time from /v1/sports/{sport_key}/odds, then after the game starts pull the closing price from /v1/historical/sports/{sport_key}/closing-odds and compare. For batch grading there is a dedicated POST /v1/clv endpoint that scores a list of bets against closing lines in one call. Tracked over a few hundred bets, cumulative CLV is the standard test of whether a betting model has real edge.

Backtest before the season starts.

CFB Week 0 kicks off August 29 and the NFL follows September 9. Sign up free - 1,000 credits a month, no card required - and run your first closing-line backtest today.