Skip to content

Event reference

All events share these fields. In football team and player are null (teams are told apart by shirt colour on frames, but no identity model names players); tennis events carry player: "near" | "far":

{
"event_id": "evt_01K…", "match_id": "match_…", "timestamp": 1760012145.32,
"video_timestamp": 2493.4, "frame": 24934, "match_clock": "41:33",
"event": "ball_move", "confidence": 0.94, "team": null, "player": null,
"ball": { "pixel": {"x": 842, "y": 391}, "pitch": {"x": 72.4, "y": 38.1}, "confidence": 0.94 }
}

ball.pitch is normalised 0–100 on both axes, and null without pitch calibration. Locations inside events carry coordinate_space: "pitch" | "pixel". match_clock = video_timestamp + the match’s kickoff offset.

Event Extra fields Rule (thresholds in EngineConfig)
ball_detected — ball visible after being lost or at start
ball_lost missing_frames no ball for ball_lost_after_frames frames
ball_move velocity, speed, coordinate_space at most once per ball_move_min_interval_s, and only after moving a minimum distance
possession track_id nearest player within possession_radius for possession_confirm_frames consecutive frames
possession_change from_track_id, to_track_id a new holder differs from the last holder
pass_candidate from_track_id, start the ball leaves the holder faster than pass_candidate_min_speed
pass from_track_id, to_track_id, start, end, distance, distance_unit, duration release, then travel ≥ pass_min_distance, then a different player confirmed within pass_max_duration_s; deduplicated
shot_candidate track_id, location, speed, speed_unit, target_goal, distance_to_goal_m speed spike within shot_origin_window_s of a touch, heading into the goal mouth (pitch mode). Pixel mode: confidence capped at shot_no_pitch_max_confidence
shot as shot_candidate only when confidence ≥ shot_confirm_confidence
ball_out side, location, last_touch_track_id, within_goal_mouth outside the pitch for ball_out_frames frames (pitch coordinates only)
corner corner (top_left…bottom_right), goal_line, location, taker_track_id, settled_s the ball settles (below corner_still_speed) within corner_radius_m of a corner flag for corner_settle_s, with a player within corner_taker_radius_m; once per placement (pitch coordinates only)

| goal_candidate | goal (left/right), location, last_touch_track_id | the ball crosses the goal line between the posts, into the net (pitch coordinates). Unconfirmed: one camera cannot see whether it went over the bar | | goal | team (home/away), score {home, away}, evidence, confirmed_at_s | the broadcast’s on-screen score goes up by one, read the same way goal_confirm_reads times in a row (OCR). Stamped at the goal moment when it was seen (evidence: ball_in_goal, goal_graphic), otherwise when the score changed. home is the team shown first (left) on the scoreboard. The first score read is the starting point; a lower score is not a goal |

Planned: throw_in, goal_kick, free_kick, cross, tackle, interception, save.

Tennis matches use their own engine. Players are "near" / "far" (the broadcast camera’s view); court positions are normalised 0–100 along the court from the near baseline (x) and across it from the left of the picture (y).

Event Extra fields Rule
serve player, serve_number, court (deuce/ad), location a hit from the idle state, confirmed once the ball crosses the net; stamped at the hit
hit player, side, rally_hits, location the ball reverses direction away from a player within reach
bounce location, side (near/far), in (null without court calibration) an upward kick in the ball’s motion, or the bounce classifier
fault, double_fault player, serve_number the serve’s first bounce lands outside the service box
ball_out player, location the first bounce after a shot lands outside the court
point_won winner, reason (out, net, double_bounce, not_returned, double_fault), rally_length point endings are held 0.8 s and cancelled if the other player plays the ball