Integration GuidesReference Docs
Coverage MatrixDocumentationChange LogLog InContact Us
Integration Guides

Tracking Live Games

Game data feeds update in real time as games are played, with the depth of live coverage declared per game. This scenario follows one NCAAFB game from finding it on the schedule to its validated final: which feed to poll at each status, what each payload contributes, and how to pick up the corrections that land after a game closes.

This scenario is commonly used to:

  • Drive a live gamecast with score, clock, down-and-distance, and the last play
  • Stream drive-by-drive and play-by-play detail for game flow, player performance, and tactical analysis
  • Show live team and player box statistics and game leaders
  • Break down the key plays that decided a game for a broadcast or an article
  • Capture the validated final for permanent storage


Relevant Feeds

FeedScopeUse
Current Week ScheduleThe week in progressFinding the games to track without naming the season year or type
Current Season Schedule, Season Schedule, Weekly ScheduleA season, or one week of itAlternative routes to a game ID; the same game shape
Game BoxscoreOne gameScore, clock, situation, last event, and complete play-by-play detail for every scoring drive
Game Play-by-PlayOne gameThe full drive and play tree with situations, per-play statistics, and details
Game StatisticsOne gameTeam and player box statistics

Real-time push delivery of the same play and statistics data is available through the Push Events and Push Statistics feeds; step 6 covers how they fit alongside the REST feeds, and the Push Feeds page covers the connection workflow.



High-Level Workflow

Live Game WorkflowFind the game, poll it through its lifecycle, wind down at closed
FindCurrent Week Schedulegame ID, kickoff time, coverage level
Pregamescheduledcreateda day before kickoff; poll from 10 minutes out
In playGame Boxscorescore, clock, situation, last_event, scoring plays
Play detailGame Play-by-PlayGame Statisticsdrives, per-play statistics, box stats
PushPush EventsPush Statisticsone connection: all live games, or one match
Wind downcompleteclosedfinal pull once closed; corrections via the change log
Dashed pills = optional depth. Cadences come from Update Frequencies.


Integration Steps


1. Find the game and watch for created

To avoid confusion and ensure you're accessing available data, refer to our Seasons feed. This resource lists all the seasons for which we have data.

For example: To ensure data availability for future seasons, such as a schedule in advance of when a season begins, first check the Seasons feed to verify that data for that specific season is already provided.

Starting with this feed can prevent unnecessary errors and streamline your data retrieval process.

Find the game ID with any of the schedule feeds:

The current_week and current_season paths return the schedule for the ongoing week or season without naming the season's year and type (such as regular season or playoffs) in the request, which suits applications that fetch the current game week automatically as the season progresses. The Current Week Schedule and Current Season Schedule feeds also verify which week or season type is in progress when you are unsure. Use the schedule feeds for non-live schedule retrieval only. The Current Week Schedule request:

GET https://api.sportradar.com/ncaafb/trial/v7/en/games/current_week/schedule.json
x-api-key: YOUR_API_KEY

Each schedule entry carries what this scenario needs: the game id, its status, the scheduled kickoff time, and two fields that shape live polling. coverage declares the live depth: full games carry live play-by-play for the entire game, while extended_boxscore games update the Boxscore with scores and time remaining as the game progresses and fill Game Statistics after the game, so read the flag before wiring play-by-play polling (the Game Status Workflow page defines the levels and which feeds each one populates). expected_latency reports how many seconds a game feed may lag live play. One entry from the Weekly Schedule, a full-coverage game with an expected_latency of 25 seconds (Louisville 28, James Madison 14), shown trimmed to the game header, the teams, and the final score; the Season and Current feeds share the same game shape:

