Update Frequencies
Every response carries a cache-control: max-age header: the feed's TTL, meaning how long that payload may be served from cache before a fresh copy is available. A TTL is a cache floor, not a polling recommendation: poll at the cadence your product needs, and read the header on the responses you actually receive.
Frequency Chart
Several feeds are state-dependent, with the tiers shown. The recommended-pull columns are recommendations, not limits.
| Feed | TTL (cache) | Data updates | Recommended pull (non-live) | Recommended pull (live) |
|---|---|---|---|---|
| Daily Change Log | 15 minutes (current day); 1 hour (current month); 4 hours (current year); 12 hours (past years) | As entities change during the day | Every hour or less, depending on your use case | Not applicable |
| Daily Schedule | 10 minutes | As that date's games change and complete | Every hour or less during the current day, depending on your use case | Not applicable |
| Daily Transfers | 2 hours | As transactions post | Every hour or less, depending on your use case | Not applicable |
| Free Agents | 4 hours | On player movement | Every hour or less, depending on your use case | Not applicable |
| Game Boxscore | 1 minute (scheduled); 2 seconds (in progress); 10 minutes (recently closed); 4 hours (more than seven days after closing) | Continuously during play | As needed; the feed can be ignored until 10 minutes before the scheduled start, with the daily change log capturing post-game changes | As fast as the response TTL allows while a game is live; begin requesting 10 minutes before the scheduled start |
| Game Play-by-Play | 1 minute (scheduled); 2 seconds (in progress); 10 minutes (recently closed); 4 hours (more than seven days after closing) | Continuously during play | As needed; the feed can be ignored until 10 minutes before the scheduled start, with the daily change log capturing post-game changes | As fast as the response TTL allows while a game is live; begin requesting 10 minutes before the scheduled start |
| Game Summary | 1 minute (scheduled); 2 seconds (in progress); 10 minutes (recently closed); 4 hours (more than seven days after closing) | Continuously during play | As needed; the feed can be ignored until 10 minutes before the scheduled start, with the daily change log capturing post-game changes | As fast as the response TTL allows while a game is live; begin requesting 10 minutes before the scheduled start |
| Injuries | 2 hours | Injury reporting is not included in G League coverage | Not applicable | Not applicable |
| League Hierarchy | 4 hours | On league structure changes | Daily or less, depending on your use case | Not applicable |
| League Leaders | 15 minutes | After games close | As needed; the daily change log captures post-game changes | 20 to 25 minutes after a game closes |
| Player Profile | 15 minutes (active players); 12 hours (retired players) | On player changes; statistics after games close | As needed; the daily change log captures post-game changes | 5 to 10 minutes after a game closes |
| Rankings | 15 minutes | After games close | As needed | 30 to 90 minutes after the day's final game closes |
| Schedule | 10 minutes | As games are scheduled, moved, or completed | Every hour or less, depending on your use case; use the game feeds for live status | Not applicable |
| Seasonal Statistics | 15 minutes | After games close | As needed; the daily change log captures post-game changes | 5 to 10 minutes after a game closes |
| Seasons | 4 hours | When seasons are added or dated | As needed | Not applicable |
| Series Schedule | 5 minutes (series with active games); 12 hours (otherwise) | As series are created and decided | As needed | Every hour or less; use the game feeds for live status |
| Series Statistics | 4 hours | After series games close | As needed; the daily change log captures post-game changes | 5 to 10 minutes after a game closes |
| Standings | 10 minutes | After games close | Every hour or less, depending on your use case | 2 to 5 minutes after a game closes |
| Team Profile | 4 hours | On roster or staff changes | Every hour or less, depending on your use case | Not applicable |
| Teams | 4 hours | On team changes | As needed | Not applicable |
TTLs Are Cache FloorsA 10-minute TTL on Standings means a fresh table can be available every 10 minutes, not that you need one that often: a standings page refreshed after each game day is fully current. Conversely, the 2-second in-progress TTL on the game feeds is a ceiling on freshness, not a mandate to poll that fast; poll live games at the cadence your product needs and let the header on each response guide you.
Reading TTL from Responses
Every response states its own TTL:
HTTP/1.1 200 OK
cache-control: public, max-age=601The value is in seconds (601 is the 10-minute tier). The header on each response is definitive for that feed.
The Change-Log Window
The Daily Change Log and Daily Transfers cover one US Eastern day each (see G League API Basics for the exact window boundaries), and past dates remain queryable. A daily pull of the change log, plus targeted refetches of what it lists, keeps a store current without re-crawling; the workflow is on the Monitoring Data Changes page.
Best Practices
- Read
cache-controlon every response rather than hardcoding TTLs; values differ by feed and can differ by game state - Poll standings-family feeds after game days, not on a timer during idle hours
- During live games, poll the game-scoped feeds for the games you track rather than the full Daily Schedule
- Use the Daily Change Log as the trigger for off-cycle refreshes of profiles, results, and standings
Updated about 14 hours ago
