Home / Guides FAQ / Arbitrage Detection

Arbitrage Detection
Across 50 Sportsbooks

One API call returns pre-computed arbitrage opportunities with stake allocation, profit percentage, and staleness flags. Pinnacle-anchored. Refreshed every 30 seconds.

50

Sportsbooks scanned

30s

Refresh cycle

0.5–3%

Typical edge range

Get API Key — Free Tier Available
Sample Response — /intelligence/arbitrage
{
  "sport_key": "basketball_nba",
  "event": "Lakers vs Celtics",
  "market": "h2h",
  "profit_pct": 1.8,
  "likely_stale": false,
  "legs": [
    {
      "outcome": "Lakers",
      "bookmaker": "draftkings",
      "price": +155,
      "stake_pct": 39.2
    },
    {
      "outcome": "Celtics",
      "bookmaker": "pinnacle",
      "price": -148,
      "stake_pct": 60.8
    }
  ],
  "detected_at": "2026-04-30T02:14:07Z",
  "age_seconds": 12
}

How It Works

01

50-Book Scan

Every 30 seconds, odds from DraftKings, FanDuel, BetMGM, Pinnacle, Betfair, and 45 other books are pulled, normalized, and compared pairwise across all outcomes.

02

Arbitrage Computed

When combined implied probability across books drops below 100%, the arb is flagged. Stake allocation and profit percentage are pre-calculated. Arbs above 5% are flagged as likely_stale — almost always a book error.

03

You Act

Pull GET /intelligence/arbitrage?sport_key=basketball_nba and receive ready-to-execute opportunities with book, price, and stake per leg. No calculation required on your end.

Integration

Three lines to detect arbitrage. No odds math required.

Python
import requests

response = requests.get(
    "https://api.theoddsapi.com/v4/intelligence/arbitrage",
    headers={"x-api-key": "YOUR_KEY"},
    params={"sport_key": "basketball_nba"}
)

arbs = response.json()["data"]
for arb in arbs:
    if not arb["likely_stale"]:
        print(f"{arb['event']}{arb['profit_pct']}% edge")
        for leg in arb["legs"]:
            print(f"  {leg['bookmaker']}: {leg['outcome']} @ {leg['price']} — stake {leg['stake_pct']}%")
JavaScript
const res = await fetch(
  "https://api.theoddsapi.com/v4/intelligence/arbitrage?sport_key=basketball_nba",
  { headers: { "x-api-key": "YOUR_KEY" } }
);

const { data: arbs } = await res.json();
arbs
  .filter(a => !a.likely_stale)
  .forEach(a => console.log(`${a.event}${a.profit_pct}% profit`));

Manual vs. Automated Detection

Manual (Browser Tabs) TheOddsAPI
Books scanned 3–5 (open tabs) 50 simultaneously
Time per scan 5–10 minutes 30 seconds (continuous)
Stake calculation Spreadsheet / mental math Pre-computed per leg
Stale detection None — you eat the void likely_stale flag on 5%+ arbs
Sports coverage 1 sport at a time 24 sports, all markets
Sharp anchor None — comparing retail to retail Pinnacle baseline included

Separating Real Edges from Noise

Not every price disagreement is a real arbitrage. The difference between 1.8% profit and a voided bet depends on detection quality.

Real Arbs (0.5–3%)

  • Cross-book disagreement on h2h or spread markets
  • Both books are active and accepting bets at posted limits
  • Detected within 30 seconds of odds change
  • Age under 2 minutes — window is still open
  • Pinnacle on one side (confirms the sharp anchor)

False Signals (5%+)

  • Book pricing error — will void the bet post-settlement
  • Limit-restricted market — you can't get the posted price
  • Stale line from a slow book — already corrected
  • Regional book not accepting bets (closed market)
  • TheOddsAPI flags these as likely_stale: true automatically

Pinnacle as the Sharp Anchor

Pinnacle accepts unlimited action at under 2% margin. Their closing line is the most efficient price in the market. When a soft book disagrees with Pinnacle, that disagreement is signal — not noise.

Example: NFL Week 8 — Chiefs vs Ravens

Pinnacle

Chiefs -148

Sharp line (baseline)

DraftKings

Chiefs -155

7pt gap — soft book lagging

FanDuel

Chiefs -150

2pt gap — already adjusted

The DraftKings line is 7 points off Pinnacle. On the other side, if Ravens are +160 on another book while Pinnacle has them at +140, that's a cross-book arbitrage candidate. TheOddsAPI detects these automatically across all 50 books.

Arbitrage Across 24 Sports

Intelligence endpoints — including arbitrage — run on every sport the scheduler refreshes. No hardcoded sport list.

NBA

h2h, spreads, totals

NFL

h2h, spreads, totals

MLB

h2h, spreads, totals

NHL

h2h, spreads, totals

EPL

h2h, spreads, totals

La Liga

h2h, spreads, totals

Champions League

h2h, spreads, totals

UFC / MMA

h2h

Bundesliga

h2h, spreads, totals

Serie A

h2h, spreads, totals

Tennis

h2h

+ 13 more

All markets

Risk and Reality

Arbitrage is not risk-free in practice. Knowing the limits protects your capital.

Account Limits

Soft sportsbooks (DraftKings, FanDuel, Caesars) limit winning accounts. Professional arbers rotate books, size bets below detection thresholds, and diversify across sports to extend account lifetime.

Execution Speed

A 30-second refresh means you see opportunities within 30 seconds of detection. The window may close before you execute. Latency matters — build your execution pipeline to act within seconds of receiving the signal.

Voided Bets

Books reserve the right to void bets on obvious pricing errors. Arbs above 5% profit are almost always errors. The likely_stale flag exists to protect you from these — filter them out.

Related

Start Detecting Arbitrage

Free tier includes 25 requests/day across NBA and MLB. Pro tier unlocks 24 sports, 50 books, and all intelligence endpoints.