{
  "id": "754e4990-efc7-11ef-bb2a-5d2d22b9215e",
  "year": 2025,
  "type": "REG",
  "name": "REG",
  "week": {
    "id": "73eacecf-7726-4de3-9419-3b821e998a83",
    "sequence": 2,
    "title": "2",
    "games": [
      {
        "id": "fefcd061-2c97-4356-bf87-d11b398148fc",
        "status": "closed",
        "scheduled": "2025-09-05T23:00:00+00:00",
        "attendance": 48717,
        "entry_mode": "LDE",
        "coverage": "full",
        "sr_id": "sr:match:59838584",
        "game_type": "regular",
        "conference_game": false,
        "duration": "3:33",
        "expected_latency": 25,
        "home": {
          "id": "1e8edb90-ea5e-4663-9a65-a30e51583711",
          "name": "Louisville Cardinals",
          "alias": "LOU",
          "game_number": 2
        },
        "away": {
          "id": "b59ad9ae-b8ec-4f8e-9bd2-ec5b4af41e57",
          "name": "James Madison Dukes",
          "alias": "JMU",
          "game_number": 2
        },
        "scoring": {
          "home_points": 28,
          "away_points": 14
        }
      }
    ]
  }
}
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" charset="UTF-8" href="/xslt/football/schedule-v7.0.xsl"?>
<!-- Generation started @ 2026-09-01 09:10:09 +0000 -->
<season xmlns="http://feed.elasticstats.com/schema/football/schedule-v7.0.xsd" id="754e4990-efc7-11ef-bb2a-5d2d22b9215e" year="2025" type="REG" name="REG">
  <week id="73eacecf-7726-4de3-9419-3b821e998a83" sequence="2" title="2">
    <game id="fefcd061-2c97-4356-bf87-d11b398148fc" status="closed" scheduled="2025-09-05T23:00:00+00:00" attendance="48717" entry_mode="LDE" coverage="full" sr_id="sr:match:59838584" game_type="regular" conference_game="false" duration="3:33" expected_latency="25">
      <home id="1e8edb90-ea5e-4663-9a65-a30e51583711" name="Louisville Cardinals" alias="LOU" game_number="2"/>
      <away id="b59ad9ae-b8ec-4f8e-9bd2-ec5b4af41e57" name="James Madison Dukes" alias="JMU" game_number="2"/>
      <scoring home_points="28" away_points="14">
        <!-- ... omitted for brevity -->
      </scoring>
      <!-- ... omitted for brevity -->
    </game>
    <!-- ... omitted for brevity -->
    <!-- ... omitted for brevity -->
  </week>
</season>
<!-- Generation ended @ 2026-09-01 09:10:09 +0000 -->
⏱️

Monitor Expected Latency

Use the expected_latency field to understand how many seconds a game feed may lag behind live play. This data point is present in all NCAAFB game and push feeds.

Values can be 2, 10, 25, or 50 seconds and are published the day before gameday (though they may adjust on gameday itself). Tracking this helps you plan for real-time updates and set accurate user expectations.

For more details on feed timings and data updates, see the Update Frequencies page.

Call the schedule feeds once or twice a day at most; scheduling changes surface in the Daily Change Log (step 7). The schedule feeds carry game status too, including inprogress, complete, and closed, but they update on a timer rather than with the game feeds, so read live status from the Game Boxscore or Game Play-by-Play, which carry the most current status changes during games.

In the day before kickoff the game moves from scheduled to created as rosters, officials, and game data preload (a Tuesday game moves on Monday, and a week that opens on Friday moves on Thursday evening). Start requests to the live game feeds no earlier than 10 minutes before the scheduled time.

🏈

Game Status Workflows

For more on what feeds look like throughout the duration of a game, see the Game Status Workflow page.

📆

When are schedules available?

Schedules and game times are typically released in the spring, around the month of April.


2. Poll the Boxscore while in play

The Game Boxscore is the one-call live view: status, quarter, and clock in the header, both teams' points, timeouts, and challenges under summary, quarter-by-quarter scoring, the current situation (down, distance, possession, and ball location), the last_event, and, for every scoring drive, complete play-by-play detail under scoring_drives and scoring_plays. The Play-by-Play and Push Events feeds carry scoring data too, but the Boxscore holds the most detailed scoring information for each team, so it is the feed to poll when scoring is the main interest.

Request it from scheduled no sooner than 10 minutes before kickoff, then poll as needed once the game is inprogress; the feed updates in real time on a 3-second cache TTL while a game is in progress. The CFP National Championship (Indiana 27, Miami (FL) 21) after closed, reduced to the game header, the two team blocks under summary, and the quarter-by-quarter scoring; a live pull carries situation, last_event, and the scoring arrays around them, and weather, coin_toss, time_zones, and broadcast are omitted here. The header repeats the schedule's coverage (full) and expected_latency (25 seconds) and adds the 3:28 duration; summary shows each side with 3 timeouts used and 1 challenge remaining; and scoring adds up to the final, 3-0, 7-0, 7-7, and 10-14 by quarter:

