Skip to content

Transition Opportunities: Player

The transition_opportunities_player section in the markings response contains one row per player per transition opportunity.

Overview

This data set provides player-level transition data with one row per on-court player.

It is designed to be able to help analyze how players are getting back in transition defense and how they are attacking in transition offense.

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_player": [
      {
        "chance_id_ctg": "chance_6dda4f792e347155bb8d20ab207d75bd",
        "crashed_on_previous_chance_end": null,
        "defensive_team_id_nba": 1610612740,
        "defender_pressing_score": null,
        "distance_to_scoring_zone_x": 39.74,
        "distance_traveled_between_previous_shot_start_and_chance_start": 6.28,
        "game_id_nba": "0022500404",
        "is_back_before_ball_crosses_scoring_zone": false,
        "is_back_before_ball_crosses_three_point_zone": false,
        "is_defender_pressing": null,
        "is_primary_initiator": true,
        "offensive_team_id_nba": 1610612742,
        "player_id_nba": 1630314,
        "player_ball_seconds_to_scoring_zone_diff": 0.0,
        "player_ball_seconds_to_three_point_zone_diff": -0.13,
        "player_start_area": "below_ft_extended",
        "season": 2025,
        "season_type": "regular season",
        "seconds_to_scoring_zone": 6.13,
        "seconds_to_scoring_zone_rank": 5,
        "seconds_to_three_point_zone": 10.83,
        "seconds_to_three_point_zone_rank": 5,
        "side": "offense",
        "speed_to_scoring_zone": 6.86,
        "speed_to_three_point_zone": 5.21,
        "team_id_nba": 1610612742,
        "transition_end_region": "far",
        "transition_end_x": 8.03725,
        "transition_end_y": 17.962333333333333,
        "transition_role": "primary_initiator",
        "was_rebounder_on_previous_chance": null,
        "was_shooter_on_previous_chance": false,
        "watched_on_previous_chance_end": false,
        "widest_y_between_scoring_zones": 18.95,
        "widest_y_between_three_point_zones": 21.66,
        "x_distance_traveled_between_shot_start_and_chance_start": -5.04
      }
    ]
  }
}

Fields

Identifiers

player_id_nba

Type: integer

NBA player ID


team_id_nba

Type: integer

NBA team ID


side

Type: string

Whether this player is on 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


Player Movement to Scoring Zone

player_start_area

Type: string

Where the player was on the court when the new offense started its transition. For most chances this is the same as the chance start. For chances that begin from a live-ball turnover, this is anchored at the new offensive team's first possession touch within the chance rather than the moment where the prior offense last touched the ball, so the player is marked based on where they were when the other team gained possession.

Values can be one of below_ft_extended (i.e. below the free throw line extended), between_ft_and_arc_extended (i.e. above the free throw line extended but below the top of the arc extended) or beyond_arc_extended (i.e. above the top of the arc extended).

Player Start Area


distance_to_scoring_zone_x

Type: float | Unit: feet

How far the player is from the scoring zone, measured along the x-axis (i.e. baseline to baseline) when the new offense starts its transition. For chances that begin from a live-ball turnover, this is anchored at the new offensive team's first possession touch within the chance rather than the moment where the prior offense last touched the ball, so the player is marked based on where they were when the other team gained possession.


seconds_to_scoring_zone

Type: float | Unit: seconds | Nullable

How many seconds it took from when the offense started its transition for the player to reach the scoring zone. null if the player never reaches the scoring zone.


seconds_to_scoring_zone_rank

Type: integer | Nullable

Rank of this player among their teammates for seconds_to_scoring_zone (1 = fastest)


speed_to_scoring_zone

Type: float | Unit: feet/sec | Nullable

distance_to_scoring_zone_x / seconds_to_scoring_zone. null if the player never reaches the scoring zone, or if they are already in it when the new offense starts its transition (zero elapsed time).


is_back_before_ball_crosses_scoring_zone

Type: boolean | Nullable

true if the player reaches the scoring zone before the ball does. null if either the player or the ball never reaches the scoring zone during the chance.


player_ball_seconds_to_scoring_zone_diff

Type: float | Unit: seconds | Nullable

How many seconds ahead of (positive) or behind (negative) the ball the player was in reaching the scoring zone. ball_seconds_to_scoring_zone - seconds_to_scoring_zone. null if either the player or the ball never reaches the scoring zone.


widest_y_between_scoring_zones

Type: float | Unit: feet | Nullable

The widest y-coordinate this player reached while running between the two scoring zones. null if no scoring-zone-to-scoring-zone window is available for this player on the chance (e.g. the chance has no frontcourt_frame).


Player Movement to Three-Point Zone

is_back_before_ball_crosses_three_point_zone

Type: boolean | Nullable

true if the player reaches the three-point zone before the ball does. null if either the player or the ball never reaches the three-point zone during the chance.


speed_to_three_point_zone

Type: float | Unit: feet/sec | Nullable

Distance to the three-point zone / seconds_to_three_point_zone. null if the player never reaches the three-point zone, or if they are already past it when the new offense starts its transition (zero elapsed time).


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. null under the same conditions (no per-frame aggregates between the three-point zones for this player).


seconds_to_three_point_zone

Type: float | Unit: seconds | Nullable

How many seconds it took from when the offense started its transition for the player to reach the three-point zone. null if the player never reaches the three-point zone.


