Appearance
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.
