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.
- Bet365 — the largest international book
- Kalshi — a regulated prediction market
- Matchbook — a betting exchange — peer-to-peer prices rather than a bookmaker margin
- Novig — a no-vig peer-to-peer exchange, newly carried and still low-volume
- Pinnacle — the sharpest line in the market, and the one most often used as a reference price
- Polymarket — a prediction market
- ProphetX — a 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
-110on one source and-120on 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.5on one source vs-2.5on 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).
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:
{
"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.