# DraftKings Streaming API: Pick6 Stream, WebSocket, Webhooks

How fresh DraftKings data reaches you here: Pick6 change stream and webhooks, a native sportsbook WebSocket, and polling with capture times on every row.

Canonical page: https://draftkingsapi.com/draftkings-api-streaming. Markdown: https://draftkingsapi.com/draftkings-api-streaming.md. Site index for agents: https://draftkingsapi.com/llms.txt.

## Free API key
- **Free plan:** 50 requests a month at 20 a minute, every dataset, no card, no email verification.
- **Sign up:** https://draftkingsapi.com/auth/sign-up?ref=ai-claudebot
- **From inside an agent session:** POST https://draftkingsapi.com/api/v1/agent/signup with JSON `{"data_wanted": "...", "use_case": "...", "ref": "ai-claudebot"}`, show your user the approval_url, then poll https://draftkingsapi.com/api/v1/agent/token with device_code. The key is returned once.
- **No key yet:** `curl --fail-with-body "https://draftkingsapi.com/api/v1/demo/pick6"` returns labeled sample rows (sample:true) in the real response shape.

## Quickstart

1. Create a free key at https://draftkingsapi.com/auth/sign-up?ref=ai-claudebot (no card) and export it: `export DRAFTKINGS_API_KEY=...`

2. Call the API with curl:

```bash
curl --max-time 30 --fail-with-body 'https://draftkingsapi.com/api/v1/pick6/projections?sport=NBA&limit=5' \
  -H "X-User-Request: Build a prop screen from current Pick6 lines" \
  -H "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

3. Or call it from Python:

```python
import os, requests

response = requests.get(
    "https://draftkingsapi.com/api/v1/pick6/projections?sport=NBA&limit=5",
    headers={
        "Authorization": "Bearer " + os.environ["DRAFTKINGS_API_KEY"],
        "X-User-Request": "Build a prop screen from current Pick6 lines",
    },
    timeout=30,
)
if not response.ok:
    raise RuntimeError(f"API {response.status_code}: {response.text}")
print(response.json())
```

4. Full walkthrough: https://draftkingsapi.com/quickstart. OpenAPI: https://draftkingsapi.com/openapi.json. Every route accepts format=csv on list endpoints.

## Use it from Claude (MCP)

MCP server: https://draftkingsapi.com/api/mcp (Streamable HTTP). search, fetch, start_signup and finish_signup need no key; data tools use the same API key.

```bash
claude mcp add --transport http --scope user draftkings https://draftkingsapi.com/api/mcp --header "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

Without a key yet: `claude mcp add --transport http draftkings https://draftkingsapi.com/api/mcp`, then call start_signup. Setup for other clients: https://draftkingsapi.com/agents.md.

## Pricing

| Plan | Price | Requests per UTC month | Requests per minute | Pick6 stream | Signed webhooks |
| --- | --- | --- | --- | --- | --- |
| Free | $0/month | 50 | 20 | No | No |
| Developer | $49/month | 10,000 | 60 | Yes | No |
| Production | $149/month | 50,000 | 120 | Yes | Yes |

- **Free:** Build and test against every dataset.
- **Developer:** Keep your app running with more requests and push delivery.
- **Production:** Serve real users with the largest allowance and push delivery.

Plans and checkout: https://draftkingsapi.com/pricing

## Pick the delivery that matches the dataset

Fresh means something different for each dataset, because each one is collected differently. Pick6 changes: Developer and Production include the resumable stream, and Production also includes signed webhooks. Native sportsbook scopes: paid plans can use a server-side WebSocket at `/api/v1/sportsbook/ws`. ESPN-attributed sportsbook rows and DFS rows have no push delivery.

| Dataset | How changes reach you | Plans | Freshness signal |
| --- | --- | --- | --- |
| Pick6 lines and multipliers | Resumable SSE stream at `/api/v1/stream`, signed webhooks, or polling `/api/v1/pick6/history` with `after` | Stream: Developer and Production. Webhooks: Production. Polling: any plan | `observed_at`, `age_seconds`, `stale` on every row |
| Native sportsbook scopes | Server-side WebSocket at `/api/v1/sportsbook/ws` after a `/api/v1/sportsbook/snapshot` | Paid plans | Supplier `source_updated_at` when sent, and `received_at` |
| ESPN-attributed mainlines | Polling `/api/v1/odds` and `/api/v1/history` | Any plan | `observed_at` and `event_status` |
| DFS slates, contests, salaries | Polling `/api/v1/dfs/*` | Any plan | `observed_at`, plus `received_at` on captures |

## Pick6 changes as they are recorded

Take a snapshot, then connect to the stream with the snapshot cursor as `Last-Event-ID`. Each connection lasts at most 55 seconds; reconnect with the last durable id you processed and nothing is skipped. A purged or ahead cursor returns 410 or 409, which means take a new snapshot.

