Skip to content

Contested Rebound Touches ​

The contested_rebound_touches section in the markings response gives more detail around “contested rebounds”, i.e. rebounds where at least one player from each team is near the ball when the ball was touched.

NOTE

Due to imprecision in finger tracking data, this data can have a higher error rate than other markings.

Overview ​

For each contested rebound, we look at each time the ball was touched. For each of these touches, we give details about what the nearby players were doing: how close they were to the ball, whether they jumped, how high they jumped, etc.

NOTE

Instead of identifying every individual touch, we group close touches together into a single “touch group”. This helps deal with situations such as when a player bobbles the ball, and so they touch the ball many times in a very short window, but in reality we want to treat it like a single touch. Or when multiple players touch the ball at the same time — we track that as a single event and show multiple players touching the ball.

Each object in this data represents one player who is nearby a given touch during the rebound.

This gives much more resolution around the “jump ball” aspect of rebounding, where multiple players jump for the ball and it matters who gets a hand on it. It should also be helpful in modeling the probabilities around securing a rebound in these kinds of contested situations.

NOTE

Currently only includes rebounds from field goal attempts where the shot was not blocked.

Sample Response ​

json
{
  "markings": {
    "contested_rebound_touches": [
      {
        "ball_height_at_touch_in": 23.83,
        "ball_rim_distance_at_touch_in": 221.45,
        "chance_id_ctg": "chance_63aea33af0863ea15ce93e7bb2511140",
        "contested_rebound_touch_id_ctg": "contested_rebound_touch_4eba3843c64c495c7a25719b2425993e",
        "did_jump_close_to_touch": false,
        "did_touch_ball": false,
        "game_id_nba": "0022500404",
        "is_rebounder": false,
        "jump_max_neck_height_in": null,
        "jump_max_wrist_height_in": null,
        "left_hand_dist_to_ball_at_touch_in": 68.92,
        "nba_game_id": "0022500404",
        "nba_player_id": 1630180,
        "nearest_jump_start_he_frame_after_touch": null,
        "nearest_jump_start_he_frame_before_touch": null,
        "nearest_jump_start_wall_clock_after_touch": null,
        "nearest_jump_start_wall_clock_before_touch": null,
        "player_id_nba": 1630180,
        "rebound_he_frame": 10245,
        "rebound_id_ctg": "rebound_8eb2b107cd90818e262d339fd3003e60",
        "rebound_wall_clock": "2025-12-23T01:13:25.211+00:00",
        "right_hand_dist_to_ball_at_touch_in": 59.85,
        "touch_group_end_he_frame": 10244,
        "touch_group_end_wall_clock": "2025-12-23T01:13:25.194+00:00",
        "touch_group_start_he_frame": 10244,
        "touch_group_start_wall_clock": "2025-12-23T01:13:25.194+00:00"
      }
    ]
  }
}

Fields ​

Identifiers ​

contested_rebound_touch_id_ctg ​

Type: string

CTG-generated unique identifier for this contested rebound touch event


game_id_nba ​

Type: string

NBA game ID


nba_game_id deprecated ​

Type: string

NBA game ID

Deprecated

Use game_id_nba instead. This field will be removed in a future version.


player_id_nba ​

Type: integer

NBA player ID of the nearby player


nba_player_id deprecated ​

Type: integer

NBA player ID of the nearby player

Deprecated

Use player_id_nba instead. This field will be removed in a future version.


rebound_id_ctg ​

Type: string

CTG-generated rebound ID


chance_id_ctg ​

Type: string | Nullable

CTG chance ID of the chance that the rebound started. null if the contested rebound is not linked to a chance.


Timing ​

rebound_he_frame ​

Type: integer

Hawk-Eye frame of the rebound


rebound_wall_clock ​

Type: string

UTC timestamp corresponding to rebound_he_frame.


touch_group_start_he_frame ​

Type: integer

First frame when a player touched the ball in this touch group


touch_group_start_wall_clock ​

Type: string

UTC timestamp corresponding to touch_group_start_he_frame.


touch_group_end_he_frame ​

Type: integer

Last frame when a player touched the ball in this touch group


touch_group_end_wall_clock ​

Type: string

UTC timestamp corresponding to touch_group_end_he_frame.


Touch Data ​

is_rebounder ​

Type: boolean

true if this player received credit for the rebound


did_touch_ball ​

Type: boolean

true if this player touched the ball between shot end and rebound

Hand Distance to Ball ​

left_hand_dist_to_ball_at_touch_in ​

Type: float | Unit: inches

Distance from left hand (midpoint of thumb/pinky) to ball center at touch


right_hand_dist_to_ball_at_touch_in ​

Type: float | Unit: inches

Distance from right hand to ball center at touch


Ball Position ​

ball_height_at_touch_in ​

Type: float | Unit: inches

Ball height above floor at touch group start


ball_rim_distance_at_touch_in ​

Type: float | Unit: inches

Distance from ball center to rim center at touch group start


Jump Data ​

did_jump_close_to_touch ​

Type: boolean

true if the player jumped near this touch


nearest_jump_start_he_frame_before_touch ​

Type: integer

Hawk-Eye frame of nearest jump start before touch (if near). null otherwise


nearest_jump_start_wall_clock_before_touch ​

Type: string

UTC timestamp corresponding to nearest_jump_start_he_frame_before_touch. null if no jump.


nearest_jump_start_he_frame_after_touch ​

Type: integer

Hawk-Eye frame of nearest jump start after touch (if near). null otherwise


nearest_jump_start_wall_clock_after_touch ​

Type: string

UTC timestamp corresponding to nearest_jump_start_he_frame_after_touch. null if no jump.

Jump Height (when did_jump_close_to_touch is true) ​

jump_max_neck_height_in ​

Type: float | Unit: inches

Max neck height during the jump. null if no jump


jump_max_wrist_height_in ​

Type: float | Unit: inches

Max wrist height during the jump. null if no jump