draftkings apiDashboard ↗

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.

A page of completed NFL rows
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.

Categories seen on NFL rows.
CategoryKeys to start with
receivingreceptions, receivingYards, receivingTouchdowns, receivingTargets, longReception
rushingRead the keys returned in your rows
passingRead the keys returned in your rows
defensive, fumbles, interceptionsRead the keys returned in your rows
kicking, punting, kickReturns, puntReturnsRead 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.

One line per player per game
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.

One athlete. Replace the placeholder with a returned ID.
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 3

Check 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

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.