# DraftKings DFS Salaries CSV and JSON

Download DraftKings DFS salaries by sport and slate as CSV or JSON, with player, position, roster slot and capture time. Free API key, no card needed.

Canonical page: https://draftkingsapi.com/draftkings-dfs-salaries-csv. Markdown: https://draftkingsapi.com/draftkings-dfs-salaries-csv.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

## Get a salary file in one request

Pull every roster-slot salary for a sport or slate into a file, a spreadsheet or your lineup tool, without visiting a contest page for each one. Add `format=csv` to any DFS request.

```
curl --fail-with-body "https://draftkingsapi.com/api/v1/dfs/players?sport=NFL&limit=100&format=csv" \
  -H "X-User-Request: Build a DFS lineup tool from current salaries" -H "Authorization: Bearer $DRAFTKINGS_API_KEY" \
  -o nfl-salaries.csv
```

In the native file, the source record stays in one JSON `data` cell, so nothing is lost. To get `salary` and `name` as their own columns, use the script below.

## A clean CSV with one column per field

`view=compact` returns flat rows and allows up to 1,000 on a page, which makes a tidy spreadsheet with few requests. This script follows the cursor and stops at a page budget.

```
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"]
import csv

FIELDS = ["slate_id", "id", "player_id", "name", "team", "position", "roster_slot_id", "salary", "observed_at", "stale"]

with open("salaries.csv", "w", newline="") as out:
    writer = csv.DictWriter(out, fieldnames=FIELDS, extrasaction="ignore")
    writer.writeheader()
    count = 0
    for row in rows("/api/v1/dfs/players", {"sport": "NFL", "view": "compact", "limit": 1000}, max_pages=5):
        writer.writerow(row)
        count += 1
print(f"Wrote {count} roster-slot rows to salaries.csv")
```

| Column | Meaning |
| --- | --- |
| `slate_id` | The draft group the salary belongs to. Filter requests with it. |
| `id` | The draftable: one roster-slot record. |
| `player_id` | The athlete. Use this, not `name`, to group a player's rows. |
| `position`, `team` | As shown on the slate. |
| `roster_slot_id` | The slot this salary applies to. |
| `salary` | The DFS salary for that slot. It is a lineup budget value, not a line or a price. Empty means the capture had no salary, not a salary of zero. |
| `observed_at`, `stale` | When we captured the row, and whether it is past its freshness window. |

## Choose a slate

List contests and slates for a sport, then pass `slate_id`. Filter by team with `team`, or by player name with `search`.

```
curl --fail-with-body "https://draftkingsapi.com/api/v1/dfs/slates?sport=NFL&limit=25" \
  -H "X-User-Request: Build a DFS lineup tool from current salaries" -H "Authorization: Bearer $DRAFTKINGS_API_KEY"

curl --fail-with-body "https://draftkingsapi.com/api/v1/dfs/contests?sport=NFL&limit=25" \
  -H "X-User-Request: Build a DFS lineup tool from current salaries" -H "Authorization: Bearer $DRAFTKINGS_API_KEY"

curl --fail-with-body "https://draftkingsapi.com/api/v1/dfs/players?sport=NFL&slate_id=SLATE_ID&team=BUF&view=compact&limit=100" \
  -H "X-User-Request: Build a DFS lineup tool from current salaries" -H "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

## One player, several rows

A captain slot and a flex slot, for example, are separate roster-slot records with different salaries. Keep them all. Removing duplicates by player throws away valid choices.

```
curl --fail-with-body "https://draftkingsapi.com/api/v1/demo/dfs"
```

## Which slates are covered

Collection covers selected draft groups across a rotation of sports, not every slate, and each row shows when it was captured. There is no salary change feed, so run the script on a schedule to keep your own record. Contest results, winning lineups and ownership are not supplied. The [DFS API page](/draftkings-dfs-salary-api) has the full boundary and the providers to use for those.

```
curl --fail-with-body "https://draftkingsapi.com/api/v1/dfs/players?sport=NBA&view=compact&limit=25" \
  -H "X-User-Request: Build a DFS lineup tool from current salaries" -H "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

## FAQ

### Can I download DraftKings salaries as a CSV?
Yes. Add format=csv to /api/v1/dfs/players for the native file, with the source record in a JSON cell, or use the script on this page for one column per field.

### Does this replace the salary export on a contest page?
It is built for automation: many slates, on a schedule, in one format, behind one key. For a single lineup you are entering by hand, the contest page is simpler.

### Why does one player appear more than once?
Each row is a roster-slot record. A player can be available in several slots at different salaries, so all of the rows are real.

### Do you have historical DFS salaries?
Only what was captured since collection began, for current slates. For years of past salaries, use a provider that sells them.

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