Skip to content

Off-Ball Player Data: Ball Screens ​

The ball_screens_off_ball_player section in the markings response contains one row per off ball player (both offense and defense) for ball-screen actions (i.e. picks and handoffs), with off-ball matchup and positioning context at key checkpoints.

Overview ​

This data set provides off-ball player context around on-ball screen actions, including:

  • Player and matchup identity
  • Start-of-play positioning and regions
  • Distance metrics to ball, hoop, and matchup throughout the play
  • Weak-side vs. strong-side positioning flags

Sample Response ​

json
{
  "markings": {
    "ball_screens_off_ball_player": [
      {
        "ball_screen_id_ctg": "ball_screen_93411b552756e33d4a7a37b8819db9c5",
        "chance_id_ctg": "chance_51bfc1fda2cc0deb125bee9988859667",
        "game_id_nba": "0022500404",
        "is_double_screener": false,
        "is_gap_defender": false,
        "is_high_weak_side_defender": false,
        "is_low_man": false,
        "is_matchup_on_weak_side_at_play_start": false,
        "is_matchup_on_weak_side_at_touch_end": false,
        "is_moving_at_play_start": false,
        "is_on_offense": true,
        "is_on_weak_side_at_play_start": false,
        "is_on_weak_side_at_touch_end": false,
        "is_one_pass_away": true,
        "matchup_min_ball_distance_during_ballhandler_touch": 13.3,
        "matchup_min_hoop_distance_during_ballhandler_touch": 14.68,
        "matchup_play_start_ball_distance": 26.11,
        "matchup_play_start_hoop_distance": 15.06,
        "matchup_player_id_nba": 1630180,
        "matchup_start_region": "left corner two",
        "matchup_start_x": 462.12,
        "matchup_start_y": -176.53,
        "max_ball_distance_during_ballhandler_touch": 35.63,
        "max_hoop_distance_during_ballhandler_touch": 21.77,
        "max_matchup_distance_during_ballhandler_touch": 7.54,
        "max_screener_distance_during_ballhandler_touch": 25.56,
        "min_ball_distance_during_ballhandler_touch": 13.56,
        "min_hoop_distance_during_ballhandler_touch": 18.51,
        "min_matchup_distance_during_ballhandler_touch": 2.66,
        "min_screener_distance_during_ballhandler_touch": 22.29,
        "pass_start_ball_distance": 13.62,
        "pass_start_matchup_distance": 2.6,
        "pass_start_player_region": "left corner two",
        "period": 1,
        "play_start_ball_distance": 28.2,
        "play_start_hoop_distance": 20.64,
        "play_start_lowness_rank": 1,
        "play_start_lowness_rank_left": null,
        "play_start_lowness_rank_right": 1,
        "play_start_matchup_distance": 6.02,
        "play_start_matchup_speed": 0.7,
        "play_start_speed": 4.49,
        "player_id_nba": 1629023,
        "player_start_region": "left corner two",
        "player_start_x": 479.02,
        "player_start_y": -246.72
      }
    ]
  }
}

Fields ​

Identifiers ​

ball_screen_id_ctg ​

Type: string

CTG-generated unique ID for the ball-screen play


game_id_nba ​

Type: string

NBA game ID


chance_id_ctg ​

Type: string

CTG-generated chance ID that contains this play


player_id_nba ​

Type: integer

NBA player ID for the off ball player


matchup_player_id_nba ​

Type: integer

NBA player ID for the off ball player's matchup at play start


Context ​

period ​

Type: integer

Period in which the play occurs


is_on_offense ​

Type: boolean

true when player_id_nba is on offense for this play


Start-Frame Positioning ​

player_start_x ​

Type: float | Unit: inches

Off ball player's x coordinate at play start


player_start_y ​

Type: float | Unit: inches

Off ball player's y coordinate at play start


player_start_region ​

Type: string | Nullable

Off ball player's start region. null if the play-start checkpoint is unavailable.


matchup_start_x ​

Type: float | Unit: inches | Nullable

Matchup player's x coordinate at play start. null if matchup coordinates are unavailable.


matchup_start_y ​

Type: float | Unit: inches | Nullable

Matchup player's y coordinate at play start. null if matchup coordinates are unavailable.


matchup_start_region ​

Type: string | Nullable

Matchup player's start region. null if matchup coordinates are unavailable.


Start-Frame Distances / Ranks ​

play_start_hoop_distance ​

Type: float | Unit: feet

Off ball player's distance from rim center at play start


matchup_play_start_hoop_distance ​

Type: float | Unit: feet | Nullable

Matchup player's distance from rim center at play start. null if matchup coordinates are unavailable.


play_start_ball_distance ​

Type: float | Unit: feet

Off ball player's distance from the ball at play start


matchup_play_start_ball_distance ​

Type: float | Unit: feet | Nullable

Matchup player's distance from the ball at play start. null if matchup coordinates are unavailable.


play_start_matchup_distance ​

Type: float | Unit: feet | Nullable

Off ball player's distance from matchup at play start. null if matchup coordinates are unavailable.


play_start_speed ​

Type: float | Unit: feet/sec | Nullable

