draftkings apiDashboard ↗

MIGRATION GUIDE

Move from a DraftKings scraper to an API

A migration path from your own DraftKings scraper to this API: map fields, run both side by side, cut over with an adapter, and keep what the API does not replace.

Editorial review: · Not a live coverage report

Decide whether to migrate

Moving makes sense if your scraper costs more to keep alive than the data is worth, and if this API's scope covers your fields. Stay on your scraper, or look at other providers, if you need something this service does not supply.

You needThis APIDecision
Selected Pick6 categories with multipliersYes, with measured coverage on /statusMigrate
DFS salaries for selected slatesYes, with roster-slot detailMigrate
DraftKings mainlinesAs of 2026-11-03: native New York NFL, NHL, college basketball and college football game lines, native New York NHL Shots on Goal, points, assists, saves, goalscorers, power-play points and first-period shots, and ESPN-attributed moneyline, spread and total observations.Migrate if mainlines are enough
Sportsbook props, alternates or futures beyond the listed native scopesNot suppliedDo not migrate this part
Every Pick6 category on every runNo. Rotation is boundedCheck first
Seconds-level freshnessNo. Worker targets are five to fifteen minutesDo not migrate this part
Years of historyNo. 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.Keep your own archive

Map your fields

List what your scraper stores today, and map each field before you write any code. Most rows have a direct counterpart in the API.

In your scraperPick6 API fieldNote
Player nameentities[].full_name, entities[].entity_idJoin on the id, not the name
Stat labelstat, stat_abbreviationFilter on the exact stat text
Linetarget_valueOne athlete can have several targets
Over and underselections[].sideMore, Less or Yes. Can be one-sided
Multiplierselections[].standings_multiplierNot odds. Do not convert it
Gameentities[].events[]DraftKings event ids, not ESPN ids
Your scrape timeobserved_atOur capture clock. Your own arrival time is separate
Source change timesource_updated_atNull when unknown. Do not fill it in

For DFS, the source record sits under data: draftableId, salary, playerDkId, rosterSlotId. See the response schema.

Write a small adapter

Keep your application's internal shape, and translate at the edge. This keeps your model and UI unchanged and makes cutover reversible.

Adapter sketch
def from_api(row):
    """Map one Pick6 API row to your existing record shape."""
    entity = (row.get("entities") or [{}])[0]
    return {
        "player_id": entity.get("entity_id"),
        "player_name": entity.get("full_name"),
        "stat": row.get("stat"),
        "line": row.get("target_value"),
        "sides": {s["side"]: s.get("standings_multiplier") for s in row.get("selections", [])},
        "paused": row.get("is_paused"),
        "captured_at": row.get("observed_at"),
        "stale": row.get("stale"),
        "source_key": (row.get("pick_group_id"), row.get("pickable_id"), row.get("pickable_market_id")),
    }

Run both side by side

Run your scraper and the adapter together for several days, including one busy game window. Compare by source identity, and record any difference rather than assuming which side is right.

  • Rows you have that the API lacks, and rows the API has that you lack. Partial category capture will produce both.
  • Target and multiplier differences on the same market, with both capture times.
  • How long each source takes to show a change you watched happen.

Use line-movement.py to read changes and daily-archive.py to keep the API side.

Size the budget

Replace your scrape loop with a poll that matches the collection target, not your old interval. Polling faster than the five-minute target spends quota without newer data. Free includes 500 requests/month at 20/minute; Developer is $49/month with 10,000 requests/month at 60/minute; Production is $149/month with 50,000 requests/month at 120/minute. Count pages, not rows: a call returns at most 100 rows. On Developer and Production, the stream replaces most polling for Pick6 changes.

Cut over, and keep what still matters

Switch reads to the adapter behind a flag, watch for a week, then stop the scraper. Keep your old archive, because the API cannot replace it: history here began around 2026-11-03. Keep the parts this API does not replace, and record which ones they are.

What migration does not settle

Using this API does not by itself make your use of the data licensed. Technical access is not a redistribution license. Stopping a scraper does not change obligations you already had under a site's terms. Take your own legal advice for a public product.

Try it

Check the recorded data

Questions

Will this API return everything my scraper sees?

Possibly not. Pick6 collection is bounded rotation over selected categories, and DFS covers selected slates. Run both side by side and measure the difference for your sports.

Is using this API cleared under DraftKings' terms?

This is an independent service, not affiliated with or endorsed by DraftKings. Technical access is not a redistribution license, so get your own advice for a public product.

How often should I poll after migrating?

No faster than the five-minute collection target for Pick6 and sportsbook, and fifteen minutes for DFS. Faster polling spends requests without newer data. Check observed_at to see what actually changed.

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.