Skip to content

Download Tracking

Per-frame player, referee and ball positions for one analysis, as a file download.

Request

GET /analyses/{id}/tracking/download?format=parquet
Parameter Type Required Description
id integer Yes Analysis ID
format string No clean or parquet (default)

The file is deterministic for a given analysis and can be cached client-side. Clean is around 1-2 MB, parquet around 20-30 MB.

format=json was removed and returns 410. Use format=clean to draw the match and format=parquet to analyse it.

Clean Format

format=clean returns a gzipped JSON file holding two keys: meta and tracklets. Each tracklet is one continuous entity (player, goalkeeper or ball) with a voted team and jersey, gap-filled and smoothed, so a viewer draws steady dots rather than the blinking of raw per-detection rows. Positions are quantised to decimetres, downsampled and delta-encoded against the frame grid meta describes, which keeps a full match around 1-2 MB. This is the payload behind minimap and video-overlay views.

From analysis version 0.5.62, each tracklet also carries status, run-length encoded over its samples as [["detected" | "projected", count], ...]: detected is a position seen on screen, projected an estimated one (player off screen, or ball between detections).

Analyses from version 0.5.38 carry the file. Older ones return 404 for this format and can be drawn from the parquet instead.

Response

The parquet format is one table: one row per tracked entity per sampled frame.

timestamp  role        player_id  team  x      y      status
3309680    player      0-4        0     6606   3256   detected
3309680    player      0-10       0     4520   4100   detected
3309680    player      1-3        1     2210   1180   projected
3309680    ball        null       null  5200   3400   detected
3309720    player      0-4        0     6610   3259   detected

Columns

Column Type Unit Description
timestamp int32 ms Time from video start
role string player, goal_keeper, ball or referee
player_id string | null Player ID, e.g. 0-10. Null on ball rows and when the jersey could not be read
team int8 | null 0 or 1, the team of this detection. Null on ball rows and when the team is not resolved. Use it, not the player_id prefix, for which end a team defends: around the half-time kickoff the prefix can lag, team does not
player_id_conf float16 | null Confidence of the identification, 0-1. Null when player_id is null
x int16 | null cm Position along the pitch length. See Pitch Coordinates. Null when the pitch projection is missing
y int16 | null cm Position across the pitch width. Null when the pitch projection is missing
bbox_x int16 | null px Centre of the player bounding box in the video frame. Null on projected rows
bbox_y int16 | null px Bottom of the player bounding box in the video frame. Null on projected rows
status string How the row was produced. See Row Status. Absent before analysis version 0.5.36
overlap_partner_id string | null On detected_overlap rows, the player this detection overlaps with. Absent before analysis version 0.5.36
position_conf float | null On projected rows, confidence in the projected position, 0-1. Absent before analysis version 0.5.36
identity_conf float | null On projected rows, confidence in the player identity, 0-1. Absent before analysis version 0.5.36

Row Status

Status Meaning
detected Player detected in the video frame
detected_overlap Detected while overlapping another player, named by overlap_partner_id. Identity attribution is less certain
projected Player not visible in the frame, position projected by the tracking model
projected_nocam Player outside all camera coverage, position projected with the highest uncertainty

From analysis version 0.5.36 the file covers the full squad: detection rows plus projected rows for players the camera does not see. Detection rows are sampled at 25 FPS (40 ms steps), projected rows at 5 Hz (200 ms steps).

Warning

Projected rows are estimates at a different sample rate. Summing frame-to-frame movement over the whole file inflates distance. Keep rows whose status starts with detected before computing per-player statistics.