Integration GuidesReference Docs
Coverage MatrixDocumentationChange LogLog InContact Us
Integration Guides

Live Game Updates

This scenario tracks games as they are played: score and clock, full team and player statistics, top performers, and an event-level play-by-play stream with shot locations and possession.

This scenario is commonly used to:

  • Drive a live scoreboard with score, quarter, and clock
  • Render live boxscores with team and player statistics
  • Power play-by-play tickers and shot charts

The response samples on this page come from the deciding game of the 2025-26 Finals (Greensboro Swarm 119 at Stockton Kings 104, April 11, 2026).



Relevant Feeds

FeedPurpose
Daily ScheduleThe day's games, tip-off times, and coverage flags
Game SummaryScore, clock, and complete team and player statistics
Game BoxscoreA lighter payload: score, quarter scoring, and stat leaders
Game Play-by-PlayEvery event of the game, with locations, possession, and stat attributions


High-Level Workflow

Daily Schedule → poll Game Summary and Play-by-Play during play → reconcile deletions → stop at closed

Live Game WorkflowFind the day's games, poll during play, reconcile, close out
Before tip-offDaily Scheduleselect gamescheck coverage + track_on_court
During playGame Summaryscore, clock, full statistics
Lighter optionGame Boxscorequarter scoring + leaders
Event streamGame Play-by-Playupsert events by iddrop ids in deleted_events
Game endstatus: closedfinal pull, stop polling
Cadences come from Update Frequencies; late corrections surface in the Daily Change Log's results section.


Integration Steps


1. Find the day's games

Pull the Daily Schedule (see Schedules) and select the games to track. Two flags on each game state what live data to expect: coverage (full for the complete live feed set; extended_boxscore, possible for some preseason games, for scores, clock, and leaders with full statistics after results post), and track_on_court: true for live on-court lineup data (the on_court player flags and lineupchange events below). A game moves from scheduled through inprogress to complete and then closed; the full lifecycle, including the exceptional paths, is on Game Status Workflow.


2. Poll the Game Summary

Game Summary is the primary live feed: the game header (status, quarter, clock), both teams' full statistics, and per-player statistics for everyone who has played. The header and the home side, with the statistics objects reduced to a selection of their fields and the player list to the top scorer:

GET https://api.sportradar.com/nbdl/trial/v8/en/games/5b13f219-10bf-4ff7-b91d-721a9f53600d/summary.json
x-api-key: YOUR_API_KEY
{
  "id": "5b13f219-10bf-4ff7-b91d-721a9f53600d",
  "status": "closed",
  "coverage": "full",
  "track_on_court": true,
  "entry_mode": "WEBSOCKET",
  "title": "Game 2",
  "scheduled": "2026-04-11T02:00:00+00:00",
  "duration": "2:10",
  "attendance": 4020,
  "quarter": 4,
  "clock": "00:00",
  "lead_changes": 0,
  "times_tied": 1,
  "season": {
    "id": "d32bbe62-5116-42c5-a96c-95ff0c87de03",
    "year": 2025,
    "type": "PST",
    "name": "Post-season"
  },
  "home": {
    "id": "b971b187-c542-4b76-9548-114acc564e05",
    "name": "Kings",
    "market": "Stockton",
    "alias": "STO",
    "points": 104,
    "bonus": true,
    "remaining_timeouts": 1,
    "statistics": {
      "points": 104,
      "field_goals_made": 39,
      "field_goals_att": 92,
      "field_goals_pct": 42.4,
      "three_points_made": 5,
      "three_points_att": 31,
      "three_points_pct": 16.1,
      "free_throws_made": 11,
      "free_throws_att": 13,
      "free_throws_pct": 84.6,
      "assists": 15,
      "steals": 11,
      "blocks": 5,
      "fast_break_pts": 15,
      "bench_points": 21,
      "biggest_lead": 0,
      "effective_fg_pct": 45.1
    },
    "players": [
      {
        "id": "80bf06f8-b2d8-483b-849c-2a168198cfbc",
        "full_name": "DaQuan Jeffries",
        "jersey_number": "6",
        "position": "F",
        "starter": true,
        "played": true,
        "active": true,
        "on_court": false,
        "statistics": {
          "minutes": "43:35",
          "points": 27,
          "rebounds": 10,
          "assists": 2,
          "steals": 2,
          "blocks": 2,
          "turnovers": 5,
          "field_goals_made": 10,
          "field_goals_att": 23,
          "field_goals_pct": 43.5,
          "three_points_made": 2,
          "three_points_att": 9,
          "free_throws_made": 2,
          "free_throws_att": 3,
          "efficiency": 26,
          "double_double": true
        }
      }
    ]
  },
  "away": {
    "id": "e74de5ce-3e98-4414-afe5-b56a90e527a2",
    "name": "Swarm",
    "market": "Greensboro",
    "alias": "GBO",
    "points": 119
  }
}

