# Positive EV API built on a no-vig reference book

GET /api/v1/value-bets returns DraftKings or FanDuel prices that beat the other book's no-vig price on the same NBA, NFL, NCAAB or NCAAF market. Edge is the offered decimal price times the reference book's no-vig probability, minus one. That is a disagreement between two books, not a proven win probability, and the response labels it that way.

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

- **Offered book:** DraftKings or FanDuel
- **Reference:** The other book, no-vig
- **Leagues:** NBA, NFL, NCAAB, NCAAF
- **Edge filter:** min_edge_percent, 0 to 100

## Request value results

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.

bookmaker chooses which book's prices you want to bet into (draftkings by default); the other book becomes the reference. min_edge_percent filters out small edges. Results sort by edge, highest first.

```bash
curl --fail-with-body "https://getoddsapi.com/api/v1/value-bets?league=NFL&bookmaker=fanduel&min_edge_percent=1.5&event_match=bounded_time" \
  -H "Authorization: Bearer $GETODDS_API_KEY"
```

## How the edge is calculated

For the reference book's two sides, probability = (1 / decimal of the side) / (1/d_home + 1/d_away). That proportional method removes the margin. Edge = offered decimal x reference probability - 1. The reference book must have between 0 and 50 percent overround; incomplete or underround reference markets are skipped.

| Step | Value |
| --- | --- |
| Reference book: home -120, away +100 | decimal 1.8333 and 2.0000 |
| Implied sum | 0.5455 + 0.5000 = 1.0455 |
| No-vig away probability | 0.5000 / 1.0455 = 47.83% |
| Offered book: away +115 (2.15) | 2.15 x 0.4783 - 1 = +2.83% edge |

## Use it, then verify it

Each result includes reference_probability, reference_decimal, reference_overround_percent and reference_edge_percent, plus both quotes and their ages. Sort or filter further in your own code, and track closing line value on what you act on; the closing line value calculator does that for a single bet.

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

url = "https://getoddsapi.com/api/v1/value-bets?league=NBA&bookmaker=draftkings&min_edge_percent=1"
req = Request(url, headers={"Authorization": "Bearer " + os.environ["GETODDS_API_KEY"]})
with urlopen(req, timeout=20) as r:
    body = json.load(r)

for v in body["data"]:
    ev = v["event"]["draftkings"]
    print(f'{ev["away"]} @ {ev["home"]} {v["market"]["family"]} {v["side"]} {v["american"]} '
          f'fair {v["reference_decimal"]:.3f} edge {v["reference_edge_percent"]:.2f}%')
```

## Where a dedicated +EV service is stronger

Serious +EV work usually prices against a sharp book such as Pinnacle, or a consensus of many books. GetOdds has neither: its reference is the other of two recreational US books, so its edges measure how DraftKings and FanDuel disagree. Services like SharpAPI and OddsPapi carry sharp books. Use GetOdds when you want a transparent, inspectable formula on the two largest US books.

## FAQ

### Is a positive edge the same as positive expected value?

Only if the reference book's no-vig price is an accurate probability. The API labels results market_implied_reference_not_true_probability for that reason.

### Does it use Pinnacle as the sharp reference?

No. GetOdds does not carry Pinnacle. The reference is FanDuel when you bet into DraftKings, and DraftKings when you bet into FanDuel.

### Which margin-removal method is used?

Proportional (multiplicative). The free no-vig calculator compares it with additive, power and Shin methods.

### How fresh are the prices?

You set max_age_seconds from 30 to 600 (default 600) and max_skew_seconds for the gap between the two captures.

---

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