Skip to content

Passes

The passes section in the markings response contains an object for every pass that we detect in the game.

Overview

We attempt to detect both completed and incomplete passes. Incomplete passes can be difficult to differentiate from other situations where a player loses the ball, but we use a combination of ball trajectory and player position to make a best guess.

We also try to include controlled tips or "touch passes", where a player intentionally deflects the ball to a teammate. This includes rebound tip outs to teammates. But once again, this is an area that can be difficult to accurately differentiate from uncontrolled tips.

We filter out passes that occur after a made basket before the ball is inbounded, for example when one teammate collects the ball after it goes through the net and tosses it to a teammate to inbound.

Sample Response

json
{
  "markings": {
    "passes": [
      {
        "ball_end_loc_x": -28.36,
        "ball_end_loc_y": -21.08,
        "ball_hit_ground_during_completed_pass": false,
        "ball_start_loc_x": -12.31,
        "ball_start_loc_y": -16.95,
        "catch_distance_forward_in": 29.8,
        "catch_distance_from_mid_chest_in": 37.22,
        "catch_distance_left_right_in": 2.72,
        "catch_height_above_mid_hip_in": 34.4,
        "catch_height_above_standing_hip_in": 23.25,
        "catch_height_in": 63.6,
        "chance_id_ctg": "chance_377f4e8d031acb0095eb520eb8ecec96",
        "distance": 16.57,
        "game_id_nba": "0022500404",
        "intended_receiver_id_ctg": 202691,
        "intended_receiver_id_nba": 202691,
        "is_assist": false,
        "is_backcourt": false,
        "is_completed": true,
        "is_direct": true,
        "is_inbounds": false,
        "is_jump_pass": false,
        "is_one_handed_pass": false,
        "is_potential_assist": true,
        "is_secondary_assist": false,
        "is_secondary_assister_the_shooter": false,
        "is_turnover": false,
        "led_to_shot": true,
        "nba_game_id": "0022500404",
        "num_dribbles_during_receiver_touch": 0,
        "pass_handedness": "both",
        "pass_id_ctg": "pass_0128a7fbcfa97b421d1877f843555263",
        "pass_release_he_frame": 388571,
        "pass_release_wall_clock": "2025-12-23T03:14:08.657+00:00",
        "passer_id_ctg": 1630230,
        "passer_id_nba": 1630230,
        "passer_loc_x": -9.78,
        "passer_loc_y": -16.27,
        "passer_region": "far",
        "pbp_event_id": null,
        "receiver_jumped_for_touch": false,
        "receiver_loc_x": -30.87,
        "receiver_loc_y": -21.29,
        "receiver_region": "left wing three",
        "receiver_touch_time": 1.17,
        "receiver_touch_start_he_frame": 388597,
        "receiver_touch_start_wall_clock": "2025-12-23T03:14:09.09+00:00",
        "receiver_touched_ball": true,
        "is_reversal": false,
        "turnover_receiver_loc_x": null,
        "turnover_receiver_loc_y": null
      }
    ]
  }
}

Fields

Identifiers

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.


pass_id_ctg

Type: string

CTG-generated unique pass ID.


chance_id_ctg

Type: string

CTG chance ID for the offensive opportunity this pass occurred in. null if no matching chance is found within 3 seconds of the pass (which may indicate a data error with a missing chance).


passer_id_nba

Type: integer

NBA player ID of the passer.


passer_id_ctg deprecated

Type: integer

NBA player ID of the passer

Deprecated

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


intended_receiver_id_nba

Type: integer

NBA player ID of the intended receiver. For a completed pass, this is the player who next touches the ball. For an incomplete pass, we use ball trajectory and player position data to make our best guess at who the pass was intended for.


intended_receiver_id_ctg deprecated

Type: integer

NBA player ID of the intended receiver

Deprecated

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


Pass Timing

pass_release_he_frame

Type: integer

Hawk-Eye frame when the pass left the passer's hands.


pass_release_wall_clock

Type: string

UTC timestamp corresponding to pass_release_he_frame.


receiver_touch_start_he_frame

Type: integer

