# NFL odds API: spreads, totals and moneylines from three sportsbooks

GetOdds returns NFL point spreads, totals and moneylines from DraftKings, native FanDuel NFL markets, and BetRivers Pennsylvania NFL markets, each with the time it was observed. Add sport=NFL to the odds endpoint for DraftKings, league=NFL for FanDuel and BetRivers, and use the seven-day history endpoint to chart how a number moved during the week.

Canonical page: https://getoddsapi.com/nfl-odds-api

**Price.** Free development allowance: 1,000 requests per UTC day and 60 per minute per account, with no payment step. Paid: the Developer Bundle at $149 per month, with 10,000 monthly requests or credits on each of four sources.

## Free API key

Get a free GetOdds API key: **1,000 requests per UTC day and 60 per minute, no card**. One key covers REST and the hosted MCP server.

Sign up: https://getoddsapi.com/sign-up?ref=ai-claudebot

## Quickstart

1. Create an account at https://getoddsapi.com/sign-up?ref=ai-claudebot, open https://getoddsapi.com/dashboard and issue a key with the sources you need (draftkings, fanduel, betrivers, prizepicks or underdog). Keep it in a server environment variable named GETODDS_API_KEY.
2. Read current DraftKings NBA spreads with curl:

```bash
curl --fail-with-body "https://getoddsapi.com/api/v1/odds?sport=NBA&market=spread&fresh_only=true&limit=50" \
  -H "Authorization: Bearer $GETODDS_API_KEY"
```

3. The same request in Python (standard library only):

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

req = urllib.request.Request(
    "https://getoddsapi.com/api/v1/odds?sport=NBA&market=spread&fresh_only=true&limit=50",
    headers={"Authorization": "Bearer " + os.environ["GETODDS_API_KEY"]},
)
with urllib.request.urlopen(req) as res:
    rows = json.load(res)["data"]
for row in rows:
    print(row["away"], "at", row["home"], row["side"], row["line"], row["american"], row["observed_at"])
```

4. Check `observed_at`, `age_seconds` and `stale` on every row before using a price. Full reference: https://getoddsapi.com/docs

## Use with Claude (MCP)

```bash
claude mcp add --transport http getodds https://getoddsapi.com/api/mcp \
  --header "Authorization: Bearer $GETODDS_API_KEY"
```

The MCP tools follow the key's source grants and share its allowance. Setup guide: https://getoddsapi.com/use-with-claude

## Pricing

| Plan | Allowance | Price |
| --- | --- | --- |
| Free key | 1,000 requests a day, 60 a minute | $0, no card |
| Developer Bundle | 10,000 requests or credits a month on each of four sources | $149 a month |

Free development allowance: 1,000 requests per UTC day and 60 per minute per account, with no payment step. Paid: the Developer Bundle at $149 per month, with 10,000 monthly requests or credits on each of four sources.
Details: https://getoddsapi.com/bundle

## Facts

- **Sportsbooks:** DraftKings, FanDuel, BetRivers
- **Markets:** Spread, total, moneyline, futures
- **Line history:** 7 days per offer or event
- **Arbitrage feed:** Spreads and totals only

## Pull this week's NFL spreads

Create an account at /sign-up, open /dashboard and issue a key with the source grants you need (draftkings, fanduel, betrivers, prizepicks or underdog). Keep the key in a server environment variable named GETODDS_API_KEY and send it as a bearer token. Never put it in a URL or in browser code.

NFL weeks are front-loaded: most lines open early in the week and move on injury news and weather. Read the full slate once, store the offer IDs, then use /api/v1/odds/updated with a since timestamp to fetch only rows whose price changed. That keeps a whole-week tracker well inside the free allowance.

```bash
curl --fail-with-body "https://getoddsapi.com/api/v1/odds?sport=NFL&market=spread&fresh_only=true&limit=200" \
  -H "Authorization: Bearer $GETODDS_API_KEY"

# Later: only rows whose stored price changed since your last read.
# SINCE is a UTC timestamp within the last 7 days, e.g. 2026-11-09T12:00:00Z
curl --fail-with-body "https://getoddsapi.com/api/v1/odds/updated?sport=NFL&since=$SINCE&limit=200" \
  -H "Authorization: Bearer $GETODDS_API_KEY"
```

## Follow one NFL line through the week

History requires an event_id or offer_id and returns retained changes from the last seven days, newest first. An unchanged quote does not create a new row, so a short history means the number held, not that data is missing. The same retained changes are available as an ordered replay with sequence cursors at /api/v1/odds/replay.

```python
import json, os
from urllib.parse import urlencode
from urllib.request import Request, urlopen

def get(path, **params):
    url = "https://getoddsapi.com/api/v1" + path + "?" + urlencode(params)
    req = Request(url, headers={"Authorization": "Bearer " + os.environ["GETODDS_API_KEY"]})
    with urlopen(req, timeout=20) as res:
        return json.load(res)

game = get("/events/search", q="Eagles", sport="NFL")["data"][0]
moves = get("/history", event_id=game["id"], market="spread", limit=100)["data"]
for m in reversed(moves):
    print(m["observed_at"], m["side"], m["line"], m["american"])
```

## Compare DraftKings and FanDuel on the same NFL game

Event IDs are native to each book, so do not join on them. /api/v1/mappings links a DraftKings event to a FanDuel event when both stores agree on teams and start time, and /api/v1/arbitrage-bets runs that matching for you. For the NFL it only evaluates spreads and totals on half-point lines. Football moneylines are excluded because a tie is possible, and whole-number lines are excluded because they can push.

```bash
# DraftKings is selected by default. FanDuel and BetRivers must be selected once per account.
curl --fail-with-body -X PUT \
  "https://getoddsapi.com/api/v1/bookmakers/selected/select?bookmakers=draftkings,fanduel,betrivers" \
  -H "Authorization: Bearer $GETODDS_API_KEY"

curl --fail-with-body "https://getoddsapi.com/api/v1/arbitrage-bets?league=NFL&event_match=bounded_time&bankroll=100" \
  -H "Authorization: Bearer $GETODDS_API_KEY"
```

## Fields on each NFL odds row

NFL rows use the same schema as every other league.

| Field | Meaning |
| --- | --- |
| id, event_id | Source-native offer and event IDs, for example espn-draftkings:espn:NBA:401909287 |
| sport | League code: NFL, NBA, NHL, NCAAF, NCAAB, MLB, EPL or MLS |
| home, away, starts_at | Teams and scheduled start (UTC ISO 8601) |
| market, period, side | moneyline, spread or total; the period; home, away, draw, over or under |
| line | Spread or total number; null on a moneyline |
| american, decimal | The recorded price in both formats |
| observed_at, age_seconds, stale | When the price was captured, its age, and whether it is older than 900 seconds |

## FAQ

### Which sportsbooks does the NFL odds API cover?

DraftKings (observed through ESPN), FanDuel (native New Jersey feed) and BetRivers Pennsylvania. Each has its own endpoint and native IDs.

### Does it include NFL player props?

BetRivers NFL event detail includes its native player markets, and pick'em player lines from PrizePicks, Underdog, Pick6 and FanDuel are on /api/v1/markets. DraftKings sportsbook props are not included.

### Can I get NFL futures like Super Bowl winner prices?

Yes, from FanDuel. /api/v1/outrights lists futures markets and /api/v1/outrights/odds returns their selection prices.

### How far back does NFL line history go?

The history endpoint covers the last seven days. A separate retained archive holds older captured observations, but it is not a complete record of every price change.

---

GetOdds is an independent developer product and is not affiliated with any sportsbook or pick’em operator. Prices describe data, not betting advice.
