INDEPENDENT DEVELOPER REFERENCE
Track DraftKings line movement with the API
Follow recorded Pick6 changes with a resumable cursor, read sportsbook history by sequence, and compute moves without overclaiming.
Editorial review: · Not a live coverage report
Two histories, two shapes
Line movement comes from two separate endpoints, and the data has limits. Recording began around 2026-11-03. Retained history is short, and it is not a complete opening-to-close archive. It does not contain seasons of past lines, and there is no public graded-results endpoint.
| Pick6 | Sportsbook | |
|---|---|---|
| Endpoint | /api/v1/pick6/history (alias /api/v1/changes) | /api/v1/history |
| What a row means | An offer change compared with the prior version | A retained observation or change for one offer |
| Prior value | previous on the row | Read the earlier row with the same offer_id |
| Paging | after from pagination.next_after | offset, ordered by seq |
| Filters | sport, stat, the identity fields, after | sport, event_id, market, offer_id |
| Value moved | standings_multiplier, is_paused on one market row; a new target arrives as a different market row | line, american, decimal |
/api/v1/changes is an alias for Pick6 history, not sportsbook history.
Establish a baseline
First captures establish a baseline. Pick6 history records actual offer changes, not every capture or live-stat tick, so unchanged captures and a moving live stat create no rows. Empty history is valid until an offer change is observed, and a new market has no change row until it first moves.
Follow Pick6 changes
Request history with after=0 and limit=100. Continue with pagination.next_after as after and offset=0. Persist the last processed change_id only after processing a page, and preserve the compound market identity across changes.
curl --fail-with-body "https://draftkingsapi.com/api/v1/pick6/history?sport=NHL&stat=Shots%20on%20Goal&after=0&limit=100" \
-H "Authorization: Bearer $DRAFTKINGS_API_KEY"python3 line-movement.py --dataset pick6 --sport NHL --stat "Shots on Goal" \
--max-pages 3 --state .line-movement-cursor.jsonCompute a Pick6 move
A pickable_market_id holds one target value. In the line movement study, no market id ever changed target, so history rows record multiplier and availability changes, and they never show a line move directly. To follow a line, compare the main target of the same player and stat between captures across rows. For multipliers, compare data fields with previous, one selection side at a time. A recorded soccer row moved a Yes selection from 2.4x to 2.5x, and in that same change the selection_id and source_url also differed. So match selections by side, not by selection_id, and do not assume that a changed ID means a new market.
def pick6_moves(row):
before = {s["side"]: s for s in (row.get("previous") or {}).get("selections", [])}
moves = []
if row.get("previous") and row["target_value"] != row["previous"]["target_value"]:
moves.append(("target", row["previous"]["target_value"], row["target_value"]))
for selection in row["selections"]:
old = before.get(selection["side"])
if old and old["standings_multiplier"] != selection["standings_multiplier"]:
moves.append((selection["side"], old["standings_multiplier"],
selection["standings_multiplier"]))
return movesPick6 rows carry standings multipliers such as 1.5x. A standings multiplier is not decimal odds, a probability or an established entry payout. A multiplier change is a change in that displayed value. It should not be described as a probability shift. A row can also change only in fields such as source_url, so an empty move list is a normal result.
Follow sportsbook history
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. Each history row has seq, offer_id, observed_at and the offer under data. Sort by seq, group by offer_id, and compare neighbors.
curl --fail-with-body "https://draftkingsapi.com/api/v1/history?sport=NBA&market=total&limit=100" \
-H "Authorization: Bearer $DRAFTKINGS_API_KEY"from itertools import groupby
rows = sorted(rows, key=lambda r: (r["offer_id"], int(r["seq"])))
for offer_id, group in groupby(rows, key=lambda r: r["offer_id"]):
series = [r["data"] for r in group]
for old, new in zip(series, series[1:]):
if (old["line"], old["american"]) != (new["line"], new["american"]):
print(offer_id, old["line"], old["american"], "->", new["line"], new["american"])Check whether the offer_id stays stable for a market you care about, and compare by event_id, market and side if it does not. Run python3 line-movement.py --dataset sportsbook --sport NBA --market total --max-pages 3 --state .line-movement-cursor.json for a working version.
What a recorded move can claim
A move here is a difference between two captures. Its timing is bounded by capture cadence, because the source update clock is unknown. Partial collection means moves can go unrecorded, and a large step may be several moves we did not see.
- Do not call the first recorded value an opening line, or the last one a closing line.
- Disappearance from a partial category is not settlement, and previously observed rows can remain in projections.
- Do not present this as a complete archive, or use it to claim a trading edge.
- Do not report a move from an event with
event_status: postas a live price.
The line movement study and coverage report show what has been recorded so far. Counts are measured there rather than repeated here.
Run it on a schedule
Poll on the collector's interval or slower. Polling faster returns no newer data. Move to the stream or webhooks only if you need to react to each change, and read the webhook guide for those.
Try it
curl --fail-with-body "https://draftkingsapi.com/api/v1/pick6/history?sport=NHL&after=0&limit=25" \
-H "Authorization: Bearer $DRAFTKINGS_API_KEY"Endpoint docs
Working assets
Check the recorded data
Questions
Is there a DraftKings line history API?
This independent service records observations from around 2026-11-03: Pick6 changes through /api/v1/pick6/history and sportsbook observations through /api/v1/history. It is short and is not a complete opening-to-close archive.
Can I get opening and closing lines?
Not reliably. Rows are retained captures, so the first value we saw is not necessarily the open, and the last one is not necessarily the close.
Why is Pick6 history empty for my filter?
History only records actual offer changes after a baseline. A market that has not moved since its first capture has no rows, and a sport or stat outside selected captures has none either.
Why did a change row show a new selection_id but the same side?
Recorded rows can carry a different selection_id and source_url across changes. Match selections by side within the three-part market identity, and compare the values you care about.
Related resources
What history each DraftKings dataset really holds, when recording began, what is not available, and how to start your own archive today.
DraftKings API webhooks and change streamsSigned Pick6 change webhooks on Production and a resumable stream on Developer: signature checks, retries, replay and limits.
DraftKings Pick6 observations APIInspect selected multi-sport Pick6 market rows, explicit selections, standings multipliers and actual changed observations.
DraftKings sportsbook data APIRead stored DraftKings-attributed ESPN mainline prices with explicit event state, signed lines and capture provenance.
How far back does the historical data go?Line recording began around 2026-11-03, so history is short. It holds no past seasons of lines and is not an opening-to-close archive.
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.