Skip to content

Shots ​

The shots section in the markings response contains an object for each shot attempt in a game: either a field goal attempt or a shooting foul where the shot was not made.

Overview ​

This data set provides complete shot information including timing, location, outcome, and classification. Every shot from the play by play data will appear here, and can be joined with more detailed mechanics data in jump_shots or interior_shots depending on the shot type.

Sample Response ​

json
{
  "markings": {
    "shots": [
      {
        "blocker_player_id_nba": null,
        "chance_id_ctg": "chance_51bfc1fda2cc0deb125bee9988859667",
        "end_game_clock": 708,
        "end_he_frame": 761,
        "end_shot_clock": 13,
        "end_wall_clock": "2025-12-23T01:10:47.139+00:00",
        "event_pbp_id": 7,
        "game_id_nba": "0022500404",
        "is_and_one": false,
        "is_bank": false,
        "is_blocked": false,
        "is_created_from_paint": true,
        "is_fouled": false,
        "is_made": true,
        "is_assisted": true,
        "is_potential_assisted": true,
        "is_three": false,
        "is_tip": false,
        "league_avg_make_probability_at_release": 0.6342,
        "league_avg_make_probability_at_start": 0.6027,
        "loc_x": 460.5,
        "loc_y": 13.91,
        "num_close_teammates": 1,
        "num_dribbles_during_touch": 2,
        "pass_id_ctg": "pass_a3384f0ea3c74d740b3b7100fd2e6257",
        "passer_id_nba": 1642843,
        "pbp_event_id": 7,
        "period": 1,
        "player_adj_make_probability_at_release": 0.6518,
        "player_adj_make_probability_at_start": 0.6203,
        "possession_id_ctg": "possession_640fb5737252cbe98b4f4a70dcee9d8f",
        "possession_touch_id_ctg": "possession_touch_2fbe67e615fc6c47c3c1a86aa59d7d93",
        "is_quick_no_dribble_shot": false,
        "shooter_id_nba": 203076,
        "shooter_acceleration": 0.68,
        "shooter_rim_movement_angle_after_shot": 12.47,
        "shooter_rim_movement_angle_before_shot": -5.31,
        "shooter_velocity_after_shot": 4.92,
        "shooter_velocity_before_shot": 4.24,
        "shot_distance_in": 42.82,
        "shot_id_ctg": "shot_105f89542695fcebf740bb7c426ac4c3",
        "shot_type": "layup",
        "shooter_feet_from_rim_at_shot": 3.57,
        "shooter_location_at_shot_x": 38.38,
        "shooter_location_at_shot_y": -1.16,
        "shooter_context": "primary",
        "start_game_clock": 708,
        "start_he_frame": 749,
        "start_shot_clock": 14,
        "start_wall_clock": "2025-12-23T01:10:46.939+00:00",
        "team_id_nba": 1610612742,
        "touch_time_before_shot": 0.78,
        "turn_over_shoulder": "none",
        "turn_over_shoulder_degrees": null
      }
    ]
  }
}

Fields ​

Nullable Fields

During live processing, shot_type and the four fields in Shot Make Probability are null until the shot's tracking and play-by-play have arrived. A few shots per live game can stay null until postgame processing replaces the live data. shot_type is also null when shot end detection fails.

Identifiers ​

shot_id_ctg ​

Type: string

CTG-generated unique shot ID


game_id_nba ​

Type: string

NBA game ID


chance_id_ctg ​

Type: string

CTG chance ID in which the shot occurred


possession_id_ctg ​

Type: string

CTG possession ID in which the shot occurred


possession_touch_id_ctg ​

Type: string | Nullable

CTG possession touch ID for the shooter's touch that ended with this shot. null if no preceding possession touch could be identified.


pass_id_ctg ​

Type: string | Nullable

CTG pass ID for the pass that led into the shooter's possession touch before this shot. This field can be present even when is_potential_assisted is false. It is null when no preceding pass could be identified.


passer_id_nba ​

Type: integer | Nullable

