Integration GuidesDocs
Coverage MatrixDocumentationChange LogLog InContact Us
Integration Guides

Tracking Live Odds

This integration scenario follows in-play odds for a game from before its start to the final out, using the Live Odds package's Daily Sport Event Schedule, Sport Event Markets, and Sport Event Player Props feeds, with the Prematch package supplying the closing line.

This scenario is commonly used to:

  • Drive an in-play odds board that refreshes through the game
  • Chart line movement from first pitch to the final
  • Show live player prop lines beside the game board
  • Capture closing lines at the moment a game goes live


Overview

The Live Odds package uses the same model as Prematch: a sport event, its markets, the books pricing each market, and each book's outcomes with odds in three formats plus opening values. Two things differ: every market is flagged is_live: true and its prices refresh every 15 seconds while the event is in play, and refresh is driven by polling the event feeds themselves rather than a change log. Live markets are guaranteed for the 2-way, spread, and total families, with more where bookmakers offer them.

Daily Sport Event Schedule → Sport Event Markets (polled through play) → Prematch Sport Event Markets (closing line)



Relevant Feeds

FeedPurpose
Daily Sport Event ScheduleEvents for a date and the following one, with their current status
Sport Event MarketsThe live market board for one event
Sport Event Player PropsLive player prop markets for one event
Daily Sport Event MarketsEvery live board for a sport and date in one call
Competition Sport Event MarketsEvery live board for a competition in one call
Sport Event Markets (Prematch)The pre-match board, retained through the game as the closing line


High-Level Workflow

Live Odds LoopFind the live slate, poll each board through play, read the final state
Find live eventsDaily Sport Event Schedulestatus per event, in-play values are sport-specific
BoardSport Event Marketsevery market, every book pricing it, removed flags per book
Props (optional)Sport Event Player Propsper-player live lines with opening values
Poll through playSport Event Markets→every 30 seconds per tracked event
HandoffPrematch Sport Event Marketsretained pre-match prices for closing lines
Cadences come from Update Frequencies; the Live Odds package has no change log, so the event feeds are polled directly during play.


Integration Steps


1. Find the Day's Live Events

Daily Sport Event Schedule lists the events on a date with their current status. The date is UTC and the response covers that date and the following one, the same window as the Prematch Daily Schedules feed (see Pulling Prematch Odds), so key events on their ID rather than on the date you queried. Pulled during a slate, the list mixes games in play, games already ended, and games still to start; the response below is trimmed to the first three of thirteen events:

GET https://api.sportradar.com/oddscomparison-liveodds/trial/v2/en/sports/sr:sport:3/schedules/2026-09-21/sport_events_schedules.json
x-api-key: YOUR_API_KEY
{
  "generated_at": "2026-09-22T01:05:25+00:00",
  "schedules": [
    {
      "sport_event": {
        "id": "sr:sport_event:63303549",
        "start_time": "2026-09-21T22:35:00+00:00",
        "start_time_confirmed": true,
        "status": "7th_inning",
        "competitors": [
          {
            "id": "sr:competitor:3652",
            "name": "Baltimore Orioles",
            "country": "USA",
            "country_code": "USA",
            "abbreviation": "BAL",
            "qualifier": "home",
            "rotation_number": 952
          },
          {
            "id": "sr:competitor:3642",
            "name": "Toronto Blue Jays",
            "country": "USA",
            "country_code": "USA",
            "abbreviation": "TOR",
            "qualifier": "away",
            "rotation_number": 951
          }
        ]
      }
    },
    {
      "sport_event": {
        "id": "sr:sport_event:63302807",
        "start_time": "2026-09-21T22:40:00+00:00",
        "start_time_confirmed": true,
        "status": "ended",
        "competitors": [
          {
            "id": "sr:competitor:3648",
            "name": "Detroit Tigers",
            "country": "USA",
            "country_code": "USA",
            "abbreviation": "DET",
            "qualifier": "home",
            "rotation_number": 954
          },
          {
            "id": "sr:competitor:5930",
            "name": "Washington Nationals",
            "country": "USA",
            "country_code": "USA",
            "abbreviation": "WSH",
            "qualifier": "away",
            "rotation_number": 953
          }
        ]
      }
    },
    {
      "sport_event": {
        "id": "sr:sport_event:63301261",
        "start_time": "2026-09-22T01:45:00+00:00",
        "start_time_confirmed": true,
        "status": "not_started",
        "competitors": [
          {
            "id": "sr:competitor:3634",
            "name": "San Francisco Giants",
            "country": "USA",
            "country_code": "USA",
            "abbreviation": "SF",
            "qualifier": "home",
            "rotation_number": 956
          },
          {
            "id": "sr:competitor:3649",
            "name": "Minnesota Twins",
            "country": "USA",
            "country_code": "USA",
            "abbreviation": "MIN",
            "qualifier": "away",
            "rotation_number": 955
          }
        ]
      }
    }
  ]
}

