Odds

Live and historical odds, plus a cross-source trust layer. The odds endpoints are /v1/odds/historical (Edge+, every snapshot for a match) and /v1/odds/closing-lines (Edge+, closing lines across a sport and date range). This page documents the trust layer on top of them: two-source verification.

Which sportsbooks

25 books, including Bet365, Kalshi, Matchbook, Novig, Pinnacle, Polymarket and ProphetX. 6 of them reach us from two independent providers, which is what makes the verification below possible for those books.

  • Bet365the largest international book
  • Kalshia regulated prediction market
  • Matchbooka betting exchange — peer-to-peer prices rather than a bookmaker margin
  • Noviga no-vig peer-to-peer exchange, newly carried and still low-volume
  • Pinnaclethe sharpest line in the market, and the one most often used as a reference price
  • Polymarketa prediction market
  • ProphetXa peer-to-peer exchange, newly carried and still low-volume

The full list: Bet365, BetMGM, BetOnline, BetRivers, BetUS, Bodog, Bovada, Caesars (William Hill US), DraftKings, Fanatics Sportsbook, FanDuel, Hard Rock Bet, Intertops, Kalshi, Lowvig, Matchbook, MyBookie.ag, Novig, Pinnacle, Polymarket, ProphetX, SportsBetting, theScore Bet, Unibet, YouWager. † corroborated across two providers.

Book identity is served on /v1/games/{id}/books, /v1/odds/historical and /v1/odds/closing-lines (Edge and above), each row naming the book it came from. This list is generated from the books we are actually receiving lines from, not from a list we maintain by hand.

Two-source verification

Honesty Architecture is one of our principles: we would rather tell you a number is uncorroborated than present it as fact. Two-source verification makes that principle a product feature. We ingest odds from two independent providers, and a worker compares them for the same match, market, and book. Where they disagree, we record it as a divergence. A divergence is signal: it tells you a line is not corroborated by both sources, so you can discount it, investigate it, or trade against it.

The four divergence categories

  • PRICE_DIFF — both sources agree on the line, but the price (juice) differs materially. Example: the same spread priced at -110 on one source and -120 on the other.
  • LINE_DIFF — same market, different line. The more serious disagreement, because it is a different bet, not just a different price. Example: a spread of -1.5 on one source vs -2.5 on the other.
  • MISSING_FROM_ONE — only one source priced the market. A coverage gap rather than a contradiction.
  • STALE — not a true disagreement: one source updated more than 30 minutes ago while the other updated within the last 5 minutes. We flag it so a stale-but-equal line is not mistaken for agreement.

When more than one category applies to a comparison, the most severe is recorded as the primary category (LINE_DIFF > PRICE_DIFF > MISSING_FROM_ONE > STALE) and the rest appear in secondary_categories.

Scope

Verification covers game lines only (moneyline, spread, total), not player props. It compares the books both providers price, across these six verified overlaps:

BetMGM, DraftKings, FanDuel, Bovada, BetOnline, Lowvig.

The comparison worker runs on a */15 schedule (every 15 minutes), slow enough to compare settled snapshots and fast enough that a divergence surfaces within about a quarter hour.

Query the divergences

GET /v1/odds/divergences returns the current divergences. Edge plan or higher. Provide either a match_id (self-bounding) or a date_from + date_to window; optionally filter by sport, category, and canonical_id (the cross-provider book id).

bashbash
curl "https://api.bigballsdata.com/v1/odds/divergences?sport=basketball&date_from=2026-06-19&date_to=2026-06-20&category=LINE_DIFF" \
  -H "x-api-key: $BBS_API_KEY"

Each row pairs the two providers side by side:

jsonjson
{
  "data": [
    {
      "match_id": "…",
      "sport_type": "basketball",
      "league": "NBA",
      "kickoff_utc": "2026-06-19T23:40:00.000Z",
      "market": "spread",
      "canonical_id": "draftkings",
      "book_display_name": "DraftKings",
      "category": "LINE_DIFF",
      "secondary_categories": [],
      "magnitude": 1.0,
      "detected_at": "…"
    }
  ],
  "meta": { "total": 12, "limit": 50, "offset": 0, "categories_present": ["LINE_DIFF"], "generated_at": "…" }
}

The per-provider lines themselves are deliberately not returned: the product is the computed disagreement, and magnitude is an absolute difference, so it cannot be used to reconstruct either side's price. magnitude is category-specific: the price-difference percentage for PRICE_DIFF, the line gap for LINE_DIFF, and null otherwise. Paginate with limit / offset against meta.total. A plan below Pro returns 403; a malformed query returns 400 with a suggested_fix.

Code examples

Copy-paste examples for the odds endpoints (historical, closing lines, divergences) in curl, Python, and Go are on the Odds API code examples page.

Coming next

A verification field on /v1/odds/historical and /v1/odds/closing-lines responses is coming next, so a single odds read tells you whether a line is two-source verified, single-source, or divergence-flagged, without a second call.