Skip to content

Concepts

Season Coverage

The CTG Pro Data Feed is based on the data in the "Hawk-Eye era", i.e. from the 2023-24 season and onward when pose data for all players first became available. We sometimes call this the "3D data" because it involves being able to analyze player movement in three dimensions, which was not previously possible in prior eras of tracking data.

Equivalent markings for the "2D era" (2013-14 through 2022-23) do not yet exist in the CTG Pro Data Feed.

During the alpha testing, only data from the 2025-26 season will be backfilled and updated with changes. When we move onto beta testing, the data will be backfilled for the entire 3D era.

Feed Types

The CTG Pro Data Feed provides two feed types: live and postgame.

The live data is built off of Hawk-Eye's delayed data stream, and the postgame data is built off of their processed stream. The delayed stream is available in-game with minimal delays, but is less accurate than the processed stream.

Checking Stream Availability

You can use the /game_status endpoint to check which games have data available for a given feed, as detailed in the Game Status Endpoint section.

Entity IDs

The CTG Pro Data Feed uses official NBA identifiers for games, players, and teams.

  • Every game has a unique 10-digit NBA game ID that identifies the specific matchup, e.g. 0042400101 or 0022500241
  • Each player has a unique integer identifier assigned by the NBA, e.g. 201939 or 1641705
  • Each teams is identified by an integer IDs assigned by the NBA, e.g. 1610612747

CTG Internal IDs

CTG generates unique identifiers for most markings. This ID is designed to be easy to read and work with so that you can know at a glance what marking type it refers to, for example:

Field NameFormatExample
shot_id_ctgshot_<hash>shot_53c414a581512a05b591899e94225dea
pass_id_ctgpass_<hash>pass_9afbfea254c6d47a1f0f74e53ba3fab3
chance_id_ctgchance_<hash>chance_878aba9051e5f93a16c5b27c495e1c3d

WARNING

These IDs are designed to be stable across changes in the data only if the underlying defining characterstics of the data do not change. That is, the shot ID is keyed to some identifying characteristics like the shooter and estimated release frame. If the release frame changes in the underlying data, the ID of the given shot will change.

You should not rely on these IDs to be stable across time, then. We do have an attempted solution to try to produce stable IDs which we may expose at some point, but until then you will need to engineer systems that assume these IDs could change across backfills.

Coordinate Systems

The CTG Pro Data Feed uses Hawk-Eye's coordinate system for all fields that reference specific x and y coordinates, in their unit of choice (inches).

Most fields will also reference the units in the field or field definition (e.g. inches vs. feet), but if not specified you can assume the defaults are inches for distance and degrees for angle measurements.

Court Layout

Here is the diagram of the coordinate system as taken from Hawk-Eye's documentation:

Hawk-Eye NBA Court Coordinate System

As you can see, the origin (0, 0, 0) is the center of the jump circle in the middle of the court right on the floor.

Attacking Direction

Where necessary, our data includes an attacking_positive_x flag (similar to what Hawk-Eye does) to indicate which basket the offensive team is attacking:

ValueMeaning
trueOffense is attacking the basket at X = +41.75 feet (right side of court when looking from broadcast angle)
falseOffense is attacking the basket at X = -41.75 feet (left side of court when looking from broadcast angle)

NOTE

We do not take the attacking_positive_x flag directly from Hawk-Eye's data, as we have found it is not always reliable. We calculate it ourselves, and thus there may be differences if compared directly to Hawk-Eye's version.

Court Regions

Sometimes our data includes a court region for easy grouping into standard regions:

RegionDescription
raRestricted Area (near the rim)
keyThe paint/key area
left corner two / right corner twoCorner 2-point zones
left corner three / right corner threeCorner 3-point zones
left wing two / right wing twoWing 2-point zones
left wing three / right wing threeWing 3-point zones
middle two / middle threeTop of key zones
left dunker / right dunkerDunker spots (offensive)
farBeyond the 3-point arc on offensive half
backcourtDefensive half of the court

Here is a diagram showing our definitions of the various zones (coordinates in the diagram are in feet):

Court Region Diagram

Frames & Timestamps

The CTG Pro Data Feed uses both the Hawk-Eye frame numbers and the wall clock timestamps to precisely identify moments during a game that apply to the markings.

Hawk-Eye Frame Numbers

Hawk-Eye frame numbers reference the frame number assigned by Hawk-Eye for the given feed type. Their tracking data is currently delivered at 60 frames per second (FPS).

Fields ending in _he_frame contain Hawk-Eye frame numbers, for example:

FieldDescription
first_ball_in_hands_he_frameWhen player first touches ball
last_ball_in_hands_he_frameWhen ball is released
last_either_foot_on_floor_he_frameLast frame where either foot is on the floor (right before becoming airborne)

Wall Clock Timestamps

Recognizing that not everything can be tied to the Hawk-Eye data, and that many teams have not ingested frame level Hawk-Eye data, we also deliver the wall clock timestamp of the frame anywhere there is a frame number. They appear in fields that are named *_wall_clock. This allows you to tie marking data to specific points in time for other uses apart from matching to Hawk-Eye frame data.

Wall clocks are delivered in UTC using ISO 8601 format, for example:

2025-11-18T02:20:39.402+00:00