# FanDuel API first call: key to JSON in five minutes

FanDuel API (https://fanduelapi.com) is an independent API for FanDuel Sportsbook data: every player prop and game market FanDuel lists in NBA, NFL, NHL, MLB, college basketball and college football, normalized per player and stat with over and under prices in American and decimal odds, plus every line and price move with its timestamp, over REST, webhooks and MCP with one key. FanDuel API is an independent data service operated by FF API Inc. It is not affiliated with, endorsed by or sponsored by FanDuel.

Source page: https://fanduelapi.com/docs/first-call (this is its markdown version, https://fanduelapi.com/docs/first-call.md).

## Free offer

- Free plan: 100 credits a month, data delayed 5 minutes, no card. REST and MCP on every plan.
- Real-time data starts at Developer, $49 a month for 10,000 credits.
- Get a free key: https://fanduelapi.com/sign-up?ref=ai-claudebot

## Quickstart

1. Create a free account at https://fanduelapi.com/sign-up?ref=ai-claudebot and create an API key in the dashboard (https://fanduelapi.com/dashboard/keys). Keys start with `fd_`. Store it as `FANDUEL_API_KEY`.
2. Make a first call with curl:

```bash
curl "https://fanduelapi.com/api/v1/props?sport=nba&stat=points&limit=5" \
  -H "Authorization: Bearer $FANDUEL_API_KEY"
```

3. Or with Python (`pip install requests`):

```python
import os
import time
from datetime import datetime, timezone

import requests

BASE = "https://fanduelapi.com/api/v1"
SESSION = requests.Session()
SESSION.headers["Authorization"] = f"Bearer {os.environ['FANDUEL_API_KEY']}"


def get(path, **params):
    """GET one endpoint and return its data list, waiting out rate limits."""
    while True:
        r = SESSION.get(f"{BASE}{path}", params=params, timeout=10)
        if r.status_code == 429:
            time.sleep(int(r.headers.get("Retry-After", "5")))
            continue
        r.raise_for_status()
        return r.json()["data"]


def price(odds):
    """American odds as text. A suspended market can come back with no price."""
    return "off" if odds is None else f"{odds:+d}"

props = get("/props", sport="nba", stat="points")
for p in props:
    print(f"{p['player']:<26} {str(p['line']):>5}  over {price(p['over_american']):>5}  under {price(p['under_american']):>5}")
```

4. Stay current with `GET /api/v1/changes?since=<cursor>` instead of re-reading every prop. Full reference: https://fanduelapi.com/openapi.json and https://fanduelapi.com/llms-full.txt.

## Use it from Claude (MCP)

Claude Code, with your key read from the shell:

```bash
claude mcp add --transport http --scope user fanduelapi https://fanduelapi.com/api/mcp \
  --header "Authorization: Bearer $FANDUEL_API_KEY"
```

Claude on the web or desktop: Settings, Connectors, Add custom connector, then paste https://fanduelapi.com/api/mcp. Without a key it gives the keyless tools (search_docs, fetch_doc, get_sample_props). Setup for other agents: https://fanduelapi.com/mcp.

## Pricing

| Plan | Price | Credits a month | Calls a minute | Includes |
| --- | --- | --- | --- | --- |
| Free | Free | 100 | 20 | REST and MCP access, Data delayed 5 minutes |
| Developer | $49/month | 10,000 | 60 | Real-time data, Line move history, Change stream |
| Production | $149/month | 50,000 | 120 | Real-time data, Line move history, Webhooks, Priority support |
| Scale | $499/month | 250,000 | 180 | Real-time data, Full line move history, Webhooks, Bulk export, Priority support |

Cancel paid plans any time from the billing portal. Details: https://fanduelapi.com/pricing

## This page

[FanDuel API](https://fanduelapi.com/)/[Docs](https://fanduelapi.com/docs) / First call

Docs

# Your first FanDuel API call

Five minutes from no account to FanDuel props in your terminal: create a key, send it in one header, read the board, and know what every part of the response means.

[Get a free API key](https://fanduelapi.com/sign-up)[Read the docs](https://fanduelapi.com/docs)

FanDuel API is an independent data service operated by FF API Inc. It is not affiliated with, endorsed by or sponsored by FanDuel.

## 1\. Get a key

[Sign up](https://fanduelapi.com/sign-up), confirm your email, open `/dashboard/keys` and create a key. It starts with `fd_` and is shown once. Keep it in an environment variable; the [API key page](https://fanduelapi.com/fanduel-api-key) covers storing and rotating it.

Shell

```
export FANDUEL_API_KEY="fd_..."
```

## 2\. Make the call

Five NBA points props

```
curl "https://fanduelapi.com/api/v1/props?sport=nba&stat=points&limit=5" \
  -H "Authorization: Bearer $FANDUEL_API_KEY"
```

The base URL is `https://fanduelapi.com/api/v1`. Every request needs the `Authorization: Bearer` header; nothing else is required.

## 3\. Read the response

A data response is always an object with `data`, a list of records, and `meta`, about the response itself.

One record in data (sample, not live data)

```
{
  "id": "nba-doncic-pts",
  "sport": "nba",
  "league": "NBA",
  "event_id": "sample-event-1",
  "event_name": "Los Angeles Lakers @ Denver Nuggets",
  "starts_at": "2026-11-06T02:00:00Z",
  "player": "Luka Dončić",
  "team": "LAL",
  "stat": "points",
  "period": "game",
  "line": 33.5,
  "over_american": -105,
  "under_american": -115,
  "over_decimal": 1.952,
  "under_decimal": 1.87,
  "market_status": "open",
  "observed_at": "2026-11-05T22:57:00Z",
  "changed_at": "2026-11-06T00:41:12Z",
  "move": {
    "open": {
      "line": 31.5,
      "over_american": -110,
      "under_american": -110,
      "fair_over": 0.5,
      "at": "2026-11-05T19:02:00Z"
    },
    "current": {
      "line": 33.5,
      "over_american": -105,
      "under_american": -115,
      "fair_over": 0.4892,
      "at": "2026-11-06T00:41:12Z"
    },
    "line_move": 2,
    "line_direction": "up",
    "fair_over_move_pp": -1.08,
    "price_direction": "toward_under",
    "line_moves": 2,
    "price_moves": 0,
    "last_moved_at": "2026-11-06T00:41:12Z",
    "last_line_moved_at": "2026-11-06T00:41:12Z",
    "status": "open",
    "observations": 3
  }
}
```

meta (sample, not live data)

```
{
  "plan": "free",
  "delay_seconds": 300,
  "as_of": "2026-11-06T01:07:00Z",
  "remaining": 49,
  "source_status": "ok",
  "observed_at": "2026-11-06T01:06:41Z",
  "source_age_seconds": 19,
  "limit": 5,
  "offset": 0,
  "has_more": true
}
```

- `line`, `over_american` and `under_american` are the current prop; a suspended market can have null prices.
- `move` says where the prop opened and how often it has moved since.
- `meta.remaining` is your quota left this month; `meta.has_more` says another page exists.
- `meta.source_status` and `meta.observed_at` say how fresh the data is.

Every field is defined in the [schema glossary](https://fanduelapi.com/docs/schema-glossary).

## 4\. The calls to make next

Read a whole league in one call instead of one call per game, and poll only what moved.

Every game's odds in one call (game lines; market\_type=all for everything)

```
curl "https://fanduelapi.com/api/v1/odds?sport=nfl" -H "Authorization: Bearer $FANDUEL_API_KEY"
```

The whole prop board in one call

```
curl "https://fanduelapi.com/api/v1/props?sport=nfl&view=compact" -H "Authorization: Bearer $FANDUEL_API_KEY"
```

One game, everything: lines, every prop with its move, alternates, movers

```
curl "https://fanduelapi.com/api/v1/games/<event_id>/report" -H "Authorization: Bearer $FANDUEL_API_KEY"
```

Main line against FanDuel's alternate ladder

```
curl "https://fanduelapi.com/api/v1/compare?sport=nfl&stat=receiving_yards&ladder=only" -H "Authorization: Bearer $FANDUEL_API_KEY"
```

What changed from now on

```
curl "https://fanduelapi.com/api/v1/changes?since=now" -H "Authorization: Bearer $FANDUEL_API_KEY"
```

Polling is cheap: every data response carries an `ETag` and `X-Next-Update-Seconds`. Send the ETag back in `If-None-Match` and an unchanged answer is a `304` with no body that costs no credits. With no sport, `/props` reads the league in season with the most open props and says which in `meta.default_league`.

## 5\. Put it on a schedule

The value is in the moves, so the setup ends with a job that polls the change feed every few minutes and saves what moved. The [scheduled jobs guide](https://fanduelapi.com/docs/scheduled-jobs) has a starter script and the cron, launchd, systemd, Task Scheduler and GitHub Actions entries.

Starter, then every 5 minutes with cron

```
mkdir -p $HOME/fanduel-watch && curl -fsSL https://fanduelapi.com/starter-kit/fanduel_props_watch.py -o $HOME/fanduel-watch/fanduel_props_watch.py
FANDUEL_API_KEY=<your key> python3 $HOME/fanduel-watch/fanduel_props_watch.py --once

# crontab -e
*/5 * * * * FANDUEL_API_KEY=<your key> /usr/bin/env python3 $HOME/fanduel-watch/fanduel_props_watch.py --once >> $HOME/fanduel-watch/watch.log 2>&1
```

Then pick a workflow: an [odds screen](https://fanduelapi.com/docs/odds-screen), [line move alerts](https://fanduelapi.com/docs/line-move-alerts) or [a prop model](https://fanduelapi.com/docs/prop-model-data). The full reference is </openapi.json>.

## Questions

## Related

- [Scheduled jobs Turn a FanDuel API key into a job that records every prop move: a starter script, then cron, launchd, systemd, Task Scheduler or GitHub Actions entries.](https://fanduelapi.com/docs/scheduled-jobs)
- [Schema glossary Every field the FanDuel API returns, defined: props, move summaries, history points, changes, markets and selections, results, DFS players and meta.](https://fanduelapi.com/docs/schema-glossary)
- [Python example Working Python code for FanDuel Sportsbook player props: authenticate with a key, list props, read a prop's move history and poll for changes.](https://fanduelapi.com/fanduel-api-python)
- [Errors and limits Every FanDuel API error code with what it means and what to do, the 429 body and Retry-After header, and a retry loop that respects both limits.](https://fanduelapi.com/fanduel-api-errors)

## Make your first call in a few minutes

Sign up, create a key in the dashboard, and send it as a Bearer token. The free plan needs no card and reads the same data five minutes behind.

[Get a free API key](https://fanduelapi.com/sign-up)

## FAQ

### Is there a free plan?

Yes. Free includes API access with delayed data, enough to build and test a model.

### Is this affiliated with FanDuel?

No. This is an independent data service operated by FF API Inc. and is not affiliated with or endorsed by FanDuel.

### Which sports are covered?

NBA, NFL, NHL, MLB and college sports as FanDuel lists them, starting with player props.

### How do I cancel?

From the billing portal in your dashboard, at any time.

### How do I get a free key?

Sign up at https://fanduelapi.com/sign-up?ref=ai-claudebot. Free plan: 100 credits a month, data delayed 5 minutes, no card. REST and MCP on every plan.

### Can an AI agent sign up for me?

Yes. The agent sends POST https://fanduelapi.com/api/v1/agent/signup with your email and what you are building (add "ref": "ai-claudebot"), you approve the emailed link, and the agent collects the key. Details: https://fanduelapi.com/connect.