NBA player ID of the passer on pass_id_ctg. null when no preceding pass could be identified.


shooter_id_nba ​

Type: integer

NBA player ID of the shooter


team_id_nba ​

Type: integer

NBA team ID of the shooting team


pbp_event_id ​

Type: integer

Play-by-play event ID (i.e. NGSS ID) for this shot


event_pbp_id deprecated ​

Type: integer

Play-by-play event ID (i.e. NGSS ID) for this shot

Deprecated

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


Timing ​

period ​

Type: integer

Period in which the shot occurred (1-4 for regulation, 5+ for OT)

Shot Start ​

The shot start is defined as the first frame after the player releases the ball.

start_game_clock ​

Type: float

Game clock (seconds remaining in period) at shot start


start_shot_clock ​

Type: float

Shot clock at shot start


start_he_frame ​

Type: integer

Hawk-Eye frame at shot start


start_wall_clock ​

Type: string

UTC timestamp at shot start

Shot End ​

The shot end is defined as the first frame where the ball reaches basket height after the shot's peak. Specifically, it's the earliest of:

  1. Close to hoop: The first frame where the center of the ball is within 16 inches of the center of the hoop and at basket height (between 118-125 inches / ~10 feet)
  2. Below 10 feet: The first frame where the ball drops below 10 feet after reaching its peak

The shot's "peak" is the frame where the ball reaches its highest point and begins descending.

If neither condition is met within 5 seconds of the shot release, the peak frame itself is used as the shot end. (This can happen when a shot is blocked out of bounds, for example, so there is no ball tracking data with the ball below 10 feet.)

Nullable Fields

The shot end fields (end_game_clock, end_he_frame, end_shot_clock, end_wall_clock) can be null in rare cases where upstream HawkEye data has timing issues. When shot end cannot be determined, is_tip and shot_type will also be null.

end_game_clock ​

Type: float

Game clock at shot end. Can be null if shot end detection fails due to upstream data issues (see note above).


end_shot_clock ​

Type: float

Shot clock at shot end. Can be null if shot end detection fails due to upstream data issues (see note above).


end_he_frame ​

Type: integer

Hawk-Eye frame at shot end. Can be null if shot end detection fails due to upstream data issues (see note above).


end_wall_clock ​

Type: string

UTC timestamp at shot end. Can be null if shot end detection fails due to upstream data issues (see note above).


Shot Location ​

The shot location is defined as the shooter's centroid at the shot release frame.

shot_distance_in ​

Type: float | Unit: inches

Distance from the shot location (as defined above) to the center of the basket at the shot release frame. This distance is measured in 2D, i.e. as if you marked a spot on the floor where shooter's centroid was and then measured along the floor to the spot directly under the center of the basket.


loc_x ​

Type: float | Unit: inches

X coordinate of the shot location on the court


loc_y ​

Type: float | Unit: inches

Y coordinate of the shot location on the court


shooter_location_at_shot_x ​

Type: float | Unit: feet | Nullable

Shooter x coordinate at the shot frame. This is the same shot-location context as loc_x, but converted to feet and oriented consistently with the location-velocity fields.


shooter_location_at_shot_y ​

Type: float | Unit: feet | Nullable

Shooter y coordinate at the shot frame. This is the same shot-location context as loc_y, but converted to feet and oriented consistently with the location-velocity fields.


shooter_feet_from_rim_at_shot ​

Type: float | Unit: feet | Nullable

Shooter distance from the rim at the shot frame.


Shooter Movement ​

These fields describe how the shooter was moving in the moments around the shot — how fast they were traveling, whether they were accelerating or decelerating, and what direction they were moving relative to the basket. All values are measured over a 0.6-second window before or after the release frame of the shot.

shooter_velocity_before_shot ​

Type: float | Unit: ft/s

How fast the shooter was moving in the 0.6 seconds before the release frame.


shooter_velocity_after_shot ​

Type: float | Unit: ft/s

How fast the shooter was moving in the 0.6 seconds after the release frame.