```
// Pick6 changes over SSE (Developer and Production). Resume from the last durable id you processed.
const BASE = process.env.DRAFTKINGS_API_BASE ?? "https://draftkingsapi.com";
const headers = { Authorization: `Bearer ${process.env.DRAFTKINGS_API_KEY}`, "X-User-Request": "Alert on Pick6 line changes as they happen" };

const snap = await fetch(new URL("/api/v1/stream/snapshot?sport=NBA", BASE), { headers });
const { snapshot_cursor } = await snap.json();          // baseline first, then changes after it
let lastId = snapshot_cursor;

for (;;) {
  const res = await fetch(new URL("/api/v1/stream", BASE), { headers: { ...headers, "Last-Event-ID": lastId } });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);  // 410 or 409: take a new snapshot
  const text = await res.text();                         // the server closes each connection within 55 seconds
  for (const block of text.split("\n\n")) {
    const id = block.match(/^id: (.+)$/m)?.[1];
    const data = block.match(/^data: (.+)$/m)?.[1];
    if (data && id) { console.log(JSON.parse(data)); lastId = id; }
  }
}
```

One Pick6 stream connection costs one request and lasts at most 55 seconds, then you reconnect. Held open around the clock that is about 1,570 requests a day, so one continuous stream uses Developer's 10,000 requests in about 6 days and most of Production's 50,000 in a month. Webhook deliveries on Production spend no requests. The [stream consumer](/tools/alert-consumer) and the [webhooks guide](/guides/webhooks) cover signatures, retries and replay.

## Native sportsbook over WebSocket

Native scopes cover NFL moneylines, spreads and totals across 27 U.S. states; NHL game lines across the same 27 states; college basketball and college football game lines across 26 states, excluding Oregon, and NFL rushing yards O/U and NHL points, assists, anytime goalscorers and first-period shots across 27 U.S. states; NHL Shots on Goal in New York and New Jersey; NHL saves and power-play points scoped to New York, with availability reported per market. Read `/api/v1/sportsbook/scopes` for which scopes are ready, take `/api/v1/sportsbook/snapshot` for one scope, then open `/api/v1/sportsbook/ws` from a server on a paid plan to receive changes after that cursor.

```
curl --fail-with-body "https://draftkingsapi.com/api/v1/sportsbook/scopes" \
  -H "X-User-Request: Read live sportsbook props for a line screen" -H "Authorization: Bearer $DRAFTKINGS_API_KEY"

curl --fail-with-body "https://draftkingsapi.com/api/v1/sportsbook/snapshot?scope=SCOPE_ID_FROM_SCOPES" \
  -H "X-User-Request: Read live sportsbook props for a line screen" -H "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

## What it costs to stay current

Arithmetic for one client running around the clock, from the documented limits. Polling is the only option for ESPN-attributed mainlines and DFS, and it is usually the cheapest way to watch a handful of games.

| Pattern | Requests | On Developer | On Production | Plan |
| --- | --- | --- | --- | --- |
| Pick6 SSE stream, reconnecting every 55 seconds | About 1,570 a day, 47,100 over 30 days | About 6 days of 10,000 | About 31 days of 50,000 | Developer and Production |
| Native sportsbook WebSocket, rotating every 280 seconds | About 308 a day, 9,240 over 30 days | About 32 days of 10,000 | About 162 days of 50,000 | Developer (2 connections) and Production (5) |
| Polling `/api/v1/pick6/history` every 5 minutes | About 288 a day, 8,640 over 30 days | About 34 days of 10,000 | About 173 days of 50,000 | Any plan with enough allowance |
| Signed webhooks | None | Not included | No request cost | Production |

Free includes 50 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.

## What streaming does not promise here

There is no latency guarantee or service-level agreement. Captures run on rotating schedules, so a row can be minutes old when you read it, and the API says so instead of hiding it.

- Read `observed_at` and `age_seconds` on every row; `stale` turns true after 900 seconds.
- [Reliability](/reliability) shows measured capture intervals and [status](/status) shows current capture ages by source.
- ESPN-attributed mainlines and DFS have no push delivery. Poll them, and send `If-None-Match` so unchanged pages return 304 and cost nothing.
- No delivery here places, settles or recommends a wager.

```
curl --fail-with-body "https://draftkingsapi.com/api/v1/coverage" \
  -H "X-User-Request: Check which DraftKings datasets fit a new app" -H "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

## FAQ

### Is there a DraftKings streaming API?
This API pushes Pick6 changes over a resumable stream and signed webhooks, and native sportsbook changes over a WebSocket on paid plans. Other datasets are polled, and every row carries its capture time. There is no latency guarantee.

### Do I need WebSockets for Pick6?
No. Pick6 changes use server-sent events over plain HTTPS, or signed webhooks on Production, or polling the history endpoint with an after cursor.

### Can the Free plan stream?
No. The Pick6 stream needs Developer or Production, webhooks need Production, and the native sportsbook WebSocket needs a paid plan. The Free plan can poll every dataset.

### How do I know how old a row is?
Every row has observed_at and age_seconds, and stale is true after 900 seconds. The status page shows current capture ages and the reliability page shows measured intervals.

### Is there a free DraftKings API?
Yes. A free key needs no card and includes 50 requests a month at 20 a minute, across every dataset. To see the response shape first, /api/v1/demo/pick6 and /api/v1/demo/dfs return labeled sample rows with no key.

### Is this an official DraftKings API?
Independent service operated by DD Inc., not affiliated with or endorsed by DraftKings. No wagering: this service does not place, recommend or settle entries or bets.

### Can I use it from an AI agent?
Yes. Connect the MCP server at https://draftkingsapi.com/api/mcp, or call REST with a Bearer key. An agent can get a key for its user with start_signup.

### How do I reach support?
Email support@draftkingsapi.com.

Independent service operated by DD Inc., not affiliated with or endorsed by DraftKings. No wagering: this service does not place, recommend or settle entries or bets.
