Appearance
Changelog
Upcoming
Added
Added
screen_start_screener_loc_xandscreen_start_screener_loc_yon Independent Ball Screens pick and handoff rows where screener start tracking is available. Values populate as games are reprocessed; older rows may still be null.Added
is_offense_lineup_inferredandis_defense_lineup_inferredto Chances. If tracking loses a player who is on the court, we now fill them intooffense_playersordefense_playersfrom the play-by-play and set the matching flag totrue.Added
saved_playlist_idto each successful entry in the Video API's save-to-usersresults(/save_playlist_for_usersand save while creating), so you get the Film Room ID for each user's copy without opening CTG Pro.Added
game_id_nbaas an accepted game identifier on the Video API's/clip,/period, and/flag_clipendpoints and in CSV playlist rows, so games with an NBA game ID can be requested with the same ID as the data feed without first looking up the videogame_id. Agame_id_nbawith no video returns404. See Game IDs.Added
POST /save_playlist_for_usersto the Video API, which saves a copy of a playlist to the saved playlists of the users you list in your organization, so a playlist created through the API appears in each person's CTG Pro without them opening its link and saving it. Each user gets their own copy. The/create_playlistmethods also acceptplaylist_name,user_emails, andcollaborativeto do this while creating the playlist.Added
wall_clock_timing_availabletovideo_metricson the Video API's/available_game_periods, telling you whether a period's clips can be requested by timestamp or only by game clock, and a matchingwall_clock_timing_availablefilter. Use it in place of the league to choose betweenstart_timestampandstart_game_clockon/clip.Added Deflections, Jump Shot Contests, and Interior Shot Contests to the in-game
delayedupdates, so they no longer arrive only at the end of the game. During the game, the contest data sets carry the fields measured at release and at the shooter's jump start, such as each contester's hand-to-ball distance, and the contester's jump fields, such asjump_timinganddid_contester_jump. The fields measured at the first touch or at minimum hip height, and the hand-to-ball distances after release, arenulluntil the end-of-game update. See Live Data.Added Ball Screens, Closeouts, and 1v1 Advantage Creation to the in-game
delayedupdates, so they no longer arrive only at the end of the game. During the game, each event has its players, such as the ball handler and their defender and, for ball screens, the screener and the screener's defender, along with its frames and its game and shot clocks. The detail fields, such as ball screen switch types, closeout results, and each event's outcome, arenulluntil the end-of-game update. During the game,drive_contexton Drives and the ball screen and handoff timing fields on Passes now have their values too. See Live Data.Added
available_marking_typesto the/markingsresponse: the marking types that the response's snapshot contains, so an empty list can be read as "none occurred" or "not produced yet". See Response Structure.Added JSON error bodies, with the message under
error, for an unknown URL under/pro/(404), a wrong HTTP method (405), and server errors (500) on/game_status,/markings, and the entity endpoints. Status codes are unchanged.Added the message under
errorto authorization errors (403), so every error uses the same key. Theresultkey remains with the same message.Added a
400error to/entities/gamesfor afrom_dateorto_datethat is not aYYYY-MM-DDdate.Added non-NBA clubs that play NBA preseason games, such as the London Lions, to
/entities/teamsunder league00. Games against these clubs now get live and postgame markings like other preseason games. Their players do not yet appear in/entities/players, so theirplayer_id_nbavalues in markings have no matching player record.Added
events_sourceto the/game_statusresponse, telling you whether a game's markings were built with the live events feed (live: everydelayedrow, and interimprocessedmarkings) or the official postgame events feed (postgame, final). Aprocessedgame can now be published twice, andctg_last_updatedchanges with the final publication. See Game Status.Added G League (
league_id=20) to the game, player, and team entity endpoints,/game_status, and/markings. Requests without a league filter continue to return NBA data only. See Leagues.Added the
complete_with_issuesvalue todata_quality_statuson/game_status, and animpactfield (minorordegrading) to each entry inissues. A game whose only problems are minor, such as a few seconds of missing tracking at the end of a period or fewer than 10 events missing from the HawkEye feed, now reportscomplete_with_issuesinstead ofdegraded, and still lists those problems inissues.
Changed
- Updated the method for calculating whether an action led to an event on the chance. Previously, off ball screens that occurred after ball screens would "take credit" for the final event. Now, if there is an active ball screen, we defer to that as the action that led to the event. We also allow brief gaps in pressure to keep the advantage from the ball screen alive to better tolerate situations where the ball is only briefly stopped but the defense is still in rotation.
- Changed
player_id_nbaon Fouls to benullfor a technical foul on a coach. It used to carry the coach's NBA person ID, which is not a player ID. - Changed
delayedgames to appear on/game_statusasin_progressabout 10 minutes before the real tip, earlier than the previous 2 minutes./markingsstill returns404for the game until the first live update, about 2 minutes after the tip, so clients must keep handling404from/markingswhile a game isin_progress. See Live Data. - Changed Chances that end with an offensive foul to report
chance_outcomeasdeadball_turnover, the turnover every offensive foul carries.offensive_foulis no longer achance_outcomevalue, so filters or counts that used it should usedeadball_turnover. - Changed
data_quality_statuson/game_statusso that short gaps in tracking in the middle of a period count as minor, as gaps at the end of a period already did. A game with a few seconds of missing tracking mid-game now reportscomplete_with_issuesinstead ofdegraded. Missing tracking makes a gamedegradedonly when all of its gaps together cover a large part of the game. Games already published keep their status until CTG reprocesses them. - Changed the Video API's
/available_game_periodsto return exactly onevideo_metricsentry for each period in every league, withhas_precise_frame_alignmentnow set for G League and Summer League games too.reliabilityandfirst_timeare nownullfor periods aligned to tracking data, because they only describe clips matched by the on-screen clock. G League and Summer League periods aligned to tracking data but with no on-screen clock reading are now listed; they were previously left out. - Changed the Video API's
/clipto return a400error that namesstart_game_clockwhen a request sends onlystart_timestampfor a period whosewall_clock_timing_availableisfalse. These requests previously failed with a generic error. - Changed the Video API's
/periodto return a404error when the requested period has no video file. It previously returned a URL that failed when opened. - Changed the Video API's
/available_game_periodsto sort results by game date, oldest first. Results were previously sorted by videogame_id, which did not follow date order. - Started publishing quality verdicts (
data_quality_statusandissues) on/game_statusfor games processed from 2026-10-08. Games processed earlier showcompleteuntil CTG reprocesses them.data_quality_statusiscomplete,complete_with_issues, ordegraded.
Deprecated
- Deprecated
seasonandseason_typeon Transition Opportunities and Transition Opportunities: Player. Both fields remain in responses for now. Removal is planned during a later backfill. Usegame_id_nbawith the Games endpoint to get season information. That endpoint uses NBA season types such asRegular SeasonandPlayoffs.
Fixed
- Touches around fouls and stoppages on Possession Touches - fixed rare cases where some touches ran on through a foul, timeout, or other stoppage. If the same player had a touch before the whistle and also the first touch on the inbound pass or catch after it, we could sometimes combine these. A new touch now starts after every dead ball.
- Final chance after restored time on Chances - fixed missing last chances and possessions in periods where officials put time back on a clock that had already reached zero, such as an inbound and buzzer heave after a review and free throws. These chances now end when the clock stops for the last time and the
chance_outcomeis correctly labeledend_period. - Rebound shot links on Rebounds - fixed rebounds being linked to the wrong missed shot. This mostly affected rebounds after a blocked shot, which could link to an earlier miss instead of the blocked one, and rebounds after an end-of-period heave, which linked to the last miss before it.
shot_id_ctgandshot_chance_id_ctgnow point to the correct shot, and arenullafter a heave (since it is not counted as an actual field goal attempt). - Improved zone-defense detection on Chances -
defense_starts_in_zonehad a higher rate of false positives than anticipated, particularly for games and teams without much zone. We have retrained this model to better handle scramble situations that were incorrectly being labeled as zone as well as better handle games where the defense did not play much (if any) zone. - Out-of-bounds plays on Chances - fixed chances that start when the ball goes out of bounds being credited to the team that had the ball earlier in the play, such as the shooting team after the defense rebounded and the ball went out, mostly in 2026-27 games. These chances now go to the team that inbounds, and a chance that ends with the ball out of bounds is
out_of_bounds_retainwhen its own team inbounds next. Short chances that end at a clock stop with no play-by-play event get a newchance_id_ctgwhen their offensive team changes. - Inbound starts and IDs of Chances - fixed chances after a dead ball that looked for the inbound from the wrong team, which could start a chance several seconds early, while the other team still had the ball. A chance that ends at a stoppage or clock stop with no play-by-play event now takes its
chance_id_ctgfrom its offensive team rather than the team the tracking feed credited, so some of these chances get a newchance_id_ctgwhen a game is reprocessed, and theprevious_chance_id_ctgandnext_chance_id_ctgthat point to them change with it. - Violation locations on Violations - fixed
loc_xandloc_yreported at center court, andregionalwaysbackcourt, for every violation with a location. Violations are now placed at the violating player's position, and those without aviolation_he_framekeepnulllocations and regions. - Chance order around simultaneous events on Chances - fixed chances built from events in the wrong order when the tracking feed's timestamps disagreed with the official play-by-play, such as a putback paired with the wrong rebound or a turnover placed after the timeout that followed it. Chances now follow the play-by-play sequence, except that a play re-entered after a coach's challenge stays ahead of the challenge timeout.
- Inbound turnovers on Chances - fixed chances that were missing, or placed in the live play before the stoppage, when the inbounding team turned the ball over on the inbound itself, such as throwing it out of bounds or a 5-second violation, often right after a timeout. These inbound attempts now get their own chance, credited to the inbounding team, from when the inbounder got the ball to the turnover. Also fixed rare turnovers after a timeout that tracking placed in the live play before the timeout; on Turnovers they now fall in the dead ball after it.
- Swapped putback frames on Shots - fixed cases where a missed shot and the same player's putback right after it had their release frames swapped, which could also leave the putback out of chance and possession points.
- Live make probabilities on Shots - fixed live shots whose make probabilities stayed
nullfor the rest of the game after the league re-published the play-by-play times of an earlier period. These shots now get their make probabilities in live markings once their tracking has arrived, like other shots. - End frames of foul-ending Chances - fixed chances that ended well before or after their foul, sometimes minutes away, when the game clock showed the same time at another stoppage or the play-by-play clock disagreed with tracking. Foul-ending chances now end when the clock stops for the foul, including fouls right after an inbound when the clock ran too briefly to change.
- Chances after free throws on Chances - fixed chances that started from the inbound or rebound of free throws from a different dead ball, often only a few seconds earlier or later, such as a foul shortly after a made free throw. These chances could be incorrectly placed leading to downstream effects.
- Missing frames on Fouls - filled
foul_he_framefor fouls whose Hawk-Eye event has no frame, which includes every personal and offensive foul before the 2025-26 regular season, using the last frame before the game clock stops. These fouls now also have locations and court regions.foul_wall_clockremainsnullfor them. - Court regions of shooting and offensive fouls on Fouls - fixed
regionandfouled_player_regionmeasured against the wrong basket when the tracking feed credited possession to the fouling team, which placed some shooting fouls in the backcourt. - Teams on Fouls, Violations, and Challenges - fixed
possession_team_id_nbaon fouls andoffensive_team_id_nbaanddefensive_team_id_nbaon violations when the upstream data feeds credited possession to the wrong team, which happened very frequently on 2026-27 preseason data. - Continued releases after shooting fouls on Shots - fixed a situation where missed shots where the player was fouled could use an incorrect shot frame when the ball was released after the whistle.
- Made shots missing from Chances and Possessions points - fixed rare cases where a made shot was left out of
is_shot_made,fga_pts, and possessionpoints, leaving a team's total below its final score. This affected well under 1% of made shots: those whose tracking placed them at the edge of a neighbouring chance, chances that contained more than one shot, and chances after a free throw with a misplaced tracking frame. - Release timing on Free Throws - fixed trips where the events feed matched a free throw to the wrong attempt in the trip, so attempts appeared out of order or two attempts shared one release. Each attempt now has its own release, which also corrects its shooting-motion and rim-contact measurements and, after a missed final free throw, the timing of the Rebound and of the Chance that follows. (This affected about 1% of free throws.)
- Putbacks after offensive rebounds on Chances - fixed rare cases where a quick putback or tip-in was folded into the chance that ended with the missed shot, typically when tracking did not detect the rebounder's touch. These putbacks now get their own chance that starts at the offensive rebound.
- End frames of steal-ending Chances - fixed rare cases where a chance ran past a steal to the next dead ball, taking in the other team's possession, because a reach-in or tie-up surrounded the steal. These chances now end at the steal.
- Offensive teams on Chances - fixed chances credited to the shooting team after a defensive rebound of a missed final free throw. This started this preseason, when the NBA's play-by-play began naming the shooting team on these rebounds, and did not affect earlier seasons. Also fixed rare short inbound chances credited to the wrong team when the inbounding team turned the ball over right away.
- Shots without tracking links on Shots - fixed shots that could be placed in the wrong possession or period after the NBA's new play-by-play system rewrote event timestamps when it re-published a period. This only affected the small share of shots.
- Rebounds without tracking links on Rebounds - fixed team rebounds and some other player rebounds after the NBA's new play-by-play system rewrote event timestamps.
- Putbacks and and-ones with bad upstream data on Chances - fixed putbacks and shooting fouls treated as happening at the same instant as the play before them only because the NBA's new play-by-play system gave both the same timestamp.
- Free throws without tracking links on Free Throws - fixed free throws that the events feed did not match to a moment in the tracking data, which happens when the NBA's new play-by-play system re-publishes a period and occasionally in other games. These free throws had no release or other measurements, and after a missed final free throw the Rebound that followed could be mistimed.
- Steals without tracking links on Chances - fixed chances that ended in steals that could be missing, end at the wrong moment, or run on to the next dead ball after the NBA's new play-by-play system changed how it handled event timestamps.
- Steals and rebounds missing from the tracking feed on Chances - fixed chances around a steal or rebound that was missing from the events feed.
- Shooting teams on Rebounds - fixed
possession_team_id_nbato always name the team that shot the rebounded ball, so on a defensive rebound it is the other team from the rebounder. The tracking feed had credited the rebounding team instead on about half of defensive rebounds in the 2026-27 preseason and about one in ten in 2025-26, which could also leaveshot_chance_id_ctgempty because the rebound was matched against the wrong team's shots. - Possession teams on Jump Balls - fixed team IDs that could be zero or identify the opposing team. Jump balls now use the team of the player who controlled the ball.
- Possession teams on Turnovers - fixed turnovers credited to the team that gained the ball instead of the team that committed the turnover.
possession_team_id_nbaanddefensive_team_id_nbanow follow the official play-by-play, or the committing player's team for the rare turnovers that have no play-by-play match. Turnover end locations and court regions also change where they depended on the possession team. - Dead-ball passes after turnovers on Passes - removed some passes by the team that committed a dead-ball turnover, such as a teammate tossing the ball after a traveling call. These passes could appear when the tracking feed credited the turnover to the other team.
[0.8.0] - 2026-09-30
Added
- Added league-average and player-adjusted shot-start make probabilities to Shots, enabling comparisons between estimated shot quality at the start and release of the shooting motion.
- Added the Ball Screen Instances data set with per-instance frames, player locations, clocks, and links to the parent ball screen.
- Added
_nbanames for defender IDs on Ball Screens, Off Ball Screens, and Possession Touches. Added_ctgnames for possession-touch, outcome, and drive links on these data sets, Advantage Creation 1v1, Closeouts, and Drives. Existing names are deprecated but remain available with the same values. - Added possession-touch links to Dribbles, Deflections, Basket Cuts, Fouls, and Turnovers, enabling direct joins to the related offensive possession touch when available. Deflections use
offensive_possession_touch_id_ctgto make the touch owner clear. - Added linked pass, shot, turnover, foul, and violation IDs to Possession Touches, so one touch can expose all related events, including passing turnovers and shots with fouls.
- Added
chance_was_used,used_chance_order, andused_by_player_id_nbato Chances, making it possible to identify, order, and assign players to chances that ended with a shot attempt, shooting foul, turnover, or bonus foul. - Added chronological touch links to Possession Touches and pass-to-touch links to Passes, enabling direct joins between each pass and its passer and receiver touches.
- Added evaluation API access to a custom set of approved postgame games for each team. Existing customer access remains unchanged.
- Added
defender_id_nbato Cuts, identifying the cutter's assigned defender near cut initiation when a matchup is available. - Added
outlet_heightto Transition Opportunities, measuring where the primary transition initiator catches the first pass relative to the non-attacking baseline. - Added
defense_starts_in_zoneto Chances, indicating whether the defense is classified as beginning the chance in a zone defense.
Changed
- Removed
elevatorfromoff_ball_screen_typein Off Ball Screens - it was too rare a case to be able to identify with high accuracy at this point.
Fixed
- Post-stoppage offensive teams on Chances - fixed shots and turnovers assigned to the opposing team after out-of-bounds stoppages.
- Consecutive Ball Screen Instances - fixed searches that ignored the end of a prior screen with the same ballhandler and screener.
- Counts and numbering on Ball Screen Instances - fixed totals and chronological numbering. All instances now report the same total, with numbering that starts at 1.
- Delay-of-game violation links on Possession Touches - removed links from unrelated touches. These calls remain available in Violations.
- Post-possession-change screener defenders on Ball Screens - fixed missing defenders after possession changes and early switches.
- Possession-touch links on Deflections - fixed links that identified a defender's touch instead of an offensive touch.
- Cut roundness directions on Cuts - fixed reversed left and right labels.
- Improved accuracy of screening instances which feed into many fields on Ball Screens - some rare cases were missing true screening instances or re-screens which was lowering the accuracy of many ball screen details.
- Increased accuracy of Off Ball Screens detection - in particular, fixed cases where distinct perimeter screens after a ball screen, or screens with brief late contact, could be missing. This change should keep precision mostly similar with a tiny bit higher rate of false positives in exchange for a good pickup of some clear false negatives.
- Screener defenders on Ball Screens - fixed cases where short matchup changes assigned the wrong screener defender or created a second screen with reversed defender roles.
- Ball-handler defenders on Ball Screens - fixed cases where an earlier switch assigned the prior defender to a handoff or the second part of a double screen.
- Improved
screener_defender_after_screen_defenseclassification on Ball Screens - increased accuracy of classification of the screener's defense type for ball screens. This should be an across the board accuracy gain, particularly for the lower frequency classes (e.g.hedge,blitz,bluff,drop_contest) as well as for some of the tougher distinctions (dropvs.none,containvs.drop, etc.). - Improved defender switch classification on Ball Screens - increased accuracy of
normal/late/noneswitch classification for both ball handler defenders and screener defenders. - Improved
screener_actionon Ball Screens - increased accuracy of classification of screener action for ball screens. Addedcrashas ascreener_actionoption for screeners who delay their rim movement until a shot attempt. - Handoff classification on Ball Screens - fixed the passer's distance outside the three-point line being counted toward
is_handoffeven when the pass did not start outside the arc. Handoff probabilities shift for all ball screens, and borderline cases can change classification. - Duplicate Falls - fixed cases where one fall could appear more than once with different chance links. Each fall now links to one chance and keeps one unique
fall_id_ctg. - Violation outcomes on Possession Touches - added the related violation ID to
outcome_ctg_id, enabling direct joins to the Violations data set when a matching violation is available. - Foul outcomes on Possession Touches - fixed defensive fouls linking to the fouler's touch instead of the fouled player's touch. Offensive fouls remain linked to the player who committed the foul, and off-ball fouls no longer create unrelated touch outcomes.
- Baseline-facing corner screens on Off Ball Screens - fixed cases where wide pin-downs could be incorrectly classified as Flex when the screener faced the attacking baseline.
- Dead-ball shot attempts on Passes - removed false incomplete pass detections when players took unofficial shots after whistles or period-ending buzzers.
- Quick controlled-release bounce passes on Passes - fixed cases where quick passes that were bounce passes were not being included in the Passes data set. This fix makes it so these are included when there is clear evidence of control by the passer.
- Screen type classification on Off Ball Screens - improved
off_ball_screen_typeclassification for out screens that finish nearer the middle of the floor and pin-down screens previously classified as flares.
[0.7.0-beta] - 2026-09-01
Added
- Added receiver next-action timing fields to Passes, showing the time from reception to handoffs, ball screens, dribbles, drives, passes, shots, and the receiver's first action during that touch.
- Added
drive_initial_directionto Drives. It identifies the driver's first attack direction asleft,right, orstraight. - Added
pass_typeto Passes, classifying each pass, including kick outs, interior passes, outlets, hit aheads, post/elbow entries, swing passes, passes to cuts, etc. - Added
off_ball_screen_typeto Off Ball Screens, classifying each off ball screen into types likewide_pin_down,flare,back,iverson, etc. - Added outcome attribution fields to Off Ball Screens, identifying screens that lead directly to cutter touches or shots, entry passes or shots for the screener, and return passes from the cutter to the screener.
- New
is_dribble_handofffield on the Ball Screens data set - indicates whether a handoff would be considered a DHO, including distinguishing cases where the screener stopped their dribble and held the ball for a bit before the handoff. - New Double Teams data set - identifies intentional secondary defender commitments to a ballhandler, including the primary defender, doubler, timing, chance, and possession touch. Related flags were also added to Possession Touches and Advantage Creation 1v1.
- Added Las Vegas Summer League (
league_id=15) discovery and filtering to the game, player, and team entity endpoints and/game_status; requests without a league filter continue to return NBA data only. - Added exact
league_idmetadata to player entity,/game_status, and/markingsresponses. - New Matchups data set - added continuous defender-to-offensive-player matchup segments, including segment timing and backcourt-start context.
- New
shooter_contextfield on the Shots data set - classifies each shot as coming from the primary ballhandler, an off-ball player, or no linked play context when available. - Added
data_quality_statusandissuesto/game_status, reporting whether a game's data iscomplete(no known problems) ordegraded, and listing each known problem with its source, affected data, period, game-clock span, and a plain-language summary. Quality is evaluated postgame;ctg_last_updateddoes not change when only the quality verdict changes, so pollissues[].updated_atto pick up quality updates without re-downloading markings.
Changed
- Improved Ball Screens recognition for certain screens a little nearer to the basket than normal.
- Improved
is_handoffclassification on Ball Screens when the initial screening action occurs before the recorded screening frame, reducing missed handoffs. - Updated Matchups to use defender direction when assigning nearby offensive players. This can change matchup assignments and related Double Teams results.
Fixed
- False-positive Double Teams - reduced cases where ordinary help on drives near the basket or distant secondary defenders were reported as double teams, while preserving double teams that ended with a quick pass.
- Direct screener entries on Off Ball Screens - fixed cases where outcomes after a direct entry pass to the screener were excluded from led-to-event results. These outcomes now follow the same directness rules as cutter receptions.
- Tipped Passes - fixed passes that could extend past the intended receiver's tip into a later teammate possession. These passes now end at the tip and remain incomplete when the receiver does not control the ball first.
- Duplicate Matchups segments - fixed rare cases where one continuous matchup assignment could appear as duplicate segments with the same start time.
- Post entries in Advantage Creation 1v1 - improved detection of clear 1v1 plays that begin near the perimeter and move into the post.
- Receiver touch context on Passes - fixed completed passes that could omit receiver possession context when control began shortly after the receiver first touched the ball.
- Post-turnover Possession Touches - fixed cases where a player's touch could continue through their live-ball turnover and merge with a later touch. These actions now appear as separate possession touches.
- Handoff pass start and end frames where passer and receiver are both touching the ball in Passes - fixed cases where handoff passes that had both passer and receiver touching the ball at the same time had incorrect timing and distance measures. These passes now use the start of the sequence where both players touch the ball as the start of the pass and the end of that sequence as the end.
- Cutter touches on Off Ball Screens - fixed cases where the possession touch data could disagree with the
led_to_cutter_touchfield. The logic forled_to_cutter_touchis now the same logic used for the other possession touch fields in this data set. - Improvements to Deflections - fixed cases where a possession-ending deflection would be missed. Also fixed cases where some of these deflections were incorrectly marked on whether the offense retained possession. Cleaned up some deflection duplicates. Weeded out some touches that were just during rebound sequences.
- Pass outcomes on Possession Touches - fixed cases where a player's pass outcome was not being marked properly. Also fixed situations where a player had a lost ball turnover but their outcome was being marked as a pass.
- Quick catch-and-pass Possession Touches - fixed cases where a receiver's brief but controlled touch could be omitted before an immediate pass, restoring the touch and related completed-pass receiver context.
- Pass receptions in Possession Touches and Passes - fixed cases where a receiver's touch started late or was missing after bobbling the ball, dribbling quickly, or passing right away. Also removed receiver touches and set passes to incomplete on incidental tips and or bobbles without full control.
- Post-make Dribbles - fixed cases where live-ball dribbles after a made basket could be omitted when the inbound was not detected, restoring related dribble counts on Possession Touches and handoff Ball Screens.
- Direct Passes - tightened directness classification so receiver turnovers, fouls, and violations after a held ball or non-attacking touch are less likely to be counted as directly created by the pass.
- Frontcourt inbound timing on Transition Opportunities - fixed cases where
halfcourt_start_framebegan several seconds after a frontcourt sideline or baseline inbound; it now begins with the inbound chance so pre-inbound alignment is treated as halfcourt play. - Pass-to-screener classification on Ball Screens - fixed cases where an earlier pass could be reused for a later possession touch, incorrectly marking the later ball screen as a pass to the screener.
- Jump-pass classification on Passes - fixed cases where a pass could be marked as a jump pass because another player was airborne at release; only the passer's own jump is now considered.
- Putback Possession Touches - fixed cases where a shot-ending touch for an immediate putback could be assigned to the preceding shot's chance instead of the putback chance.
- Ballhandler movement side on Ball Screens - improved direction classification when the ballhandler's meaningful screen movement begins after early setup movement, reducing incorrect left/right assignments.
- Dead-ball handling in Passes - removed incomplete pass detections by the team that just scored when the handling occurred after the made basket and before the next inbound.
- Direct Closeouts - relaxed directness classification so closeouts that quickly lead to a shot, turnover, foul, or quick pass to a shot are more consistently counted as direct.
- Offensive-rebound positioning in After Shot Positioning - improved recognition of genuine corner and wing rebound pursuits while reducing cases where shot follow-throughs, shallow steps toward the lane, or players retreating from the basket were marked as positioning for an offensive rebound.
- Missing Chances after made baskets - fixed cases where the possession right after an opponent's made basket could be dropped when a quick inbound was not detected as stepping out of bounds, which also removed the events belonging to that possession.
- Made-basket inbound Passes - fixed cases where a later live-ball pass after a made basket could be classified as an inbound pass even though it was on the wrong baseline
[0.6.0-beta] - 2026-07-01
Added
- New screen context fields on Ball Screens, Off Ball Screens, and Ball Screens - Off Ball Players data sets - added illegal-screen, roller-behind, double-screener, and screener-defender context when available.
- Added
drive_outcomeon the Drives data set to classify how each drive ended, including dribble-outs, passes to the interior or perimeter, shots, turnovers, and stoppages. - New
is_team_turnoverfield on the Turnovers data set - indicates whether the official turnover is assigned to the team rather than an individual player. - New
turn_over_shoulderandturn_over_shoulder_degreesfields on the Shots data set - classifies whether the shooter turned over the left shoulder, right shoulder, or neither shoulder into the shooting motion, plus the estimated size of that turn. - New fields on Drives, Possession Touches, Dribbles, Shots, and Turnovers data sets - added additional location, region, start-type, directness, paint-creation, and passer context fields.
- New Violations data set - added official violation events with player, team, timing, location, region, and play-by-play identifiers.
- New Jump Balls data set - added one row per jump ball, including the players who won, lost, and recovered the jump ball when available.
- New location and movement context fields on Shots, Dribbles, and Possession Touches data sets, plus new defender-grain Shots Location Velocity Defender, Dribbles Location Velocity Defender, and Possession Touches Location Velocity Defender data sets.
- New Challenges data set - added official challenge events with team, timing, play-by-play context, and result when available.
- New NBA entity endpoints - added team, player, game, and game-specific player participation reference data through the Pro API.
- New
outcome_pbp_idfield on Chances data set - the ID of the play by play event associated with eachchance_outcome. - New bring-up ballhandler fields on Chances data set - added
bring_up_ball_handler_id_nbaandbring_up_ball_handler_defender_id_nbato identify the player who brought the ball up the floor and their matched defender when available. - New sequence fields on Chances data set - added chance and possession ordering, previous and next chance and possession links, and home score differential at the start of each chance.
- New frontcourt timing fields on Chances data set - added shot-clock timing for when the ball first enters the frontcourt, and added separate timing for when it first enters the frontcourt during an offensive player's possession along with the associated, shot clock and wall-clock details.
- New rebound-location fields on Shots Location Velocity Defender and After Shot Positioning data sets - added player and defender locations at key post-shot rebound moments when available.
- New
halfcourt_start_framefield on Transition Opportunities data set - identifies when a first-chance halfcourt possession stopped being treated as a transition opportunity when that timing is available. - New fields on Interior Shots data set - added jump timing and gather distance fields. The gather distance is measured to the shooter's offensive basket.
- New
did_ballhandler_dribblefield on Advantage Creation 1v1 data set - indicates whether the ball handler dribbled during the 1v1 before their possession touch ended. - New pass reversal fields on Passes and Chances data sets - added
is_reversalto passes andreversalsto chances to identify passes that move the ball from one side of the court to the other. - New ballhandler start-with-ball fields on Advantage Creation 1v1 data set - identifies the 1v1 start point with the ball, including timing and location fields when available.
- New fields on Passes data set - added pass location, ball location, court region, backcourt, turnover, secondary assist, and play-by-play context fields.
- New fields on Fouls data set - added foul classification, take foul, shooting foul, charge, and fouling/fouled-player location fields when available.
- New location fields on Closeouts data set - added defender and ballhandler locations at key closeout frames when available.
- New drive start location fields on Drives data set - added
start_loc_x,start_loc_y, andattacking_positive_x_basketto identify where the driver began the drive and which basket the offense was attacking. - New defensive role fields on Drives: Off Ball Players data set - added flags for help position, dig position, screener defender, and switched-screen defender roles on drives.
- New receiver touch fields on Passes data set - added receiver touch duration and dribble count for completed passes with linked receiver touches.
Changed
- Tightened reversal classification on Passes and Chances data sets so middle-of-floor passes after multiple dribbles in the middle are no longer counted as reversals when the pass stays on the same side of the court.
- Updated reversal classification on Passes and Chances data sets to use established strong-side context, reducing ordinary side-to-side passes being counted as reversals and allowing qualifying incomplete passes to count when the intended receiver location is available.
Fixed
- Duplicate inbound Possession Touches - fixed rare cases where a single inbound touch could appear as duplicate possession touches with the same start time. These inbound touches now appear as one continuous touch.
- Overextended Drives entries - fixed cases where a drive could continue through later ballhandler movement away from the basket, which could suppress valid drives or make existing drive end times too late.
- Team-assigned Fouls - fixed cases where fouls assigned to a team rather than an individual player could be missing from the fouls data set. For these fouls,
player_id_nbais nownull;fouled_player_id_nbacan also benullwhen the official play-by-play does not identify a fouled player. - Loose-ball foul rebound Chances and Rebounds - fixed rare cases where a continuing chance after a rebound and immediate loose-ball foul could start from the same rebound as the short foul chance, which could duplicate the related rebound output. The continuing chance now starts from the foul.
- Missing After Shot Positioning rows - fixed rare cases where unusual shot timing around dunks, fouled shots, and other close-to-rim attempts could omit after-shot positioning rows. Shot end timing is now kept after shot release so related positioning rows can be returned.
- Transition Opportunities filtering - fixed cases where continuation chances after the first chance of a possession could be included as separate transition opportunities.
- Shot timing on Shots data set - fixed missed shooting-foul shots that could be timed at the whistle or clock stoppage instead of the actual shot release.
- End-clock timing on Chances data set - fixed cases where a chance's end clock could reflect the related event time instead of the actual delivered end frame, especially after chance boundary adjustments.
- Interior shot contests on Interior Shot Contests and Shots data sets - fixed cases where a close defender could be omitted from interior shot contest outputs when the shooter did not have a reliable jump-start checkpoint, especially around shooting fouls and unusual release timing.
- End-boundary dribbles on Possession Touches and touch-derived outputs - fixed cases where a dribble immediately after a possession touch could be excluded from the touch's dribble count, which could also affect completed-pass receiver touch dribble counts.
- Post-touch Drives entries - tightened drive filtering so a drive is no longer emitted after the driver has already lost possession.
- Stopped-clock Possession Touches splitting - fixed cases where one touch could incorrectly span a foul, timeout, free throw, violation, or other stoppage before play resumed.
- Possession-change and restart boundaries on Chances data set - fixed rare cases where chance boundaries could span a live-ball possession change or prefer a clock fallback over the actual inbound restart, which could omit a short following chance or assign the chance outcome to the wrong segment.
- Catch-and-shoot Passes completion - fixed rare cases where a completed pass to a shooter could be marked as a turnover and incomplete when the defense gained possession after the shot.
- Shot-clock turnover Chances outcomes - fixed cases where a shot-clock violation occurred while the shot was in the air. In these cases, we had a chance for the shot but not for the subsequent shot-clock violation turnover. We now create a second chance from the team offensive rebound until the shot-clock violation.
- Post-block recovery Passes detection - fixed rare cases where a controlled pass after a blocked shot could be omitted when the receiver immediately caught and shot the ball.
- Close handoff-style Passes - fixed rare cases where close same-team ball exchanges could appear as near-zero-length passes instead of covering the actual transfer to the receiver.
- Sparse tracking gaps on Passes and touch-derived data sets - fixed rare cases where noisy hand/ball matches could create an impossibly long touch across stoppages or periods, which could suppress valid passes and affect other touch-derived outputs.
- Missed free throw offensive rebound Chances deduplication - fixed rare cases where a missed free throw offensive rebound could correctly create an
ft_orebchance while also leaving behind an extra sideline-inbounds chance ending at the same rebound. - Chance context classification on Chances data set - fixed cases where transition, putback, press, backcourt, and running-out-clock chances could be classified too early or assigned to the wrong context when the chance included late fouls, rebound scrambles, high catches, or short backcourt sequences.
- Personal-foul Chances splitting - fixed rare cases where a non-shooting personal foul immediately before a made shot could be merged into the following scoring chance instead of appearing as its own chance.
- Basket-relative measurements on Interior Shots data set - fixed rare cases where fields measured relative to the basket (such as ball-to-rim distance at release and shooting-hand identification) could be calculated against the opposite basket when the court-direction signal briefly flipped around the shot.
- Set point detection on Jump Shots and Free Throws data sets - fixed rare cases where the set point could be identified using the wrong basket direction, which could shift set point timing and related measurement fields.
- Start-clock timing on Chances data set - fixed cases where a chance's start clock could reflect the related event time instead of the actual delivered start frame, especially for chances beginning after rebounds.
- Team turnover handling - fixed cases where team turnovers, such as shot clock violations, could be missing from outputs that identify how chances ended.
- Team rebound Chances after missed shots - fixed cases where chances after missed field goals with team rebounds could be missing, assigned to the wrong offensive team, or fail to split correctly when followed by an immediate loose-ball foul.
- Post-make Passes filtering - tightened filtering so non-inbound passes after made baskets are less likely to appear before the actual inbound pass.
- Jump-ball tap Passes filtering - fixed rare cases where a jump-ball tap could appear as a pass when the ball was not controlled by a teammate.
- Jump-ball Chances outcomes - fixed rare cases where duplicate jump-ball event rows could cause a chance to end as a jump ball instead of continuing to the following foul or shot outcome.
- Post-timeout Chances boundaries - fixed cases where a chance after a timeout could start too early and be classified with the wrong inbound start type, especially when play restarted from the sideline.
- Technical free throw Chances start-type classification - fixed cases where chances after made technical free throws could be shown with a start type of
ftminstead of the inbound start type used to resume play. - Rebound-start timing on Chances data set - fixed cases where chances beginning with rebounds could start after the rebound action or include action from the previous shot sequence, which may adjust chance start times and add missing short rebound-to-foul chances.
- Out-of-bounds retained possession attribution on Chances data set - fixed cases where a chance beginning from an out-of-bounds retained possession could be assigned to the wrong offensive team, which could cause following shots and 1v1 outcomes to be attributed to the previous chance.
- Missed free throw team-rebound Chances splitting - fixed rare cases where a missed final free throw followed by a team rebound could be classified as a sideline inbound, or could be missing the 1-frame rebound-to-foul chance when followed by an immediate loose-ball foul.
- Post-putback Chances start-type classification - fixed cases where the possession after a made putback could be shown with a start type of
fg_orebinstead offgm. - Immediate offensive rebound putbacks on Chances data set - fixed rare cases where a made putback after an offensive rebound at the same game clock could be merged into the previous shot chance, which now separates the putback and following possession correctly.
- Same-clock putback boundaries on Chances data set - fixed rare cases where offensive rebound chances could extend past an immediate made putback and end on a later event from the next possession.
- Retained out-of-bounds Chances classification - fixed cases where retained out-of-bounds chances could be shown as missed-shot chances or assigned to the wrong offensive team.
- Same-clock Chances event grouping - fixed rare cases where distinct chance-ending events at the same game clock could be collapsed together, causing made putbacks or following possession segments to be omitted.
- Chance context after steals on Chances data set - fixed rare cases where transition chances that began with a steal could be treated as attacking the wrong basket.
- Rebound-start Chances classification - fixed cases where chances beginning with offensive rebounds, defensive rebounds, or loose-ball fouls during rebounds could have the wrong offensive team or
chance_start_type. - Shot locations on Shots data set - fixed rare cases where two-point shots could be assigned to the wrong shooter or release location, causing implausibly long shot distances.
- Court regions on Fouls and Violations data sets - fixed court-region assignment to use the correct offensive basket when a location is available.
[0.5.0-beta] - 2026-05-21
Added
- New defender fields on Possession Touches data set - added
touch_start_defender_idandtouch_end_defender_id, based on the ballhandler's last clear matchup at the possession touch start and end frames. - New Chance Matchups data set - added per-player offensive and defensive matchup context for each chance, including clear assignments and probability-based matchup estimates at chance checkpoints.
- New
chance_contextfield on Chances data set - classifies each chance as transition, halfcourt, press, backcourt, putback, etc. - New potential assist fields on Passes and Shots data sets - added flags for passes that would very likely be assists if the shot was made, and shots that came from such a pass, plus pass and possession-touch links on shots.
- New official assist fields on Passes and Shots data sets - added flags for officially scored assists.
- New free throw trip summary fields on Free Throws data set - added fields showing each free throw's number within its trip, plus made and attempted free throw counts for the trip.
- New dribble count fields on Ball Screens data set - added
ballhandler_num_dribbles_after_screenandhandoff_screener_num_dribbles_before_screento describe how each player used the ball around the screen. - New
is_quick_no_dribble_shotfield on Shots data set - indicates whether a shot came after a short touch with no dribbles, serving as the current catch-and-shoot equivalent. - New
led_to_eventfields on Ball Screens, Off Ball Screens, Advantage Creation 1v1 data sets - addedled_to_event,event_type,pbp_event_id, andevent_frame_number_heto identify when any of these actions is deemed to have led to the chance ending event. - New
ball_hoop_distance_minfield on Drives and Advantage Creation 1v1 data sets - shows the closest the ball got to the hoop during the action.
Fixed
- Incorrectly split Drives entries - fixed cases where one continuous drive could be incorrectly split into multiple consecutive drive entries.
- Missing Chances around made putbacks - fixed rare cases where a made putback could be missing as a chance-ending event, which could cause the following possession segment to be omitted.
- Out-of-bounds cut regions on Cuts data set - fixed cases where
start_region,end_region, orafter_regioncould benulleven though the cutter's location was known but outside the normal court area. These locations now returnout_of_bounds. - Possession touch turnover outcomes on Possession Touches data set - fixed rare cases where a possession touch could remain
unknowneven when the ballhandler committed a turnover during that same touch. - Shot end frame calculation on Shots data set - fixed rare cases where a shot end frame could be missing when ball tracking disappears after release before the normal shot-end trajectory logic can identify an end frame.
- Duplicate ball screen entries on Ball Screens data set - fixed edge cases where one ball screen action could incorrectly appear as multiple consecutive entries.
- Overlapping Chances causing duplicate downstream events - fixed rare cases where one chance fully contained the start of the next chance, which could cause the same event (e.g. a cut) to be attributed to two different chances.
Changed
- Changed default
stream_typetoprocessedon/markingsendpoint - the default is now to return the processed data, rather than the delayed data if notstream_typeis specified. - Updated
is_after_timeouton Chances data set to only mark chances that begin from a timeout or start a period. Chances following replay reviews are no longer marked as after-timeout unless they also meet one of those conditions.
[0.4.0-beta] - 2026-05-01
Added
- New
ballhandler_movement_sidefield on Ball Screens and Drives — indicates whether the ballhandler moved left or right during the action when that context is available. - New ballhandler possession-touch linkage fields on Ball Screens, Off Ball Screens, Advantage Creation 1v1, Closeouts, and Drives - added
ballhandler_outcome,ballhandler_possession_touch_id, andballhandler_possession_touch_outcome_idwhere applicable, plusdrive_idlinks on ball screens, off-ball screens, 1v1s, closeouts, and Possession Touches. - New shot make probability fields on Shots data set - added
league_avg_make_probability_at_releaseandplayer_adj_make_probability_at_release. - New pre-shot touch fields on Shots data set - Added
num_dribbles_during_touch(number of dribbles during the touch that preceded the shot) andtouch_time_before_shot(duration of that touch in seconds) - New shooter movement context fields on Shots data set - Added
shooter_velocity_before_shot,shooter_velocity_after_shot,shooter_acceleration,shooter_rim_movement_angle_before_shot,shooter_rim_movement_angle_after_shot, andnum_close_teammates - New
is_directfield on Drives, Closeouts, Passes, Ball Screens, Off Ball Screens, and Advantage Creation 1v1 — indicates whether the action ended in a direct scoring outcome (the primary player shot, drew a foul, or turned the ball over, or made a quick pass to a receiver who shot within one dribble of catching it) - New
takeoff_feetandlanding_feetfields on Jumps data set - Classifies which foot or feet the player took off from and landed on (left,right, orboth;nullwhen footwork cannot be determined) - New
ballhandler_defender_initial_routefield on Ball Screens data set - Classifies how the original ballhandler defender initially navigates the screen (over,under, ornone) - New
ballhandler_defender_switch_typeandscreener_defender_switch_typefields on Ball Screens data set - Classifies whether each original defender switched (normal/late) or stayed with assignment (none) - New
screener_defender_initial_positionfield on Ball Screens data set - Classifies the screener defender's starting level in coverage (above,level,drop,deep) - New
screener_defender_after_screen_defensefield on Ball Screens data set - Classifies the screener defender's after-screen coverage (drop,drop_contest,switch,hedge,blitz,contain,bluff,none) - New
screener_actionfield on Ball Screens data set - Classifies what the screener does after the ball screen (roll,short_roll,pop,mid_post,move_to_screen,none) - New
rejected_screenandslip_screen_typefields on Ball Screens data set - Classifies whether the ballhandler rejected the screen and whether the screener slipped (none,quick,slow)
Fixed
- Improved pass completion accuracy on Passes data set - fixed rare cases where passes were incorrectly marked incomplete when the intended receiver caught the ball and shot immediately before the opposing team gained possession.
- Pass turnover classification on Passes data set - fixed rare cases where incomplete passes tied to a later dead-ball turnover were not marked as turnovers.
- Incorrect splitting of possession touches on Possession Touches - fixed a rare issue where a possession touch could be incorrectly split into two separate touches.
- Duplicate
jump_shot_footwork_typerows on Jump Shots data set - fixed a rare issue where duplicate upstream shot-touch links could cause jump shot footwork outputs to fan out into duplicate rows for the same shot. - Bug in screener defender attribution on Ball Screens data set - fixed rare issue where the on ball defender was sometimes also marked as the screener defender.
- False inbound tagging on Possession Touches and Passes data sets - fixed rare cases where live-ball out of bounds save plays could be mislabeled as inbounds passes and certain post-FGM inbound touches could show up as duplicate possession touches.
- Improved classification of edge case in Advantage Creation 1v1 data set - improved handling of 1v1s where the floor is very static and the ballhandler doesn't really go anywhere but we can infer from the static floor that it was a 1v1 attempt.
- Improved classification of corner movement and players heading out of bounds on After Shot Positioning data set - players in the corners who headed up the court at an angle are now separated better into actually getting back compared to positioning for an offensive rebound. Additionally, players headed out of bounds are more accurately classified, paritcularly those who just shot, and these players are not marked as positioning for an offensive rebound.
Changed
- Expanded paint-touch qualification logic on Possession Touches, Chances, and Possessions data sets to handle edge cases.
- Improved
closeout_resultclassification on Closeouts data set - updated classification logic to improve accuracy in certain edge cases.
[0.3.0-alpha] - 2026-03-11
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 - New paint-touch fields on Possession Touches, Chances, and Possessions data sets - Added
has_paint_touch_during_possessionto possession touches andtotal_paint_touchesrollups to chances/possessions based on touches where the ball and both feet are in the paint.
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.
