Odds API for Prediction Market Arbitrage

Compare Kalshi and Polymarket prices against sportsbook odds in one schema to find exchange-vs-book arbitrage and mispricing across prediction markets and books in one API.

Updated June 2026Built on the live SportsGameOdds feed
How it works
  1. 1
    Pull exchange and book prices together

    Request an event with oddsAvailable=true and read each market's byBookmaker map, where Kalshi and Polymarket prices sit next to sportsbooks like Pinnacle and DraftKings, with no separate exchange API to join.

  2. 2
    Convert each price to implied probability

    Convert each byBookmaker entry's odds to a probability and sum the two sides; when an exchange price on one side and a book price on the other combine below 100%, that is a cross-market arbitrage to act on after checking fees and limits.

  3. 3
    Benchmark against fairOdds to catch mispricing

    Compare a single Kalshi or Polymarket price to the market's no-vig fairOdds to spot one-sided mispricing, where an exchange prices an outcome away from the sharp consensus.

A prediction market arbitrage API returns prediction-market contract prices and sportsbook odds for the same outcome side by side, so a tool can convert each to implied probability and flag where an exchange and a book disagree enough to lock in an edge. SportsGameOdds puts both in one feed: Kalshi and Polymarket land in the same byBookmaker object as sportsbooks, keyed kalshi and polymarket next to pinnacle and draftkings, across 85+ books, with a no-vig fairOdds consensus to benchmark every price against. You query one feed instead of reconciling an exchange API against a separate odds API.

Why build your prediction market arbitrage on SportsGameOdds

  • Exchanges and books share one schema. Kalshi and Polymarket prices sit under the same byBookmaker map as pinnacle, draftkings, and fanduel, all keyed to one normalized oddID, so an exchange contract and a sportsbook line for the same outcome collapse onto one row without any cross-API matching.
  • fairOdds is a built-in benchmark. Each market ships fairOdds (the no-vig consensus) and bookOdds (consensus with vig), so you can measure how far a Kalshi or Polymarket price sits from where the sharp market lands. That gap is the core signal behind exchange-vs-sportsbook mispricing.
  • One oddID aligns every side. The format statID-statEntityID-periodID-betTypeID-sideID (e.g. points-home-game-ml-home) identifies the same outcome across an exchange and a book, so converting each byBookmaker entry to implied probability and summing the two sides is a few lines, not a normalization project.
  • Prices, availability, and timing per entry. Every byBookmaker entry carries odds, an available flag, and lastUpdatedAt, so your tool can skip stale or unavailable contracts before it ever calls something an arbitrage.
  • Predictable per-event-object pricing. One event is one object no matter how many books, exchanges, or markets you pull, so scanning Kalshi and Polymarket against every sportsbook on a slate doesn't multiply your bill.
  • Five official SDKs plus an MCP server. JavaScript/TypeScript, Python, Ruby, Go, and Java wrap the identical feed, plus an MCP server for AI-assisted development in Claude Code, Cursor, and VS Code.

How exchange-vs-sportsbook arbitrage works with our data

Cross-market arbitrage rarely comes down to the math. The challenge is getting an exchange contract and a sportsbook line into the same shape, at the same moment, for the same outcome. SportsGameOdds pre-assembles that: one oddID, one byBookmaker object, exchanges and books together. Here is how each step maps to concrete fields.

Pull exchange and book prices together

Request an event with oddsAvailable=true and read each market under event.odds. The byBookmaker object holds pinnacle, draftkings, and fanduel alongside kalshi and polymarket, every price for that outcome in one place. There is no separate Kalshi odds API or Polymarket sports API to call and join; the exchange contracts arrive in the same payload as the sportsbook lines.

Convert each price to implied probability

Arbitrage and mispricing both reduce to one comparison: implied probability. Convert each byBookmaker entry's odds to a probability, do the same for the opposing side, and sum them. When the combined implied probability of an exchange price on one side and a book price on the other falls below 100%, the two markets disagree enough to cover both outcomes. That is exchange-vs-sportsbook arbitrage. Use available and lastUpdatedAt to discard anything stale before you trust the number.

Benchmark against fairOdds to catch mispricing

Not every edge is a two-sided arb. Comparing a single exchange price to the market's fairOdds (the no-vig consensus) tells you when Kalshi or Polymarket is simply pricing an outcome away from where the sharp books land, a one-sided mispricing you can act on. bookOdds keeps the vig-inclusive consensus for display, while fairOdds is the clean baseline your edge is measured against.

Example request

Pull an NBA event with odds attached so exchange and book prices arrive together:

curl "https://api.sportsgameodds.com/v2/events?leagueID=NBA&oddsAvailable=true&limit=1" \
  -H "x-api-key: YOUR_API_KEY"

A trimmed moneyline market shows Kalshi and Polymarket priced next to Pinnacle and DraftKings, with a no-vig fairOdds to benchmark against:

{
  "eventID": "LAL_at_BOS_2026...",
  "odds": {
    "points-home-game-ml-home": {
      "oddID": "points-home-game-ml-home",
      "betTypeID": "ml",
      "sideID": "home",
      "periodID": "game",
      "fairOdds": "-135",
      "bookOdds": "-142",
      "byBookmaker": {
        "pinnacle":   { "odds": "-138", "available": true },
        "draftkings": { "odds": "-145", "available": true },
        "kalshi":     { "odds": "-120", "available": true },
        "polymarket": { "odds": "-128", "available": true }
      }
    }
  }
}

Here Kalshi's -120 on the home side converts to a ~54.5% implied probability versus the no-vig fairOdds of -135 (~57.4%), a one-sided mispricing. To check for a true two-sided arb, pair that -120 against the best available away price and sum the implied probabilities; if the total falls below 100%, you can cover both outcomes. Treat any result as a candidate, not a guarantee. Exchange fees, contract resolution, liquidity limits, and line moves all erode it, so hedge rather than assume risk-free. See the docs and the arbitrage calculator example for the full implied-probability and stake-sizing math.

SportsGameOdds vs building it yourself

What you needSportsGameOddsIntegrate Kalshi + Polymarket + an odds API yourself
Exchanges + books togetherKalshi & Polymarket in the same byBookmaker object as sportsbooksSeparate exchange APIs plus a separate odds API to reconcile
Outcome alignmentShared oddID lines every side upMatch each market and team by hand across sources
No-vig benchmarkfairOdds consensus includedDe-vig every book yourself, per market
Freshness / availabilityavailable + lastUpdatedAt per entryTrack each source's update timing separately
Price normalizationOne schema across exchanges and booksMap each source's contract and odds format
Coverage85+ books from one callOne integration, auth, and rate limit per source
BillingPer event object, so books don't multiply costPer-source pricing and quotas stacked together

Wiring the sources together yourself makes sense if you want full control over how exchange contracts map to sportsbook outcomes. The real trade-off is the plumbing: separate Kalshi and Polymarket integrations, a third odds source, and the ongoing work of normalizing contract formats, matching outcomes, and de-vigging, all before you compute a single implied probability. SportsGameOdds collapses that into one byBookmaker object so you spend your time on the edge, not the ETL.

Frequently asked questions

Related use cases

Find prediction-market arbitrage

Free plan available. Set up in 5 minutes. No credit card required.