draftkings apiDashboard ↗

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.

Pick6Sportsbook
Endpoint/api/v1/pick6/history (alias /api/v1/changes)/api/v1/history
What a row meansAn offer change compared with the prior versionA retained observation or change for one offer
Prior valueprevious on the rowRead the earlier row with the same offer_id
Pagingafter from pagination.next_afteroffset, ordered by seq
Filterssport, stat, the identity fields, aftersport, event_id, market, offer_id
Value movedstandings_multiplier, is_paused on one market row; a new target arrives as a different market rowline, 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.

First page
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"
Script with a saved cursor
python3 line-movement.py --dataset pick6 --sport NHL --stat "Shots on Goal" \
  --max-pages 3 --state .line-movement-cursor.json

Compute 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.

Target and multiplier moves
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 moves

Pick6 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.

Totals for one league
curl --fail-with-body "https://draftkingsapi.com/api/v1/history?sport=NBA&market=total&limit=100" \
  -H "Authorization: Bearer $DRAFTKINGS_API_KEY"
Neighbor comparison
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: post as 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"

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

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.