Integration GuidesDocs
Coverage MatrixDocumentationChange LogLog InContact Us
Integration Guides

Tracking Win Probabilities

This integration scenario tracks event win probabilities from the day's schedule through live play to the final result, using the Sport Schedule, Sport Event Probabilities, and Timeline feeds.

This scenario is commonly used to:

  • Show a win-probability figure next to a matchup preview
  • Drive a live win-probability graph during a game
  • Reconstruct a completed game's probability swing for recaps
  • Trigger content when a probability crosses a threshold


Overview

Probabilities are delivered as markets whose outcomes carry percentages summing to 100. A two-outcome sport like baseball uses the 2way market (home_team_winner, away_team_winner); sports where a draw is possible use a 3-way structure. During live coverage, each probability point also carries the score and game state that produced it.

Sport Schedule (day) → Sport Event Probabilities (one event, polled live) → Timeline (the full curve)



Relevant Feeds

FeedPurpose
Sport ScheduleThe day's events with current probabilities inline
Sport Event ProbabilitiesCurrent probabilities and game state for one event
Sport Event Probabilities TimelineEvery probability change for one event
Sport CompetitionsWhich competitions carry live_coverage


Integration Steps


1. Pull the Day's Slate

Sport Schedule returns the day's events under sport_event_probabilities, each already carrying its current markets, so a matchup list with probabilities is a single call. Note the date is UTC.

GET https://api.sportradar.com/probabilities/trial/v1/en/sports/sr:sport:3/schedules/2026-07-21/schedule.json
x-api-key: YOUR_API_KEY

Each entry pairs a sport_event (with full context: competition, season, venue, competitors) with a sport_event_status and its markets. Events without probabilities yet appear with an empty markets list, so filter on markets being present when rendering. Pre-match probabilities typically appear one to two days before an event, once both teams' previous games have completed. An event in play reads status: live and lists its market twice, as described in step 3.


2. Pull One Event's Probabilities

Sport Event Probabilities takes the same sr:sport_event: ID used by the Odds Comparison APIs. This is the complete, untrimmed pre-game response for an MLB game:

