Skip to content

Turnovers ​

The turnovers section in the markings response contains details on each official turnover.

Sample Response ​

json
{
  "markings": {
    "turnovers": [
      {
        "attacking_positive_x": true,
        "defensive_team_id_nba": 1610612740,
        "event_pbp_descriptor": null,
        "event_pbp_id": 20,
        "event_pbp_qualifiers": null,
        "event_pbp_subtype": "badpass",
        "event_pbp_turnover_total": 1,
        "game_clock": 636,
        "game_clock_running": true,
        "game_id_nba": "0022500404",
        "end_loc_x": 411.42,
        "end_loc_y": -40.93,
        "end_region": "key",
        "pbp_event_id": 20,
        "period": 1,
        "player_id_nba": 1642948,
        "possession_touch_id_ctg": "possession_touch_5435b99a68a17dd802078397e4b7008a",
        "possession_team_id_nba": 1610612742,
        "is_team_turnover": false,
        "shot_clock": 12,
        "shot_clock_running": true,
        "start_loc_x": 379.69,
        "start_loc_y": -153.89,
        "start_region": "right wing two",
        "stealer_id_nba": 1642852,
        "turnover_he_frame": 8690,
        "turnover_id_ctg": "turnover_a2ec347932d326efe9d81bcebcf08390",
        "turnover_wall_clock": "2025-12-23T01:12:59.297+00:00"
      }
    ]
  }
}

Fields ​

Identifiers ​

game_id_nba ​

Type: string

NBA game ID


turnover_id_ctg ​

Type: string

CTG-generated unique turnover ID


possession_touch_id_ctg ​

Type: string | Nullable

CTG-generated ID for the player's possession touch that ended in this turnover. null for team turnovers or when no possession touch can be linked.


player_id_nba ​

Type: integer | Nullable

NBA player ID who committed the turnover. null if the turnover is not assigned to a player.


possession_team_id_nba ​

Type: integer

NBA team ID of the team that lost possession


defensive_team_id_nba ​

Type: integer

NBA team ID of the team that gained possession


stealer_id_nba ​

Type: integer

NBA player ID who recorded the steal. null if not a steal


Classification ​

is_team_turnover ​

Type: boolean

true when the turnover is a team turnover, meaning the official turnover is not assigned to an individual player. false otherwise.


Timing ​

period ​

Type: integer

Period when the turnover occurred


game_clock ​

Type: float

Game clock (seconds remaining) at the turnover


shot_clock ​

Type: float

Shot clock at the turnover. null if the shot clock is off


turnover_he_frame ​

Type: integer

Hawk-Eye frame of the turnover. null if there is no corresponding Hawk-Eye frame in the Hawk-Eye event data


turnover_wall_clock ​

Type: string

UTC timestamp corresponding to turnover_he_frame. null if there is no corresponding Hawk-Eye frame.


game_clock_running deprecated ​

Type: boolean

true if game clock was running

Deprecated

This field is unreliable and not particularly useful for analyzing turnover events. This field will be removed in a future version.


shot_clock_running deprecated ​

Type: boolean

true if shot clock was running

Deprecated

This field is unreliable and not particularly useful for analyzing turnover events. This field will be removed in a future version.


Court Context ​

start_* fields describe where the player who committed the turnover lost possession. end_* fields usually match the start location, but can differ for live-ball turnovers. In that case we look at where the defense establishes possession, preferring the possession touch by the player who recorded the steal when available. Both regions are described relative to the basket the original offensive team was attacking.

start_loc_x ​

Type: float | Unit: inches

X coordinate where the player who committed the turnover lost possession. null if the player or location is unavailable.


start_loc_y ​

Type: float | Unit: inches

Y coordinate where the player who committed the turnover lost possession. null if the player or location is unavailable.


start_region ​

Type: string | Nullable

Court region where the player who committed the turnover lost possession. null if the player location or attacking basket is unavailable.


end_loc_x ​

Type: float | Unit: inches

X coordinate where the turnover resolved. This usually matches start_loc_x, but on live-ball turnovers it can use the first possession touch by the player who recorded the steal, or if no such touch is found, the first ensuing possession touch by the defensive team. null if the location is unavailable.


end_loc_y ​

Type: float | Unit: inches

Y coordinate where the turnover resolved. This usually matches start_loc_y, but on live-ball turnovers it can use the first possession touch by the player who recorded the steal, or if no such touch is found, the first ensuing possession touch by the defensive team. null if the location is unavailable.


end_region ​

Type: string | Nullable

Court region where the turnover resolved. This usually matches start_region, but on live-ball turnovers it can use the first possession touch by the player who recorded the steal, or if no such touch is found, the first ensuing possession touch by the defensive team. Both start_region and end_region are described relative to the basket the team that committed the turnover was attacking at the start of the turnover sequence. null if the location or attacking basket is unavailable.


attacking_positive_x deprecated ​

Type: boolean

true if offensive team was attacking positive X basket. null if unknown

Deprecated

This information is not particularly accurate and not useful for analyzing turnover events. This field will be removed in a future version.


Play-by-Play Data ​

pbp_event_id ​

Type: integer

Play-by-play event ID


event_pbp_id deprecated ​

Type: integer

Play-by-play event ID

Deprecated

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


event_pbp_subtype ​

Type: string | Nullable

Turnover type from the official play-by-play feed. null if the feed does not provide a type.

Values observed in production:

  • 10secondfreethrowshooter
  • 3secviolation
  • 5secondbacktothebasket
  • 5secviolation
  • 8secviolation
  • backcourt
  • badpass
  • basketfrombelow
  • discontinuedribble
  • doubledribble
  • excesstimeout
  • illegalassist
  • inbound
  • jumpballviolation
  • laneviolation
  • lostball
  • offensivefoul
  • offensivegoaltending
  • offensivekickedball
  • outofbounds
  • palming
  • punchedball
  • shotclock
  • swingingelbows
  • toomanyplayers
  • traveling
  • unknown

event_pbp_descriptor deprecated ​

Type: string

Additional description (e.g., "lostball" for out of bounds). null if not provided

Deprecated

This information is not particularly useful for analyzing turnover events. This field will be removed in a future version.


event_pbp_qualifiers deprecated ​

Type: string

Qualifier information. null if not provided

Deprecated

This information is not useful for analyzing turnover events. This field will be removed in a future version.


event_pbp_turnover_total deprecated ​

Type: integer

Player's turnover total for the game at this point in the game

Deprecated

This data is already available in the official NBA play-by-play feed. This field will be removed in a future version.