# DraftKings Backtesting: Point-in-Time Data and Leakage

A point-in-time DraftKings dataset includes only captures captured before the decision cutoff. A game played before that cutoff can still leak future information if its statistics were collected afterward. Preserve capture time, game time and source time separately; exclude missing historical lines instead of substituting today’s board.

Canonical page: https://draftkingsapi.com/guides/point-in-time-data. Markdown: https://draftkingsapi.com/guides/point-in-time-data.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

## Three clocks answer three different questions

Game time identifies the event. observed_at records when the collector saw the payload. source_updated_at, when supplied, describes the source clock. None is a substitute for the other.

| Clock | Question answered | Research rule |
| --- | --- | --- |
| Game start | When was the game scheduled? | Exclude games after your prediction cutoff |
| observed_at | When did we capture the row? | Require this to be at or before the cutoff |
| source_updated_at | When did the source update it? | Keep null when absent; never invent it |

## A historical game can still contain future knowledge

Suppose a game ended Monday and its box score was first captured Wednesday. A Tuesday backtest must not treat that Wednesday capture as a Tuesday capture. The same applies to corrected stats and prices collected after kickoff.

## Preserve the actual line path

Read recorded changes from /api/v1/pick6/history or one prop’s /api/v1/pick6/line-history. Keep identifiers, previous and current values, and the capture clock. A gap in recording stays a gap; a last-seen line is not a proven closing line.

```
curl --fail-with-body "https://draftkingsapi.com/api/v1/pick6/history?sport=NBA&limit=25" \
  -H "X-User-Request: Track Pick6 line moves for an alert bot" -H "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

## Record corrections as new captures

A corrected box score may differ from the first published result. Preserve both versions when available and record when your system captured each. Select the version available at your decision cutoff, rather than silently replacing all earlier inputs with the latest value.

## Publish exclusions with every experiment

Report unmatched players, missing market periods, unavailable historical captures and stale last-seen prices. Split by time. Keep the extraction query and a hash of the saved data so another developer can reproduce the same experiment.

- Never infer settlement from a standings multiplier.
- Do not use a current player team to rewrite historical teams.
- Keep unsupported stat combinations ungraded.
- Measure the missing-data rate before reporting model performance.

## FAQ

### What should I save with an experiment?
Save the input snapshot, exact query, extraction time, model version and decision cutoff. Include excluded rows and missing-data counts so the result can be reproduced.

### Can I reconstruct a board from before collection began?
No. A current board and historical box scores cannot recover unobserved historical prices or lines.

### Is the latest captured line necessarily the closing line?
No. It is the last line the collector captured. A collection gap before game start prevents a complete closing-line claim.

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