Appearance
Transition Opportunities
The transition_opportunities section in the markings response contains one row per team-side for each transition opportunity.
Overview
A transition opportunity is defined as the first chance of a possession where it was not a sideline or baseline out of bounds, it was not after a timeout, and it was not an immediate turnover in the backcourt (e.g. a steal right after a rebound). In other words, this contains all chances where the offense could have possibly created an advantage before the defense was set after a change of possession that occurred on the other side of the court.
This data set provides team-level information for each transition opportunity, with one row per side (offense and defense).
For per-player transition data, see Transition Opportunities: Player.
This data uses the concept of a "scoring zone", which is defined as anywhere inside of a line 8 feet past halfcourt. In the image below, everything closer to the basket than the orange line is inside the scoring zone:

Sample Response
json
{
"markings": {
"transition_opportunities": [
{
"are_any_defenders_on_team_pressing": false,
"avg_defender_speed": 5.21,
"ball_distance_to_scoring_zone_x": 53.63,
"ball_distance_to_three_point_zone_x": 67.63,
"ball_in_paint_shot_clock": 12.0,
"ball_seconds_to_paint": 8.27,
"ball_seconds_to_scoring_zone": 6.13,
"ball_seconds_to_three_point_zone": 10.7,
"ball_speed_to_scoring_zone": 8.74,
"ball_speed_to_three_point_zone": 6.32,
"chance_id_ctg": "chance_6dda4f792e347155bb8d20ab207d75bd",
"defensive_team_id_nba": 1610612740,
"defenders_back": 5,
"defenders_even": 0,
"did_chance_continue": false,
"game_id_nba": "0022500404",
"is_defense_back": true,
"is_transition": false,
"num_backcourt_defenders": 0,
"num_crashers_on_team": null,
"num_opp_players_below_ft_extended": 0,
"num_players_below_ft_extended": 0,
"num_watchers_on_team": null,
"offensive_team_id_nba": 1610612742,
"pts_resulting_from_chance": 0,
"scoring_zone_shot_clock": 19,
"season": 2025,
"season_type": "regular season",
"sec_between_previous_chance_end_and_inbounds": 1.77,
"side": "offense",
"team_id_nba": 1610612742,
"team_y_spread": 40.29,
"widest_y_between_scoring_zones": 20.76,
"widest_y_between_three_point_zones": 22.65
}
]
}
}Fields
Identifiers
team_id_nba
Type: integer
NBA team ID
side
Type: string
Whether this row represents the offense or defense side
game_id_nba
Type: string
NBA game ID
chance_id_ctg
Type: string
CTG-generated chance ID
Context
season
Type: integer
Season year
season_type
Type: string
Season type (e.g. regular season, playoff)
offensive_team_id_nba
Type: integer
NBA team ID of the offensive team
defensive_team_id_nba
Type: integer
NBA team ID of the defensive team
is_transition
Type: boolean
true if we identify this chance as one that ended with the initial transition advantage still going. So if the defense is never able to get back and set or end the offense's transition advantage before the chance ending event (shot, turnover, etc.), this will be true.
pts_resulting_from_chance
Type: integer
How many points were scored on this chance or putbacks that result from misses on this chance
did_chance_continue
Type: boolean | Nullable
true if the offense retains possession at the end of this chance (or at the end of a sequence of putbacks). For example, if the offense takes a shot, misses, gets an offensive rebound and attempts a putback, misses, attempts another putback, misses, and is fouled on the subsequent rebound, this would be true as they retain possession (though any points scored would no longer be attributed to transition). null if there is no following chance in the same period to compare against (e.g. the last chance of a quarter).
Ball Movement to Scoring Zone
ball_distance_to_scoring_zone_x
Type: float | Unit: feet | Nullable
When the new offense starts its transition, how far is the ball from the scoring zone along the x-coordinate dimension. For most chances this is the same as the chance start. On live-ball turnover starts, it is anchored at the new offense's first possession touch within the chance rather than the prior offense's losing event. null if the chance has no frontcourt_frame (the ball never crosses half-court during the chance).
scoring_zone_shot_clock
Type: integer | Nullable
The shot clock when the ball enters the scoring zone. null if the ball never enters the scoring zone during the chance, or if the chance has no frontcourt_frame.
ball_seconds_to_scoring_zone
Type: float | Unit: seconds | Nullable
How many seconds elapsed between the start of the transition and the ball entering the scoring zone. See ball_distance_to_scoring_zone_x for the exact anchor used. null if the ball never enters the scoring zone during the chance, or if the chance has no frontcourt_frame.
ball_speed_to_scoring_zone
Type: float | Unit: feet/sec | Nullable
ball_distance_to_scoring_zone_x / ball_seconds_to_scoring_zone. Measures how fast the ball reached the scoring zone accounting for distance, not actual ball speed. null if the ball never enters the scoring zone, if the chance has no frontcourt_frame, or if the ball is already in the scoring zone when the new offense starts its transition (zero elapsed time).
Ball Movement to Three-Point Zone
ball_distance_to_three_point_zone_x
Type: float | Unit: feet | Nullable
Same as ball_distance_to_scoring_zone_x, except using the top of the 3pt arc extended instead of the scoring zone. null under the same conditions (chance has no frontcourt_frame).
ball_seconds_to_three_point_zone
Type: float | Unit: seconds | Nullable
Same as ball_seconds_to_scoring_zone, except using the top of the 3pt arc extended instead of the scoring zone. null if the ball never reaches the three-point zone during the chance, or if the chance has no frontcourt_frame.
ball_speed_to_three_point_zone
Type: float | Unit: feet/sec | Nullable
Same as ball_speed_to_scoring_zone, except using the top of the 3pt arc extended instead of the scoring zone. null if the ball never reaches the three-point zone, if the chance has no frontcourt_frame, or if the ball is already past the three-point line when the new offense starts its transition.
Ball Movement to Paint
ball_in_paint_shot_clock
Type: float | Nullable
The shot clock at the first frame when a player paint touch is identified. A qualifying paint touch is counted if the ball and both feet are in the paint during the touch or shortly after it ends (to capture in air passes or fouls while driving). null if no qualifying paint touch occurs during the chance, or if the chance has no frontcourt_frame.
ball_seconds_to_paint
Type: float | Unit: seconds | Nullable
The amount of time from chance_start_frame to the first frame when a player paint touch is identified. A qualifying paint touch is counted if the ball and both feet are in the paint during the touch or shortly after it ends (to capture in air passes or fouls while driving). null if no qualifying paint touch occurs.
Defensive Readiness
defenders_back
Type: integer | Nullable
How many defenders would be judged as having gotten back (i.e. reasonably ahead of the ball) when the ball entered the frontcourt during a player's possession touch. If the ball is passed ahead into the frontcourt and the receiver is inside the scoring zone at pass reception, any players inside the scoring zone are counted as back. null for chances where the ball never enters the frontcourt during a player's possession touch.
defenders_even
Type: integer | Nullable
How many defenders are roughly even with the ball when it enters the frontcourt during a player's possession touch. null for chances where the ball never enters the frontcourt during a player's possession touch.
avg_defender_speed
Type: float | Unit: feet/sec | Nullable
The average speed of the 5 defensive players when the ball is first in the frontcourt during a player's possession touch. null for chances where the ball never enters the frontcourt during a player's possession touch.
is_defense_back
Type: boolean | Nullable
true if the defense has 5 defenders back or 4 defenders back with a low average speed. null under the same conditions as defenders_back.
are_any_defenders_on_team_pressing
Type: boolean
true if any defender on the team is judged as applying backcourt pressure.
num_backcourt_defenders
Type: integer | Nullable
Number of defenders that are judged as applying backcourt pressure on this chance.
Team Composition
num_watchers_on_team
Type: integer | Nullable
How many players on the team didn't move much between the shot release and the rebound on the previous shot (i.e. stood and watched). Only available for the team that transitions to defense; null for the team that transitions to offense.
num_crashers_on_team
Type: integer | Nullable
How many players on the team crashed in for the offensive rebound on the previous shot. Only available for the team that transitions to defense; null for the team that transitions to offense.
num_players_below_ft_extended
Type: integer
How many players on this team were below the free throw line extended at the start of this chance.
num_opp_players_below_ft_extended
Type: integer
How many opposing players were below the free throw line extended at the start of this chance.
team_y_spread
Type: float | Unit: feet | Nullable
A measurement of how wide the team gets in transition, measured by finding the distance between the widest any player gets on either side of the court when running between the two scoring zones. null if the chance has no frontcourt_frame.
widest_y_between_scoring_zones
Type: float | Unit: feet | Nullable
The widest y-coordinate reached by any player on this team when running between the scoring zones. null if the chance has no frontcourt_frame.
widest_y_between_three_point_zones
Type: float | Unit: feet | Nullable
Same as widest_y_between_scoring_zones, except using the top of the 3pt arc extended instead of the scoring zone. null under the same conditions (chance has no frontcourt_frame).
Inbounds Timing
sec_between_previous_chance_end_and_inbounds
Type: float | Unit: seconds | Nullable
Time between the previous chance ending and the inbounds. null if there's no inbounds to start this chance.
