# DraftKings Odds API: Moneylines and Spreads

Get DraftKings moneylines, spreads and totals through one API, as JSON or CSV. Build odds screens and price trackers. Start with a free API key, no card.

Canonical page: https://draftkingsapi.com/draftkings-odds-api. Markdown: https://draftkingsapi.com/draftkings-odds-api.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

## Pull DraftKings odds in one request

Pull current moneylines, spreads and totals by league, track how a price changes, and build screens, alerts and trackers on top. Every row carries its own capture time, so your app can always say how old a price is.

```
curl --fail-with-body "https://draftkingsapi.com/api/v1/odds?sport=NFL&market=spread&status=pre&limit=25" \
  -H "X-User-Request: Compare sportsbook lines across games for a dashboard" -H "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

```
curl --fail-with-body "https://draftkingsapi.com/api/v1/demo/odds?sport=NFL&limit=5"
```

## What you can build

These are the jobs the odds endpoints do well today.

- Odds screens. Filter by `sport`, `market`, `status` and team `search`, and show the capture age next to each price.
- Price trackers. Read `/api/v1/history` for one `offer_id` and chart the prices recorded for it.
- Spreadsheets and reports. Add `format=csv` to get a file instead of JSON.
- Agents. The same data is available as MCP tools, so a model can answer from a real row.
- Live scoped apps. Native scopes add a WebSocket on paid plans, for the leagues and markets listed below.

## Two kinds of sportsbook data

The API serves DraftKings prices two ways. 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 props for 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. They stay live while the scope is healthy. ESPN-attributed rows give the latest moneyline, spread and total across eight leagues, each with its capture age.

| You want | Call | Delivery |
| --- | --- | --- |
| Latest mainlines by league | `/api/v1/odds` | Poll, JSON or CSV |
| Games and start times | `/api/v1/events` | Poll, JSON or CSV |
| Recorded prices for an offer | `/api/v1/history` | Poll, JSON or CSV |
| The native scope list | `/api/v1/sportsbook/scopes` | Poll, JSON |
| One native scope right now | `/api/v1/sportsbook/snapshot?scope=` | Snapshot, then WebSocket on paid plans |

```
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_THE_LIST" \
  -H "X-User-Request: Read live sportsbook props for a line screen" -H "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

## Python and JavaScript

No SDK. Both of these run as written once `DRAFTKINGS_API_KEY` is set. `view=compact` returns the fields most apps need and allows up to 1,000 rows on a page.

```
import json, os, urllib.parse, urllib.request

BASE = os.environ.get("DRAFTKINGS_API_BASE", "https://draftkingsapi.com")
KEY = os.environ["DRAFTKINGS_API_KEY"]


def get(path, params):
    url = f"{BASE}{path}?{urllib.parse.urlencode(params)}"
    request = urllib.request.Request(url, headers={"Authorization": f"Bearer {KEY}", "X-User-Request": "Check which DraftKings datasets fit a new app"})
    with urllib.request.urlopen(request, timeout=30) as response:
        return json.load(response)


def rows(path, params, max_pages=3):
    """Follow next_cursor, and stop at a page budget so a run cannot spend your quota."""
    params = dict(params)
    for _ in range(max_pages):
        page = get(path, params)
        yield from page["data"]
        if not page["pagination"]["has_more"]:
            return
        params["cursor"] = page["pagination"]["next_cursor"]


def implied(american):
    return 100 / (american + 100) if american > 0 else -american / (100 - american)


for row in rows("/api/v1/odds", {"sport": "NFL", "market": "spread", "status": "pre", "view": "compact", "limit": 100}):
    print(row["event_id"], row["side"], row["line"], row["american"],
          f"{implied(row['american']):.1%}", f"captured {row['age_seconds']}s ago")
```

```
const BASE = process.env.DRAFTKINGS_API_BASE ?? "https://draftkingsapi.com";
const url = new URL("/api/v1/odds", BASE);
url.searchParams.set("sport", "NBA");
url.searchParams.set("market", "total");
url.searchParams.set("status", "pre");
url.searchParams.set("view", "compact");
url.searchParams.set("limit", "100");

const response = await fetch(url, {
  headers: { Authorization: `Bearer ${process.env.DRAFTKINGS_API_KEY}`, "X-User-Request": "Compare sportsbook lines across games for a dashboard" },
  signal: AbortSignal.timeout(30_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const { data } = await response.json();
for (const row of data) console.log(row.event_id, row.side, Number(row.line), row.american, row.observed_at);
```

## The fields on an odds row

One row is one side of one market in one game.

| Field | Example | Notes |
| --- | --- | --- |
| `market` | `spread` | `moneyline`, `spread` or `total` |
| `side` | `home` | `home` or `away`, or `over` or `under` on a total |
| `line` | `"223.5"` | A numeric string, null on a moneyline. Parse it. |
| `american`, `decimal` | `-110`, `"1.909"` | The price in both formats |
| `observed_at`, `age_seconds` | `2026-11-04T01:44:43.683Z` | When we captured it and how long ago |
| `stale` | `false` | True when the row is past its freshness window |
| `event_status` | `pre` | `pre`, `in`, `post` or `unknown` |

In CSV, a value that starts with a minus sign arrives with a leading apostrophe so spreadsheets do not read it as a formula. Strip it when you load the file into code.

## When you need a broader feed

This API has one operator. If you need many books, consensus prices or every DraftKings market, a multi-book provider is the better buy, and [when to choose us](/compare/when-to-choose-us) says so with sources. Side-by-side notes: [SharpAPI](/compare/sharpapi), [OddsPapi](/compare/oddspapi), [365OddsAPI](/compare/365oddsapi), [OpticOdds](/compare/opticodds).

```
curl --fail-with-body "https://draftkingsapi.com/api/v1/odds?sport=NBA&market=moneyline&status=pre&view=compact&limit=100" \
  -H "X-User-Request: Compare sportsbook lines across games for a dashboard" -H "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

## FAQ

### Does DraftKings have a public odds API?
Not that we know of: we know of no public developer API from DraftKings for its odds. This site is an independent service, not affiliated with or endorsed by DraftKings, that serves captured DraftKings prices through documented endpoints.

### Which leagues does the odds endpoint cover?
The mainline endpoint accepts NFL, NBA, NHL, MLB, NCAAF, NCAAB, EPL and MLS, and what is on offer at a given moment depends on the schedule. The status page shows what is stored now.

### Are the odds live?
Native scopes are live while healthy, on the WebSocket on paid plans. Rows from /api/v1/odds are the latest capture, so read observed_at and age_seconds on each row before you show a price.

### Are player props included?
Scoped native props are. Full-book props are not. Call /api/v1/sportsbook/scopes for the current list. For Pick6 props, use the Pick6 endpoints, which are a separate product with multipliers rather than prices.

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