GET https://api.sportradar.com/ncaafb/trial/v7/en/games/ac60aab5-2638-45de-87f0-037e3f199282/boxscore.json
x-api-key: YOUR_API_KEY
{
  "id": "ac60aab5-2638-45de-87f0-037e3f199282",
  "status": "closed",
  "scheduled": "2026-01-20T00:30:00+00:00",
  "attendance": 67227,
  "entry_mode": "LDE",
  "clock": "00:00",
  "quarter": 4,
  "coverage": "full",
  "playoff_game_type": "CFP National Championship",
  "sr_id": "sr:match:67621710",
  "neutral_site": true,
  "game_type": "playoff",
  "conference_game": false,
  "title": "CFP National Championship",
  "duration": "3:28",
  "parent_id": "d679c1cd-c879-4d1b-8de0-d88ec1916569",
  "expected_latency": 25,
  "summary": {
    "home": {
      "id": "fa0eb091-8e35-49c7-b00f-269794a99a61",
      "name": "Hoosiers",
      "market": "Indiana",
      "alias": "IND",
      "used_timeouts": 3,
      "remaining_timeouts": 0,
      "points": 27,
      "used_challenges": 0,
      "remaining_challenges": 1
    },
    "away": {
      "id": "2f475a40-df87-43a7-b8a9-c36a43edff21",
      "name": "Hurricanes",
      "market": "Miami (FL)",
      "alias": "MIA",
      "used_timeouts": 3,
      "remaining_timeouts": 0,
      "points": 21,
      "used_challenges": 0,
      "remaining_challenges": 1
    }
  },
  "scoring": [
    {
      "period_type": "quarter",
      "id": "396cf033-180c-48c2-9205-aad2524f26ae",
      "number": 1,
      "sequence": 1,
      "home_points": 3,
      "away_points": 0
    },
    {
      "period_type": "quarter",
      "id": "e19777ca-d283-460a-81b0-d493e7519a11",
      "number": 2,
      "sequence": 2,
      "home_points": 7,
      "away_points": 0
    },
    {
      "period_type": "quarter",
      "id": "9142c516-deb4-4264-be00-7f6412b0c0db",
      "number": 3,
      "sequence": 3,
      "home_points": 7,
      "away_points": 7
    },
    {
      "period_type": "quarter",
      "id": "565a4634-c6fd-4cab-8bfc-94ca1fdffe4b",
      "number": 4,
      "sequence": 4,
      "home_points": 10,
      "away_points": 14
    }
  ]
}
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" charset="UTF-8" href="/xslt/football/boxscore-v7.0.xsl"?>
<!-- Generation started @ 2026-01-28 23:22:45 +0000 -->
<game xmlns="http://feed.elasticstats.com/schema/football/boxscore-v7.0.xsd" id="ac60aab5-2638-45de-87f0-037e3f199282" status="closed" scheduled="2026-01-20T00:30:00+00:00" attendance="67227" entry_mode="LDE" clock="00:00" quarter="4" coverage="full" playoff_game_type="CFP National Championship" sr_id="sr:match:67621710" neutral_site="true" game_type="playoff" conference_game="false" title="CFP National Championship" duration="3:28" parent_id="d679c1cd-c879-4d1b-8de0-d88ec1916569" expected_latency="25">
  <summary>
    <home id="fa0eb091-8e35-49c7-b00f-269794a99a61" name="Hoosiers" market="Indiana" alias="IND" used_timeouts="3" remaining_timeouts="0" points="27" used_challenges="0" remaining_challenges="1">
      <!-- ... omitted for brevity -->
    </home>
    <away id="2f475a40-df87-43a7-b8a9-c36a43edff21" name="Hurricanes" market="Miami (FL)" alias="MIA" used_timeouts="3" remaining_timeouts="0" points="21" used_challenges="0" remaining_challenges="1">
      <!-- ... omitted for brevity -->
    </away>
    <!-- ... omitted for brevity -->
  </summary>
  <scoring>
    <quarter id="396cf033-180c-48c2-9205-aad2524f26ae" number="1" sequence="1" home_points="3" away_points="0"/>
    <quarter id="e19777ca-d283-460a-81b0-d493e7519a11" number="2" sequence="2" home_points="7" away_points="0"/>
    <quarter id="9142c516-deb4-4264-be00-7f6412b0c0db" number="3" sequence="3" home_points="7" away_points="7"/>
    <quarter id="565a4634-c6fd-4cab-8bfc-94ca1fdffe4b" number="4" sequence="4" home_points="10" away_points="14"/>
  </scoring>
  <!-- ... omitted for brevity -->
</game>
<!-- Generation ended @ 2026-01-28 23:22:46 +0000 -->

The quarter-by-quarter scoring array renders as a line score; the card below shows the shape with the game still scoreless:

CFP CHAMPIONSHIP · SCORINGquarter scoring
INDHoosiers0
MIAHurricanes0
Quarter-by-quarter scoring rides the game feeds; the boxscore adds scoring plays and drives.

3. Read scoring plays and drives

scoring_plays lists every scoring play with its situations, a score object, and the play's statistics and details; scoring_drives groups the same points by drive, each with its start and end reasons, play count, duration, and yardage plus the plays that made it up. Two consecutive entries from the same Boxscore response: Riley Nowakowski's 1-yard touchdown run at 6:17 of the second quarter, which finished the 14-play drive shown in step 4, and the extra point that followed. The touchdown keeps its situations, flags, score object, and rushing statistic; the extra point is reduced to its headline fields; the details arrays and the touchdown's team-level conversion statistic are omitted:

