# Soccer odds API for the Premier League and MLS

GetOdds returns English Premier League and MLS odds from DraftKings: three-way moneylines (home, draw, away), spreads and totals, each with the time the price was observed. Use sport=EPL or sport=MLS. Coverage is those two leagues on one sportsbook; if you need European books or many leagues, a global aggregator will serve you better.

Canonical page: https://getoddsapi.com/soccer-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:** Premier League (EPL), MLS
- **Sportsbook:** DraftKings
- **Moneyline:** Three-way, includes draw
- **Formats:** American and decimal

## Read Premier League 1X2 prices

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.

Soccer moneylines have three rows per match: side=home, side=away and side=draw. That is the 1X2 market in European terms. Group the three rows by event_id before computing anything.

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

## Remove the margin from a three-way market

A three-way market carries more margin than a two-way one, and the draw is often where it hides. The script groups each match's three prices, sums their implied probabilities and scales them to 100 percent. The /api/v1/odds/summary endpoint does the same grouping server-side and only reports a normalized probability when all three EPL or MLS sides are present and captured within 60 seconds of each other.

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

url = "https://getoddsapi.com/api/v1/odds?sport=EPL&market=moneyline&fresh_only=true&limit=200"
req = Request(url, headers={"Authorization": "Bearer " + os.environ["GETODDS_API_KEY"]})
with urlopen(req, timeout=20) as r:
    rows = json.load(r)["data"]

matches = defaultdict(dict)
for row in rows:
    matches[(row["event_id"], row["home"], row["away"])][row["side"]] = row["decimal"]

for (eid, home, away), prices in matches.items():
    if set(prices) != {"home", "draw", "away"}:
        continue  # incomplete market: do not normalize
    total = sum(1 / d for d in prices.values())
    fair = {side: round(100 / d / total, 1) for side, d in prices.items()}
    print(f"{home} v {away}: margin {100 * (total - 1):.2f}%  fair {fair}")
```

## Regulation time and what is not covered

Soccer three-way moneylines normally settle on the result after regulation plus stoppage time, so extra time and penalties in cup matches do not count. Check the sportsbook's house rules for the contract you display.

GetOdds does not carry FanDuel or BetRivers soccer, Champions League or other European leagues, and soccer is not part of the arbitrage feed. MLS and EPL player markets are not included.

## FAQ

### Which soccer leagues does the API cover?

The English Premier League (sport=EPL) and Major League Soccer (sport=MLS), priced by DraftKings.

### Does the soccer moneyline include the draw?

Yes. Each match has home, away and draw rows.

### Are Asian handicaps available?

The spread market holds the handicap DraftKings posts for the match. Quarter-ball Asian lines and other European formats are not normalized.

### Can I get Champions League or La Liga odds?

No. Only the EPL and MLS are covered today.

---

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