Skip to content

Data Sets Overview ​

The CTG Pro Data Feed includes data organized into several marking types. The API bundles these all within the markings object. The marking types that appear in the response are based on the API parameters you used. Within each of these markings objects is a list of objects, one for each instance of the given marking.

For example, within the shots object would be a list of objects, one for each shot taken in the game, with the data fields we have included to help describe what is going on in that instance.

json
{
  "markings": {
    "shots": [
        {
          "blocker_player_id_nba": null,
          "chance_id_ctg": "chance_51bfc1fda2cc0deb125bee9988859667",
          "end_game_clock": 708,
          "end_he_frame": 761,
          ...
        },
        {
          "blocker_player_id_nba": null,
          "chance_id_ctg": "chance_4c33ded97f95174cc013b446c3981347",
          "end_game_clock": 688,
          "end_he_frame": 1971,
          ...
        }
    ],
    "jump_shots": [...],
    "interior_shots": [...],
    "chances": [...],
    "possessions": [...],
    ...
  }
}

There is a section in these docs for each marking type available with detailed explanations of what that marking represents as well as all of the fields included with it.

Nullable Fields ​

A small set of fields is present in every row. You can safely enforce non-null constraints on these fields, where the data set has them:

  • game_id_nba
  • The row's key IDs. In most data sets, this is the data set's own *_id_ctg field, for example shot_id_ctg. The data sets in the table below have one row per player, side, or instance, so their key is more than one field.
  • period
  • The start frame: start_he_frame, or jump_start_he_frame in Jumps, shot_start_he_frame in Shots Location Velocity Defender, and touch_start_he_frame in Possession Touches Location Velocity Defender. Event frames such as foul_he_frame and turnover_he_frame are not in this set.

Some fields can also be null by design, for example when the field does not apply to the row.

All other fields are intended to have a value when they apply, but can be null in rare cases when upstream tracking or event data is missing or wrong. Examples are a Hawk-Eye clock or tracking outage, or, during live processing, a shot so recent that its tracking and play-by-play have not fully arrived yet. Do not enforce non-null constraints on these fields, so that one bad value does not block the rest of a game.

Data setKey fields
After Shot Positioningshot_id_ctg, player_id_nba
Anthro Measurementsgame_id_nba, player_id_nba
Ball Screen Instancesball_screen_id_ctg, instance_number
Ball Screens: Off-Ball Playersball_screen_id_ctg, player_id_nba
Chance Matchupschance_id_ctg, player_id_nba
Dribbles Location Velocity Defenderdribble_id_ctg, defender_id_nba
Drives: Off-Ball Playersdrive_id_ctg, player_id_nba
Matchupschance_id_ctg, defender_id_nba, start_he_frame
Possession Touches Location Velocity Defenderpossession_touch_id_ctg, defender_id_nba
Shots Location Velocity Defendershot_id_ctg, defender_id_nba
Transition Opportunitieschance_id_ctg, side
Transition Opportunities: Playerchance_id_ctg, player_id_nba
1v1 Advantage Creation: Off-Ball Playersadvantage_creation_1v1_id_ctg, player_id_nba