Skip to content

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:

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.