GET https://api.sportradar.com/probabilities/trial/v1/en/sport_events/sr:sport_event:63301085/probabilities.json
x-api-key: YOUR_API_KEY
{
  "generated_at": "2026-07-20T16:33:37+00:00",
  "sport_event": {
    "id": "sr:sport_event:63301085",
    "start_time": "2026-07-21T00:05:00+00:00",
    "start_time_confirmed": true,
    "sport_event_context": {
      "sport": {
        "id": "sr:sport:3",
        "name": "Baseball"
      },
      "category": {
        "id": "sr:category:16",
        "name": "USA",
        "country_code": "USA"
      },
      "competition": {
        "id": "sr:competition:109",
        "name": "MLB",
        "gender": "men"
      },
      "season": {
        "id": "sr:season:134469",
        "name": "MLB 2026",
        "start_date": "2026-03-25",
        "end_date": "2026-11-01",
        "year": "2026",
        "competition_id": "sr:competition:109"
      },
      "stage": {
        "order": 1,
        "type": "league",
        "phase": "regular season",
        "start_date": "2026-03-25",
        "end_date": "2026-09-28",
        "year": "2026"
      },
      "round": {
        "number": 1
      },
      "groups": [
        {
          "id": "sr:league:99737",
          "name": "MLB 2026"
        },
        {
          "id": "sr:league:99739",
          "name": "MLB 2026, American League",
          "group_name": "American League"
        },
        {
          "id": "sr:league:99741",
          "name": "MLB 2026, American League Central",
          "group_name": "American League Central"
        },
        {
          "id": "sr:league:99747",
          "name": "MLB 2026, National League",
          "group_name": "National League"
        },
        {
          "id": "sr:league:99749",
          "name": "MLB 2026, National League Central",
          "group_name": "National League Central"
        }
      ]
    },
    "competitors": [
      {
        "id": "sr:competitor:3627",
        "name": "Chicago Cubs",
        "country": "USA",
        "country_code": "USA",
        "abbreviation": "CHC",
        "qualifier": "home"
      },
      {
        "id": "sr:competitor:3648",
        "name": "Detroit Tigers",
        "country": "USA",
        "country_code": "USA",
        "abbreviation": "DET",
        "qualifier": "away"
      }
    ],
    "venue": {
      "id": "sr:venue:8069",
      "name": "Wrigley Field",
      "capacity": 41363,
      "city_name": "Chicago, IL",
      "city_id": "sr:city:1038",
      "country_name": "USA",
      "map_coordinates": "41.9474473, -87.6560538",
      "country_code": "USA",
      "timezone": "America/Chicago"
    }
  },
  "sport_event_status": {
    "status": "not_started",
    "match_status": "not_started",
    "live": true
  },
  "markets": [
    {
      "name": "2way",
      "outcomes": [
        {
          "name": "home_team_winner",
          "probability": 51.1
        },
        {
          "name": "away_team_winner",
          "probability": 48.9
        }
      ],
      "last_updated": "2026-07-20T15:09:48+00:00"
    }
  ]
}
<?xml version="1.0" ?>
<sport_event_probabilities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.sportradar.com/sportsapi/probabilities/v1" generated_at="2026-07-20T16:33:40+00:00" xsi:schemaLocation="http://schemas.sportradar.com/sportsapi/probabilities/v1 https://schemas.sportradar.com/sportsapi/probabilities/v1/schemas/sport_event_probabilities.xsd">
  <sport_event id="sr:sport_event:63301085" start_time="2026-07-21T00:05:00+00:00" start_time_confirmed="true">
    <sport_event_context>
      <sport id="sr:sport:3" name="Baseball"/>
      <category id="sr:category:16" name="USA" country_code="USA"/>
      <competition id="sr:competition:109" name="MLB" gender="men"/>
      <season id="sr:season:134469" name="MLB 2026" start_date="2026-03-25" end_date="2026-11-01" year="2026" competition_id="sr:competition:109"/>
      <stage order="1" type="league" phase="regular season" start_date="2026-03-25" end_date="2026-09-28" year="2026"/>
      <round number="1"/>
      <groups>
        <group id="sr:league:99737" name="MLB 2026"/>
        <group id="sr:league:99739" name="MLB 2026, American League" group_name="American League"/>
        <group id="sr:league:99741" name="MLB 2026, American League Central" group_name="American League Central"/>
        <group id="sr:league:99747" name="MLB 2026, National League" group_name="National League"/>
        <group id="sr:league:99749" name="MLB 2026, National League Central" group_name="National League Central"/>
      </groups>
    </sport_event_context>
    <competitors>
      <competitor id="sr:competitor:3627" name="Chicago Cubs" country="USA" country_code="USA" abbreviation="CHC" qualifier="home"/>
      <competitor id="sr:competitor:3648" name="Detroit Tigers" country="USA" country_code="USA" abbreviation="DET" qualifier="away"/>
    </competitors>
    <venue id="sr:venue:8069" name="Wrigley Field" capacity="41363" city_name="Chicago, IL" city_id="sr:city:1038" country_name="USA" map_coordinates="41.9474473, -87.6560538" country_code="USA" timezone="America/Chicago"/>
  </sport_event>
  <sport_event_status status="not_started" match_status="not_started" live="true"/>
  <markets>
    <market name="2way" last_updated="2026-07-20T15:09:48+00:00">
      <outcomes>
        <outcome name="home_team_winner" probability="51.1"/>
        <outcome name="away_team_winner" probability="48.9"/>
      </outcomes>
    </market>
  </markets>
</sport_event_probabilities>

Reading it:

  • The 2way market's outcomes carry the percentages (here 51.1 home against 48.9 away)
  • last_updated stamps the probability calculation; once the event is in play, the live entry adds home_score and away_score
  • sport_event_status.status is not_started pre-game; sport_event.sport_event_context carries the season and competition for joining to the seasonal feeds

3. Poll Through Live Play

For events covered live (every event of a competition flagged live_coverage: true, and any other event whose sport_event_status.live is true), probabilities recalculate through play. Poll this feed during the game: status reads live, match_status names the period (5th_inning_top or break_top5_bottom4 in baseball; other sports use their own values, such as 1st_half, halftime, 1st_quarter, or 2nd_period), and the payload adds live game state (for baseball: balls, strikes, outs, bases, and scores). A CPBL game in the top of the fifth inning, trimmed to the status and markets:

GET https://api.sportradar.com/probabilities/trial/v1/en/sport_events/sr:sport_event:74713422/probabilities.json
x-api-key: YOUR_API_KEY
{
  "generated_at": "2026-10-02T11:41:53+00:00",
  "sport_event_status": {
    "status": "live",
    "match_status": "5th_inning_top",
    "away_score": 0,
    "balls": 0,
    "bases": "0,0,0",
    "home_score": 1,
    "live": true,
    "outs": 1,
    "strikes": 0
  },
  "markets": [
    {
      "name": "2way",
      "outcomes": [
        {
          "name": "home_team_winner",
          "probability": 50.7
        },
        {
          "name": "away_team_winner",
          "probability": 49.3
        }
      ],
      "last_updated": "2026-10-02T09:24:07+00:00"
    },
    {
      "name": "2way",
      "outcomes": [
        {
          "name": "home_team_winner",
          "probability": 67.5
        },
        {
          "name": "away_team_winner",
          "probability": 32.5
        }
      ],
      "live": true,
      "last_updated": "2026-10-02T11:41:29+00:00",
      "home_score": 1,
      "away_score": 0
    }
  ]
}

