---
updatedAt: 2026-09-01T10:23:16.000Z
agentTools:
  siteIndex: https://developer.sportradar.com/llms.txt
  projectIndex: https://developer.sportradar.com/basketball/llms.txt
---

# 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).

<br />

***

## Relevant Feeds

| Feed                                                                                                          | Purpose                                                                    |
| ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| <Anchor label="Daily Schedule" target="_blank" href="ref:g-league-daily-schedule">Daily Schedule</Anchor>     | The day's games, tip-off times, and coverage flags                         |
| <Anchor label="Game Summary" target="_blank" href="ref:g-league-game-summary">Game Summary</Anchor>           | Score, clock, and complete team and player statistics                      |
| <Anchor label="Game Boxscore" target="_blank" href="ref:g-league-game-boxscore">Game Boxscore</Anchor>        | A lighter payload: score, quarter scoring, and stat leaders                |
| <Anchor label="Game Play-by-Play" target="_blank" href="ref:g-league-play-by-play">Game Play-by-Play</Anchor> | Every event of the game, with locations, possession, and stat attributions |

<br />

***

## High-Level Workflow

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

<div style={{border: "1px solid #C5CAE9", borderRadius: "12px", overflow: "hidden", margin: "4px 0 8px"}}>
  <div style={{background: "linear-gradient(90deg, #1A237E 0%, #283593 60%, #3949AB 100%)", color: "#FFFFFF", padding: "10px 18px", display: "flex", alignItems: "baseline", justifyContent: "space-between", flexWrap: "wrap", gap: "4px 12px"}}>
    <span style={{fontWeight: 700, fontSize: "14px", letterSpacing: "0.02em"}}>Live Game Workflow</span>
    <span style={{fontSize: "12px", opacity: 0.8}}>Find the day's games, poll during play, reconcile, close out</span>
  </div>
  <div style={{padding: "12px 18px", background: "#FFFFFF", display: "flex", flexDirection: "column", gap: "10px"}}>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>Before tip-off</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", whiteSpace: "nowrap"}}>Daily Schedule</span>
      <span style={{color: "#9FA8DA", fontWeight: 700, fontSize: "14px"}}>→</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap"}}>select games</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #E8EAF6", background: "#FAFAFA", color: "#6B7280", fontSize: "12px", whiteSpace: "nowrap"}}>check coverage + track_on_court</span>
    </div>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>During play</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", whiteSpace: "nowrap"}}>Game Summary</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #E8EAF6", background: "#FAFAFA", color: "#6B7280", fontSize: "12px", whiteSpace: "nowrap"}}>score, clock, full statistics</span>
    </div>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>Lighter option</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px dashed #9FA8DA", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", whiteSpace: "nowrap"}}>Game Boxscore</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #E8EAF6", background: "#FAFAFA", color: "#6B7280", fontSize: "12px", whiteSpace: "nowrap"}}>quarter scoring + leaders</span>
    </div>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>Event stream</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", whiteSpace: "nowrap"}}>Game Play-by-Play</span>
      <span style={{color: "#9FA8DA", fontWeight: 700, fontSize: "14px"}}>→</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap"}}>upsert events by id</span>
      <span style={{color: "#9FA8DA", fontWeight: 700, fontSize: "14px"}}>→</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #FFCFCF", background: "#FFEBEB", color: "#B71C1C", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap"}}>drop ids in deleted_events</span>
    </div>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>Game end</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", background: "#1A237E", color: "#FFFFFF", fontSize: "12.5px", fontWeight: 600, fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", whiteSpace: "nowrap"}}>status: closed</span>
      <span style={{color: "#9FA8DA", fontWeight: 700, fontSize: "14px"}}>→</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap"}}>final pull, stop polling</span>
    </div>
  </div>
  <div style={{padding: "8px 18px", borderTop: "1px solid #E8EAF6", fontSize: "12px", color: "#6B7280", background: "#FAFAFA"}}>Cadences come from Update Frequencies; late corrections surface in the Daily Change Log's results section.</div>
</div>

<br />

***

## Integration Steps

<br />

### 1. Find the day's games

