draftkings apiDashboard ↗

INDEPENDENT DEVELOPER REFERENCE

DraftKings API response schema, field by field

Every response field for sportsbook, Pick6, DFS, statistics and context rows, with types, null behavior and how to read each one.

Editorial review: · Not a live coverage report

The shared envelope

List endpoints return a JSON object with dataset, data, pagination and caveats. Read caveats once when you integrate, because it states the source boundary in the dataset's own terms. Errors use a different shape, {"error":{"code":400,"message":"..."}}.

FieldMeaning
datasetsportsbook, pick6, dfs, espn-context or espn-independent-stats.
dataThe rows. An empty array is a valid result.
paginationlimit, offset, has_more on offset lists; next_after added on Pick6 history; limit, next, has_more on statistics.
coveragePick6 and statistics only. Stored row counts and collector context on Pick6, a sentence on statistics.
caveatsThe source boundary for this dataset.

Sportsbook rows

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. Events come from /api/v1/events and prices from /api/v1/odds. Join them on event_id.

Odds rows
FieldTypeNotes
idstringOffer identity, prefixed with its source.
event_idstringFor example espn-draftkings:espn:NBA:401909925. The last part is the ESPN event ID.
source_idstringespn-draftkings for the current adapter.
marketstringmoneyline, spread or total.
periodstringgame on current rows.
sidestringhome, away, over or under.
linestring or nullNull on moneyline. Signed on spread. The total on total rows. Parse it.
americannumberAmerican price, for example -110.
decimalstringDecimal price as a numeric string.
observed_attimestampWhen we captured the row.
source_updated_atnullThe venue price clock is unknown.
provenanceobjecturl, provider and rights_reference.
fingerprintstringHash of the offer content.
event_statusstringpre, in, post or unknown.
age_seconds, stalenumber, booleanCapture age, and true beyond 15 minutes.

Event rows carry id, source_id, sport, home, away, starts_at, observed_at, provenance, event_status, age_seconds and stale. History rows from /api/v1/history carry seq, offer_id, observed_at, age_seconds, stale and the offer under data. Inside data, line and decimal are numbers.

Pick6 rows

Pick6 rows carry standings multipliers such as 1.5x. A standings multiplier is not decimal odds, a probability or an established entry payout. The tuple pick_group_id, pickable_id and pickable_market_id identifies one market row.

FieldTypeNotes
sport, statstringFor example NHL, Shots on Goal.
stat_abbreviationstringSource short form, such as SOG or RecYds.
target_valuenumberThe line, such as 34.5.
periodstring or nullNull means unknown, not full game.
is_live, is_pausedbooleanPaused rows must not be treated as selectable.
selectionsarrayOne entry per explicit side.
selections[].sidestringMore, Less or Yes in current captures.
selections[].standings_multipliernumberFor example 8.2. Not decimal odds.
selections[].formatted_standings_multiplierstringSource display form, for example 8.2x.
selections[].selection_idstringSource identity for that selection.
entitiesarrayAthletes, each with entity_id, full_name, display_name and events.
entities[].events[]arrayevent_id, name, team_name, opponent_name, start_time.
live_stat_value, live_stat_updated_atnumber, string, or nullThe live stat and its own clock, which is not the offer clock.
promo_class, promo_type_idstring or nullSource promotion labels. Missing labels stay unknown.
market_id, product, raw_source_statusvariousSource context.
source_url, capture_hashstringCapture evidence.
observed_at, source_updated_attimestamp, nullCapture clock, and the unknown source clock.
age_seconds, stalenumber, booleanCapture age, and true beyond 15 minutes.

Pick6 history rows add change_id and previous, which holds the prior version of the same row.

DFS rows

DFS rows wrap the source record: id, sport, slate_id, observed_at, source_updated_at, received_at, http_date, payload_sha256, adapter_version, rights_status, source_url, caveats and data. The nested data shape depends on the resource, and it can vary by sport.

ResourceIdentityUseful nested fields
dfs/sportssportIdfullName, isEnabled, hasPublicContests, regionAbbreviatedSportName
dfs/slatesDraftGroupIdSport, GameCount, StartDate, DraftGroupTag, ContestStartTimeSuffix
dfs/contestsidn (name), dg (draft group), sdstring (start), gameType, attr
dfs/playersdraftableIdsalary, rosterSlotId, playerId, playerDkId, displayName, position, teamAbbreviation, competition, draftStatAttributes

The source's own short names, such as n and dg, are preserved, not translated. Salary is a DFS roster cost, not a line or a price.

Statistics rows

/api/v1/stats/* returns dataset: espn-independent-stats, kind, sport, season, available and rows shaped {"data":..., "game":...}. 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.

ObjectFields
Gameevent_id, sport, season, season_type, starts_at, state, completed, status, period, display_clock, source_updated_at, teams, evidence
Player gameathlete_id, name, team_id, opponent_id, category, starter, did_not_play, stats
Team gameteam_id, opponent_id, stats
Statkey, label, display, numeric, scope
Evidenceurl, observed_at, http_date, last_modified, sha256

numeric is a scalar or null. Values like 1-3 and 13:10 stay display-only. scope is game or season-to-date, and season-to-date stats must not be used as single-game results.

Context rows

/api/v1/context/games, player-stats and team-stats return dataset: espn-context with rows holding kind, sport, event_id, entity_id, observed_at, source_url, payload_sha256, data, age_seconds and stale. Context statistics store a string value for each stat, unlike the numeric field on statistics rows.

Rules for all datasets

Treat missing and null as unknown. Store source identifiers as strings, because large IDs and leading characters do not survive conversion. Ignore fields you do not recognize, so that added fields cannot break your parser.

Try it

curl --fail-with-body "https://draftkingsapi.com/api/v1/pick6/projections?sport=NBA&limit=1" \
  -H "Authorization: Bearer $DRAFTKINGS_API_KEY"

curl --fail-with-body "https://draftkingsapi.com/api/v1/odds?sport=NBA&limit=1" \
  -H "Authorization: Bearer $DRAFTKINGS_API_KEY"

Questions

Why is source_updated_at null on every row?

The source does not give us a venue update clock for these rows, so the honest value is null. Use observed_at for capture time, and do not describe it as the time the price changed.

Why are line and decimal strings on odds rows?

Current odds rows return these database numerics as strings, and moneyline rows have a null line. Parse them with your language's decimal or float conversion. Nested history payloads hold numbers.

Is there a machine-readable schema?

Yes. The public OpenAPI document at /api/openapi lists endpoints and parameters. Nested source records vary by sport, so inspect real responses too.

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.