Appearance
Changelog
Upcoming
These changes are released and will appear in newly processed games, but not yet backfilled for all games.
Added
- New
ball_handler_loc_x,ball_handler_loc_y, andattacking_positive_x_basketfields on Advantage Creation 1v1 data set - Location coordinates of the ball handler at the start frame, along with a flag indicating which basket the offensive team is attacking - New
screener_loc_x,screener_loc_y,ball_handler_loc_x,ball_handler_loc_y, andattacking_positive_x_basketfields on Ball Screens data set - Location coordinates of the screener and ball handler at the screening frame, along with a flag indicating which basket the offensive team is attacking - New screen detail fields on Ball Screens data set -
screener_hoop_distance,screener_defender_hoop_distance_screen_start,screener_defender_hoop_distance_max,screener_defender_hoop_distance_diff,screener_defender_hoop_distance_max_diff,was_screener_defender_in_3pt_area_at_screen,did_ball_get_behind_screener_defender,screener_hoop_distance_min,ball_hoop_distance_min,ballhandler_outcome,screener_outcome,did_ballhandler_pass_to_screener,screen_distance_to_center_court,screen_distance_to_baseline, anddid_ballhandler_dribble_after_screenfor richer screen context and outcomes (distances in feet) - New Off Ball Screens data set
- New
chance_id_ctgandpossession_id_ctgfields on Ball Screens and Off Ball Screens data sets - CTG-generated identifiers linking each screen event to its parent chance and possession
Changed
- Consecutive Chances no longer share the same start and end frame - When one chance ends and another begins immediately (rebounds, loose ball fouls, live ball turnovers), the new chance now starts one frame later to avoid frame overlap between consecutive chances.
- Ball Screens end-frame timing now caps at ball-handler touch end - Ball screen windows now end no later than the end of the ball-handler possession touch that contains the screening frame, which prevents screen windows from lingering after the on-ball action has ended.
Fixed
- Switch + roll handling in Ball Screens data set - In cases where a player set a ball screen, the defense switched, and then the screener rolled, they would sometimes end up facing the switched defender which would trigger our ball screen model to think they were setting a new screen. We have added more safeguards to better handle these cases.
- Inbound possession touch robustness on Possession Touches data set - Improved handling of rare edge cases in inbound timing and touch boundary selection so outputs are more stable and consistent in ambiguous tracking/event scenarios.
- Hoop-relative field accuracy across multiple data sets - Several hoop-relative measurements (rim distance, shot angle, contest distance, etc.) were occasionally computed against the wrong basket due to reliance on Hawk-Eye's
attacking_positive_xfield, which can be inaccurate at times. Basket side is now determined from a stable period- and team-level source, making these calculations consistent across Jump Shots, Jump Shot Contests, Free Throws, Shots, Interior Shot Contests, Closeouts, Contested Rebounds, and Jumps. Hoop-relative fields on Jumps will now returnnullwhen no reliable team context is available within 5 seconds of the jump, rather than returning a value computed against a potentially incorrect basket. - Period assignment on Rebounds data set - Fixed a bug where rebounds sometimes had incorrect period values in very rare cases at the end of periods; this had downstream effects on chance start and end frames.
- Shot end frame calculation on Shots data set - Previously, when two shots occurred close together (e.g. blocked shots and putback shots), the end frame was incorrectly assigned to the end frame of the subsequent shot. We now cap shot end frames to the frame before the next shot starts in these cases.
- Chance start timing (2D fallback) on Chances data set - During inbounds (particularly after long stoppages), ball and limb tracking can be highly error prone. Previously, we were using the first time we detected the inbounder touching the ball as the start of the chance in these cases, however in cases with bad upstream data this meant chances were starting later than they should have. This change makes it so we now use a 2D-based fallback to compensate in these situations, looking for when the ball is close to the inbounder's body. This may start chances too early sometimes, but this seems to be a more tolerable error than starting them too late.
- Turnover frame timing on Chances data set - We found some cases where chance ends were incorrect on certain types of live ball turnovers. We have implemented a fix that should lower the error rate.
- Inbound attempt deflected out of bounds included in Chances data set - When the ball is deflected out of bounds during an inbound (e.g. batted away before the pass is caught), we previously would miss categorizing these as chances. We now correctly treat this as a chance-ending stoppage. The chance end time aligns to the out-of-bounds event, and these sequences are handled consistently with other stoppages.
- Clock flicker filtering on Chances data set - Added robustness to erroneous upstream clock stop/start flicker events by treating brief stop-then-start pairs (within 1 second) as noise and filtering them out.
- Touch outcome for passes near lost-ball turnovers on Possession Touches data set - In some cases a pass we detected was actually part of a lost-ball turnover (e.g., ball batted away). We now prefer to assign the touch outcome as a turnover when a lost-ball turnover by the same player occurs within about 1 second of the pass, so the outcome matches the official result.
[0.2.1-alpha] - 2026-02-17
Changed
- Improved accuracy of
height,wingspan,right_arm_length, andleft_arm_lengthcalculations on Anthro Measurements data set - Calibrated measurement constants using NBA Combine data to account for HawkEye skeleton changes in the 2025-26 season
[0.2.0-alpha] - 2026-01-13
Added
- New Ball Screens data set
- New Advantage Creation 1v1 data set
- New Possession Touches data set
- New After Shot Positioning data set - this captures information on how offensive players are moving after each shot, including whether they were positioning for an offensive rebound
- New
chance_id_ctgfield on Jumps data set - CTG-generated identifier linking each jump to the chance during which it occurred - New
chance_id_ctgfield on Drives data set - CTG-generated identifier linking each drive to the chance during which it occurred - New
game_id_nbaparameter on/game_statusendpoint - Standardize NBA game ID naming togame_id_nba - New
game_id_nbaparameter on/markingsendpoint - Standardize NBA game ID naming togame_id_nba - New
game_id_nbafield in/game_statusresponse - Consistent NBA game ID naming in response body - New
game_id_nbafield in/markingsresponse - Consistent NBA game ID naming in response body - New
seasonparameter on/game_statusendpoint - Filter games by NBA season (e.g.,season=2025for the 2025-26 season)
Deprecated
nba_game_idparameter on/game_statusendpoint - Usegame_id_nbainsteadnba_game_idparameter on/markingsendpoint - Usegame_id_nbainsteadnba_game_idfield in/game_statusresponse - Usegame_id_nbainsteadnba_game_idfield in/markingsresponse - Usegame_id_nbainstead
[0.1.0-alpha] - 2026-01-08
Added
- Initial creation of the CTG Pro Data Feed API documentation
- New
is_live_ball_reboundfield on Rebounds data set - Indicates whether the rebound was secured as a live ball (not a team rebound or out of bounds). This is a clearer name for what was previouslyis_rebounded - New
offense_playersanddefense_playersfields on Chances data set - Arrays of NBA player IDs for the five players on offense and defense during each chance - New context and outcome fields on Chances data set -
in_garbage_time(indicates if chance occurred during garbage time),shot_location(court zone where shot was taken),is_shot_made,is_shot_blocked,is_shooter_fouled, andled_to_offensive_rebound(shot outcome indicators) - New statistical fields on Chances data set -
fga_pts(points scored on field goal attempt),fgm,fga,ftm,fta,tov,fg_dreb, andfg_oreb(four factors and basic statistics) - Standardized field names across markings data sets for consistency:
- New
game_id_nbafield on Passes, Deflections, Dribbles, Contested Rebound Touches, Anthro Measurements, Free Throws, Falls - Consistent NBA game ID naming - New
player_id_nbafield on Dribbles, Contested Rebound Touches, Anthro Measurements, Free Throws, Falls - Consistent NBA player ID naming - New
passer_id_nbaandintended_receiver_id_nbafields on Passes - Correct suffix for NBA player IDs - New
def_player_id_nbaandoff_player_id_nbafields on Deflections - Added missing_nbasuffix - New
pbp_event_idfield on Shots, Jump Shots, Jump Shot Contests, Interior Shots, Interior Shot Contests, Rebounds, Fouls, Turnovers - Consistent PBP event ID naming - New
set_point_he_frame,last_ball_in_hands_he_frame,last_ball_in_hands_wall_clock,first_shooting_wrist_below_eye_after_release_he_frame,first_shooting_wrist_below_eye_after_release_wall_clock,first_non_shooting_wrist_below_eye_after_release_he_frame,first_non_shooting_wrist_below_eye_after_release_wall_clockfields on Free Throws - Aligned naming with Jump Shots - New
possession_id_ctgfield on Chances data set - CTG-generated possession ID that links chances to their parent possession, enabling grouping of chances that belong to the same possession (e.g., after offensive rebounds)
- New
Changed
- New
heaveoption added tochance_outcomeon Chances data set - Indicates an official heave
Deprecated
is_reboundedon Rebounds - Useis_live_ball_reboundinstead. The old field name was confusing; the new name better describes the field's purposeattacking_positive_xon Rebounds - This information is not particularly accurate and not useful in this data setevent_pbp_descriptoron Rebounds - This field is alwaysnulland provides no valueevent_pbp_qualifierson Rebounds - This information is redundant with other fields in the responseattacking_positive_xon Fouls - This information is not particularly accurate and not so useful in this data setevent_pbp_foul_personal_totalon Fouls - This data is already available in the official NBA play-by-play feedevent_pbp_foul_technical_totalon Fouls - This data is already available in the official NBA play-by-play feedattacking_positive_xon Turnovers - This information is not particularly accurate and not useful for analyzing turnover eventsevent_pbp_descriptoron Turnovers - This information is not particularly useful for analyzing turnover eventsevent_pbp_qualifierson Turnovers - This information is not useful for analyzing turnover eventsevent_pbp_turnover_totalon Turnovers - This data is already available in the official NBA play-by-play feed- Deprecated field names replaced by standardized versions (all retain backward compatibility):
nba_game_idon Passes, Deflections, Dribbles, Contested Rebound Touches, Anthro Measurements, Free Throws, Falls - Usegame_id_nbainsteadnba_player_idon Dribbles, Contested Rebound Touches, Anthro Measurements, Free Throws, Falls - Useplayer_id_nbainsteadpasser_id_ctgandintended_receiver_id_ctgon Passes - Usepasser_id_nbaandintended_receiver_id_nbainsteaddef_player_idandoff_player_idon Deflections - Usedef_player_id_nbaandoff_player_id_nbainsteadevent_pbp_idon Shots, Jump Shots, Jump Shot Contests, Interior Shots, Interior Shot Contests, Rebounds, Fouls, Turnovers - Usepbp_event_idinsteadset_point_frame,release_frame,release_wall_clock,first_frame_shooting_wrist_below_eye,shooting_wrist_below_eye_wall_clock,first_frame_non_shooting_wrist_below_eye,non_shooting_wrist_below_eye_wall_clockon Free Throws - Use standardized names matching Jump Shotsgame_clock_runningon Turnovers - This field is unreliable and not particularly useful for analyzing turnover events
shot_clock_runningon Turnovers - This field is unreliable and not particularly useful for analyzing turnover eventsgame_clock_runningon Fouls - This field is unreliable and not particularly useful for analyzing foul eventsshot_clock_runningon Fouls - This field is unreliable and not particularly useful for analyzing foul events
Format and Versioning
The changelog format is based on Keep a Changelog.
It includes the following types of changes:
- Added - New data sets, fields, or API features
- Changed - Changes to existing data or behavior (may be breaking)
- Deprecated - Features that will be removed in future versions
- Removed - Features that have been removed
- Fixed - Bug fixes in data accuracy or API behavior
The API follows Semantic Versioning (SemVer). Version numbers are formatted as MAJOR.MINOR.PATCH with optional pre-release labels:
| Component | When It Changes | Example |
|---|---|---|
| MAJOR | Breaking changes that require client updates | 1.0.0 → 2.0.0 |
| MINOR | New features added in a backward-compatible way | 1.0.0 → 1.1.0 |
| PATCH | Bug fixes that don't change the API contract | 1.0.0 → 1.0.1 |
Pre-release Labels
- alpha - Early development; API may change significantly between releases
- beta - Feature complete; API is stabilizing but may still have minor changes
- rc (release candidate) - Final testing before stable release
Versioning Policy
- 0.x.x versions: The API is in active development. Breaking changes may occur between minor versions. We will notify you before this occurs.
- 1.0.0 and beyond: The API is stable. Breaking changes will only occur in major version bumps, with advance notice in the changelog.