Reading it:

  • The market is now listed twice: the first entry is the pre-match figure, held at its last pre-match value, and the second, flagged live: true, is the in-play probability with the score it was calculated at; display the live entry while the event is in play
  • The live entry's last_updated trails generated_at (here by 24 seconds): probabilities are delivered on a 15-second delay, and the gap widens during breaks in play, when nothing is recalculated
  • A stoppage shows as match_status: interrupted with status still live, and extra innings as extra_inning_top and extra_inning_bottom

When the game ends, status reads ended (match_status reads ended too, or aet after overtime), and within a few minutes both market entries show the result; read the result once the two entries agree. The pre-match figure no longer appears in this feed after that, so store it during play or read it from the Timeline in step 4.

Match the polling cadence to your display; the feed's cache TTL is 1 second, so near-real-time polling is supported where your rate limits allow it. Cadence guidance for every feed is on Update Frequencies.


4. Reconstruct the Curve with the Timeline

The Timeline returns every probability point for the event. Pre-match revisions come first, as points without a live flag or scores, so the list is populated before play begins; once the event is live, each recalculation adds a point flagged live: true with the score at that moment. After the final, the full curve is there; this completed game returned 1,003 points (5 pre-match and 998 in play), trimmed here to five that tell the story: the first and last pre-match figures, the home side's peak at 80.4 percent with the score tied 1 to 1, its drop to 24.3 percent when the visitors went ahead 2 to 1, and the closing 0 percent after a loss in extra innings:

GET https://api.sportradar.com/probabilities/trial/v1/en/sport_events/sr:sport_event:74713422/timeline.json
x-api-key: YOUR_API_KEY
{
  "generated_at": "2026-10-02T14:38:37+00:00",
  "sport_event_status": {
    "status": "ended",
    "match_status": "ended",
    "away_score": 2,
    "balls": 0,
    "bases": "0,0,0",
    "home_score": 1,
    "live": true,
    "outs": 0,
    "strikes": 0
  },
  "timeline": [
    {
      "name": "2way",
      "outcomes": [
        {
          "name": "home_team_winner",
          "probability": 49.2
        },
        {
          "name": "away_team_winner",
          "probability": 50.8
        }
      ],
      "last_updated": "2026-10-01T16:17:32+00:00"
    },
    {
      "name": "2way",
      "outcomes": [
        {
          "name": "home_team_winner",
          "probability": 50.7
        },
        {
          "name": "away_team_winner",
          "probability": 49.3
        }
      ],
      "last_updated": "2026-10-02T09:24:07+00:00"
    },
    {
      "name": "2way",
      "outcomes": [
        {
          "name": "home_team_winner",
          "probability": 80.4
        },
        {
          "name": "away_team_winner",
          "probability": 19.6
        }
      ],
      "live": true,
      "last_updated": "2026-10-02T13:51:57+00:00",
      "home_score": 1,
      "away_score": 1
    },
    {
      "name": "2way",
      "outcomes": [
        {
          "name": "home_team_winner",
          "probability": 24.3
        },
        {
          "name": "away_team_winner",
          "probability": 75.7
        }
      ],
      "live": true,
      "last_updated": "2026-10-02T13:52:44+00:00",
      "home_score": 1,
      "away_score": 2
    },
    {
      "name": "2way",
      "outcomes": [
        {
          "name": "home_team_winner",
          "probability": 0
        },
        {
          "name": "away_team_winner",
          "probability": 100
        }
      ],
      "live": true,
      "last_updated": "2026-10-02T14:19:36+00:00",
      "home_score": 1,
      "away_score": 2
    }
  ]
}

Each in-play point carries the score alongside the probabilities, so a win-probability chart annotated with scoring plays comes straight from this one feed, and the last point without a live flag is the closing pre-match figure. The final point of a decided game puts 100 on the outcome that occurred. This is the game's in-play curve, plotted from the same feed:

Home Win Probability: Dragons at Guardians, 2026-10-02Every in-play point from the Timeline feed
play interrupted
0%25%50%75%100%





50.7% at first pitch

70.0%, leading 1-0

80.4%, tied 1-1

0%: final 1-2
first pitch 10:36 UTC
final out 14:19 UTC
997 in-play points from sr:sport_event:74713422, downsampled for rendering; the 5 pre-match points sit before first pitch and are not drawn. Probabilities shown are home_team_winner.


Common Use Cases

  • Pre-game probability widget: step 1 daily, step 2 near game time
  • Live probability graph: step 3 during play, step 4 at the end to backfill the exact curve
  • Upset detection: alert when the live entry crosses your threshold against the pre-match entry; both ride in the same payload during play

Did this page help you?