Off ball player's speed at play start. null when coordinates are unavailable.


play_start_matchup_speed ​

Type: float | Unit: feet/sec | Nullable

Matchup player's speed at play start. null when coordinates are unavailable.


play_start_lowness_rank_left ​

Type: integer | Nullable

Lowness rank among players on the left side at play start (1 is lowest on that side). null if player is not on the left side. "Lowest" means closest to the basket.


play_start_lowness_rank_right ​

Type: integer | Nullable

Lowness rank among players on the right side at play start (1 is lowest on that side). null if player is not on the right side. "Lowest" means closest to the basket.


play_start_lowness_rank ​

Type: integer | Nullable

Lowness rank at play start in one number. This shows the left-side rank when it exists, otherwise the right-side rank, so it matches whichever half of the floor the player is counted on with the same interpretation as those fields (1 is lowest on that side; lowest means closest to the basket). null when both side-specific ranks are null (player is not placed on either side for this snapshot).


Pass-Start Checkpoint ​

These fields represent the off ball player's positioning and movement at the moment the ballhandler releases a pass during the ball-screen action (if they passed).

pass_start_matchup_distance ​

Type: float | Nullable

Distance to matchup at ballhandler pass start (feet). null if no pass exists.


pass_start_ball_distance ​

Type: float | Unit: feet | Nullable

Distance from the player to the ball at pass start. null when no pass occurred or coordinates are unavailable.


pass_start_player_region ​

Type: string | Nullable

Player region at ballhandler pass start. null if no pass exists.


Min/Max During Ballhandler Touch ​

min_ball_distance_during_ballhandler_touch ​

Type: float | Unit: feet

Minimum distance to ball during ballhandler touch


matchup_min_ball_distance_during_ballhandler_touch ​

Type: float | Unit: feet | Nullable

Matchup player's minimum distance to ball during ballhandler touch. null if matchup coordinates are unavailable during the touch.


min_hoop_distance_during_ballhandler_touch ​

Type: float | Unit: feet

Minimum distance to rim center during ballhandler touch


matchup_min_hoop_distance_during_ballhandler_touch ​

Type: float | Unit: feet | Nullable

Matchup player's minimum distance to rim center during ballhandler touch. null if matchup coordinates are unavailable during the touch.


min_matchup_distance_during_ballhandler_touch ​

Type: float | Unit: feet | Nullable

Minimum player-to-matchup distance during ballhandler touch. null if matchup coordinates are unavailable during the touch.


min_screener_distance_during_ballhandler_touch ​

Type: float | Unit: feet | Nullable

Minimum distance to screener during ballhandler touch. null when not available.


max_ball_distance_during_ballhandler_touch ​

Type: float | Unit: feet

Maximum distance to ball during ballhandler touch


max_hoop_distance_during_ballhandler_touch ​

Type: float | Unit: feet

Maximum distance to rim center during ballhandler touch


max_matchup_distance_during_ballhandler_touch ​

Type: float | Unit: feet | Nullable

Maximum player-to-matchup distance during ballhandler touch. null if matchup coordinates are unavailable during the touch.


max_screener_distance_during_ballhandler_touch ​

Type: float | Unit: feet | Nullable

Maximum distance to screener during ballhandler touch. null when not available.


Role / Weak-Side Flags ​

is_double_screener ​

Type: boolean | Nullable

true when this offensive off-ball player is the partner screener in a double-screen ball-screen action. null for non-ball-screen play types.


is_moving_at_play_start ​

Type: boolean

true if the player is moving at a reasonably high speed at the start of the pick.


is_one_pass_away ​

Type: boolean | Nullable

true if the player is on the perimeter (more than 15 feet from the center of the rim) and there is no teammate between them and the ball. null when not available.


is_low_man ​

Type: boolean

true if we estimate most teams would have assigned this player low-man responsibility at the start of the pick. This is usually the lowest player on the weak side at pick start, and when there are zero weak-side players it falls back to the lowest player on the strong side.

If the player is on offense, this is true when their matchup is estimated to be the low man.


is_high_weak_side_defender ​

Type: boolean

true if the player is the highest defender on the weak side and there is more than one weak-side defender.

If the player is on offense, this is true when their matchup is estimated to be the high weak-side defender.


is_gap_defender ​

Type: boolean

true if the player is on the strong side, is guarding a player who is one pass away, and is not guarding a player in the corner.

If the player is on offense, this is true when their matchup is estimated to be the gap defender.


is_on_weak_side_at_play_start ​

Type: boolean

true if the player is on what we estimate is the weak side at the start of the play.


is_on_weak_side_at_touch_end ​

Type: boolean

true if the player is on what we estimate is the weak side at the end of the ballhandler's touch.


is_matchup_on_weak_side_at_play_start ​

Type: boolean | Nullable

true if the player's matchup is on what we estimate is the weak side at the start of the play. null if a matchup is unavailable at play start.


is_matchup_on_weak_side_at_touch_end ​

Type: boolean | Nullable

true if the player's matchup is on what we estimate is the weak side at the end of the ballhandler's touch. null if a matchup is unavailable at touch end.