shooter_acceleration ​

Type: float | Unit: ft/s

The change in the shooter's speed from before to after the shot release (shooter_velocity_after_shot minus shooter_velocity_before_shot). A positive value means the shooter was moving faster after the release frame than before it; a negative value means they were slowing down.


shooter_rim_movement_angle_before_shot ​

Type: float | Unit: degrees

The direction the shooter was moving relative to the basket in the 0.6 seconds before the release frame. Angles are centered on the basket: 0° means moving directly toward or away from the basket, positive values indicate movement to the right of the basket (from the shooter's perspective), and negative values indicate movement to the left. Values range from -180 to 180.


shooter_rim_movement_angle_after_shot ​

Type: float | Unit: degrees

The direction the shooter was moving relative to the basket in the 0.6 seconds after the release frame, using the same convention as shooter_rim_movement_angle_before_shot.


num_close_teammates ​

Type: integer

Number of offensive teammates within 7.5 feet of the shooter at the time of the shot release.


Shot Make Probability ​

These fields estimate the probability that the shot will be made based on the tracking context at the start or release of the shot. Values range from 0 to 1, where 0.5 means a 50% estimated make probability. They are not adjusted for the added value of three point shots, so if you want to see an eFG% equivalent, you will need to multiply by 1.5 on three point attempts.

league_avg_make_probability_at_release ​

Type: float

The league average shot make model estimates the probability that a given shot attempt will be made, based purely on the characteristics of the shot itself rather than on who is taking it. You can think of the output as: "If a typical NBA player took this exact shot, in this exact situation, how often would it go in?"

For every shot we detect from the 3D tracking data, we extract a set of features that describe both the shot and the surrounding context at the moment of release.

WARNING

Because this model is keyed to the release of the shot, it means that if a player is stripped on the way up or blocked or fouled, the ball release can happen at a time when the shot probability is already very low. So these shots will have very low probabilities assigned.

The features used to estimate the make probability fall into a few broad categories:

  • Game context:
    • How late in the shot clock or game clock the shot occurred.
    • Whether the shooter was fouled.
  • Shot location and momentum:
    • How close the shooter was to the rim.
    • How fast the shooter was moving relative to the rim.
    • For interior shots, the shooter's angle to the rim and the ball's distance from the rim at release.
    • How far the shooter traveled during the touch.
  • Shot mechanics:
    • The height of the ball.
    • Whether the ball was moving up or down.
    • Whether the shooter had one or both hands on the ball.
    • Whether the ball was extended above the shooter's shoulders.
  • Defensive pressure:
    • How close the nearest defender was.
    • How close a defender's hand came to the ball during the shooting motion.
    • How quickly a defender's hand was closing on the ball at release.

Probability estimates are made out-of-sample for all shots. In other words, each historical shot is scored by a model that was not trained on that shot to ensure estimates are representative of live future performance and not overfit to the current data.


player_adj_make_probability_at_release ​

Type: float

The player adjusted model takes the league average probability for a shot and modifies it based on the specific shooter's recent track record. The result is a per-shot probability that answers a slightly different question: "Given that this particular player is taking this shot, how often would we expect it to go in?"

The player adjusted probability starts from the league average probability and applies a player-specific shift. The shift is positive for shooters who have outperformed league expectations on similar shots prior to the game in question, negative for shooters who have underperformed, and close to zero for shooters whose results have tracked the league baseline.

The adjustment is computed separately for different categories of shots so that a player's strengths and weaknesses in different parts of the floor are reflected appropriately. Specifically, shots are bucketed by:

  • Distance from the rim: 0 to 4 feet, 4 to 14 feet, 14 to 22 feet, 22 to 30 feet, and over 30 feet.
  • Defender pressure at release: open versus contested.

Some key points:

  • Only shots taken before the current game are used to build a player's adjustment. When we score a shot from a given game, the player's adjustment reflects what they had done up to but not including that game. This means that players with no (or few) prior games will have a small or zero adjustment.
  • Adjustments are regularized toward the league average. A player who has only a handful of attempts in a given bucket will receive a small adjustment, even if their early shooting percentage is extreme. The strength of the regularization scales with sample size, so adjustments grow more confident as a player accumulates attempts.
  • The adjustment is applied on the log-odds scale. Practically this means a fixed "player skill" advantage produces a larger absolute swing in the middle of the probability range and a smaller swing near 0 or 1. A shooter who is reliably above average will not be pushed past plausible make rates on already-easy looks, and a poor shooter will not be pushed below realistic rates on already-tough looks.

league_avg_make_probability_at_start ​

Type: float

The league average shot make model estimates the probability that a given shot attempt will be made, based purely on the characteristics of the shot itself rather than on who is taking it. You can think of the output as: "If a typical NBA player took this exact shot, in this exact situation, how often would it go in?"

For every shot we detect from the 3D tracking data, we extract a set of features that describe both the shot and the surrounding context as the player goes up into the shooting motion. We try to detect that rise into the shooting motion by finding the frame when the player begins to lift the ball into the shot.

We developed this so that you can more accurately gauge the “shot quality” for shots that are blocked or stripped/disrupted before release. It may also allow you to see the impact of defensive positioning/offensive adjustment in the window after the upward motion and before the release by comparing the shot start probability with the release probability.

The features used to estimate the make probability fall into a few broad categories:

  • Game context:
    • How late in the shot clock or game clock the shot occurred.
    • Whether a field goal miss recently occurred.
  • Shot location and momentum:
    • How close the shooter was to the rim and the angle to the rim.
    • The ball's height at shot start.
    • How far the shooter traveled during the touch.
  • Shot mechanics:
    • How fast the shooter is moving.
    • Whether the shooter had one or both hands on the ball.
    • Shooter hip height.
  • Defensive pressure:
    • Distance and angle to the nearest defender and other nearby defenders.
    • Nearest defender hand distance and speed.

Probability estimates are made out-of-sample for all shots. In other words, each historical shot is scored by a model that was not trained on that shot to ensure estimates are representative of live future performance and not overfit to the current data.


player_adj_make_probability_at_start ​

Type: float

The player adjusted shot-start model applies the shooter's prior results to league_avg_make_probability_at_start following the same method we use for the player adjustment on the shot release model.


Pre-Shot Touch ​

These fields describe the ball-handling touch that immediately preceded the shot — how long the shooter had the ball and how many times they dribbled during that touch.

num_dribbles_during_touch ​

Type: integer

Number of dribbles the shooter took during the possession touch that immediately preceded the shot. A value of 0 means the shooter did not dribble during the touch before the shot. When no touch is found before the shot (touch_time_before_shot is null), this value is 0.


is_quick_no_dribble_shot ​

Type: boolean

true when the shooter took no dribbles during the possession touch immediately before the shot and released the shot within 2 seconds of starting that touch. This applies to both jump shots and layups. For jump shots it can help you identify catch-and-shoot situations. When no touch is found before the shot (touch_time_before_shot is null), this value is false.


is_potential_assisted ​

Type: boolean

true when this shot has a preceding pass and the shooter took no more than 3 dribbles with no more than 3.5 seconds of touch time before the shot. false otherwise.

NOTE

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


touch_time_before_shot ​

Type: float | Unit: seconds

Duration of the possession touch that immediately preceded the shot, in seconds. null if no preceding touch could be identified (for example, on tip shots or plays where tracking data is incomplete).


is_created_from_paint ​

Type: boolean

true if the ball was in the paint during the shooter touch or during the preceding touch no more than roughly two seconds before the shot.


Shot Details ​

shot_type ​

Type: string

The shot_type field classifies the shot using 3D tracking data to analyze movement and release style. Can be null if shot end detection fails due to upstream data issues.

  • dunk: A dunk or dunk attempt that is not a lob.
  • floater: A floater would be a shot taken near the rim and uses one hand to shoot overhand with the player largely facing the basket. A baby hook shot or push shot with the player's shoulder mostly turned to the basket would be different (see below). This also includes runners and shots from further away that are taken without a normal jump shot shooting motion, almost always with a one-handed push shooting motion.
  • heave: A shot from very far away taken up against the end of the shot/game clock.
  • hook: A shot taken primarily with one hand and with the back or side turned toward the basket, usually not moving toward the basket.
  • jumper: A jump shot with two hands on the ball until pushing to release. This includes a large variety of jump shots like a standard jumper, a fadeaway out of the post, a pull up, etc.
  • layup: Any shot near the basket that is not a dunk, lob, or tip. Layups and floaters can sometimes be difficult to distinguish. More weight is given to a shot being classified as a layup over a floater if it uses the backboard.
  • lob: A shot near the basket where shooter receives a pass and shoots without landing first. Includes lob dunks.
  • lost_ball_on_way_up: A shot where the ball is blocked or the player is fouled and loses the ball such that you can’t actually tell which type of shot it was going to be.
  • putback: Player dunks or shoots immediately after an offensive rebound without landing.
  • tip: Player hits the ball with one hand after a missed shot to tip it in without landing from their jump first. This does not include tips from passes, which would be considered lobs.

Jump Shots vs Interior Shots

In other sections of our markings, we separate jump shots from interior shots. jumper shots have detailed mechanics in the jump_shots section, while other shot types have their mechanics in interior_shots.


shooter_context ​

Type: string | Nullable

Classifies whether the shot came from the primary ballhandler in a linked play, an off-ball player in a linked play, or no linked play context. Possible values are:

  • primary: The shooter was the primary ballhandler in the linked play.
  • off_ball: The shot came from a linked play, but the shooter was not the primary ballhandler.
  • random: The shot did not have a linked play context.

turn_over_shoulder ​

Type: string

For shots with a shot_type of jumper or hook, this classifies whether the shooter turned over a shoulder as part of the shooting motion and, if so, which shoulder. Possible values are:

  • left: The shooter turned over the left shoulder into the shot.
  • right: The shooter turned over the right shoulder into the shot.
  • none: The shot did not include a shoulder turn into the shooting motion. This value is also used for shot types other than jumpers and hooks.

A null value is not none. It means the shoulder turn could not be measured for the shot.

For jumpers, this is designed to mostly include turnaround shots. A step back where a player moved their shoulders as part of the motion would not be included.

For hook shots, the required turn is lower: a player who shoots a hook shot over their left shoulder without turning much is still considered turning over their left shoulder. You can use the turn_over_shoulder_degrees field to determine the magnitude of the turn if you want to filter these out.


turn_over_shoulder_degrees ​

Type: float | Unit: degrees | Nullable

Estimated magnitude of the shooter's shoulder turn into the shot. Larger values mean the shooter made a bigger shoulder turn during the shooting motion. null when turn_over_shoulder is none.


is_three ​

Type: boolean

true if the shot was a three-point attempt


is_tip ​

Type: boolean

true if the shot was a tip-in attempt. Can be null if shot end detection fails due to upstream data issues.


is_made ​

Type: boolean

true if the shot was made


is_assisted ​

Type: boolean

true if the NBA play-by-play credited an official assist on this shot.


is_bank ​

Type: boolean

The is_bank field indicates whether the ball hit the front side of the backboard and changed trajectory before hitting the rim.

  • Returns true only if the ball hits the front of the backboard first
  • Returns false if the ball hits the side, back, or top of the backboard first
  • Returns false if the ball hits the rim first
  • Returns false if the ball never gets near the backboard before the shot end frame (e.g. an airball)
  • Returns null if the shot is blocked (since we can't determine if it would have been a bank)

is_blocked ​

Type: boolean

true if the shot was blocked


blocker_player_id_nba ​

Type: integer

NBA player ID of the blocker. null if not blocked


is_fouled ​

Type: boolean

true if the shooter was fouled during the shot


is_and_one ​

Type: boolean

true if the shot was made and the shooter was fouled