Reading the payload:

  • quarter and clock place the game; lead_changes and times_tied summarize its flow
  • Team statistics go well beyond the counting stats: shooting splits by zone (field_goals_at_rim_*, field_goals_at_midrange_*), fast_break_pts, bench_points, biggest_lead, and effective_fg_pct
  • bonus and remaining_timeouts carry the in-game situation
  • Each player row carries starter, played, active, and (for games with track_on_court) on_court for who is on the floor right now
  • Player statistics include plus_minus, efficiency, and double_double alongside the box-score lines
  • Rostered players who do not play carry a not_playing_reason (a fixed value list, for example DNP – Coach's Decision; the full list is in the G League FAQ) and can also carry a not_playing_description, a free-text note entered by the league with no fixed value list; treat the description as display text

3. Use the Boxscore for lighter polling

Game Boxscore carries the header, quarter-by-quarter scoring, and each team's current stat leaders, without the full player lists. It is the right feed when a scoreboard needs more than the schedule but less than the full summary:

GET https://api.sportradar.com/nbdl/trial/v8/en/games/5b13f219-10bf-4ff7-b91d-721a9f53600d/boxscore.json
x-api-key: YOUR_API_KEY
{
  "id": "5b13f219-10bf-4ff7-b91d-721a9f53600d",
  "status": "closed",
  "quarter": 4,
  "clock": "00:00",
  "scheduled": "2026-04-11T02:00:00+00:00",
  "home": {
    "id": "b971b187-c542-4b76-9548-114acc564e05",
    "name": "Kings",
    "market": "Stockton",
    "alias": "STO",
    "points": 104,
    "scoring": [
      {
        "type": "quarter",
        "number": 1,
        "sequence": 1,
        "points": 19
      },
      {
        "type": "quarter",
        "number": 2,
        "sequence": 2,
        "points": 31
      },
      {
        "type": "quarter",
        "number": 3,
        "sequence": 3,
        "points": 33
      },
      {
        "type": "quarter",
        "number": 4,
        "sequence": 4,
        "points": 21
      }
    ],
    "leaders": {
      "points": [
        {
          "id": "80bf06f8-b2d8-483b-849c-2a168198cfbc",
          "full_name": "DaQuan Jeffries",
          "jersey_number": "6",
          "position": "F",
          "statistics": {
            "minutes": "43:35",
            "points": 27,
            "rebounds": 10,
            "assists": 2,
            "steals": 2,
            "blocks": 2,
            "turnovers": 5,
            "field_goals_made": 10,
            "field_goals_att": 23,
            "field_goals_pct": 43.5,
            "three_points_made": 2,
            "three_points_att": 9,
            "free_throws_made": 2,
            "free_throws_att": 3,
            "efficiency": 26,
            "double_double": true
          }
        }
      ]
    }
  },
  "away": {
    "id": "e74de5ce-3e98-4414-afe5-b56a90e527a2",
    "name": "Swarm",
    "market": "Greensboro",
    "alias": "GBO",
    "points": 119
  }
}

The leaders object ranks the current leaders in points, rebounds, and assists; the sample is reduced to the points leader.

Rendered as a finished screen, the same response becomes a linescore and leaders panel:

NBA G League Finals: Game 2FINAL
Q1Q2Q3Q4T
GBOGreensboro Swarm25372730119
STOStockton Kings19313321104
GREENSBORO LEADERSPTSTosan Evbuomwan22REBTidjane Salaun10ASTTerrell Brown Jr.10
STOCKTON LEADERSPTSDaQuan Jeffries27REBDaQuan Jeffries10ASTJon Elmore7
The headshot and logo slots are generic placeholders; fill them from Sportradar's image products or your own assets.

4. Stream the Play-by-Play

Game Play-by-Play returns the game as periods, each carrying an ordered events array; this game produced 500 events across four quarters. The header and the opening events:

GET https://api.sportradar.com/nbdl/trial/v8/en/games/5b13f219-10bf-4ff7-b91d-721a9f53600d/pbp.json
x-api-key: YOUR_API_KEY
{
  "id": "5b13f219-10bf-4ff7-b91d-721a9f53600d",
  "status": "closed",
  "entry_mode": "WEBSOCKET",
  "quarter": 4,
  "clock": "00:00",
  "periods": [
    {
      "id": "16373336-1a4a-44d2-b41a-039872157fd3",
      "number": 1,
      "type": "quarter",
      "sequence": 1,
      "events": [
        {
          "id": "7ea26c41-5a91-4de8-85fa-e840d24cda28",
          "clock": "12:00",
          "event_type": "lineupchange",
          "description": "Swarm lineup change (Tosan Evbuomwan, Marcus Garrett, Tidjane Salaun, Jonas Aidoo, Liam McNeeley)",
          "home_points": 0,
          "away_points": 0,
          "sequence": 1775872970293
        },
        {
          "id": "1d6bbc80-96f8-4e7b-a0c6-a47e28201afe",
          "clock": "12:00",
          "event_type": "lineupchange",
          "description": "Kings lineup change (Jon Elmore, DaQuan Jeffries, Patrick Baldwin Jr., Gabe Levin, Dexter Dennis)",
          "home_points": 0,
          "away_points": 0,
          "sequence": 1775872970295
        },
        {
          "id": "642f8032-e19b-477f-a552-2e1430267337",
          "clock": "12:00",
          "event_type": "startperiod",
          "description": "Start of 1st Quarter",
          "home_points": 0,
          "away_points": 0,
          "sequence": 1775872970300
        }
      ]
    }
  ]
}

The events above are reduced to their core fields. A scoring event in full shows everything an event can carry:

{
  "id": "230eb822-0fff-45be-b237-8cb5e5a38f1f",
  "clock": "10:48",
  "clock_decimal": "10:48",
  "event_type": "twopointmade",
  "description": "Tosan Evbuomwan makes two point fadeaway jump shot",
  "home_points": 0,
  "away_points": 2,
  "attribution": {
    "name": "Swarm",
    "market": "Greensboro",
    "id": "e74de5ce-3e98-4414-afe5-b56a90e527a2",
    "team_basket": "right"
  },
  "location": {
    "coord_x": 1014,
    "coord_y": 194,
    "action_area": "insideleft"
  },
  "possession": {
    "name": "Kings",
    "market": "Stockton",
    "id": "b971b187-c542-4b76-9548-114acc564e05",
    "reference": "1612709914"
  },
  "statistics": [
    {
      "type": "fieldgoal",
      "made": true,
      "shot_type": "jump shot",
      "shot_type_desc": "fadeaway",
      "points": 2,
      "team": {
        "name": "Swarm",
        "market": "Greensboro",
        "id": "e74de5ce-3e98-4414-afe5-b56a90e527a2",
        "reference": "1612709922"
      },
      "player": {
        "full_name": "Tosan Evbuomwan",
        "jersey_number": "8",
        "id": "a13cb61f-223c-4b04-b1eb-1abe652d945c",
        "reference": "1641787"
      }
    }
  ],
  "wall_clock": "2026-04-11T02:04:01+00:00"
}
  • attribution names the acting team, and team_basket orients location: court coordinates for shot charts, with an action_area zone label
  • possession names the team in possession after the event
  • statistics attributes the event to players and stat types (the sample is a made field goal with shot_type detail)
  • sequence orders events globally; clock_decimal supplements clock for sub-second rendering
  • Events also carry an on_court object (omitted above for brevity) listing the ten players on the floor
  • G League rules include the weighted free throw, a single attempt worth the full value of the trip; these arrive as ordinary free throw events whose description carries the value (makes 3 point weighted free throw 1 of 1 in this game) and whose statistics carry free_throw_type: "weighted" alongside regular
  • The full event-type vocabulary is in the G League FAQ

Poll the feed and append events with unseen sequence values; each event's updated timestamp tells you when it last changed.

The location coordinates render straight onto a court: each dot below is one Greensboro Swarm field-goal attempt from this game's play-by-play, filled when made and hollow when missed:

Greensboro Swarm Shot ChartNBA G League Finals: Game 2




































































































made (42)missed (49)
The court drawing is schematic; each dot sits at its event's coordinates.

5. Reconcile edits and deletions

Play-by-play is corrected live by the scorekeepers: events can be updated after they first appear, and some are deleted outright. Official reviews are part of this flow: a review surfaces as its own review event (this game carried one, described as Instant replay (Challenge: Ruling Upheld)), and when a ruling changes a play, the affected event is adjusted in place, moving its updated timestamp. The root-level deleted_events array lists the IDs of every deleted event, as in this response:

{
  "deleted_events": [
    {
      "id": "e16cab40-8830-42ca-9918-44ea792245c5"
    },
    {
      "id": "1bb5dfcb-a034-4a91-8b77-fb221b08f956"
    },
    {
      "id": "0166663f-1ac7-4840-b452-07acd8a9798d"
    }
  ]
}

On each poll, upsert events by id (re-applying any whose updated changed) and drop any ID that appears in deleted_events.


6. Close out the game

A finished game passes through complete while stats are validated and settles at closed, where results are final: make one last pull of the Summary and Play-by-Play, then stop polling. Completed-game responses serve on a long cache (see Update Frequencies), and late corrections surface through the results section of the daily change log (Monitoring Data Changes).



Common Use Cases

Typical builds on this workflow include:

  • A live scoreboard on the Boxscore feed with quarter scoring and leaders
  • A full live boxscore page on the Game Summary feed
  • A play-by-play ticker and shot chart on the Play-by-Play feed's locations and descriptions


Best Practices

  • Poll only the games you are tracking, at a cadence matched to your product (a few seconds for a live ticker; slower for a periodically refreshed page); read each response's cache-control header for the feed's current TTL
  • Upsert play-by-play by event id and honor deleted_events on every poll; do not treat the stream as append-only
  • Use on_court data only where the game's track_on_court flag is true
  • After closed, reconcile via the Daily Change Log instead of continuing to poll game feeds
  • Data collection carries a failover process; see the Failover section of the G League FAQ

Did this page help you?