Historical odds API for backtesting and closing line value

1.7M+ historical game closing lines with continuous coverage back to 2005, plus 30M+ player prop closing lines since June 2022. One flat-cost call can mix moneylines, spreads, totals, and prop keys - the raw material for model backtests and CLV tracking. Free tier, no card required.

1.7M+
Game closing lines
30M+
Prop closing lines
2005
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 the live numbers for free.

Closing linesGame lines back to 2005, props since 2022

1.7M+ game closing lines with continuous coverage from 2005 (deepest in NFL and soccer) and 30M+ player prop closing lines since June 2022. Mix game-line and prop market keys freely in one call, filter by season, date, dateFrom/dateTo, bookmakers, or a player substring - a flat 10 credits per call.

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.

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

Size the archive before you sign up

Backtests die on silent coverage gaps. These pages and endpoints are free and read from the same archive you'd be buying, so check your sport's depth first.

Historical coverage map

Per-sport, per-book depth of the closing-line archive - which years and which sources actually have rows.

parlay-api.com/historical-coverage →

Live archive stats

The free /v1/historical/stats endpoint: live 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

# 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=2024-10-18&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 date, game lines and props in one call
curl "https://parlay-api.com/v1/historical/sports/americanfootball_nfl/closing-odds?date=2024-10-18&markets=h2h,spreads,totals,player_pass_yds&bookmakers=pinnacle" \
  -H "X-API-Key: YOUR_KEY"

# a whole season of one player's prop closes
curl "https://parlay-api.com/v1/historical/sports/basketball_nba/closing-odds?season=2023-24&markets=player_points&player=jokic" \
  -H "X-API-Key: YOUR_KEY"

# free, no credits: size the archive for your sport first
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 closing-line archive holds 1.7M+ historical game closing lines with continuous coverage back to 2005 (deepest in NFL and soccer), plus 30M+ player prop closing lines going back to June 2022. Both counts are floors that grow daily. GET /v1/historical/stats is free and returns the live row count and per-sport date ranges, so you can size the archive for your exact sport before spending a credit.

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. The archive holds 30M+ player prop closing lines going back to June 2022. 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 pull whole seasons with season or dateFrom/dateTo - all inside the same flat 10-credit call as game lines. 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.