Skip to content

Ball Screen Instances ​

The ball_screen_instances section contains one row for each "screening instance" during a Ball Screen.

Overview ​

If a screener adjusts the angle of their screen or re-screens, we often want to view these as separate "instances" of a ball screen. These are all still part of the same ball screen action but the directions and coverages can differ between each of these instances of a screen.

Because of this, we have created the notion of a "screening instance", where a given ball screen can have more than one screening instance. Notably, we require all 4 players in the ball screen to remain the same for it to count as a screening instance. So a case where a screener screens, the defenders switch, the screener turns and re-screens would not be viewed as a new instance. Ideally this would be a separate ball screen action.

This data set gives the Hawk-Eye frame for each instance linked to a ball_screen_id_ctg.

For ball screens without a re-screen or angle adjustment, they will have one screening instance that will match the screening_he_frame of the ball screen.

Each row has the player IDs, the instance frame and clocks, and the screener and ballhandler locations at that frame. It also has fields that show which instance is the first one and which frame is the current ball-screen frame.

Sample Response ​

json
{
  "markings": {
    "ball_screen_instances": [
      {
        "attacking_positive_x_basket": false,
        "ball_defender_id_nba": 1630230,
        "ball_handler_id_nba": 1630180,
        "ball_handler_loc_x": -156.78,
        "ball_handler_loc_y": -102.65,
        "ball_screen_id_ctg": "ball_screen_790295edbb16a587380cd3d49f5063ef",
        "ball_screen_screening_he_frame": 1747,
        "chance_id_ctg": "chance_4c33ded97f95174cc013b446c3981347",
        "double_screen_screener_id_nba": null,
        "game_id_nba": "0022500404",
        "instance_count": 2,
        "instance_number": 1,
        "instance_screening_he_frame": 1747,
        "is_current_screening_frame": true,
        "is_dribble_handoff": true,
        "is_handoff": true,
        "is_initial_screening_instance": true,
        "period": 1,
        "possession_id_ctg": "possession_90461f431f3586f0ba39f25f0cefdec7",
        "screener_defender_id_nba": 203076,
        "screener_id_nba": 1642852,
        "screener_loc_x": -182.64,
        "screener_loc_y": -54.05,
        "screening_game_clock": 692.0,
        "screening_shot_clock": 10.0,
        "screening_wall_clock": "2025-12-23T01:11:03.571+00:00"
      }
    ]
  }
}

The sample values show the response shape. They do not describe a current game record.

Fields ​

Identifiers ​

ball_screen_id_ctg ​

Type: string

CTG ID of the parent row in Ball Screens. Join this field with ball_screen_id_ctg in that data set.


game_id_nba ​

Type: string

NBA game ID.


chance_id_ctg ​

Type: string | Nullable

CTG ID of the related chance, when available.


possession_id_ctg ​

Type: string | Nullable

CTG ID of the related possession, when available.


Players ​

ball_handler_id_nba ​

Type: integer | Nullable

NBA player ID of the ballhandler.


screener_id_nba ​

Type: integer | Nullable

NBA player ID of the screener.


double_screen_screener_id_nba ​

Type: integer | Nullable

NBA player ID of the other screener in a double screen, when available.


ball_defender_id_nba ​

Type: integer | Nullable

NBA player ID of the defender assigned to the ballhandler.


screener_defender_id_nba ​

Type: integer | Nullable

NBA player ID of the defender assigned to the screener.


Instance ​

instance_number ​

Type: integer | Nullable

Chronological order of this instance within its parent ball screen. Numbering starts at 1 and has no gaps.


instance_count ​

Type: integer | Nullable

Total number of instances linked to the parent ball screen. All rows for that parent have the same value.


instance_screening_he_frame ​

Type: integer

Hawk-Eye frame number for this screening instance.


ball_screen_screening_he_frame ​

Type: integer | Nullable

Hawk-Eye frame number for the parent ball screen's recorded screening frame.


is_initial_screening_instance ​

Type: boolean | Nullable

true when this is the first screening instance linked to the parent ball screen.


is_current_screening_frame ​

Type: boolean | Nullable

true when this frame matches the parent ball screen's recorded screening frame.


is_handoff ​

Type: boolean | Nullable

true when CTG classifies the parent ball screen as a handoff.


is_dribble_handoff ​

Type: boolean

true when CTG classifies the parent ball screen as a dribble handoff.


Timing ​

period ​

Type: integer | Nullable

Period number. Values 1–4 are regulation periods. Values 5 and higher are overtime periods.


screening_game_clock ​

Type: float | Unit: seconds | Nullable

Game clock time remaining in the period at instance_screening_he_frame.


screening_shot_clock ​

Type: float | Unit: seconds | Nullable

Shot clock time at instance_screening_he_frame. 0 when the shot clock is off.


screening_wall_clock ​

Type: string | Nullable

UTC wall-clock time at instance_screening_he_frame, in ISO-8601 format.


Location ​

attacking_positive_x_basket ​

Type: boolean | Nullable

true when the offense attacks the basket on the positive-x side of the court.


screener_loc_x ​

Type: float | Unit: inches | Nullable

X coordinate of the screener at instance_screening_he_frame.


screener_loc_y ​

Type: float | Unit: inches | Nullable

Y coordinate of the screener at instance_screening_he_frame.


ball_handler_loc_x ​

Type: float | Unit: inches | Nullable

X coordinate of the ballhandler at instance_screening_he_frame.


ball_handler_loc_y ​

Type: float | Unit: inches | Nullable

Y coordinate of the ballhandler at instance_screening_he_frame.