Odds API for Positive EV Betting
Retail prices and sharp reference prices in one response, so you can build your own fair line.
A positive expected value (EV) tool compares what a bookmaker pays with what an outcome is really worth. It needs two things: every bookmaker's price for the market, and a fair price to measure them against. SockOdds v1 gives you the prices, including exchanges and sharper bookmakers, in one shape. You choose how to remove the margin, so the method is yours to test and change.
No promises. A positive EV price is an estimate that is only as good as your fair-price method, and any single bet can still lose. Prices move, and bookmakers may limit accounts that keep taking their best prices.
Why SockOdds
- Reference prices in the same response. Exchanges such as
betfair_exchangeand bookmakers such aspinnaclecome back next to the retail bookmakers, in decimal, under the same outcome ids. Where each one delivers is on the bookmakers pages. - Implied probability on every quote.
implied_probabilityis1 / decimal_oddswith the margin still in, ready for you to remove it. - Opening and closing prices. On Pro,
snapshots=opening,closingadds each quote's first and last recorded price before the start, which is what you need to measure closing line value. - Graded results.
GET /resultssettles outcomes from official sources, so you can check how the prices you flagged actually finished. - Fresh quotes only. Quotes older than 10 minutes are withheld, so an old price never shows up as an edge.
What you can build
A fair-price engine
Pick a reference bookmaker or exchange, add up its implied_probability across the market's outcomes, and divide each one by the total. That proportional method is a starting point; you can swap in any other and compare them.
A value scanner
Compare every bookmaker's decimal_odds with your fair odds (1 / fair probability). Where the price is higher, decimal_odds × fair probability - 1 is the estimated edge.
Closing line tracking
Store each price you flag with its outcome id. After the start, request the game's odds with snapshots=closing and compare your price with the last one recorded before the game.
Try it
This request asks for the winner market on an upcoming college football game from the Betfair Exchange and Betr.
curl -sS "https://api.sockodds.com/v1/events/ev_000ckk0nc1tg/odds?markets=winner&bookmakers=betfair_exchange,betr" \
-H "Authorization: Bearer $SOCKODDS_API_KEY"const response = await fetch("https://api.sockodds.com/v1/events/ev_000ckk0nc1tg/odds?markets=winner&bookmakers=betfair_exchange,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=betfair_exchange,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": "betfair_exchange",
"decimal_odds": 1.72,
"implied_probability": 0.581395,
"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": "betfair_exchange",
"decimal_odds": 2.12,
"implied_probability": 0.471698,
"available": true,
"observed_at": "2026-10-15T07:58:00.000Z"
}
]
}
]
}
]
},
"meta": {
"count": 1,
"cursor": null
},
"links": {
"next": null
}
}Add up the exchange's two implied_probability values and divide each by the total to get a fair probability per team. Then compare each Betr decimal_odds with 1 / fair probability. With these test prices neither Betr price is above fair, which is the usual result: positive EV prices are the exception, not the rule.