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
| Feed | Purpose |
|---|---|
| Daily Schedule | The day's games, tip-off times, and coverage flags |
| Game Summary | Score, clock, and complete team and player statistics |
| Game Boxscore | A lighter payload: score, quarter scoring, and stat leaders |
| Game Play-by-Play | Every 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
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:
quarterandclockplace the game;lead_changesandtimes_tiedsummarize 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, andeffective_fg_pct bonusandremaining_timeoutscarry the in-game situation- Each player row carries
starter,played,active, and (for games withtrack_on_court)on_courtfor who is on the floor right now - Player statistics include
plus_minus,efficiency, anddouble_doublealongside the box-score lines - Rostered players who do not play carry a
not_playing_reason(a fixed value list, for exampleDNP – Coach's Decision; the full list is in the G League FAQ) and can also carry anot_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:
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"
}attributionnames the acting team, andteam_basketorientslocation: court coordinates for shot charts, with anaction_areazone labelpossessionnames the team in possession after the eventstatisticsattributes the event to players and stat types (the sample is a made field goal withshot_typedetail)sequenceorders events globally;clock_decimalsupplementsclockfor sub-second rendering- Events also carry an
on_courtobject (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 1in this game) and whose statistics carryfree_throw_type: "weighted"alongsideregular - 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:
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-controlheader for the feed's current TTL - Upsert play-by-play by event
idand honordeleted_eventson every poll; do not treat the stream as append-only - Use
on_courtdata only where the game'strack_on_courtflag 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
Updated about 17 hours ago
