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,sportsbetand all three come back together.GET /bookmakersgives each one'skind:sportsbook,exchangeorprediction_market. - Decimal like everything else. Prediction market prices are decimal, with
implied_probabilitybeside 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.