GET https://api.sportradar.com/ncaafb/trial/v7/en/games/ac60aab5-2638-45de-87f0-037e3f199282/boxscore.json
x-api-key: YOUR_API_KEY
{
  "id": "ac60aab5-2638-45de-87f0-037e3f199282",
  "status": "closed",
  "clock": "00:00",
  "quarter": 4,
  "scoring_plays": [
    {
      "type": "play",
      "id": "2748eb50-f5a3-11f0-b0dd-bd428802ffaf",
      "sequence": 1768874392029.0,
      "clock": "6:17",
      "home_points": 9,
      "away_points": 0,
      "play_type": "rush",
      "scoring_play": true,
      "goaltogo": true,
      "wall_clock": "2026-01-20T01:59:06+00:00",
      "description": "R.Nowakowski rushed for 1 yards. TOUCHDOWN.",
      "scoring_description": "R.Nowakowski rushed for 1 yards. TOUCHDOWN.",
      "fake_punt": false,
      "fake_field_goal": false,
      "screen_pass": false,
      "play_action": false,
      "run_pass_option": false,
      "created_at": "2026-01-20T01:59:52+00:00",
      "updated_at": "2026-01-28T22:42:47+00:00",
      "official": true,
      "start_situation": {
        "clock": "6:17",
        "down": 3,
        "yfd": 1,
        "possession": {
          "id": "fa0eb091-8e35-49c7-b00f-269794a99a61",
          "name": "Hoosiers",
          "market": "Indiana",
          "alias": "IND"
        },
        "location": {
          "id": "2f475a40-df87-43a7-b8a9-c36a43edff21",
          "name": "Hurricanes",
          "market": "Miami (FL)",
          "alias": "MIA",
          "yardline": 1
        }
      },
      "end_situation": {
        "clock": "6:13",
        "down": 0,
        "yfd": 0,
        "possession": {
          "id": "fa0eb091-8e35-49c7-b00f-269794a99a61",
          "name": "Hoosiers",
          "market": "Indiana",
          "alias": "IND"
        },
        "location": {
          "id": "2f475a40-df87-43a7-b8a9-c36a43edff21",
          "name": "Hurricanes",
          "market": "Miami (FL)",
          "alias": "MIA",
          "yardline": 3
        }
      },
      "score": {
        "sequence": 3,
        "clock": "6:13",
        "points": 7,
        "home_points": 10,
        "away_points": 0,
        "points-after-play": {
          "id": "b5d3db00-f5a3-11f0-b0dd-bd428802ffaf",
          "sequence": 1768874395094.0,
          "type": "extra_point"
        }
      },
      "statistics": [
        {
          "stat_type": "rush",
          "attempt": 1,
          "yards": 1,
          "touchdown": 1,
          "firstdown": 0,
          "inside_20": 1,
          "goaltogo": 0,
          "player": {
            "id": "57ea8923-b9d4-497e-95f2-44516539dbbc",
            "name": "Riley Nowakowski",
            "jersey": "37",
            "position": "TE"
          },
          "team": {
            "id": "fa0eb091-8e35-49c7-b00f-269794a99a61",
            "name": "Hoosiers",
            "market": "Indiana",
            "alias": "IND"
          }
        }
      ],
      "quarter": {
        "id": "e19777ca-d283-460a-81b0-d493e7519a11",
        "number": 2,
        "sequence": 2
      }
    },
    {
      "type": "play",
      "id": "b5d3db00-f5a3-11f0-b0dd-bd428802ffaf",
      "sequence": 1768874395094.0,
      "clock": "6:13",
      "home_points": 10,
      "away_points": 0,
      "play_type": "extra_point",
      "scoring_play": true,
      "wall_clock": "2026-01-20T01:59:53+00:00",
      "description": "N.Radicic extra point is good.",
      "scoring_description": "R.Nowakowski rushed for 1 yards. TOUCHDOWN.",
      "fake_punt": false,
      "fake_field_goal": false,
      "screen_pass": false,
      "play_action": false,
      "run_pass_option": false,
      "created_at": "2026-01-20T01:59:55+00:00",
      "updated_at": "2026-01-20T01:59:55+00:00",
      "official": true,
      "quarter": {
        "id": "e19777ca-d283-460a-81b0-d493e7519a11",
        "number": 2,
        "sequence": 2
      }
    }
  ]
}

The touchdown comes on third and goal from the MIA 1 (goaltogo: true): the play-level home_points reads 9 at the moment of the score, and its score object credits 7 points and a 10-0 lead once the point-after resolved, referencing the extra point under points-after-play. That extra point is the second entry, N.Radicic's kick at 6:13, its own extra_point play with scoring_play: true and the touchdown's text carried in scoring_description. Read the score object rather than assuming a fixed value per touchdown. The statistics credit Nowakowski (a tight end, jersey 37) with the rush attempt, touchdown: 1, and inside_20: 1; the end_situation places the ball at the MIA 3 for the try; and the play's updated_at stamp of January 28, eight days after the game, shows that scoring entries can be revised after closed (step 7). Every entry carries the clock, the points for both teams, and a description of the action on the field.


4. Add Play-by-Play depth

The Game Play-by-Play feed is the live play-by-play timeline: possession and ball location, plus every team and player statistic earned on each play. It is the source for game flow, player performance, and tactical analysis in real time.

