Live revisions and prediction history
The same canonical mat_, ply_, trn_, edt_, drw_ and pnt_ identities are used across live states, predictions and historical publication. A live match can exist before inclusion in a named historical release. An older release is not changed to include it; hydrate its operational state with the live endpoints until historical publication is available.
Identity and correction rules
Source match identifiers, alternate player-name spellings and provider routing fields stay private. Conflicting identities and duplicate primary cards are rejected before public admission. Additional source observations must reconcile into the authoritative identity; name similarity alone does not create a second public match.
A score-only fallback has point_id: null. It remains associated with its exact score_revision. A later confirmed point is not retroactively attached to that immutable result.
Read current data and retained history
Filter prediction history with point_id and/or score_revision. Cursors are signed and bound to the account, route, match and filters; do not reuse them with different filters. History retention is 180 days for superseded results; the latest result can remain beyond that window. A removed or expired history record can return 404.
Polling should use a new ordinary GET request. Reusing an idempotency key is a retry of the original operation, not a request for a new polling sample. Pagination of operational live states is dynamic; use a named release for an immutable historical dataset.
For example, GET /v2/live/matches?status=cancelled selects currently cancelled tracked matches. Status history preserves an earlier interruption even if a match later resumed, including explicit terminal corrections. Statuses include scheduled, warmup, live, suspended, finished, retired, walkover, cancelled and unknown. A rain delay or play abandoned for the day is an interruption, not automatically a permanent cancellation.
Commentary is stored privately and deduplicated by content with snapshot links. Only normalized lifecycle state and an allowed interruption reason are public. Commentary text and general card insights are not stream or REST fields.
Time semantics and measured delay
Clocks use UTC and preserve available microsecond evidence precision. Clock precision is not proof of physical event-time accuracy. score_observed_at is an observed pipeline boundary, not the time the ball was struck or the point ended on court.
Useful measurements are score_received_at - score_observed_at, prediction_requested_at - score_received_at, computed_at - prediction_requested_at, and your live receive time minus computed_at. The last two include queueing and transport, not only CPU inference time. Exclude replay frames from live-latency samples and synchronize participating clocks.
For first-prediction latency, group by match_id plus score_revision and choose the earliest computed_at from immutable prediction history. Report later input/enrichment revisions separately. Include eligible score revisions with no accepted result in the availability denominator; a histogram of successful calculations alone does not measure availability. Superseded scores, startup boundaries and source-stale intervals need explicit categories.
Pending, unavailable, stale or terminal current states carry null probabilities and no calculation identity or clocks from an earlier score. Use immutable history to inspect previous results. A missing result can reflect missing required inputs or a dependency failure; a public unavailable state does not imply that missing inputs were filled.
Coverage and units
Live statistics use the canonical metric code, side, period, numerator, denominator, value and unit. Ratios use [0,1]; a zero denominator yields null. Missing outcome classifications do not imply zero aces or errors. Point result_code is a canonical outcome or null.
rally_count_by_side contains observed per-side source counts and rally_length_missing records their missingness. These values are not promoted to exact rally lengths or stroke trajectories. serve_speed_raw has an unverified unit and must not be assumed to be km/h. The public schema does not label uncertain point-duration fields as timestamps.
features_used measures finite model inputs for a particular result; features_total is 77. Coverage varies by point, denominators, available profiles/rankings, matched historical baselines and live enrichment. Recorded source capability has reached 70 inputs, but neither 70 on every point nor model accuracy/calibration is guaranteed by that count.
Bounded live pages
A page contains at most the requested limit and may contain fewer rows to fit the authenticated response byte budget. Follow page.next_cursor until it is null; a short page is not a completion signal. The cursor refers to the last returned row and remains bound to the principal, operation and filters. An individual row that cannot fit still returns 413 RESPONSE_LIMIT; the byte cap is never disabled. Live pages describe a changing observed set, not a frozen historical release.