Pull the <Anchor label="Daily Schedule" target="_blank" href="ref:g-league-daily-schedule">Daily Schedule</Anchor> (see [Schedules](https://developer.sportradar.com/basketball/docs/g-league-ig-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](https://developer.sportradar.com/basketball/docs/g-league-ig-game-status-workflow).

<br />

### 2. Poll the Game Summary

<Anchor label="Game Summary" target="_blank" href="ref:g-league-game-summary">Game Summary</Anchor> 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:

```http
GET https://api.sportradar.com/nbdl/trial/v8/en/games/5b13f219-10bf-4ff7-b91d-721a9f53600d/summary.json
x-api-key: YOUR_API_KEY
```
```json Game Summary (json)
{
  "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](https://developer.sportradar.com/basketball/reference/g-league-faq#what-are-the-possible-values-for-player---not_playing_reason)) 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

<br />

### 3. Use the Boxscore for lighter polling

<Anchor label="Game Boxscore" target="_blank" href="ref:g-league-game-boxscore">Game Boxscore</Anchor> 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:

```http
GET https://api.sportradar.com/nbdl/trial/v8/en/games/5b13f219-10bf-4ff7-b91d-721a9f53600d/boxscore.json
x-api-key: YOUR_API_KEY
```
```json Game Boxscore (json)
{
  "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:

<div style={{border: "1px solid #C5CAE9", borderRadius: "12px", overflow: "hidden", margin: "4px 0 8px", maxWidth: "560px"}}>
<div style={{background: "linear-gradient(90deg, #1A237E 0%, #283593 60%, #3949AB 100%)", color: "#FFFFFF", padding: "10px 18px", display: "flex", alignItems: "baseline", justifyContent: "space-between", flexWrap: "wrap", gap: "4px 12px"}}>
<span style={{fontWeight: 700, fontSize: "14px", letterSpacing: "0.02em"}}>NBA G League Finals: Game 2</span>
<span style={{fontSize: "11px", fontWeight: 700, letterSpacing: "0.06em", padding: "2px 8px", borderRadius: "999px", background: "rgba(255,255,255,0.16)"}}>FINAL</span>
</div>
<div style={{display: "flex", justifyContent: "flex-end", gap: "6px", padding: "8px 14px", background: "#F3F6FA"}}>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#6B7280", flex: "none"}}>Q1</span>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#6B7280", flex: "none"}}>Q2</span>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#6B7280", flex: "none"}}>Q3</span>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#6B7280", flex: "none"}}>Q4</span>
<span style={{width: "36px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#6B7280", flex: "none"}}>T</span>
</div>
<div style={{display: "flex", alignItems: "center", gap: "6px", padding: "8px 18px", borderTop: "1px solid #E8EAF6"}}>
<span style={{width: "26px", height: "26px", borderRadius: "50%", background: "#E8EAF6", color: "#1A237E", fontWeight: 700, fontSize: "10px", display: "inline-flex", alignItems: "center", justifyContent: "center", flex: "none"}}>GBO</span>
<span style={{flex: "1 1 120px", minWidth: "0", fontSize: "12.5px", fontWeight: 700, color: "#1A237E", lineHeight: "1.2"}}>Greensboro Swarm</span>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#3B4252", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>25</span>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#3B4252", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>37</span>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#3B4252", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>27</span>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#3B4252", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>30</span>
<span style={{width: "36px", textAlign: "right", fontSize: "12.5px", fontWeight: 700, color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>119</span>
</div>
<div style={{display: "flex", alignItems: "center", gap: "6px", padding: "8px 18px", borderTop: "1px solid #E8EAF6"}}>
<span style={{width: "26px", height: "26px", borderRadius: "50%", background: "#E8EAF6", color: "#1A237E", fontWeight: 700, fontSize: "10px", display: "inline-flex", alignItems: "center", justifyContent: "center", flex: "none"}}>STO</span>
<span style={{flex: "1 1 120px", minWidth: "0", fontSize: "12.5px", fontWeight: 600, color: "#1A237E", lineHeight: "1.2"}}>Stockton Kings</span>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#3B4252", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>19</span>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#3B4252", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>31</span>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#3B4252", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>33</span>
<span style={{width: "30px", textAlign: "right", fontSize: "12.5px", fontWeight: 600, color: "#3B4252", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>21</span>
<span style={{width: "36px", textAlign: "right", fontSize: "12.5px", fontWeight: 700, color: "#3B4252", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>104</span>
</div>
<div style={{display: "flex", flexWrap: "wrap", gap: "14px", padding: "12px 18px", borderTop: "1px solid #E8EAF6", background: "#FFFFFF"}}>
<div style={{flex: "1 1 220px", minWidth: "0", display: "flex", flexDirection: "column", gap: "8px"}}>
<span style={{fontSize: "11px", fontWeight: 700, color: "#6B7280", letterSpacing: "0.04em"}}>GREENSBORO LEADERS</span>
<span style={{display: "flex", alignItems: "center", gap: "8px"}}><svg width="30" height="30" viewBox="0 0 28 28" style={{borderRadius: "50%", background: "#E8EAF6", flex: "none"}}><circle cx="14" cy="10.5" r="4.5" fill="#9FA8DA" /><path d="M3 27c1.5-6 6.5-9 11-9s9.5 3 11 9z" fill="#9FA8DA" /></svg><span style={{width: "30px", fontSize: "11px", fontWeight: 700, color: "#6B7280", flex: "none"}}>PTS</span><span style={{flex: "1 1 auto", minWidth: "0", fontSize: "12.5px", fontWeight: 600, color: "#1A237E", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap"}}>Tosan Evbuomwan</span><span style={{fontSize: "13px", fontWeight: 700, color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>22</span></span>
<span style={{display: "flex", alignItems: "center", gap: "8px"}}><svg width="30" height="30" viewBox="0 0 28 28" style={{borderRadius: "50%", background: "#E8EAF6", flex: "none"}}><circle cx="14" cy="10.5" r="4.5" fill="#9FA8DA" /><path d="M3 27c1.5-6 6.5-9 11-9s9.5 3 11 9z" fill="#9FA8DA" /></svg><span style={{width: "30px", fontSize: "11px", fontWeight: 700, color: "#6B7280", flex: "none"}}>REB</span><span style={{flex: "1 1 auto", minWidth: "0", fontSize: "12.5px", fontWeight: 600, color: "#1A237E", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap"}}>Tidjane Salaun</span><span style={{fontSize: "13px", fontWeight: 700, color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>10</span></span>
<span style={{display: "flex", alignItems: "center", gap: "8px"}}><svg width="30" height="30" viewBox="0 0 28 28" style={{borderRadius: "50%", background: "#E8EAF6", flex: "none"}}><circle cx="14" cy="10.5" r="4.5" fill="#9FA8DA" /><path d="M3 27c1.5-6 6.5-9 11-9s9.5 3 11 9z" fill="#9FA8DA" /></svg><span style={{width: "30px", fontSize: "11px", fontWeight: 700, color: "#6B7280", flex: "none"}}>AST</span><span style={{flex: "1 1 auto", minWidth: "0", fontSize: "12.5px", fontWeight: 600, color: "#1A237E", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap"}}>Terrell Brown Jr.</span><span style={{fontSize: "13px", fontWeight: 700, color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>10</span></span>
</div>
<div style={{flex: "1 1 220px", minWidth: "0", display: "flex", flexDirection: "column", gap: "8px"}}>
<span style={{fontSize: "11px", fontWeight: 700, color: "#6B7280", letterSpacing: "0.04em"}}>STOCKTON LEADERS</span>
<span style={{display: "flex", alignItems: "center", gap: "8px"}}><svg width="30" height="30" viewBox="0 0 28 28" style={{borderRadius: "50%", background: "#E8EAF6", flex: "none"}}><circle cx="14" cy="10.5" r="4.5" fill="#9FA8DA" /><path d="M3 27c1.5-6 6.5-9 11-9s9.5 3 11 9z" fill="#9FA8DA" /></svg><span style={{width: "30px", fontSize: "11px", fontWeight: 700, color: "#6B7280", flex: "none"}}>PTS</span><span style={{flex: "1 1 auto", minWidth: "0", fontSize: "12.5px", fontWeight: 600, color: "#1A237E", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap"}}>DaQuan Jeffries</span><span style={{fontSize: "13px", fontWeight: 700, color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>27</span></span>
<span style={{display: "flex", alignItems: "center", gap: "8px"}}><svg width="30" height="30" viewBox="0 0 28 28" style={{borderRadius: "50%", background: "#E8EAF6", flex: "none"}}><circle cx="14" cy="10.5" r="4.5" fill="#9FA8DA" /><path d="M3 27c1.5-6 6.5-9 11-9s9.5 3 11 9z" fill="#9FA8DA" /></svg><span style={{width: "30px", fontSize: "11px", fontWeight: 700, color: "#6B7280", flex: "none"}}>REB</span><span style={{flex: "1 1 auto", minWidth: "0", fontSize: "12.5px", fontWeight: 600, color: "#1A237E", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap"}}>DaQuan Jeffries</span><span style={{fontSize: "13px", fontWeight: 700, color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>10</span></span>
<span style={{display: "flex", alignItems: "center", gap: "8px"}}><svg width="30" height="30" viewBox="0 0 28 28" style={{borderRadius: "50%", background: "#E8EAF6", flex: "none"}}><circle cx="14" cy="10.5" r="4.5" fill="#9FA8DA" /><path d="M3 27c1.5-6 6.5-9 11-9s9.5 3 11 9z" fill="#9FA8DA" /></svg><span style={{width: "30px", fontSize: "11px", fontWeight: 700, color: "#6B7280", flex: "none"}}>AST</span><span style={{flex: "1 1 auto", minWidth: "0", fontSize: "12.5px", fontWeight: 600, color: "#1A237E", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap"}}>Jon Elmore</span><span style={{fontSize: "13px", fontWeight: 700, color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", flex: "none"}}>7</span></span>
</div>
</div>
<div style={{padding: "8px 18px", borderTop: "1px solid #E8EAF6", fontSize: "12px", color: "#6B7280", background: "#FAFAFA"}}>The headshot and logo slots are generic placeholders; fill them from Sportradar's image products or your own assets.</div>
</div>

<br />

### 4. Stream the Play-by-Play

<Anchor label="Game Play-by-Play" target="_blank" href="ref:g-league-play-by-play">Game Play-by-Play</Anchor> 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:

```http
GET https://api.sportradar.com/nbdl/trial/v8/en/games/5b13f219-10bf-4ff7-b91d-721a9f53600d/pbp.json
x-api-key: YOUR_API_KEY
```
```json Game Play-by-Play (json)
{
  "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:

```json Play-by-Play event (json)
{
  "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](https://developer.sportradar.com/basketball/reference/g-league-faq#event-types)

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:

<div style={{border: "1px solid #C5CAE9", borderRadius: "12px", overflow: "hidden", margin: "4px 0 8px", maxWidth: "440px"}}>
<div style={{background: "linear-gradient(90deg, #1A237E 0%, #283593 60%, #3949AB 100%)", color: "#FFFFFF", padding: "10px 18px", display: "flex", alignItems: "baseline", justifyContent: "space-between", flexWrap: "wrap", gap: "4px 12px"}}>
<span style={{fontWeight: 700, fontSize: "14px", letterSpacing: "0.02em"}}>Greensboro Swarm Shot Chart</span>
<span style={{fontSize: "12px", opacity: 0.8}}>NBA G League Finals: Game 2</span>
</div>
<div style={{padding: "10px 14px", background: "#FFFFFF"}}>
<svg viewBox="0 0 600 564" style={{width: "100%", height: "auto", display: "block"}}>
<rect x="0" y="0" width="600" height="564" fill="#FFFFFF" />
<line x1="0" y1="1.5" x2="600" y2="1.5" stroke="#C5CAE9" strokeWidth="3" />
<line x1="1.5" y1="0" x2="1.5" y2="564" stroke="#C5CAE9" strokeWidth="3" />
<line x1="598.5" y1="0" x2="598.5" y2="564" stroke="#C5CAE9" strokeWidth="3" />
<line x1="0" y1="562.5" x2="600" y2="562.5" stroke="#C5CAE9" strokeWidth="3" />
<rect x="204" y="0" width="192" height="228" fill="none" stroke="#C5CAE9" strokeWidth="3" />
<circle cx="300" cy="228" r="72" fill="none" stroke="#C5CAE9" strokeWidth="3" />
<line x1="264" y1="48" x2="336" y2="48" stroke="#C5CAE9" strokeWidth="4" />
<circle cx="300" cy="63" r="9" fill="none" stroke="#9FA8DA" strokeWidth="3" />
<path d="M 36 0 L 36 168 A 285 285 0 0 0 564 168 L 564 0" fill="none" stroke="#C5CAE9" strokeWidth="3" />
<circle cx="320" cy="105" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="239" cy="61" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="194" cy="114" r="7.5" fill="#1A237E" />
<circle cx="383" cy="356" r="7.5" fill="#1A237E" />
<circle cx="439" cy="341" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="295" cy="79" r="7.5" fill="#1A237E" />
<circle cx="307" cy="71" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="300" cy="64" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="342" cy="77" r="7.5" fill="#1A237E" />
<circle cx="292" cy="116" r="7.5" fill="#1A237E" />
<circle cx="325" cy="58" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="319" cy="59" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="17" cy="61" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="339" cy="170" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="491" cy="298" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="355" cy="203" r="7.5" fill="#1A237E" />
<circle cx="295" cy="84" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="301" cy="80" r="7.5" fill="#1A237E" />
<circle cx="255" cy="196" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="504" cy="320" r="7.5" fill="#1A237E" />
<circle cx="567" cy="222" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="58" cy="295" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="300" cy="64" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="202" cy="190" r="7.5" fill="#1A237E" />
<circle cx="111" cy="316" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="291" cy="70" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="579" cy="64" r="7.5" fill="#1A237E" />
<circle cx="448" cy="344" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="164" cy="224" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="311" cy="70" r="7.5" fill="#1A237E" />
<circle cx="269" cy="79" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="330" cy="56" r="7.5" fill="#1A237E" />
<circle cx="339" cy="187" r="7.5" fill="#1A237E" />
<circle cx="283" cy="80" r="7.5" fill="#1A237E" />
<circle cx="323" cy="86" r="7.5" fill="#1A237E" />
<circle cx="305" cy="76" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="261" cy="203" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="307" cy="67" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="88" cy="317" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="258" cy="196" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="20" cy="90" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="476" cy="322" r="7.5" fill="#1A237E" />
<circle cx="466" cy="323" r="7.5" fill="#1A237E" />
<circle cx="276" cy="81" r="7.5" fill="#1A237E" />
<circle cx="297" cy="59" r="7.5" fill="#1A237E" />
<circle cx="386" cy="99" r="7.5" fill="#1A237E" />
<circle cx="294" cy="80" r="7.5" fill="#1A237E" />
<circle cx="27" cy="184" r="7.5" fill="#1A237E" />
<circle cx="364" cy="89" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="11" cy="68" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="345" cy="126" r="7.5" fill="#1A237E" />
<circle cx="295" cy="96" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="120" cy="344" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="15" cy="111" r="7.5" fill="#1A237E" />
<circle cx="584" cy="83" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="506" cy="341" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="274" cy="90" r="7.5" fill="#1A237E" />
<circle cx="187" cy="82" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="331" cy="85" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="540" cy="276" r="7.5" fill="#1A237E" />
<circle cx="299" cy="85" r="7.5" fill="#1A237E" />
<circle cx="305" cy="83" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="525" cy="267" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="315" cy="93" r="7.5" fill="#1A237E" />
<circle cx="253" cy="175" r="7.5" fill="#1A237E" />
<circle cx="308" cy="385" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="15" cy="83" r="7.5" fill="#1A237E" />
<circle cx="267" cy="113" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="25" cy="85" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="502" cy="310" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="298" cy="79" r="7.5" fill="#1A237E" />
<circle cx="299" cy="89" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="286" cy="104" r="7.5" fill="#1A237E" />
<circle cx="398" cy="119" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="478" cy="329" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="300" cy="83" r="7.5" fill="#1A237E" />
<circle cx="295" cy="85" r="7.5" fill="#1A237E" />
<circle cx="100" cy="317" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="220" cy="178" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="283" cy="79" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="315" cy="73" r="7.5" fill="#1A237E" />
<circle cx="58" cy="258" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="217" cy="182" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="453" cy="104" r="7.5" fill="#1A237E" />
<circle cx="37" cy="230" r="7.5" fill="#1A237E" />
<circle cx="580" cy="77" r="7.5" fill="#1A237E" />
<circle cx="577" cy="150" r="7.5" fill="#1A237E" />
<circle cx="576" cy="86" r="7.5" fill="#1A237E" />
<circle cx="36" cy="233" r="7.5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="3" />
<circle cx="308" cy="98" r="7.5" fill="#1A237E" />
<circle cx="305" cy="82" r="7.5" fill="#1A237E" />
</svg>
</div>
<div style={{display: "flex", flexWrap: "wrap", gap: "8px 16px", alignItems: "center", padding: "8px 18px", borderTop: "1px solid #E8EAF6", background: "#FFFFFF"}}>
<span style={{display: "inline-flex", alignItems: "center", gap: "6px", fontSize: "12px", color: "#3B4252"}}><svg width="14" height="14" viewBox="0 0 14 14"><circle cx="7" cy="7" r="5.5" fill="#1A237E" /></svg>made (42)</span>
<span style={{display: "inline-flex", alignItems: "center", gap: "6px", fontSize: "12px", color: "#3B4252"}}><svg width="14" height="14" viewBox="0 0 14 14"><circle cx="7" cy="7" r="5" fill="#FFFFFF" stroke="#9FA8DA" strokeWidth="2" /></svg>missed (49)</span>
</div>
<div style={{padding: "8px 18px", borderTop: "1px solid #E8EAF6", fontSize: "12px", color: "#6B7280", background: "#FAFAFA"}}>The court drawing is schematic; each dot sits at its event's coordinates.</div>
</div>

<br />

### 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:

```json Play-by-Play deleted events (json)
{
  "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`.

<br />

### 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](https://developer.sportradar.com/basketball/docs/g-league-ig-update-frequencies)), and late corrections surface through the `results` section of the daily change log ([Monitoring Data Changes](https://developer.sportradar.com/basketball/docs/g-league-ig-daily-change-log)).

<br />

***

## 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

<br />

***

## 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](https://developer.sportradar.com/basketball/reference/g-league-faq#failover)