Live scores and replays
The live court score comes from the cloud and is public. The court video stream comes from the club court server. Match highlights and analysis live in the cloud for participants only; a clip can be shared with a public link.
Club live score
GET /v1/live/{club_id} is a public method without authorization. It returns the score of matches in progress on the club courts, sorted by court name.
curl "https://your-server/api/v1/live/c1"
# → {"items": [{"court": "court4", "score": "6:4 3:2 · 30-15",
# "teams": "Ivan/Oleg — Anna/Maria", "set_no": 2, "on_air": true}]}- The court server pushes the score (
POST /v1/ingest/live); after 180 seconds without updates the court drops out. An empty list means nobody is playing with a score now. scoreandteamsare ready-to-show strings;on_air: truemeans the court video stream is on.- Poll every few seconds from your server — a browser request from a foreign domain will be blocked (see limits).
A ready-made scoreboard for a club screen: https://your-server/api/tv/<club id> — the page refreshes the score every 3 seconds.
Court video stream
Video does not go through the cloud: it is served by the club court server directly. The club gets the court server address on connection. Stream pages and lists open without a PIN — they show what is visible in the frame anyway.
| Address on the court server | Returns |
|---|---|
/watch?court=<court> | Viewer page for the court stream |
/live.json | Courts on air: court, teams, score, stream (main HLS stream), stream_auto (quality list), qualities, watch (viewer page link) |
/live/<court>/state.json | Whether the court is on air, and the score |
/live/<court>/cams.json | Stream cameras for the switch and the “all cameras” grid, with a stream-ready flag |
/live/<court>/index.m3u8, master.m3u8 | HLS stream: main, and the quality list for automatic selection |
- Paths in
/live.jsonare relative — prefix them with the court server address. - A stream opens only while it is on air: after the match an old link returns
404. - Extra cameras and the “all cameras” grid start when a viewer picks them and stop without viewers — do not poll them constantly.
Match replays and highlights
After the match the court server sends the result, stats and clips to the cloud (see Court server and cloud). The player sees everything in the match card:
GET /v1/matches/my— the player's recent matches;GET /v1/matches/{match_id}— the card: score, AI stats, highlights by moment (main clip, angles from other cameras, 9:16 vertical copy), movement.- The card is returned to match participants only; others get
404. - Video links are signed on every card request and live for minutes (15 by default). Do not store them — request the card again. An empty
urlandready: falsemean the video is still on its way to storage. - A clip may have several qualities (
renditions): the main 720p and light copies for poor connections. GET /v1/cv/match/{match_id}— rallies with ball trajectories and the heat map for your own visualization.GET /v1/matches/{match_id}/review— a text review of the game, if enabled.
Sharing a clip
curl -X POST "https://your-server/api/v1/matches/8c0f4a52-2d1e-4b7a-9f63-1a5e7d9b3c20/clips/f0c3a8e1-4d27-4b96-a5e3-9c18d2b7f604/share" \
-H "Authorization: Bearer <player token>"
# → {"url": "https://your-server/card/clip/<token>", "title": "…"}The link leads to a public clip page with a social preview. Only a match participant can get it.
Marking a rally
A player taps “clip this” right after a great rally — POST /v1/matches/mark. The court is taken from the player's current booking; the mark reaches the court server in the response to its health report and promotes the nearest rally in the highlight selection.