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 deprecated ​

Type: integer

Season year

Deprecated

This field is deprecated. It remains in the response for now. We plan to remove it during a later backfill.

Use game_id_nba with the Games endpoint (GET /pro/entities/games) to get season.


season_type deprecated ​

Type: string

Season type (e.g. regular season, playoff)

Deprecated

This field is deprecated. It remains in the response for now. We plan to remove it during a later backfill.

Use game_id_nba with the Games endpoint (GET /pro/entities/games) to get season_type. That endpoint uses NBA season types such as Regular Season and Playoffs.


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: they did not crash and moved less than 5 feet between the shot and the start of this chance. 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. Also null when the player was not deep in the frontcourt (within about 25 feet of the baseline, roughly the top of the key) when the shot went up, or when their location at the shot is missing. A player who was further away was already back and would be counted as already back even if they are standing still, so this field can be null while crashed_on_previous_chance_end is set.


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.