Odds API for Prediction Market Arbitrage

Prediction markets and sportsbooks in one response, in the same shape.

Prediction markets such as Kalshi and Polymarket price many of the same games as sportsbooks. Comparing them usually means two integrations and a lot of matching by team name. In SockOdds v1 they are bookmakers like any other, keyed kalshi and polymarket, so a prediction market price and a sportsbook price for the same team share an outcome id in the same response.

Why SockOdds

  • Bookmaker keys, not a separate API. Ask for bookmakers=kalshi,polymarket,sportsbet and all three come back together. GET /bookmakers gives each one's kind: sportsbook, exchange or prediction_market.
  • Decimal like everything else. Prediction market prices are decimal, with implied_probability beside them, so they compare directly with any sportsbook price.
  • Shared outcome ids. The same team is the same oc_ id at a prediction market and at a sportsbook, so there is no name matching to do.
  • Coverage you can check. As of 30 October 2026 both deliver US leagues and European football. The current leagues are on the Kalshi and Polymarket pages.
  • Fresh quotes only. Every quote has observed_at, and quotes older than 10 minutes are withheld.

Not risk free. Prices move between the quote and your order, prediction markets can be thin, fees and settlement rules differ from sportsbooks, and bookmakers may limit accounts. Check every leg on the venue itself before you act.

What you can build

A cross-venue arbitrage scanner

Take the best price per outcome across prediction markets and sportsbooks and add up 1 / decimal_odds. A sum under 1 is a possible arbitrage, before fees.

A probability dashboard

Show each venue's implied_probability for the same outcome side by side, and how far the venues disagree.

A prediction market tracker

Store prediction market prices on a schedule, or on Pro read their history, to see how they moved against the sportsbooks.

Try it

This request asks for the winner market on an upcoming college football game from Kalshi and Betr.

curl -sS "https://api.sockodds.com/v1/events/ev_000ckk0nc1tg/odds?markets=winner&bookmakers=kalshi,betr" \
  -H "Authorization: Bearer $SOCKODDS_API_KEY"
const response = await fetch("https://api.sockodds.com/v1/events/ev_000ckk0nc1tg/odds?markets=winner&bookmakers=kalshi,betr", {
  headers: { Authorization: `Bearer ${process.env.SOCKODDS_API_KEY}` },
});
console.log(JSON.stringify(await response.json(), null, 2));
import json, os, urllib.request

request = urllib.request.Request(
    "https://api.sockodds.com/v1/events/ev_000ckk0nc1tg/odds?markets=winner&bookmakers=kalshi,betr",
    headers={"Authorization": "Bearer " + os.environ["SOCKODDS_API_KEY"]},
)
with urllib.request.urlopen(request) as response:
    print(json.dumps(json.load(response), indent=2))

Response from a local copy of the API with invented test prices

{
  "data": {
    "id": "ev_000ckk0nc1tg",
    "name": "Abilene Christian Wildcats v Air Force Falcons",
    "league": {
      "key": "ncaaf",
      "name": "College football"
    },
    "scheduled_start": "2026-10-16T19:00:00.000Z",
    "status": "scheduled",
    "participants": [
      {
        "role": "away",
        "identity": {
          "key": "air_force_falcons",
          "name": "Air Force Falcons"
        }
      },
      {
        "role": "home",
        "identity": {
          "key": "abilene_christian_wildcats",
          "name": "Abilene Christian Wildcats"
        }
      }
    ],
    "markets": [
      {
        "id": "mk_qpcfjj74vm67qng3",
        "key": "winner",
        "name": "Winner",
        "period": "full",
        "subject": null,
        "alternate": false,
        "outcomes": [
          {
            "id": "oc_2eq7ejh9tvepckre",
            "name": "Abilene Christian Wildcats",
            "side": "home",
            "line": null,
            "prices": [
              {
                "bookmaker": "betr",
                "decimal_odds": 1.77,
                "implied_probability": 0.564972,
                "available": true,
                "observed_at": "2026-10-15T07:58:00.000Z"
              },
              {
                "bookmaker": "kalshi",
                "decimal_odds": 1.69,
                "implied_probability": 0.591716,
                "available": true,
                "observed_at": "2026-10-15T07:58:00.000Z"
              }
            ]
          },
          {
            "id": "oc_43ctd7dv6hy4dqjz",
            "name": "Air Force Falcons",
            "side": "away",
            "line": null,
            "prices": [
              {
                "bookmaker": "betr",
                "decimal_odds": 2.18,
                "implied_probability": 0.458716,
                "available": true,
                "observed_at": "2026-10-15T07:58:00.000Z"
              },
              {
                "bookmaker": "kalshi",
                "decimal_odds": 2.08,
                "implied_probability": 0.480769,
                "available": true,
                "observed_at": "2026-10-15T07:58:00.000Z"
              }
            ]
          }
        ]
      }
    ]
  },
  "meta": {
    "count": 1,
    "cursor": null
  },
  "links": {
    "next": null
  }
}

Both bookmakers return the same outcome ids, and Kalshi's prices are decimal like Betr's. Compare implied_probability for each team to see how far the two venues disagree, then add up the best price per team as in the scanner above.

Search across the SockOdds documentation and catalogue.