Betting odds
Fixture odds
GET/v2/fixtures/{id}/oddsPro and up
Every market the bookmaker prices for a fixture — result (1X2), winner, double chance, draw no bet, both teams to score, first to score, goal / card / corner / points totals, Asian handicap, handicap / point spread, next goal (live), cricket toss winner, most sixes and a hundred / fifty in the match — with opening and current prices (decimal and fractional), the direction of the last move, suspension and, after the match, the winning choices. Pro, Business and Enterprise plans.
A market’s key is stable within the fixture (kind, then :period, :line and :live — "result", "result:half1", "totalGoals:2.5", "asianHandicap:-1.25", "winner:live") — merge WebSocket odds frames by it. In play the bookmaker lists the in-play market (live: true, key …:live) next to the closed pre-match one, whose prices are the last before kick-off. line is a total’s figure or the HOME side’s handicap; a moved line is a new key. decimal = 1 + fractional, rounded to 2 decimals. winning is null before settlement and where nobody settles the market; settledBy says who set it. The source does not settle every market — on NBA games the handicap (point spread) and the first-quarter winner stayed null after the final whistle (checked 2026-11-05, hours later), and football Asian handicaps and total cards on every finished fixture (checked 2026-11-12, days later), while results, winners and goal totals were settled within minutes (settledBy "source"). Since 2026-11-12 we settle two of those ourselves from the final result, marked settledBy "computed" and never over a flag of the source’s: football Asian handicaps on half lines (from the regular-time score) and football total cards on half lines when the match had yellow cards only, all to players on the pitch, with the incidents and the statistics agreeing. Everything else the source leaves unsettled stays null for good. The bookmaker’s own rules decide a bet. An empty markets list (and a null updatedAt) = the bookmaker prices nothing for it — minor leagues, matches far ahead. REST reads are refreshed about every 30 seconds in play; for every price move subscribe to odds:{id}.
Parameters
id
our numeric id (positive integer)
Response
- data
Odds- meta
- count (markets)
- errors
- 403 endpoint_not_in_plan — Free and Starter keys403 history_not_in_plan — the fixture is older than your plan’s history404 not_found — an id we never issued
Every /v2 call can also answer the common errors.
$ curl -H "Authorization: Bearer sk_live_…" \ "https://api.sportsapi.app/v2/fixtures/{id}/odds"
Example
{ "data": { "fixtureId": 701210, "updatedAt": "2026-11-04T17:20:00.000Z", "markets": [ { "key": "result", "kind": "result", "name": "Full time", "period": "match", "line": null, "live": false, "suspended": false, "choices": [ { "name": "1", "outcome": "home", "fractional": "19/20", "decimal": 1.95, "openingFractional": "11/10", "openingDecimal": 2.1, "change": "down", "winning": null }, { "name": "X", "outcome": "draw", "fractional": "10/3", "decimal": 4.33, "openingFractional": "5/2", "openingDecimal": 3.5, "change": "up", "winning": null }, { "name": "2", "outcome": "away", "fractional": "11/5", "decimal": 3.2, "openingFractional": "11/5", "openingDecimal": 3.2, "change": "none", "winning": null } ], "settledBy": null }, { "key": "totalGoals:2.5", "kind": "totalGoals", "name": "Match goals", "period": "match", "line": 2.5, "live": false, "suspended": false, "choices": [ { "name": "Over", "outcome": "over", "fractional": "4/5", "decimal": 1.8, … }, { "name": "Under", "outcome": "under", … } ] }, { "key": "asianHandicap:-0.5", "kind": "asianHandicap", "name": "Asian handicap", "period": "match", "line": -0.5, … }, … ] }, "meta": { "count": 19 } }