seconds_to_three_point_zone_rank

Type: integer | Nullable

Rank of this player among their teammates for seconds_to_three_point_zone (1 = fastest)


player_ball_seconds_to_three_point_zone_diff

Type: float | Unit: seconds | Nullable

How many seconds ahead of (positive) or behind (negative) the ball the player was in reaching the three-point zone. ball_seconds_to_three_point_zone - seconds_to_three_point_zone. null if either the player or the ball never reaches the three-point zone.


Role & Initiative

is_primary_initiator

Type: boolean

true if this player is the primary ball handler initiating the transition. We mark a player as the primary initiator if they make a long pass upcourt or have possession of the ball longest before the ball enters the scoring zone.


transition_role

Type: string | Nullable

All offensive players are assigned a transition role based on their location and actions on the floor during the transition. This field is null if the player is on defense; if the player is already in the scoring zone before the chance starts (for example on a backcourt inbound); or if the player or ball never reach the frontcourt.

Possible values:

  • primary_initiator — this player is the primary transition initiator; same rules as is_primary_initiator above.
  • rim_runner_ahead — the player was in front of the ball or close to it when the ball crossed into the scoring zone, ran down the middle of the court, and got close enough to the basket.
  • rim_runner_trailer — the player ran down the middle, got close to the basket, and crossed the scoring zone within about 1.5 seconds of the ball, but was not predominantly ahead of the ball (distinguishing it from rim_runner_ahead).
  • rim_runner_other — the player ran down the middle but did not get very near the rim and is not classified as a trailer.
  • trailer — the player stayed well behind the ball (more than about 1.5 seconds), or set a drag screen. This includes players who ran down the middle and also players who drifted laterally but not far enough to qualify as a wing runner.
  • left_wing_runner — the player ran up the left side of the court.
  • right_wing_runner — the player ran up the right side of the court.
  • middle_to_right_runner — the player ran through the middle of the court toward the right side of the court.
  • middle_to_left_runner — the player ran through the middle of the court toward the left side of the court.
  • other — offensive cases that do not match any of the roles above after those rules are applied.

Previous Chance Carryover

was_shooter_on_previous_chance

Type: boolean | Nullable

true if this player was the shooter on the previous chance. null if there is no previous chance or the previous chance had no shot attempt.


was_rebounder_on_previous_chance

Type: boolean | Nullable

true if this player got the rebound on the previous chance. null if the chance didn't start with a rebound.


crashed_on_previous_chance_end

Type: boolean | Nullable

true if our data marked this player as positioning for an offensive rebound at the end of the previous chance. null if the previous chance didn't end in a real field-goal attempt (e.g. fouled shot, turnover, end of period) or the current chance didn't flow directly from that shot's outcome (e.g. an inbound after free throws).


watched_on_previous_chance_end

Type: boolean | Nullable

true if this player stood and watched during the shot at the end of the previous chance instead of running back or positioning for a rebound. null if the previous chance didn't end in a real field-goal attempt or the current chance didn't flow directly from that shot's outcome.


distance_traveled_between_previous_shot_start_and_chance_start

Type: float | Unit: feet | Nullable

How many feet did the player move from the start of the shot to the start of the next chance? This can be useful in combination with x_distance_traveled_between_shot_start_and_chance_start because a player who crashes in from the corner might have an x-distance traveled that is close to 0, but a high overall distance traveled. null if there is no previous chance, the previous chance had no shot attempt, or player coordinates are unavailable at the previous shot's start frame.


x_distance_traveled_between_shot_start_and_chance_start

Type: float | Unit: feet | Nullable

How many feet, along the x-axis, did the player move toward the opposite hoop from the start of the shot to the start of the next chance? A high positive value means the player moved much closer to the other rim during the shot (e.g. getting back on defense or leaking out), while a negative value means they moved toward the shooting hoop (e.g. crashing the glass). null if there is no previous chance, the previous chance had no shot attempt, or player coordinates are unavailable at the previous shot's start frame.


End-of-Transition Positioning

We attempt to estimate where the player ended their transition run by looking at when they stop moving or have a sharp change of direction or when the offense first runs an action. The fields below contain the coordinates and the region of where we estimate the player’s transition run ended.

transition_end_x

Type: float | Nullable

The player's x-coordinate at the estimated end of their transition run. null if no transition end position is available for this player on the chance.


transition_end_y

Type: float | Nullable

The player's y-coordinate at the estimated end of their transition run. null if no transition end position is available for this player on the chance.


transition_end_region

Type: string | Nullable

Court region at the estimated end of the player's transition run. Can be one of: backcourt, far, left corner three, left wing three, right wing three, middle three, right corner three, left corner two, left wing two, middle two, right wing two, right corner two, key, ra, out of bounds, other. null if no transition end position is available for this player on the chance or if the player is on defense.


Defender Pressing

defender_pressing_score

Type: float | Nullable

A score from 0 to 1 indicating how much this player applied backcourt pressure on this chance. Higher values indicate more pressure. Only populated for defensive players; null for offensive players.


is_defender_pressing

Type: boolean | Nullable

true if we determine that the player is attempting to defend in the backcourt (including off ball players) instead of getting back on defense. Some players we define as pressing may not have a high pressure score, but we think they are not getting back on defense as they normally would. So this should be used in combination with the pressure score to interpret how aggressively the player is pressing. Only populated for defensive players; null for offensive players.