Status values are sport-specific during play: baseball moves through 1st_inning to 9th_inning, football through 1st_quarter onward, with pause between periods, start_delayed before a late first pitch, and ended at the final, or aet when the game needed extra innings or overtime. not_started, ended, and aet are shared across sports. Poll this feed every few minutes on game days and open a board for each event whose status leaves not_started.


2. Read the Board Before the Start

Sport Event Markets answers before the game begins: the live markets already exist, but each book carries removed: true until play starts, so the prices shown are opening figures rather than a live line. Twenty minutes before first pitch, this game carried three markets priced by one book; the response is trimmed to the winner market:

GET https://api.sportradar.com/oddscomparison-liveodds/trial/v2/en/sport_events/sr:sport_event:63302807/sport_event_markets.json
x-api-key: YOUR_API_KEY
{
  "generated_at": "2026-09-21T22:19:50+00:00",
  "sport_event": {
    "id": "sr:sport_event:63302807",
    "start_time": "2026-09-21T22:40:00+00:00",
    "start_time_confirmed": true,
    "status": "not_started",
    "competitors": [
      {
        "id": "sr:competitor:3648",
        "name": "Detroit Tigers",
        "country": "USA",
        "country_code": "USA",
        "abbreviation": "DET",
        "qualifier": "home",
        "rotation_number": 954
      },
      {
        "id": "sr:competitor:5930",
        "name": "Washington Nationals",
        "country": "USA",
        "country_code": "USA",
        "abbreviation": "WSH",
        "qualifier": "away",
        "rotation_number": 953
      }
    ]
  },
  "markets": [
    {
      "id": "sr:market:251",
      "name": "winner (incl. extra innings)",
      "is_live": true,
      "books": [
        {
          "id": "sr:book:32219",
          "name": "WilliamHillNewJersey",
          "removed": true,
          "external_sport_event_id": "f503414f-0b00-41cc-b43d-40ccc5399196",
          "external_market_id": "f9b69104-dc5d-31ff-b11f-88a82c065f59",
          "outcomes": [
            {
              "id": "sr:outcome:4",
              "type": "home",
              "odds_decimal": "1.735",
              "odds_american": "-136",
              "odds_fraction": "147/200",
              "open_odds_decimal": "1.637",
              "open_odds_american": "-157",
              "open_odds_fraction": "637/1000",
              "external_outcome_id": "28e399f5-edf0-385f-8fe4-6738d24a6e77",
              "removed": true
            },
            {
              "id": "sr:outcome:5",
              "type": "away",
              "odds_decimal": "2.160",
              "odds_american": "+116",
              "odds_fraction": "29/25",
              "open_odds_decimal": "2.330",
              "open_odds_american": "+133",
              "open_odds_fraction": "133/100",
              "external_outcome_id": "fafd77c1-b923-34d2-9e9d-6aed24970ee2",
              "removed": true
            }
          ]
        }
      ]
    }
  ]
}

Treat a board whose books are all removed as not yet open, and keep showing the Prematch board until the first live prices arrive.


3. Poll the Board Through Play

Once the game is under way the board fills out. Two minutes into the first inning the same event carried 18 market instances across 6 books, including the winner, handicap, and total markets, innings 1 to 5 markets, and a 1x2 market per inning that shares one market ID with a different name per inning (key on the pair of id and name, as on the Prematch board). Books suspend and reopen around plays, so removed flips per book from poll to poll; here one book is suspended while two others price the market. The response is trimmed to the winner market and three books:

