Odds Comparison Fundamentals
Every Odds Comparison v2 payload, in every package, is built from the same four building blocks: a sport event (or a future), its markets, the books offering each market, and each book's outcomes carrying the actual odds. This page explains that model once, so the scenario pages can focus on their workflows.
The Market Model
Each level nests inside the one above, and the chips on the right are the key fields carried at that level:
A market payload nests as follows:
sport_event: the game, withstart_time(UTC),start_time_confirmed, astatus(for examplenot_started), and the twocompetitorswithqualifierofhomeorawayand, for US sports, arotation_numbermarkets: one entry per offered market instance, each with ansr:market:ID, a displayname, and anis_liveflagbooks: inside each market, one entry per bookmaker currently or previously offering it, with thesr:book:ID, the bookmaker's own IDs for the event and market (external_sport_event_id,external_market_id), and aremovedflagoutcomes: inside each book, the selections. Each outcome carries ansr:outcome:ID, atype, the odds in all three formats, the opening odds in all three formats, the bookmaker's own outcome ID (external_outcome_id), and aremovedflag
Here is one complete market from an MLB game, trimmed to the winner market (the full response carries 27 markets):
{
"generated_at": "2026-07-20T16:32:58+00:00",
"sport_event": {
"id": "sr:sport_event:63301085",
"start_time": "2026-07-21T00:05:00+00:00",
"start_time_confirmed": true,
"status": "not_started",
"competitors": [
{
"id": "sr:competitor:3627",
"name": "Chicago Cubs",
"country": "USA",
"country_code": "USA",
"abbreviation": "CHC",
"qualifier": "home",
"rotation_number": 922
},
{
"id": "sr:competitor:3648",
"name": "Detroit Tigers",
"country": "USA",
"country_code": "USA",
"abbreviation": "DET",
"qualifier": "away",
"rotation_number": 921
}
]
},
"markets": [
{
"id": "sr:market:251",
"name": "winner (incl. extra innings)",
"is_live": false,
"books": [
{
"id": "sr:book:17324",
"name": "MGM",
"removed": false,
"external_sport_event_id": "19803922",
"external_market_id": "1542773883",
"outcomes": [
{
"id": "sr:outcome:4",
"type": "home",
"odds_decimal": "1.870",
"odds_american": "-115",
"odds_fraction": "87/100",
"open_odds_decimal": "1.870",
"open_odds_american": "-115",
"open_odds_fraction": "87/100",
"external_outcome_id": "2253398329",
"removed": false
},
{
"id": "sr:outcome:5",
"type": "away",
"odds_decimal": "1.950",
"odds_american": "-105",
"odds_fraction": "20/21",
"open_odds_decimal": "1.950",
"open_odds_american": "-105",
"open_odds_fraction": "20/21",
"external_outcome_id": "2253398328",
"removed": false
}
]
},
{
"id": "sr:book:18149",
"name": "DraftKings",
"removed": false,
"external_sport_event_id": "34413809",
"external_market_id": "1_85555146",
"outcomes": [
{
"id": "sr:outcome:4",
"type": "home",
"odds_decimal": "1.877",
"odds_american": "-114",
"odds_fraction": "877/1000",
"open_odds_decimal": "1.870",
"open_odds_american": "-115",
"open_odds_fraction": "87/100",
"external_outcome_id": "0ML85555146_1",
"removed": false
},
{
"id": "sr:outcome:5",
"type": "away",
"odds_decimal": "1.952",
"odds_american": "-105",
"odds_fraction": "119/125",
"open_odds_decimal": "1.952",
"open_odds_american": "-105",
"open_odds_fraction": "119/125",
"external_outcome_id": "0ML85555146_3",
"removed": false
}
]
},
{
"id": "sr:book:18186",
"name": "FanDuel",
"removed": false,
"external_sport_event_id": "35841674",
"external_market_id": "42.593016238",
"outcomes": [
{
"id": "sr:outcome:4",
"type": "home",
"odds_decimal": "1.893",
"odds_american": "-112",
"odds_fraction": "893/1000",
"open_odds_decimal": "1.926",
"open_odds_american": "-108",
"open_odds_fraction": "463/500",
"external_outcome_id": "29166",
"removed": false
},
{
"id": "sr:outcome:5",
"type": "away",
"odds_decimal": "1.962",
"odds_american": "-104",
"odds_fraction": "481/500",
"open_odds_decimal": "1.926",
"open_odds_american": "-108",
"open_odds_fraction": "463/500",
"external_outcome_id": "29159",
"removed": false
}
]
},
{
"id": "sr:book:25080",
"name": "consensus",
"removed": false,
"outcomes": [
{
"id": "sr:outcome:4",
"type": "home",
"odds_decimal": "1.877",
"odds_american": "-114",
"odds_fraction": "877/1000",
"open_odds_decimal": "1.926",
"open_odds_american": "-108",
"open_odds_fraction": "463/500",
"external_outcome_id": "29166",
"removed": false
},
{
"id": "sr:outcome:5",
"type": "away",
"odds_decimal": "1.954",
"odds_american": "-105",
"odds_fraction": "477/500",
"open_odds_decimal": "1.926",
"open_odds_american": "-108",
"open_odds_fraction": "463/500",
"external_outcome_id": "29159",
"removed": false
}
]
},
{
"id": "sr:book:27447",
"name": "BetRivers",
"removed": false,
"external_sport_event_id": "1024788135",
"external_market_id": "2670685555",
"outcomes": [
{
"id": "sr:outcome:4",
"type": "home",
"odds_decimal": "1.910",
"odds_american": "-110",
"odds_fraction": "10/11",
"open_odds_decimal": "1.910",
"open_odds_american": "-110",
"open_odds_fraction": "10/11",
"external_outcome_id": "4265584995",
"removed": false
},
{
"id": "sr:outcome:5",
"type": "away",
"odds_decimal": "1.940",
"odds_american": "-106",
"odds_fraction": "47/50",
"open_odds_decimal": "1.930",
"open_odds_american": "-108",
"open_odds_fraction": "93/100",
"external_outcome_id": "4265584996",
"removed": false
}
]
},
{
"id": "sr:book:28901",
"name": "Bet365.US.NJ",
"removed": false,
"external_sport_event_id": "198179484",
"external_market_id": "198179484-1096",
"outcomes": [
{
"id": "sr:outcome:4",
"type": "home",
"odds_decimal": "1.820",
"odds_american": "-122",
"odds_fraction": "41/50",
"open_odds_decimal": "1.820",
"open_odds_american": "-122",
"open_odds_fraction": "41/50",
"external_outcome_id": "1730171000",
"removed": false
},
{
"id": "sr:outcome:5",
"type": "away",
"odds_decimal": "1.910",
"odds_american": "-110",
"odds_fraction": "10/11",
"open_odds_decimal": "1.910",
"open_odds_american": "-110",
"open_odds_fraction": "10/11",
"external_outcome_id": "1730170998",
"removed": false
}
]
},
{
"id": "sr:book:32219",
"name": "WilliamHillNewJersey",
"removed": false,
"external_sport_event_id": "627a61ed-4b9f-4ed2-a328-896b0e3d903a",
"external_market_id": "519355b5-9e6a-3fd3-8a71-1d2c6fe668f5",
"outcomes": [
{
"id": "sr:outcome:4",
"type": "home",
"odds_decimal": "1.870",
"odds_american": "-115",
"odds_fraction": "87/100",
"open_odds_decimal": "1.870",
"open_odds_american": "-115",
"open_odds_fraction": "87/100",
"external_outcome_id": "d0f324ca-5f78-3966-b3cf-a6fe468e8205",
"removed": false
},
{
"id": "sr:outcome:5",
"type": "away",
"odds_decimal": "1.952",
"odds_american": "-105",
"odds_fraction": "119/125",
"open_odds_decimal": "1.952",
"open_odds_american": "-105",
"open_odds_fraction": "119/125",
"external_outcome_id": "9821c272-d8a8-39e8-a679-9ae1189231c5",
"removed": false
}
]
},
{
"id": "sr:book:40316",
"name": "TheScore",
"removed": false,
"external_sport_event_id": "d0e0432a-9219-4884-b90e-720c34df0dab",
"external_market_id": "c61a8bf6-2087-4b7a-b514-9318e9c07093",
"outcomes": [
{
"id": "sr:outcome:4",
"type": "home",
"odds_decimal": "1.870",
"odds_american": "-115",
"odds_fraction": "87/100",
"open_odds_decimal": "1.910",
"open_odds_american": "-110",
"open_odds_fraction": "10/11",
"external_outcome_id": "164ee45b-dabb-4bb4-8bb7-44153b4caa2b",
"removed": false
},
{
"id": "sr:outcome:5",
"type": "away",
"odds_decimal": "1.950",
"odds_american": "-105",
"odds_fraction": "20/21",
"open_odds_decimal": "1.910",
"open_odds_american": "-110",
"open_odds_fraction": "10/11",
"external_outcome_id": "49135a11-9789-4e99-ad2a-97f9795b714c",
"removed": false
}
]
}
]
}
]
}Market IDs and Market Names
A market ID identifies a market type; the name identifies the instance. The same sr:market: ID can appear multiple times in one response with different names. In the payload above, sr:market:1123 appears nine times: once each as 1st inning - winner through 9th inning - winner. Group and deduplicate by the pair of id and name, never by id alone.
Odds Formats and Line Values
Every outcome carries the price in all three formats simultaneously, so you never convert:
odds_decimal: global standard; the total return per unit staked (below2.000the selection is the favorite)odds_american: US standard; negative values show the stake needed to win 100, positive values the winnings on a 100 stakeodds_fraction: UK standard; winnings relative to stake
The opening price is preserved beside the current price in all three formats (open_odds_decimal, open_odds_american, open_odds_fraction), so line movement since open is always visible in a single response.
Markets with a line carry it on each outcome:
- Handicap and spread outcomes carry
handicapandopen_handicap - Total outcomes carry
totalandopen_total
In this handicap market, the line held at 1.5 while the home price shortened from -182 to -175:
{
"markets": [
{
"id": "sr:market:256",
"name": "handicap (incl. extra innings)",
"is_live": false,
"books": [
{
"id": "sr:book:17324",
"name": "MGM",
"removed": false,
"external_sport_event_id": "19803922",
"external_market_id": "1542773886",
"outcomes": [
{
"id": "sr:outcome:1714",
"type": "home_handicap",
"odds_decimal": "1.570",
"odds_american": "-175",
"odds_fraction": "4/7",
"open_odds_decimal": "1.550",
"open_odds_american": "-182",
"open_odds_fraction": "11/20",
"handicap": "1.5",
"open_handicap": "1.5",
"external_outcome_id": "2253398335",
"removed": false
},
{
"id": "sr:outcome:1715",
"type": "away_handicap",
"odds_decimal": "2.450",
"odds_american": "+145",
"odds_fraction": "29/20",
"open_odds_decimal": "2.500",
"open_odds_american": "+150",
"open_odds_fraction": "3/2",
"handicap": "-1.5",
"open_handicap": "-1.5",
"external_outcome_id": "2253398334",
"removed": false
}
]
}
]
}
]
}The removed Flag
removed appears at two levels and is the market lifecycle signal:
- Book level (
"removed": trueon a book): the bookmaker has suspended or taken down the whole market. The last known odds remain in the payload. Once an event goes live and the pre-match market comes down, that retained price is effectively the closing line; in-play prices continue in the Live Odds package (see Tracking Live Odds). - Outcome level (
"removed": trueon an outcome): that selection was suspended or removed while the rest of the market remains available.
An outcome flagged removed while showing decimal odds of 1.00 indicates a selection the bookmaker never actually offered; the Prematch FAQ covers this case.
In this example from a player props payload, one book has taken a market down while others still price it:
{
"players_props": [
{
"player": {
"id": "sr:player:848589",
"name": "Swanson, Dansby",
"competitor_id": "sr:competitor:3627"
},
"markets": [
{
"id": "sr:market:9005",
"name": "total doubles (incl. extra innings)",
"is_live": false,
"books": [
{
"id": "sr:book:32219",
"name": "WilliamHillNewJersey",
"removed": true,
"external_sport_event_id": "627a61ed-4b9f-4ed2-a328-896b0e3d903a",
"external_market_id": "cf134bc7-665c-3510-88f1-fa8002ef3a54",
"outcomes": [
{
"id": "sr:outcome:12",
"type": "over",
"odds_decimal": "5.000",
"odds_american": "+400",
"odds_fraction": "4/1",
"open_odds_decimal": "5.000",
"open_odds_american": "+400",
"open_odds_fraction": "4/1",
"total": "0.5",
"open_total": "0.5",
"external_outcome_id": "a2df9397-7c94-3023-bf28-bcd500fdf505",
"removed": true
},
{
"id": "sr:outcome:13",
"type": "under",
"odds_decimal": "1.133",
"odds_american": "-752",
"odds_fraction": "133/1000",
"open_odds_decimal": "1.133",
"open_odds_american": "-752",
"open_odds_fraction": "133/1000",
"total": "0.5",
"open_total": "0.5",
"external_outcome_id": "d0010047-5be8-39c9-b56a-edff0d9ee348",
"removed": true
}
]
}
]
}
]
}
]
}
Removed does not mean deletedMarkets and outcomes are not dropped from the payload when a bookmaker pulls them; they stay, flagged
removed="true", retaining the last odds. Filter on the flag when displaying live boards, and use the retained values when you need closing lines.
The Consensus Book
consensus (sr:book:25080) is a calculated consensus line delivered alongside the individual bookmakers as a book of its own. Use it when you need a single representative price per market rather than a per-bookmaker comparison. It appears first in the Books feed of packages configured with it.
Bookmaker ID Universes
The Books feed lists every bookmaker configured for your key on that package, but not every book prices every market. In the winner-market example above, two books price the market; other configured books do not appear inside that market's books array. Treat the per-market books list, not the global Books feed, as the source of which bookmakers offer a given market.
Event Availability
Sport events appear in the schedule and odds feeds when odds become available for them, so a Daily Schedules response is the day's slate with odds, not the league's full fixture list. Events carry a status field (not_started before the game) and stay in the feeds for two weeks after they complete. If you need every fixture regardless of odds availability, source the schedule from the corresponding Sportradar sport API and join by ID through the mappings feeds (see ID Handling).
Updated 15 days ago
