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

# Monitoring Data Changes

This scenario keeps a local store current without re-crawling: one daily feed lists every player, game, and team whose data changed that day, and targeted refetches do the rest.

This scenario is commonly used to:

* Keep a synced database of players, results, and standings current
* Catch late corrections to closed games
* Trigger profile refreshes only for players whose data actually changed

<br />

***

## Relevant Feeds

| Feed                                                                                                            | Purpose                                                       |
| --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
| <Anchor label="Daily Change Log" target="_blank" href="ref:g-league-daily-change-log">Daily Change Log</Anchor> | Everything that changed on one US Eastern day, by entity type |
| <Anchor label="Player Profile" target="_blank" href="ref:g-league-player-profile">Player Profile</Anchor>       | The refetch target for `players` entries                      |
| <Anchor label="Game Summary" target="_blank" href="ref:g-league-game-summary">Game Summary</Anchor>             | The refetch target for `schedule` and `results` entries       |
| <Anchor label="Standings" target="_blank" href="ref:g-league-standings">Standings</Anchor>                      | The refetch target for `standings` entries                    |

<br />

***

## High-Level Workflow

**Pull the day's log → refetch only what it lists → update the store**

<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"}}>Daily Reconciliation Loop</span>
    <span style={{fontSize: "12px", opacity: 0.8}}>One pull, four sections, targeted refetches</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}}>Pull daily</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 Change Log</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, fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", whiteSpace: "nowrap"}}>players</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"}}>schedule</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"}}>results</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"}}>standings</span>
    </div>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>Refetch</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"}}>Player Profile</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 #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontSize: "12.5px", fontWeight: 600, fontFamily: "SFMono-Regular, Menlo, Consolas, monospace", whiteSpace: "nowrap"}}>Standings</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #E8EAF6", background: "#FAFAFA", color: "#6B7280", fontSize: "12px", whiteSpace: "nowrap"}}>only entities the log lists</span>
    </div>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>Store</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #070D44", background: "#070D44", color: "#FFFFFF", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap"}}>local store</span>
      <span style={{display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #E8EAF6", background: "#FAFAFA", color: "#6B7280", fontSize: "12px", whiteSpace: "nowrap"}}>skip entries whose last_modified you already hold</span>
    </div>
  </div>
  <div style={{padding: "8px 18px", borderTop: "1px solid #E8EAF6", fontSize: "12px", color: "#6B7280", background: "#FAFAFA"}}>Past dates stay queryable: on recovery from downtime, walk the missed Eastern days in order.</div>
</div>

<br />

***

## Integration Steps

<br />

### 1. Pull the day's changes

<Anchor label="Daily Change Log" target="_blank" href="ref:g-league-daily-change-log">Daily Change Log</Anchor> takes a date and returns what changed that day, grouped by entity type. A mid-season day, reduced to two entries per section:

```http
GET https://api.sportradar.com/nbdl/trial/v8/en/league/2026/01/15/changes.json
x-api-key: YOUR_API_KEY
```
```json Daily Change Log (json)
{
  "league": {
    "id": "ac79301f-9b1a-4e72-a4cb-230d4418ae08",
    "name": "NBA G League",
    "alias": "NBDL"
  },
  "start_time": "2026-01-15T05:00:00Z",
  "end_time": "2026-01-16T04:59:59Z",
  "players": [
    {
      "id": "052a06be-1070-461b-9f5a-9eea0196390f",
      "full_name": "Pierre Crockrell II",
      "last_modified": "2026-01-15T06:21:35+00:00",
      "reference": "1642623"
    },
    {
      "id": "1cda8bbe-b118-4619-92e0-eb5e3c357b1b",
      "full_name": "Rahsool Diggins",
      "last_modified": "2026-01-15T15:01:40+00:00",
      "reference": "1643323"
    }
  ],
  "schedule": [
    {
      "id": "01184287-a093-4dec-af91-5ea761c40a8e",
      "season_id": "fea41a6e-80d4-4756-bfea-37c7b347a21a",
      "last_modified": "2026-01-16T03:32:58+00:00"
    },
    {
      "id": "1589082c-c8a8-4beb-8413-337ac35b1183",
      "season_id": "fea41a6e-80d4-4756-bfea-37c7b347a21a",
      "last_modified": "2026-01-16T03:25:36+00:00"
    }
  ],
  "results": [
    {
      "id": "8c35068f-b5ec-45b0-88a3-734af16e0d88",
      "season_id": "fea41a6e-80d4-4756-bfea-37c7b347a21a",
      "last_modified": "2026-01-15T23:07:43+00:00"
    },
    {
      "id": "1649a800-b545-459c-a386-ce5c86fc22ca",
      "season_id": "fea41a6e-80d4-4756-bfea-37c7b347a21a",
      "last_modified": "2026-01-16T03:18:38+00:00"
    }
  ],
  "standings": [
    {
      "id": "035ebd2d-69d9-4d73-a4b3-519f78071975",
      "name": "Blue",
      "market": "Oklahoma City",
      "last_modified": "2026-01-15T05:38:31+00:00"
    },
    {
      "id": "0a3d428b-572a-4a94-b716-8c1297c53d8e",
      "name": "Lakers",
      "market": "South Bay",
      "last_modified": "2026-01-16T04:15:05+00:00"
    }
  ]
}
```

The `start_time` and `end_time` window is one **US Eastern day** expressed in UTC (see [G League API Basics](https://developer.sportradar.com/basketball/docs/g-league-ig-api-basics)). The sections:

* `players`: players whose profile data changed, with `id`, `reference`, and `last_modified`
* `schedule`: games whose scheduling data changed, each carrying its `season_id`
* `results`: games whose result data changed (including post-game corrections), each carrying its `season_id`
* `standings`: teams whose standings rows moved

Sections appear only when they hold entries: an off-season day can carry `players` alone. The <Anchor label="Daily Change Log" target="_blank" href="ref:g-league-daily-change-log">reference page</Anchor> describes change coverage across teams, players, game statistics, schedules, and standings, so parse the response by the sections present rather than expecting a fixed set.

<br />

### 2. Refetch what changed

Each section maps to one refetch target:

| Section     | Refetch                                                                                                                                                                                                                                              |
| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `players`   | <Anchor label="Player Profile" target="_blank" href="ref:g-league-player-profile">Player Profile</Anchor> per listed ID                                                                                                                              |
| `schedule`  | <Anchor label="Game Summary" target="_blank" href="ref:g-league-game-summary">Game Summary</Anchor> per listed ID, or the season's <Anchor label="Schedule" target="_blank" href="ref:g-league-schedule">Schedule</Anchor> on bulk days              |
| `results`   | <Anchor label="Game Summary" target="_blank" href="ref:g-league-game-summary">Game Summary</Anchor> (and <Anchor label="Game Play-by-Play" target="_blank" href="ref:g-league-play-by-play">Play-by-Play</Anchor> if you store events) per listed ID |
| `standings` | <Anchor label="Standings" target="_blank" href="ref:g-league-standings">Standings</Anchor> once per affected season type                                                                                                                             |

Use each entry's `last_modified` against your stored state to skip work you have already done.

<br />

### 3. Expect quiet days to stay small

The feed works year-round. An off-season day often carries only a handful of player edits, as on this July date:

```http
GET https://api.sportradar.com/nbdl/trial/v8/en/league/2026/07/21/changes.json
x-api-key: YOUR_API_KEY
```
```json Daily Change Log (off-season, json)
{
  "league": {
    "id": "ac79301f-9b1a-4e72-a4cb-230d4418ae08",
    "name": "NBA G League",
    "alias": "NBDL"
  },
  "start_time": "2026-07-21T04:00:00Z",
  "end_time": "2026-07-22T03:59:59Z",
  "players": [
    {
      "id": "4d0302c4-fed2-4c93-a015-8e261f211416",
      "full_name": "Jalen Wilson",
      "last_modified": "2026-07-21T12:41:00+00:00",
      "reference": "1630592"
    },
    {
      "id": "60b42c4f-a2c6-4e0b-b3bf-cab0ae77ad66",
      "full_name": "Tyler Smith",
      "last_modified": "2026-07-21T12:14:21+00:00",
      "reference": "1641890"
    },
    {
      "id": "d92d5542-8f7e-46b7-82fb-e0a77047c966",
      "full_name": "Taelon Peter",
      "last_modified": "2026-07-21T12:17:53+00:00",
      "reference": "1643007"
    },
    {
      "id": "e1b305ff-bc34-4763-94b6-da8f980c2c43",
      "full_name": "Jett Howard",
      "last_modified": "2026-07-21T12:09:03+00:00",
      "reference": "1641724"
    }
  ]
}
```

<br />

### 4. Backfill missed days

Past dates remain queryable long after the fact, so an integration that was down for a day pulls the missed dates on recovery rather than re-crawling the league.

<br />

***

## Common Use Cases

Typical builds on this workflow include:

* A nightly sync job: pull the change log after the Eastern day ends, refetch per section, sleep
* A corrections monitor that re-pulls closed games listed under `results`
* A profile cache invalidated per player from the `players` section

<br />

***

## Best Practices

* Pull once daily after the Eastern day closes, plus every few hours intraday if you need same-day corrections
* Refetch only listed entities; the change log's purpose is to make full re-crawls unnecessary
* On recovery from downtime, walk the missed dates in order before resuming the daily cadence
* Pair with [Daily Transfers](https://developer.sportradar.com/basketball/docs/g-league-ig-rosters) for roster movement; the change log tracks data edits, while transfers track transactions