Line history
FanDuel line history for props and markets
Every recorded state of a FanDuel prop or market, oldest first, with timestamps: where it opened, each line and price move, and where it closed.
FanDuel API is an independent data service operated by FF API Inc. It is not affiliated with, endorsed by or sponsored by FanDuel.
Replay a prop or a game line from the first time it was seen to now, move by move.
- Price-only moves
- An over going from -110 to -125 on the same line is its own entry, so closing line value is measured on price, not only on line.
- Timestamps
- Every point has observed_at, the time the collector read it. Nothing is interpolated.
- Open and close
- The move summary gives open, current, net line move and the direction prices moved.
What it returns now
Real rows, 5 min delay, as of 3:25 PM ET
{
"data": {
"prop": {
"id": "734.195493033-103179237",
"league": "NCAAF",
"player": "Jamal Rule",
"stat": "rushing_yards",
"line": 57.5
},
"move": {
"open": {
"line": 70.5,
"over_american": -114,
"under_american": -114,
"fair_over": 0.5,
"at": "2026-11-05T22:15:29.496Z"
},
"current": {
"line": 57.5,
"over_american": -114,
"under_american": -114,
"fair_over": 0.5,
"at": "2026-11-06T16:44:43.924Z"
},
"line_moves": 4,
"price_moves": 0
},
"history": [
{
"observed_at": "2026-11-06T16:33:43.292Z",
"line": 66.5,
"over_american": -114,
"under_american": -114
},
{
"observed_at": "2026-11-06T16:35:32.027Z",
"line": 58.5,
"over_american": -114,
"under_american": -114
},
{
"observed_at": "2026-11-06T16:44:43.924Z",
"line": 57.5,
"over_american": -114,
"under_american": -114
}
]
}
}Endpoints and parameters
/api/v1/props/{id}/historyEvery recorded state of one prop, oldest first, with its timestamp, plus the move summary.
| Parameter | In | Description |
|---|---|---|
| id * | path | Prop id from /api/v1/props. |
/api/v1/markets/{id}/historyEvery recorded state of one market, oldest first, with its timestamp.
| Parameter | In | Description |
|---|---|---|
| id * | path | FanDuel market id from /api/v1/markets, such as 734.195271534. |
| limit | query | Rows per page, 1 to 200. Default 50. |
| offset | query | Rows to skip, for paging. |
Code
curl "https://fanduelapi.com/api/v1/props/<prop id>/history" \
-H "Authorization: Bearer $FANDUEL_API_KEY"import os, requests
r = requests.get(
"https://fanduelapi.com/api/v1/props/{id}/history",
params={},
headers={"Authorization": f"Bearer {os.environ['FANDUEL_API_KEY']}"},
)
r.raise_for_status()
body = r.json()
print(body["meta"]) # plan, delay_seconds, as_of, source_status
for row in body["data"][:5]:
print(row)Keys look like fd_.... Keep one in the FANDUEL_API_KEY environment variable on your server, never in browser code. Every response's meta says which plan answered, how far behind it is and how fresh the collection is.
Which plans include it
- FreeIncluded, 5 minutes behind
- DeveloperIncluded, real time
- ProductionIncluded, real time
- ScaleIncluded, real time
Read from the plans on the pricing page. Every request counts against the monthly and per-minute allowance; request quotas explains how.
Works well with
- Change feedKeep a local copy of the board current by reading only what changed since your last call.
/api/v1/changes - CSV and NDJSON exportsLoad a slate or a season of line history straight into pandas, DuckDB or a spreadsheet.
/api/v1/export - Props feedRead the whole player prop board in one call, already normalised, with where each line opened.
/api/v1/props
Related
Make your first call in a few minutes
Sign up, create a key in the dashboard, and send it as a Bearer token. The free plan needs no card and reads the same data five minutes behind.
Get a free API key