Request it from scheduled no sooner than 10 minutes before kickoff and poll as needed once the game is inprogress; it updates in real time on the same 3-second in-progress cache TTL as the Boxscore. The feed nests periods[] > pbp[], where each item is a drive (with events[] of plays) or a standalone event such as a TV timeout. Each drive carries its start and end reasons, play count, duration, first downs, yardage, penalty yards, the inside_20 and scoring_drive flags, created_at and updated_at stamps, and its start and end clocks and yard lines. Overtime is untimed in college football, so overtime drives and plays carry 00:00 clocks. The drive's events[] holds its plays, each with a start_situation and end_situation, per-play statistics attributions, and details that break the play into its parts. A statistic or role credited to the team rather than to an individual carries a placeholder player with id team and name (Team), as on team rushes, passes, or tackles; skip those rows when building player totals. Because every play carries its own statistics, per-quarter and per-half player totals are built here by summing the plays within a period, while Game Statistics carries whole-game totals. The second-quarter drive that produced the touchdown in step 3, reduced to its first three plays: the first keeps both situations, two of its statistics, and the first of its details; the other two keep their headline fields and end situations; possession and location are reduced to the alias and yard line throughout:

GET https://api.sportradar.com/ncaafb/trial/v7/en/games/ac60aab5-2638-45de-87f0-037e3f199282/pbp.json
x-api-key: YOUR_API_KEY
{
  "id": "ac60aab5-2638-45de-87f0-037e3f199282",
  "status": "closed",
  "clock": "00:00",
  "quarter": 4,
  "coverage": "full",
  "title": "CFP National Championship",
  "expected_latency": 25,
  "periods": [
    {
      "period_type": "quarter",
      "id": "e19777ca-d283-460a-81b0-d493e7519a11",
      "number": 2,
      "sequence": 2,
      "pbp": [
        {
          "type": "drive",
          "id": "f3fac0f2-8a02-4473-a079-1f5077e23776",
          "sequence": 8,
          "start_reason": "Punt",
          "end_reason": "Touchdown",
          "play_count": 14,
          "duration": "6:44",
          "first_downs": 5,
          "gain": 69,
          "penalty_yards": 16,
          "inside_20": true,
          "scoring_drive": true,
          "created_at": "2026-01-20T01:41:27+00:00",
          "updated_at": "2026-01-20T04:51:21+00:00",
          "team_sequence": 4,
          "start_clock": "12:57",
          "end_clock": "6:13",
          "first_drive_yardline": 85,
          "last_drive_yardline": 1,
          "farthest_drive_yardline": 1,
          "net_yards": 85,
          "pat_successful": true,
          "pat_points_attempted": 1,
          "events": [
            {
              "type": "play",
              "id": "e2428c70-f5a0-11f0-b0dd-bd428802ffaf",
              "sequence": 1768873287765.0,
              "clock": "12:57",
              "home_points": 3,
              "away_points": 0,
              "play_type": "pass",
              "wall_clock": "2026-01-20T01:41:10+00:00",
              "description": "F.Mendoza pass complete. Catch made by E.Sarratt for 12 yards. Pushed out of bounds by O.Frederique at IND 27.",
              "fake_punt": false,
              "fake_field_goal": false,
              "screen_pass": false,
              "play_action": false,
              "run_pass_option": false,
              "created_at": "2026-01-20T01:41:27+00:00",
              "updated_at": "2026-01-20T01:43:35+00:00",
              "official": true,
              "start_situation": {
                "clock": "12:57",
                "down": 1,
                "yfd": 10,
                "possession": {
                  "alias": "IND"
                },
                "location": {
                  "alias": "IND",
                  "yardline": 15
                }
              },
              "end_situation": {
                "clock": "12:30",
                "down": 1,
                "yfd": 10,
                "possession": {
                  "alias": "IND"
                },
                "location": {
                  "alias": "IND",
                  "yardline": 27
                }
              },
              "statistics": [
                {
                  "stat_type": "pass",
                  "attempt": 1,
                  "complete": 1,
                  "yards": 12,
                  "att_yards": 0,
                  "firstdown": 1,
                  "inside_20": 0,
                  "goaltogo": 0,
                  "player": {
                    "id": "e41043f0-8946-11ec-b2b8-adecafc94fa4",
                    "name": "Fernando Mendoza",
                    "jersey": "15",
                    "position": "QB"
                  },
                  "team": {
                    "id": "fa0eb091-8e35-49c7-b00f-269794a99a61",
                    "alias": "IND"
                  }
                },
                {
                  "stat_type": "receive",
                  "firstdown": 1,
                  "target": 1,
                  "reception": 1,
                  "yards": 12,
                  "yards_after_catch": 12,
                  "inside_20": 0,
                  "goaltogo": 0,
                  "player": {
                    "id": "5f21bf90-0c8e-11ed-8189-d1adc266b955",
                    "name": "Elijah Sarratt",
                    "jersey": "13",
                    "position": "WR"
                  },
                  "team": {
                    "id": "fa0eb091-8e35-49c7-b00f-269794a99a61",
                    "alias": "IND"
                  }
                }
              ],
              "details": [
                {
                  "category": "pass_completion",
                  "description": "F.Mendoza pass complete.",
                  "sequence": 0,
                  "yards": 12,
                  "start_location": {
                    "alias": "IND",
                    "yardline": 15
                  },
                  "end_location": {
                    "alias": "IND",
                    "yardline": 15
                  },
                  "players": [
                    {
                      "id": "e41043f0-8946-11ec-b2b8-adecafc94fa4",
                      "name": "Fernando Mendoza",
                      "jersey": "15",
                      "position": "QB",
                      "role": "pass"
                    }
                  ]
                }
              ]
            },
            {
              "type": "play",
              "id": "23ef4af0-f5a1-11f0-b0dd-bd428802ffaf",
              "sequence": 1768873308740.0,
              "clock": "12:30",
              "home_points": 3,
              "away_points": 0,
              "play_type": "pass",
              "wall_clock": "2026-01-20T01:41:39+00:00",
              "description": "F.Mendoza steps back to pass. Pass incomplete intended for E.Sarratt.",
              "fake_punt": false,
              "fake_field_goal": false,
              "screen_pass": false,
              "play_action": false,
              "run_pass_option": false,
              "created_at": "2026-01-20T01:41:48+00:00",
              "updated_at": "2026-01-20T01:41:49+00:00",
              "official": true,
              "end_situation": {
                "clock": "12:24",
                "down": 2,
                "yfd": 10,
                "possession": {
                  "alias": "IND"
                },
                "location": {
                  "alias": "IND",
                  "yardline": 27
                }
              }
            },
            {
              "type": "play",
              "id": "301b7150-f5a1-11f0-b0dd-bd428802ffaf",
              "sequence": 1768873361010.0,
              "clock": "12:24",
              "home_points": 3,
              "away_points": 0,
              "play_type": "pass",
              "wall_clock": "2026-01-20T01:42:19+00:00",
              "description": "F.Mendoza pass complete. Catch made by R.Nowakowski for 8 yards. Pushed out of bounds by E.O'Connor at IND 35.",
              "fake_punt": false,
              "fake_field_goal": false,
              "screen_pass": false,
              "play_action": false,
              "run_pass_option": false,
              "created_at": "2026-01-20T01:42:41+00:00",
              "updated_at": "2026-01-20T01:43:49+00:00",
              "official": true,
              "end_situation": {
                "clock": "11:44",
                "down": 3,
                "yfd": 2,
                "possession": {
                  "alias": "IND"
                },
                "location": {
                  "alias": "IND",
                  "yardline": 35
                }
              }
            }
          ]
        }
      ]
    }
  ]
}

