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
Relevant Feeds
| Feed | Purpose |
|---|---|
| Daily Change Log | Everything that changed on one US Eastern day, by entity type |
| Player Profile | The refetch target for players entries |
| Game Summary | The refetch target for schedule and results entries |
| Standings | The refetch target for standings entries |
High-Level Workflow
Pull the day's log → refetch only what it lists → update the store
Integration Steps
1. Pull the day's changes
Daily Change Log takes a date and returns what changed that day, grouped by entity type. A mid-season day, reduced to two entries per section:
GET https://api.sportradar.com/nbdl/trial/v8/en/league/2026/01/15/changes.json
x-api-key: YOUR_API_KEY{
"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). The sections:
players: players whose profile data changed, withid,reference, andlast_modifiedschedule: games whose scheduling data changed, each carrying itsseason_idresults: games whose result data changed (including post-game corrections), each carrying itsseason_idstandings: teams whose standings rows moved
Sections appear only when they hold entries: an off-season day can carry players alone. The reference page 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.
2. Refetch what changed
Each section maps to one refetch target:
| Section | Refetch |
|---|---|
players | Player Profile per listed ID |
schedule | Game Summary per listed ID, or the season's Schedule on bulk days |
results | Game Summary (and Play-by-Play if you store events) per listed ID |
standings | Standings once per affected season type |
Use each entry's last_modified against your stored state to skip work you have already done.
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:
GET https://api.sportradar.com/nbdl/trial/v8/en/league/2026/07/21/changes.json
x-api-key: YOUR_API_KEY{
"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"
}
]
}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.
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
playerssection
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 for roster movement; the change log tracks data edits, while transfers track transactions
Updated about 16 hours ago