Hawk-Eye frame when the intended receiver first touched the ball. null if the receiver never touched the ball (e.g. on an incomplete pass)


receiver_touch_start_wall_clock

Type: string

UTC timestamp corresponding to receiver_touch_start_he_frame. null if the receiver never touched the ball.


Pass Result

is_completed

Type: boolean

true if the pass was completed to a teammate after CTG's pass-result refinements. false when the pass is incomplete, including cases where a defender deflects the ball, the ball bounces multiple times after defensive contact, the defense gains immediate possession, or the play context indicates a turnover or stoppage rather than a controlled catch.


is_inbounds

Type: boolean

true if the pass was an inbounds pass. false otherwise.


is_turnover

Type: boolean

true if the pass resulted in a turnover. false otherwise.


is_direct

Type: boolean

true when the receiver’s touch after this pass ends in a shot, turnover, foul, or violation within a few seconds of catching the ball in the same period. false otherwise.


is_assist

Type: boolean

true if the NBA play-by-play credited this passer with an official assist on the receiver's shot. false otherwise.


pbp_event_id

Type: integer

The play-by-play event ID for the assisted shot when this pass was credited as an official assist. null if the pass was not credited as an official assist.


is_potential_assist

Type: boolean

true when the receiver's touch after this pass ends in a shot with no more than 3 dribbles and no more than 3.5 seconds of touch time. false otherwise.

NOTE

These thresholds were chosen by determining the values that best matched actual assists.


is_secondary_assist

Type: boolean

true if the receiver made a quick pass that was credited as an official assist without first dribbling. false otherwise.


is_secondary_assister_the_shooter

Type: boolean

true if this pass is a secondary assist where the passing player was also the shooter on the officially-assisted shot, such as a give-and-go. false otherwise.


led_to_shot

Type: boolean

true if the receiver shot the ball to end the possession touch immediately after this pass. false otherwise.


receiver_touch_time

Type: float | Unit: seconds

Duration of the receiver's possession touch after catching this pass. null if the pass was incomplete or the receiver touch could not be linked.


num_dribbles_during_receiver_touch

Type: integer

Number of dribbles during the receiver's possession touch after catching this pass. null if the pass was incomplete or the receiver touch could not be linked.


Pass Style

is_one_handed_pass

Type: boolean

true if the pass was thrown with only one hand on the ball for a meaningful portion of the throw. null if player pose data is unavailable for the passer at the time of the pass


pass_handedness

Type: string

Which hand primarily threw the pass:

  • right
  • left
  • both
  • null if player pose data is unavailable for the passer at the time of the pass

NOTE

A pass that is not one-handed can still be primarily thrown with either the right or left hand if both hands are on the ball close to the release of the pass but one hand does the pushing.


is_jump_pass

Type: boolean

true if the passer was in the air when the ball was released. null if player pose data is unavailable for the passer at the time of the pass


is_reversal

Type: boolean

true if the pass moves the ball from an established strong side of the court to a receiver on the weak side. The receiver must be in the frontcourt and outside the middle of the floor. A pass is not counted as a reversal when the passer stays in the middle of the floor after multiple dribbles in the middle and passes to a receiver on the same side of the court. Incomplete passes can still be marked as reversals when the intended receiver's location is available. false otherwise.


is_backcourt

Type: boolean

true if the pass started in the offensive team's backcourt. false otherwise.


Pass Location

These fields use court coordinates in feet.

passer_loc_x

Type: float | Unit: feet

Passer's x-coordinate when the pass was released.


passer_loc_y

Type: float | Unit: feet

Passer's y-coordinate when the pass was released.


receiver_loc_x

Type: float | Unit: feet

Intended receiver's x-coordinate at the pass reception moment. For incomplete passes, this is the intended receiver's x-coordinate when the pass was released.


receiver_loc_y

Type: float | Unit: feet

Intended receiver's y-coordinate at the pass reception moment. For incomplete passes, this is the intended receiver's y-coordinate when the pass was released.


ball_start_loc_x

Type: float | Unit: feet

Ball x-coordinate when the pass was released.


ball_start_loc_y