GET https://api.sportradar.com/oddscomparison-liveodds/trial/v2/en/sport_events/sr:sport_event:63302807/sport_event_markets.json
x-api-key: YOUR_API_KEY
{
  "generated_at": "2026-09-21T22:42:07+00:00",
  "sport_event": {
    "id": "sr:sport_event:63302807",
    "start_time": "2026-09-21T22:40:00+00:00",
    "start_time_confirmed": true,
    "status": "1st_inning",
    "competitors": [
      {
        "id": "sr:competitor:3648",
        "name": "Detroit Tigers",
        "country": "USA",
        "country_code": "USA",
        "abbreviation": "DET",
        "qualifier": "home",
        "rotation_number": 954
      },
      {
        "id": "sr:competitor:5930",
        "name": "Washington Nationals",
        "country": "USA",
        "country_code": "USA",
        "abbreviation": "WSH",
        "qualifier": "away",
        "rotation_number": 953
      }
    ]
  },
  "markets": [
    {
      "id": "sr:market:251",
      "name": "winner (incl. extra innings)",
      "is_live": true,
      "books": [
        {
          "id": "sr:book:17324",
          "name": "MGM",
          "removed": true,
          "external_sport_event_id": "19944304",
          "external_market_id": "1558551928",
          "outcomes": [
            {
              "id": "sr:outcome:4",
              "type": "home",
              "odds_decimal": "1.740",
              "odds_american": "-135",
              "odds_fraction": "37/50",
              "open_odds_decimal": "1.740",
              "open_odds_american": "-135",
              "open_odds_fraction": "37/50",
              "external_outcome_id": "2296753650",
              "removed": true
            },
            {
              "id": "sr:outcome:5",
              "type": "away",
              "odds_decimal": "2.150",
              "odds_american": "+115",
              "odds_fraction": "23/20",
              "open_odds_decimal": "2.150",
              "open_odds_american": "+115",
              "open_odds_fraction": "23/20",
              "external_outcome_id": "2296753649",
              "removed": true
            }
          ]
        },
        {
          "id": "sr:book:18149",
          "name": "DraftKings",
          "removed": false,
          "external_sport_event_id": "34700180",
          "external_market_id": "1_86406660",
          "outcomes": [
            {
              "id": "sr:outcome:4",
              "type": "home",
              "odds_decimal": "1.690",
              "odds_american": "-145",
              "odds_fraction": "69/100",
              "open_odds_decimal": "1.690",
              "open_odds_american": "-145",
              "open_odds_fraction": "69/100",
              "external_outcome_id": "0ML86406660_1",
              "removed": false
            },
            {
              "id": "sr:outcome:5",
              "type": "away",
              "odds_decimal": "2.110",
              "odds_american": "+111",
              "odds_fraction": "111/100",
              "open_odds_decimal": "2.110",
              "open_odds_american": "+111",
              "open_odds_fraction": "111/100",
              "external_outcome_id": "0ML86406660_3",
              "removed": false
            }
          ]
        },
        {
          "id": "sr:book:18186",
          "name": "FanDuel",
          "removed": false,
          "external_sport_event_id": "36094854",
          "external_market_id": "42.609722497",
          "outcomes": [
            {
              "id": "sr:outcome:4",
              "type": "home",
              "odds_decimal": "1.769",
              "odds_american": "-130",
              "odds_fraction": "769/1000",
              "open_odds_decimal": "1.769",
              "open_odds_american": "-130",
              "open_odds_fraction": "769/1000",
              "external_outcome_id": "29159",
              "removed": false
            },
            {
              "id": "sr:outcome:5",
              "type": "away",
              "odds_decimal": "2.020",
              "odds_american": "+102",
              "odds_fraction": "51/50",
              "open_odds_decimal": "2.020",
              "open_odds_american": "+102",
              "open_odds_fraction": "51/50",
              "external_outcome_id": "1033687",
              "removed": false
            }
          ]
        }
      ]
    }
  ]
}