The drive starts after a punt at 12:57 from Indiana's own 15 (a first_drive_yardline of 85, the distance to the goal line) and runs 14 plays and 69 yards over 6:44 to the 1-yard touchdown, with 5 first downs, 16 penalty yards, and a successful point-after (pat_successful). Fernando Mendoza opens it with a 12-yard completion to Elijah Sarratt, pushed out of bounds at the IND 27 for a first down: the play's statistics credit the passer and the receiver (the tackler and the team first down follow in the full payload), and its details split the play into the completion, the reception, the push out of bounds, and the first-down marker. An incompletion intended for Sarratt at 12:30 leaves second and 10 at the 27, then an 8-yard completion to Riley Nowakowski reaches the IND 35 for third and 2. Every play also carries wall_clock, the official flag, and the fake_punt, fake_field_goal, screen_pass, play_action, and run_pass_option flags. A drive log renders straight from these fields: clock, play_type, and description per play, under a header built from the drive's own fields:

DRIVE LOG · CFP CHAMPIONSHIPGame Play-by-Play · one drive
DRIVEPunt start · 14 plays · 69 yds · Touchdown
12:57passF.Mendoza pass complete. Catch made by E.Sarratt for 12 yards. Pushed out of bounds by O.Frederique at IND 27.
12:30passF.Mendoza steps back to pass. Pass incomplete intended for E.Sarratt.
12:24passF.Mendoza pass complete. Catch made by R.Nowakowski for 8 yards. Pushed out of bounds by E.O'Connor at IND 35.
Each play carries situations, per-play statistics, and details under the drive.

Every play's situations carry location as a team alias plus a yard line; plot one drive's values and they read straight onto the field:

FIELD POSITION · CFP CHAMPIONSHIP · Q4Game Play-by-Play · one Indiana drive



IND
MIA





















10
20
30
40
50
40
30
20
10
IND drive



1st down



12-yd TD rush - 9:27












IND 25
MIA 42
MIA 12

4th and 5 at MIA 37 - 11:28
one dot per play, plotted from location.alias + location.yardlinedashed line = the first-down spot, yfd yards past the ballthe alias flips at midfield: IND 40 to MIA 42 is an 18-yard gain
The yard line counts up from the goal line of the team named in location.alias, so the same number appears on both halves of the field; down, yfd, clock, and possession ride each play's situation objects.

