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

CTG chance ID of the chance that the rebound started


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