Players and results
FanDuel prop results, hit rates and player data
Players matched to ESPN athletes with headshots, injury reports, box score lines, every prop graded against the final box score, and over hit rates per player.
FanDuel API is an independent data service operated by FF API Inc. It is not affiliated with, endorsed by or sponsored by FanDuel.
Join each FanDuel line to what actually happened, and train on graded outcomes instead of guesses.
- Graded
- Closing FanDuel line, box score value, and over, under, push or void with its reason.
- Matched, not guessed
- Only props matched to a confirmed player and game are graded; ambiguous names stay ungraded.
- Hit rates
- How often the over hit across the last N games against the closing line, with the sample size.
What it returns now
| Player | Stat | Close | Actual | Result |
|---|---|---|---|---|
| Martin Necasshots on goal | shots on goal | 2.5 | 3 | over |
| Cale Makarshots on goal | shots on goal | 2.5 | 0 | under |
| Nathan MacKinnonshots on goal | shots on goal | 3.5 | 1 | under |
| Artturi Lehkonenshots on goal | shots on goal | 2.5 | 2 | under |
| Mackenzie Blackwoodsaves | saves | 21.5 | 22 | over |
| Brock Nelsonshots on goal | shots on goal | 1.5 | 1 | under |
| Nazem Kadrishots on goal | shots on goal | 2.5 | 3 | over |
| Justus Annunensaves | saves | 28.5 | 30 | over |
More on the graded examples page and in hit rates.
Endpoints and parameters
/api/v1/playersOne record per player: id, league, team, position, the ESPN athlete id and headshot_url when a unique exact match was made, and any current injury.
| Parameter | In | Description |
|---|---|---|
| league | query | League code as FanDuel lists it, such as NBA. |
| team | query | Team code. |
| q | query | Part of a player name. |
| limit | query | Rows per page, 1 to 200. Default 50. |
| offset | query | Rows to skip, for paging. |
/api/v1/injuriesThe latest injury report per league, by player.
| Parameter | In | Description |
|---|---|---|
| league | query | League code as FanDuel lists it, such as NBA. |
| player | query | Player id or part of a name. |
| limit | query | Rows per page, 1 to 200. Default 50. |
| offset | query | Rows to skip, for paging. |
/api/v1/game-logsPlayer box score lines from final games, newest first.
| Parameter | In | Description |
|---|---|---|
| league | query | League code as FanDuel lists it, such as NBA. |
| player | query | Player id. |
| game_id | query | Game id. |
| limit | query | Rows per page, 1 to 200. Default 50. |
| offset | query | Rows to skip, for paging. |
/api/v1/resultsClosing FanDuel line, box score value, and over, under, push or void with its reason. Only props matched to a confirmed player and game are graded.
| Parameter | In | Description |
|---|---|---|
| league | query | League code as FanDuel lists it, such as NBA. |
| player | query | Player id. |
| stat | query | Stat. |
| limit | query | Rows per page, 1 to 200. Default 50. |
| offset | query | Rows to skip, for paging. |
/api/v1/hit-ratesPer player and stat, how often the over hit over the last N games against the closing FanDuel line, with the sample size.
| Parameter | In | Description |
|---|---|---|
| league | query | League code as FanDuel lists it, such as NBA. |
| player | query | Player id. |
| stat | query | Stat. |
| games | query | Last N graded games. |
Code
curl "https://fanduelapi.com/api/v1/players?league=NBA&q=james" \
-H "Authorization: Bearer $FANDUEL_API_KEY"import os, requests
r = requests.get(
"https://fanduelapi.com/api/v1/players",
params={"league": "NBA", "q": "james"},
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
- 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 - Line historyReplay a prop or a game line from the first time it was seen to now, move by move.
/api/v1/props/{id}/history
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