# Sports odds API with American and decimal prices and capture times

The GetOdds sports odds API returns moneyline, spread and total betting odds for the NFL, NBA, NHL, college football, college basketball, the Premier League and MLS. Each price comes in American and decimal form with the time it was observed, and you can filter to quotes captured in the last 15 minutes.

Canonical page: https://getoddsapi.com/sports-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

- **Leagues:** NFL, NBA, NHL, NCAAF, NCAAB, EPL, MLS
- **Markets:** Moneyline, spread, total, futures
- **Formats:** American and decimal
- **Page size:** Up to 200 rows per request

## Request odds for one league and market

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.

sport takes a league code. market narrows to moneyline, spread or total. Results page with limit (1 to 200) and offset (up to 10,000); follow pagination.next_offset while has_more is true. Pages are not a frozen snapshot, so a price can change between pages.

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

## Convert and compare odds correctly

Both formats are stored, so you never have to round-trip a conversion. Decimal odds equal total return per unit staked; implied probability is 1 divided by the decimal price. A two-way market's implied probabilities add up to more than 100 percent; the excess is the margin. The free odds converter and no-vig calculator on this site use the same arithmetic if you want to check a number by hand.

| Quantity | Value |
| --- | --- |
| Decimal price each side | 1.9091 |
| Implied probability each side | 52.38% |
| Sum of both sides (overround) | 104.76% |
| Theoretical hold | 4.55% |
| No-vig probability each side | 50.00% |

## Find specific games, then batch them

Search events by team name, then read up to 20 known events in one call with /api/v1/odds/multi. /api/v1/odds/updated returns rows whose stored prices changed since a timestamp in the last seven days, which is cheaper than re-reading a full league every minute.

```bash
curl --fail-with-body "https://getoddsapi.com/api/v1/events/search?q=Celtics&sport=NBA" \
  -H "Authorization: Bearer $GETODDS_API_KEY"

curl --fail-with-body "https://getoddsapi.com/api/v1/odds/multi?event_ids=EVENT_ID_1,EVENT_ID_2&fresh_only=true" \
  -H "Authorization: Bearer $GETODDS_API_KEY"
```

## Fields you get back

Every odds row has the same shape, which keeps parsing simple across leagues.

| 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

### Is a sports odds API the same as a betting odds API?

Yes. Both terms describe an API that returns bookmaker prices for sporting events. GetOdds returns them per sportsbook with the observation time attached.

### Which sportsbook are the /api/v1/odds prices from?

DraftKings, observed through ESPN's odds data. FanDuel and BetRivers prices are on their own endpoints because their native market structures differ.

### Do I get fractional odds?

No. Rows contain American and decimal prices. Fractional odds can be derived from decimal, and the site's odds converter shows the conversion.

### How many requests can I make for free?

1,000 per UTC day and 60 per minute per account. Each page of up to 200 rows is one request.

---

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