Type: float | Unit: feet

Ball y-coordinate when the pass was released.


ball_end_loc_x

Type: float | Unit: feet

Ball x-coordinate at the end of the pass.


ball_end_loc_y

Type: float | Unit: feet

Ball y-coordinate at the end of the pass.


turnover_receiver_loc_x

Type: float | Unit: feet

X-coordinate of the defender credited with the steal on a live-ball turnover pass. When the defender credited with the steal is the first defender to gain possession of the ball, this uses that possession touch's start location. If the defender credited with the steal deflects the ball, this uses their last touch of the ball before their team gains possession; if that touch cannot be found, it falls back to the defender credited with the steal's location at the pass end frame. null if the pass was not a turnover or no steal was credited (e.g. an out-of-bounds or offensive-foul turnover).


turnover_receiver_loc_y

Type: float | Unit: feet

Y-coordinate of the defender credited with the steal on a live-ball turnover pass. When the defender credited with the steal is the first defender to gain possession of the ball, this uses that possession touch's start location. If the defender credited with the steal deflects the ball, this uses their last touch of the ball before their team gains possession; if that touch cannot be found, it falls back to the defender credited with the steal's location at the pass end frame. null if the pass was not a turnover or no steal was credited (e.g. an out-of-bounds or offensive-foul turnover).


passer_region

Type: string

Court region of the passer when the pass was released.


receiver_region

Type: string

Court region of the intended receiver at the pass reception moment. For incomplete passes, this is based on the intended receiver's location when the pass was released.


distance

Type: float | Unit: feet

Distance the ball traveled from the start of the pass to the end of the pass.


Reception Data

receiver_touched_ball

Type: boolean

true if the intended receiver touched the ball at any point near the end of the pass (including incomplete passes).


receiver_jumped_for_touch

Type: boolean

true if the receiver's first touch occurred while they were in the air. null if the receiver never touched the ball (e.g. on an incomplete pass)


ball_hit_ground_during_completed_pass

Type: boolean

true if the ball hit the ground between release and the receiver's first touch. null if the receiver never touched the ball (e.g. on an incomplete pass)

NOTE

Usually the ball hitting the ground on a completed pass is intentional, like a bounce pass, but because we can't easily infer intention from the tracking data this field is intentionally named to describe what we're measuring: whether the ball hit the ground between release and the receiver's first touch, not whether it was a bounce pass.


Catch Location

These fields measure where the receiver caught the ball relative to their body.

catch_height_in

Type: float | Unit: inches

Ball height above the floor at the receiver's first touch. null if the receiver never touched the ball (e.g. on an incomplete pass)


catch_height_above_mid_hip_in

Type: float | Unit: inches

Ball height above the receiver's mid hip at first touch. null if the receiver never touched the ball (e.g. on an incomplete pass)


catch_height_above_standing_hip_in

Type: float | Unit: inches

Ball height above the receiver's estimated standing hip height at first touch. This helps adjust for receivers bending down to catch low passes. null if the receiver never touched the ball (e.g. on an incomplete pass)


catch_distance_from_mid_chest_in

Type: float | Unit: inches

Distance from the ball center to the receiver's mid-chest point at first touch. We compute the mid-chest as the midpoint between the mid hip and neck. null if the receiver never touched the ball (e.g. on an incomplete pass)


catch_distance_left_right_in

Type: float | Unit: inches

How many inches to the left/right the center of the ball is from the center of the player’s chest (based on which way the shoulders are facing). This is an absolute value, i.e. it does not indicate direction only the magnitude. A value close to 0 would indicate the ball is caught in the middle of the player’s body, while a high value would indicate it is way off to the side of the player (again, based on which way the player’s shoulders are facing when the ball is first touched). null if the receiver never touched the ball (e.g. on an incomplete pass)


catch_distance_forward_in

Type: float | Unit: inches

How many inches in front of the player the center of the ball is when it is first touched. A value close to 0 would indicate the ball is first touched very close to the player’s body, while a high value would indicate it is touched far out in front of a player’s body. null if the receiver never touched the ball (e.g. on an incomplete pass)