The conversion runs off which half of the field the alias names: with Indiana in possession, MIA 12 is 12 yards from the end zone (the opponent's side, so the yard line is the distance), while IND 25 is 75 yards out (their own side, so subtract the yard line from 100).


5. Show live leaders from Game Statistics

The Game Statistics feed carries team-level and player-level statistics for each team in the game: a summary block per team (possession time, average gain, turnovers, play counts, total yards, fumbles, penalties, and return yards) followed by category blocks, each with totals and a players[] array. A players[] list can include a (Team) row (id team) holding statistics credited to the team rather than to a player, and in defense total tackles are tackles plus assists, which the combined field also carries. The game header also carries the weather node, whose optional stadium_status value reports whether a roof is open or closed; the field is omitted when it does not apply, and the Boxscore and Play-by-Play feeds carry it the same way.

Request it from scheduled no sooner than 10 minutes before kickoff and poll as needed once the game is inprogress, on the same 3-second in-progress cache TTL. Both teams from the CFP National Championship, reduced to the game header, each team's summary, and the first passing line on each side; the category totals and the other categories are omitted:

GET https://api.sportradar.com/ncaafb/trial/v7/en/games/ac60aab5-2638-45de-87f0-037e3f199282/statistics.json
x-api-key: YOUR_API_KEY
{
  "id": "ac60aab5-2638-45de-87f0-037e3f199282",
  "status": "closed",
  "scheduled": "2026-01-20T00:30:00+00:00",
  "clock": "00:00",
  "quarter": 4,
  "coverage": "full",
  "title": "CFP National Championship",
  "statistics": {
    "home": {
      "id": "fa0eb091-8e35-49c7-b00f-269794a99a61",
      "name": "Hoosiers",
      "market": "Indiana",
      "alias": "IND",
      "summary": {
        "possession_time": "35:28",
        "avg_gain": 4.4,
        "safeties": 0,
        "turnovers": 0,
        "play_count": 72,
        "rush_plays": 45,
        "total_yards": 317,
        "fumbles": 0,
        "lost_fumbles": 0,
        "penalties": 5,
        "penalty_yards": 38,
        "return_yards": 16
      },
      "passing": {
        "players": [
          {
            "id": "e41043f0-8946-11ec-b2b8-adecafc94fa4",
            "name": "Fernando Mendoza",
            "jersey": "15",
            "position": "QB",
            "first_downs": 11,
            "attempts": 27,
            "completions": 16,
            "cmp_pct": 59.259,
            "yards": 186,
            "avg_yards": 6.889,
            "sacks": 3,
            "sack_yards": 23,
            "touchdowns": 0,
            "longest": 25,
            "interceptions": 0,
            "rating": 117.13,
            "redzone_attempts": 3,
            "int_touchdowns": 0
          }
        ]
      }
    },
    "away": {
      "id": "2f475a40-df87-43a7-b8a9-c36a43edff21",
      "name": "Hurricanes",
      "market": "Miami (FL)",
      "alias": "MIA",
      "summary": {
        "possession_time": "24:32",
        "avg_gain": 6.5,
        "safeties": 0,
        "turnovers": 1,
        "play_count": 53,
        "rush_plays": 21,
        "total_yards": 342,
        "fumbles": 0,
        "lost_fumbles": 0,
        "penalties": 7,
        "penalty_yards": 60,
        "return_yards": 25
      },
      "passing": {
        "players": [
          {
            "id": "970f7241-ce14-4d28-80ea-392675e4a14a",
            "name": "Carson Beck",
            "jersey": "11",
            "position": "QB",
            "first_downs": 9,
            "attempts": 32,
            "completions": 19,
            "cmp_pct": 59.375,
            "yards": 232,
            "avg_yards": 7.25,
            "sacks": 1,
            "sack_yards": 7,
            "touchdowns": 1,
            "longest": 41,
            "interceptions": 1,
            "rating": 124.34,
            "longest_touchdown": 22,
            "redzone_attempts": 0,
            "int_touchdowns": 0
          }
        ]
      }
    }
  }
}

Indiana's summary shows 35:28 of possession, 4.4 yards per play, no turnovers, and 72 plays (45 of them rushes) for 317 yards with 5 penalties for 38 yards; Miami had 24:32 of possession, 6.5 yards per play, 1 turnover, and 53 plays (21 rushes) for 342 yards with 7 penalties for 60 yards, a concise view of each team's offensive effectiveness. The players[] lines hold the detailed metrics: Fernando Mendoza completed 16 of 27 for 186 yards with no touchdowns or interceptions and a 117.13 rating, and Carson Beck 19 of 32 for 232 yards, 1 touchdown, and 1 interception. Sort each category's players[] by yards on your side to build a game leaders panel, and read the summary blocks for a key-stats comparison; the leaders and the team summaries side by side:

CFP NATIONAL CHAMPIONSHIPFINAL
INDHoosiers27FINAL21HurricanesMIA
PASSING LEADERS
Fernando Mendoza · IND186 yds0 TD
Carson Beck · MIA232 yds1 TD
The headshot slots are generic placeholders; fill them from Sportradar's image products or your own assets.
CFP NATIONAL CHAMPIONSHIP · KEY STATSGame Statistics
INDHoosiersKEY STATSHurricanesMIA
186PASSING YDS232
131RUSHING YDS110
0TURNOVERS1
20FIRST DOWNS15
35:28POSSESSION24:32
Team summaries carry possession time, turnovers, and play counts alongside the category blocks.
📸

Accessing Headshots and Team Logos

To access team logos and player headshots, use the Images API.

For play-level detail that the statistics categories summarize, such as attempted field goals, out-of-bounds fumbles, and passes inside the 20-yard line, supplement Game Statistics (or Push Statistics) with the Game Play-by-Play feed; compare the data points each feed returns to understand the specific information each provides.


6. Stream events and statistics over push

The Push Events feed delivers live play-by-play data over a single connection, and the Push Statistics feed delivers the same live statistics as the Game Statistics feed the same way. Both push JSON payloads through a push service, which minimizes the number of calls required; the Push feature is available to Realtime customers. Add the match parameter with a game id to follow one game; without it, both feeds return data for all NCAAFB games currently in progress.

Run push alongside the REST feeds rather than on its own. Certain statistics are only available through the RESTful feeds, and the Game Play-by-Play feed carries boxscore detail and broader league statistics beyond what Push Events delivers. A dropped connection cannot resume where it left off, so open multiple push connections (which also lets you monitor several games or data types at once and keeps data flowing if one connection fails) and keep the Game Play-by-Play and Game Statistics feeds as the fallback to retrieve any timeline data missed during live games. A common split: push for immediate notification of major events such as touchdowns and penalties, and the Game Play-by-Play feed for a user-requested drive timeline that includes minor plays and player statistics. Compare the data points returned by the Game Play-by-Play feed with those from Push Events to see what each provides. The Push Feeds page covers the connection workflow and message shapes.


7. Wind down at complete and closed, then follow the change log

At complete the game is over and the score is final while statistics are verified against the official gamebooks, and scores populate in the schedule feeds; at closed all stats are validated. Take one final pull of the Boxscore, Play-by-Play, and Game Statistics once the game reads closed, then stop polling: closed-game payloads move to a 600-second cache TTL, and to 30 minutes once seven days pass.

Corrections that land after a game has ended (plays added or corrected, statistical errors rectified, tackle detail completed during the following week) surface in the Daily Change Log rather than in a status change, so keep the log in the loop after every game day. For this scenario, watch these entries and refetch the listed game's feed:

DataUse case
Play-by-PlayTrack changes in play details such as new plays added or corrections to existing play records
Game StatisticsMonitor updates in player statistics and team performance metrics from post-game corrections
Game BoxscoreMonitor adjustments in game summary data, including final scores or statistical errors being rectified

Set a regular schedule to pull the log every 10 minutes or less, depending on your use case. The Monitoring Data Changes page covers the feed's mechanics: what it lists, the entity types, the league-day window, deletions, and downtime recovery.



Common Use Cases

  • Score ticker: Boxscore only, on a short cadence
  • Gamecast: Boxscore for state plus Play-by-Play for the drive timeline, tracking a drive like Indiana's 14-play touchdown march: the 12-yard completion to Sarratt, the incompletion that followed, and the 8-yard throw to Nowakowski that set up third and 2
  • Live player stats: Game Statistics alongside the Boxscore
  • Broadcast and editorial breakdowns: the scoring plays and per-play statistics behind the plays that influenced the game's outcome
  • Coaching and analytics: rushing effectiveness, turnover margins, and penalty impact from the team summaries and category blocks, informing player rotations, game strategy, and preparation for upcoming opponents
  • Post-game recap: one closed pull of the three game feeds, then Daily Change Log corrections


Best Practices

  • Branch on status at every poll: halftime is a normal mid-game status, delayed and suspended mean pause but keep watching, and only closed (or cancelled) ends the loop
  • Read coverage from the schedule before wiring play-by-play polling: play-by-play depth applies to full games, and expected_latency sets the lag to expect on every game feed
  • Start game-feed requests no earlier than 10 minutes before kickoff, poll the Boxscore as your heartbeat, and fetch Play-by-Play on a slower cadence or on score change
  • Ingest play-by-play idempotently by event id and sequence; entries can be corrected while a game is live and after it closes
  • Run push connections alongside the REST feeds, never instead of them, and keep more than one connection open
  • Treat complete-state stats as provisional, re-ingest at closed, and follow the Daily Change Log for later corrections
  • Cadences and cache TTLs by game status are on the Update Frequencies page

Did this page help you?