Локальный API сервера корта
Данные игр клуб забирает у себя: итоги матчей, замеры мяча, моменты и видео лежат на сервере корта в сети клуба и отдаются оттуда без интернета. Облако нужно для того, что живёт между клубами и в приложении игрока: брони, кошелёк, рейтинг.
Что откуда брать
| Данные | Откуда | Доступ |
|---|---|---|
| Итоги матча: счёт, состав, движение игроков, хайлайты | Сервер корта — /match/summary | Ключ интеграции |
| Разбор игроков: удары, техника, уровень | Сервер корта — /match/report | Ключ интеграции |
| Замеры мяча: розыгрыши, скорости, отскоки, тепловые карты | Сервер корта — /measure/* | Ключ интеграции |
| Видео: моменты, хайлайты, повторы, полные записи матчей | Сервер корта — /archive/* | Ключ интеграции |
| Состояние кортов, записи и сессий | Сервер корта — /status, /board.json, /session/… | Ключ интеграции |
| Живой счёт и эфир корта | Сервер корта — /live.json, /live/…/state.json | Без ключа |
| Брони, слоты, кошелёк, рейтинг игроков, профиль игрока | Облако — справочник API | Токены облака |
| Платежи из 1С на кошельки игроков | Облако — интеграция с 1С | Токен 1С |
В облако сервер корта отправляет только итоги матча, агрегаты статистики и клипы для приложения игрока (см. «Сервер корта и облако»). Полные записи, моменты со всех камер и сырые замеры мяча остаются в клубе — забрать их можно только локально.
Адрес
http://<адрес сервера корта>:8016- Сервер корта доступен в сети клуба. Его адрес клуб получает при подключении; порт по умолчанию — 8016.
- Корт указывается своим именем, как он назван на сервере корта (например, «Корт 4»), в кодировке URL:
%D0%9A%D0%BE%D1%80%D1%82%204. Список имён — в полеcourt_namesответа/status. - Ответы — JSON в UTF-8. Часть ответов отдаётся теми же структурами, что видят экран корта и видеостена клуба, поэтому в них встречаются поля для показа (подписи, ссылки на миниатюры).
Ключ интеграции
Система клуба (1С, CRM, учёт, хранилище видео) передаёт ключ в заголовке X-Integration-Key. Ключ открывает только чтение данных игр из таблицы ниже. Управлять кортом по нему нельзя: счёт, состав, сессии, перезапуск служб, настройки камер, живое видео и звук остаются за PIN персонала.
curl "http://<адрес сервера корта>:8016/status" \
-H "X-Integration-Key: <ключ интеграции>"- Ключ выдаётся на систему: у 1С и у CRM — разные ключи, любой можно отозвать, не трогая остальные. Ключ создаётся на сервере корта и показывается один раз; в документации вместо него стоит заглушка
<ключ интеграции>. - Как получить: обратитесь к администратору вашей платформы — название клуба и какой системе нужен доступ. Новый и отозванный ключ начинают и перестают действовать после перезапуска служб сервера корта, который делается, когда на кортах нет игры.
- Неверный ключ, ключ на адресе вне списка и любой запрос, кроме
GET, —401 bad_pin.
В итогах и разборе матча есть персональные данные игроков: имена и последние четыре цифры телефона. Храните ключ на сервере своей системы, а не в коде страниц и приложений, и не передавайте полученные данные за пределы клуба без согласия игроков.
Методы
| Метод | Параметры | Что возвращает |
|---|---|---|
GET /match/summary | court | Последний итог матча на корте: время, длительность, счёт по сетам, победитель, игроки с движением (дистанция, темп, максимальная скорость, рывки, зоны), команды, хайлайты и запись матча. Итога нет — 404 no_summary |
GET /match/report | court, t0 (необязательно — начало матча из итога) | Разбор игроков: удары по видам, оценка техники, уровень, ошибки и план, эпизоды. Поле status: ready, pending (ещё считается), failed, missing, offline (нет связи с облаком, отдан сохранённый), unavailable (функция не входит в лицензию) |
GET /measure/totals | court | Итоги замеров по корту: розыгрыши, время игры, максимальная и средняя скорость мяча, число измерений за каждой величиной |
GET /measure/history | court, limit (50), match_ref | Розыгрыши: длительность, скорости |
GET /measure/rally/{rally_id} | — | Сводка по розыгрышу |
GET /measure/trajectory/{rally_id} | limit (20000), measured_only | Траектория мяча; достроенные точки помечены interpolated |
GET /measure/events | court, rally_id, kind, limit (500) | События мяча: отскоки, удары, касания стекла — со скоростью и её погрешностью |
GET /measure/heatmap | court, kind (bounce), nx (20), ny (10), match_ref | Тепловая карта событий по клеткам корта со средней скоростью в клетке |
GET /measure/daemon | — | Работает ли служба замеров и успевает ли за камерами |
GET /archive/list.json | court, kind (moment, highlight, episode, match), days (7, не больше 90) | Видео на диске сервера корта по дням, новые первыми: файлы каждой камеры, длительность, размер, готовность; итоги матчей за те же дни. Не больше 1500 записей — тогда truncated: true |
GET /archive/file | root, path — из списка; download=1 — сохранить файлом | Видео MP4 или миниатюра JPEG. Поддерживает перемотку: заголовок Range, ответ 206 |
GET /moments | court | Моменты матча, отмеченные игроками и автоматически: время, подпись, ракурсы |
GET /episodes/{court} | limit (12) | Последние очки с решением системы и основанием |
GET /positions | court | Где сейчас игроки и мяч на плане корта |
GET /ball/live | court (необязательно) | Где мяч прямо сейчас и как идёт приём телеметрии |
GET /session/{court} | — | Текущая сессия корта: время открытия и окончания, формат, состав, бронь, счёт идущего матча. Сессии нет — 404 no_session_on_court |
GET /americano/{court} | — | Игра американо на корте и её счёт |
GET /board.json | — | Табло клуба: все корты, сессии, счёт, камеры; диск и видеокарта сервера |
GET /status | — | Имена кортов, лицензия, связь с облаком и очередь отправки |
GET /rec/status | — | Запись по камерам, срок хранения записи в часах, занятое место |
Без ключа открыты GET /health (сервер жив, сколько кортов играет), GET /live.json (какие корты в эфире) и GET /live/{court}/state.json (идёт ли трансляция и счёт) — в них нет ничего, чего не видно на табло.
Поля ответов /measure/* пока названы по-русски (розыгрышей, скорость_макс_кмч, база_доступна). Если база_доступна: false — база замеров недоступна, и пустой ответ не означает, что розыгрышей не было.
После матча: итог и видео
S="http://<адрес сервера корта>:8016"
K="X-Integration-Key: <ключ интеграции>"
C="%D0%9A%D0%BE%D1%80%D1%82%204" # «Корт 4»
# 1. Итог последнего матча на корте
curl -H "$K" "$S/match/summary?court=$C"
# → {"court": "Корт 4", "t0": 1790863200, "day": "2026-10-02", "time_from": "18:00", "time_to": "19:28",
# "sets": [{"team1": 6, "team2": 4, "unfinished": false}, …], "winner": 1,
# "players": [{"name": "Олег", "team": 1, "phone_tail": "0001", "distance_m": 2350.4,
# "top_speed_ms": 6.1, "sprints": 14, …}, …],
# "highlights": [{"title": "…", "duration_s": 18, "ready": true, "url": "…"}],
# "match_video": {"duration_s": 5280, "ready": true, "url": "…"}, …}
# 2. Разбор игроков этого матча (t0 — из итога)
curl -H "$K" "$S/match/report?court=$C&t0=1790863200"
# 3. Видео за сегодня: только полные записи матчей
curl -H "$K" "$S/archive/list.json?court=$C&kind=match&days=1"
# → {"items": [{"id": "…", "kind": "match", "day": "2026-10-02", "time": "18:00", "duration_s": 5280,
# "cams": [{"cam": "hik101", "root": "rec", "path": "…", "size": 1834221568,
# "ready": true, …}], …}], "summaries": […], "truncated": false}
# 4. Скачать файл камеры (root и path — из списка, path в кодировке URL)
curl -H "$K" -o match.mp4 "$S/archive/file?root=<root>&path=<path>&download=1"- Забирайте видео, пока оно на диске: запись хранится столько часов, сколько указано в
retention_hответа/rec/status(по умолчанию 72), потом удаляется. - Файл с
ready: falseещё дописывается — заберите позже. - Итог отдаётся по последнему матчу корта. Чтобы не пропустить матчи, опрашивайте
/archive/list.json: в полеsummaries— итоги всех матчей за выбранные дни.
Ошибки
401 bad_pin— нет ключа, он неверен или метод не входит в чтение по ключу.400 unknown_court— такого корта на сервере нет;422— не передан обязательный параметр (чаще всегоcourt).404— нет итога (no_summary), сессии (no_session_on_court) или файла (not_found).