# NHL odds API: puck lines, totals and moneylines

GetOdds returns NHL moneylines, puck lines and totals from DraftKings, FanDuel's native NHL markets and BetRivers Pennsylvania. In the API the puck line is the spread market, almost always plus or minus 1.5 goals, and every price carries the time it was observed so you can drop stale quotes before a game.

Canonical page: https://getoddsapi.com/nhl-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:** Moneyline, puck line, total
- **League code:** NHL
- **Arbitrage feed:** Not covered for NHL

## Read NHL puck lines

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.

Request market=spread to get puck lines. Each game returns a home row and an away row; the line is from that side's perspective, so a -1.5 favorite's opponent shows +1.5. Puck line prices swing much more than the line itself, which is why the price, not the number, is what to track in hockey.

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

## Hockey settlement differs, so be careful comparing books

NHL moneylines usually include overtime and the shootout, while some markets are regulation-only three-way bets. Because those contracts are not interchangeable, GetOdds does not run NHL through its DraftKings versus FanDuel arbitrage or value feeds. If you compare NHL prices yourself, match the market type and period field exactly, and read each book's rules.

## Compare BetRivers NHL prices with DraftKings

BetRivers markets keep their native criterion labels, lifetimes and both decimal and American display prices exactly as published. The script reads both books for the NHL and prints them side by side by team names; it does not claim the two contracts are identical.

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

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

dk = get("/odds?sport=NHL&market=moneyline&fresh_only=true&limit=100")["data"]
br = get("/betrivers/markets?league=NHL&limit=50")["data"]  # select BetRivers on the account first

for row in dk[:10]:
    print("DK", row["away"], "@", row["home"], row["side"], row["american"], row["observed_at"])
for market in br[:10]:
    prices = [(o["name"], o["line"], o["price_american"], o["price_decimal"]) for o in market["outcomes"]]
    print("BR", market["event"]["name"], "|", market["criterion"]["label"], prices)
```

## FAQ

### Is the puck line the same as the spread?

Yes. In GetOdds the NHL puck line is stored as market=spread, with line usually -1.5 or +1.5.

### Which books cover the NHL?

DraftKings, FanDuel and BetRivers Pennsylvania.

### Why is the NHL not in the arbitrage feed?

Hockey contracts differ on overtime, shootouts and regulation-only three-way markets. The feed only covers basketball and football contracts where the settlement assumptions can be stated precisely.

### Are NHL player props available?

BetRivers NHL event detail includes its native player markets, and pick'em lines come from /api/v1/markets where operators post them.

---

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