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_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


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

Turnover type (see values below)


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.