INDEPENDENT DEVELOPER REFERENCE
NFL game logs API for player statistics
Build an NFL player game log from retained ESPN box scores: category rows, starting-year seasons, receiving and rushing keys and cursor pages.
Editorial review: · Not a live coverage report
The NFL request
Use /api/v1/stats/player-games with sport=NFL. NFL uses the starting year: season=2026 is the 2026 season. Independent ESPN statistics cover NBA, NFL and NHL as limited retained game samples, not full seasons. As of 2026-11-03 those samples were captured after the games were played, so they do not show what was known at game time.
curl --fail-with-body "https://draftkingsapi.com/api/v1/stats/player-games?sport=NFL&season=2026&completed=true&limit=50" \
-H "Authorization: Bearer $DRAFTKINGS_API_KEY"One row per category
An NFL player game is not one row. A player can have one row per category within a game, so a receiver who also rushed has two. Combine rows on event_id plus athlete_id when you want one line per game. The event ID is on game.event_id.
| Category | Keys to start with |
|---|---|
receiving | receptions, receivingYards, receivingTouchdowns, receivingTargets, longReception |
rushing | Read the keys returned in your rows |
passing | Read the keys returned in your rows |
defensive, fumbles, interceptions | Read the keys returned in your rows |
kicking, punting, kickReturns, puntReturns | Read the keys returned in your rows |
The label YDS and TD repeat across categories, so always read a statistic by key and category, never by label alone. The request cannot filter on category. Filter returned rows on your side.
Merge categories into one game line
This merge keeps one dictionary per game and athlete and prefixes nothing, since NFL keys such as receivingYards already name their category. Check for key collisions in the categories you merge.
from collections import defaultdict
games = defaultdict(dict)
for row in rows:
game = row["game"]
key = (game["event_id"], row["data"]["athlete_id"])
games[key]["starts_at"] = game["starts_at"]
games[key]["name"] = row["data"]["name"]
for stat in row["data"]["stats"]:
if stat["scope"] == "game":
games[key][stat["key"]] = stat["numeric"]
for line in sorted(games.values(), key=lambda g: g["starts_at"]):
print(line["starts_at"][:10], line["name"], line.get("receivingYards"))Read one athlete's games
Add athlete_id, a numeric ESPN ID. There is no name search, so read it from a page of rows, filtered by team_id to stay small. Use from and to for a week's dates: the API has no week parameter.
curl --fail-with-body "https://draftkingsapi.com/api/v1/stats/player-games?sport=NFL&season=2026&athlete_id=ATHLETE_ID&limit=50" \
-H "Authorization: Bearer $DRAFTKINGS_API_KEY"Pages follow a cursor based on event, athlete and category, not date. Follow pagination.next through after, then sort on game.starts_at. limit accepts 1 to 200.
Display-only and nullable values
A statistic keeps its source string in display and sets numeric only when that string is a plain number. Values such as attempts and completions in one field stay display-only. starter and did_not_play can be null on NFL rows, which means unknown rather than false.
Sport-specific limits
Stored NFL samples are limited. A valid season does not mean every week or player is present. Read available and coverage on each response, and the coverage report for counts. Rows are ESPN identities, separate from DraftKings IDs, and they are not settlement data for any entry.
/api/v1/context/player-stats?sport=NFL is a second source for games the sportsbook collector observed, with statistics entries holding key, label and value strings. As of 2026-11-03, native sportsbook scopes cover New York NFL, NHL, college basketball and college football game lines and New York NHL Shots on Goal, points, assists, saves, goalscorers, power-play points and first-period shots. Read snapshots and streamed changes through the sportsbook endpoints. ESPN-attributed DraftKings moneyline, spread and total observations are also available across eight leagues. Current scope inventory is listed at /api/v1/sportsbook/scopes.
Try it
Replace ID with an athlete ID returned by listing rows.
python3 player-game-log.py --sport NFL --season 2026 --max-pages 1
python3 player-game-log.py --sport NFL --season 2026 --athlete-id ID --stat receivingYards --max-pages 3Check the recorded data
Questions
What season value is the 2026 NFL season?
Use season=2026. NFL uses the starting year, while NBA and NHL use the ending year.
Why does a player have two rows for one game?
NFL rows are split by category, such as receiving and rushing. Merge on event and athlete if you want one line for each game.
Is there a filter for an NFL week?
No. Use from and to with dates that cover the week, then sort on game.starts_at.
Are full NFL seasons available?
No. Retained NFL games are limited samples. Check the coverage report and the response's coverage field for what is actually stored.
Related resources
Read NFL Receiving Yards targets from Pick6 and receivingYards from ESPN box scores, with targets, receptions and part-of-game labels kept apart.
NFL Pick6 props APIFilter recorded NFL Pick6 rows by exact stat label, encode spaces and plus signs, and tell first-quarter and first-half markets apart.
Training data for sports prop modelsWhy there is no ready-made training set here, where point-in-time leakage comes from, and how to record your own as-of dataset from now on.
DraftKings API pagination: offset, after and cursorsThree pagination styles with working loops: offset lists, the Pick6 next_after sequence and statistics cursors, plus their limits.
Independent service operated by DD Inc., not affiliated with or endorsed by DraftKings. Technical access is not a redistribution license. No wagering: this service does not place, recommend or settle entries or bets. Check sources and status for actual capture context.