Poll each tracked event's board every 30 seconds while its status is in play; bookmaker prices refresh every 15 seconds and the feed's cache TTL is 1 second, so each poll at that cadence returns a current board. Compare each poll against the last one you stored to detect movement, and filter removed books out of a live display while keeping their last prices for reference.


4. Keep the Closing Line from Prematch

The Prematch board does not disappear when the game starts. Its status advances with the game while its prices stay at their pre-match values, so the Prematch Sport Event Markets feed is where the closing line lives once in-play pricing has moved to the Live Odds board. During the ninth inning of the same game, Prematch still served the pre-match winner prices with these books open; the response is trimmed to the winner market and two books:

GET https://api.sportradar.com/oddscomparison-prematch/trial/v2/en/sport_events/sr:sport_event:63302807/sport_event_markets.json
x-api-key: YOUR_API_KEY
{
  "generated_at": "2026-09-22T00:59:20+00:00",
  "sport_event": {
    "id": "sr:sport_event:63302807",
    "start_time": "2026-09-21T22:40:00+00:00",
    "start_time_confirmed": true,
    "status": "9th_inning",
    "competitors": [
      {
        "id": "sr:competitor:3648",
        "name": "Detroit Tigers",
        "country": "USA",
        "country_code": "USA",
        "abbreviation": "DET",
        "qualifier": "home",
        "rotation_number": 954
      },
      {
        "id": "sr:competitor:5930",
        "name": "Washington Nationals",
        "country": "USA",
        "country_code": "USA",
        "abbreviation": "WSH",
        "qualifier": "away",
        "rotation_number": 953
      }
    ]
  },
  "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": "19944304",
          "external_market_id": "1558551928",
          "outcomes": [
            {
              "id": "sr:outcome:4",
              "type": "home",
              "odds_decimal": "1.740",
              "odds_american": "-135",
              "odds_fraction": "37/50",
              "open_odds_decimal": "1.620",
              "open_odds_american": "-161",
              "open_odds_fraction": "8/13",
              "external_outcome_id": "2296753650",
              "removed": false
            },
            {
              "id": "sr:outcome:5",
              "type": "away",
              "odds_decimal": "2.150",
              "odds_american": "+115",
              "odds_fraction": "23/20",
              "open_odds_decimal": "2.350",
              "open_odds_american": "+135",
              "open_odds_fraction": "27/20",
              "external_outcome_id": "2296753649",
              "removed": false
            }
          ]
        },
        {
          "id": "sr:book:18149",
          "name": "DraftKings",
          "removed": false,
          "external_sport_event_id": "34700180",
          "external_market_id": "1_86393483",
          "outcomes": [
            {
              "id": "sr:outcome:4",
              "type": "home",
              "odds_decimal": "1.735",
              "odds_american": "-136",
              "odds_fraction": "147/200",
              "open_odds_decimal": "1.641",
              "open_odds_american": "-156",
              "open_odds_fraction": "641/1000",
              "external_outcome_id": "0ML86393483_1",
              "removed": false
            },
            {
              "id": "sr:outcome:5",
              "type": "away",
              "odds_decimal": "2.130",
              "odds_american": "+113",
              "odds_fraction": "113/100",
              "open_odds_decimal": "2.290",
              "open_odds_american": "+129",
              "open_odds_fraction": "129/100",
              "external_outcome_id": "0ML86393483_3",
              "removed": false
            }
          ]
        }
      ]
    }
  ]
}

Pull the Prematch board once after the game starts and persist it; every later price belongs to the live board. Books that come down on the Prematch side flip to removed: true with their last prices intact, as described on Pulling Prematch Odds.


5. Add Live Player Props

Sport Event Player Props groups live prop markets under each player, in the shape used by the Player Props package, with lines that move as the game unfolds: open_total keeps the opening line while total carries the current one. In the sixth inning this player's total bases line had moved from 1.5 to 2.5; the response is trimmed to one player, one market, and two books:

GET https://api.sportradar.com/oddscomparison-liveodds/trial/v2/en/sport_events/sr:sport_event:63303549/players_props.json
x-api-key: YOUR_API_KEY
{
  "sport_event_players_props": {
    "sport_event": {
      "id": "sr:sport_event:63303549",
      "start_time": "2026-09-21T22:35:00+00:00",
      "status": "6th_inning"
    },
    "players_props": [
      {
        "player": {
          "id": "sr:player:843127",
          "name": "Springer, George",
          "competitor_id": "sr:competitor:3642"
        },
        "markets": [
          {
            "id": "sr:market:926",
            "name": "total bases (incl. extra innings)",
            "is_live": true,
            "books": [
              {
                "id": "sr:book:18149",
                "name": "DraftKings",
                "removed": false,
                "external_sport_event_id": "34700179",
                "external_market_id": "372232455",
                "outcomes": [
                  {
                    "id": "sr:outcome:12",
                    "type": "over",
                    "odds_decimal": "3.750",
                    "odds_american": "+275",
                    "odds_fraction": "11/4",
                    "open_odds_decimal": "2.450",
                    "open_odds_american": "+145",
                    "open_odds_fraction": "29/20",
                    "total": "2.5",
                    "open_total": "1.5",
                    "external_outcome_id": "0QA372232455#2294432610_13L84240Q12129728188Q20",
                    "removed": false
                  },
                  {
                    "id": "sr:outcome:13",
                    "type": "under",
                    "odds_decimal": "1.256",
                    "odds_american": "-391",
                    "odds_fraction": "32/125",
                    "open_odds_decimal": "1.500",
                    "open_odds_american": "-200",
                    "open_odds_fraction": "1/2",
                    "total": "2.5",
                    "open_total": "1.5",
                    "external_outcome_id": "0QA372232455#2294432611_13L84240Q1-995469838Q20",
                    "removed": false
                  }
                ]
              },
              {
                "id": "sr:book:32219",
                "name": "WilliamHillNewJersey",
                "removed": false,
                "external_sport_event_id": "71163065-cf17-49c9-8bff-9f3868e34311",
                "external_market_id": "2f54d9f2-650e-3a86-8422-853528a1c32c",
                "outcomes": [
                  {
                    "id": "sr:outcome:12",
                    "type": "over",
                    "odds_decimal": "3.600",
                    "odds_american": "+260",
                    "odds_fraction": "13/5",
                    "open_odds_decimal": "2.270",
                    "open_odds_american": "+127",
                    "open_odds_fraction": "127/100",
                    "total": "2.5",
                    "open_total": "1.5",
                    "external_outcome_id": "36d14017-505b-3d32-a9c0-86e525113231",
                    "removed": false
                  },
                  {
                    "id": "sr:outcome:13",
                    "type": "under",
                    "odds_decimal": "1.256",
                    "odds_american": "-391",
                    "odds_fraction": "32/125",
                    "open_odds_decimal": "1.588",
                    "open_odds_american": "-170",
                    "open_odds_fraction": "147/250",
                    "total": "2.5",
                    "open_total": "1.5",
                    "external_outcome_id": "9466cb30-a2f9-34ed-8101-68b700b2c7a1",
                    "removed": false
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
}

The props board is large during play (this pull carried 164 live prop markets across 23 players), and the feed's cache TTL is 60 seconds, so poll it once a minute and only for the events whose props you display.


6. Read the Final State

When the game ends, the event's status becomes ended (aet after extra innings), most books on the board are removed, and the last prices reflect the decided result: favorites priced at extremes such as -10000 in the closing minutes. A removed outcome can omit its current odds fields entirely, keeping only its opening values, so read the odds_* fields defensively at this stage. The response is trimmed to the winner market and two books, one of which shows outcomes without current odds:

GET https://api.sportradar.com/oddscomparison-liveodds/trial/v2/en/sport_events/sr:sport_event:63302807/sport_event_markets.json
x-api-key: YOUR_API_KEY
{
  "generated_at": "2026-09-22T01:01:12+00:00",
  "sport_event": {
    "id": "sr:sport_event:63302807",
    "start_time": "2026-09-21T22:40:00+00:00",
    "start_time_confirmed": true,
    "status": "ended",
    "competitors": [
      {
        "id": "sr:competitor:3648",
        "name": "Detroit Tigers",
        "country": "USA",
        "country_code": "USA",
        "abbreviation": "DET",
        "qualifier": "home",
        "rotation_number": 954
      },
      {
        "id": "sr:competitor:5930",
        "name": "Washington Nationals",
        "country": "USA",
        "country_code": "USA",
        "abbreviation": "WSH",
        "qualifier": "away",
        "rotation_number": 953
      }
    ]
  },
  "markets": [
    {
      "id": "sr:market:251",
      "name": "winner (incl. extra innings)",
      "is_live": true,
      "books": [
        {
          "id": "sr:book:18149",
          "name": "DraftKings",
          "removed": true,
          "external_sport_event_id": "34700180",
          "external_market_id": "1_86406660",
          "outcomes": [
            {
              "id": "sr:outcome:4",
              "type": "home",
              "odds_decimal": "1.010",
              "odds_american": "-10000",
              "odds_fraction": "1/100",
              "open_odds_decimal": "1.690",
              "open_odds_american": "-145",
              "open_odds_fraction": "69/100",
              "external_outcome_id": "0ML86406660_1",
              "removed": true
            },
            {
              "id": "sr:outcome:5",
              "type": "away",
              "odds_decimal": "101.000",
              "odds_american": "+10000",
              "odds_fraction": "100/1",
              "open_odds_decimal": "2.110",
              "open_odds_american": "+111",
              "open_odds_fraction": "111/100",
              "external_outcome_id": "0ML86406660_3",
              "removed": true
            }
          ]
        },
        {
          "id": "sr:book:27447",
          "name": "BetRivers",
          "removed": true,
          "external_sport_event_id": "1024787255",
          "external_market_id": "2694431969",
          "outcomes": [
            {
              "id": "sr:outcome:4",
              "type": "home",
              "open_odds_decimal": "1.680",
              "open_odds_american": "-147",
              "open_odds_fraction": "17/25",
              "external_outcome_id": "4344431331",
              "removed": true
            },
            {
              "id": "sr:outcome:5",
              "type": "away",
              "open_odds_decimal": "2.060",
              "open_odds_american": "+106",
              "open_odds_fraction": "53/50",
              "external_outcome_id": "4344431332",
              "removed": true
            }
          ]
        }
      ]
    }
  ]
}

At the final, 66 of the 75 book entries on this board were removed. Stop polling once you see ended or aet; the board stays available after the final for the same two weeks as every other event in the odds feeds (see Fundamentals), so a last pull need not happen the moment the game ends.



Line Movement Through a Game

Storing each board pull from step 3 gives you the movement of every book on every market. The chart below plots the home side of the winner market for three books across the same night's Giants against Twins game: one pull per status change plus one every five minutes while prices were moving.

Line Movement Through a GameHome winner price from 38 board pulls, three books
DraftKingsFanDuelMGM

0%

25%

50%

75%

100%


1

2

3

4

5

6

7

8

9
inning







first live price 1.725 (58.0%)

final 1.010 (99.0%)
first pitch 01:45 UTC
final 04:15 UTC
Home (San Francisco Giants) winner price against Minnesota Twins, shown as the percentage implied by each book's decimal price (100 divided by odds_decimal, so the overround is included). Before first pitch the board carried one suspended book at 2.080 (48.1%); the first live prices arrived 7 minutes in at 1.725 (58.0%), and the home side closed at 1.010 (99.0%). Dotted segments bridge pulls where that book was removed.

The shape is typical of a game that the home side controls early: the books converge within the first two innings, suspensions (removed: true) show as dotted bridges rather than points, and the last prices sit at the extremes described in step 6. To reproduce it, key each stored pull on the pair of market id and name, take the outcome you display, and plot odds_decimal (or its implied percentage) against generated_at.



Common Use Cases

  • In-play odds board: step 1 every few minutes, step 3 every 30 seconds per event in play, rendering per-book columns and graying out removed books
  • Line movement chart: store each poll from step 3 and plot one book's price for a market against time, as in the chart above
  • Closing-line capture: step 4 once per event after it starts, persisted beside the live series
  • Live props ticker: step 5 once a minute for the players your product features, keyed on open_total against total

Did this page help you?