Сервер корта: приём данных
Результаты матчей, статистика, движение, клипы, живой счёт, американо, сетка турнира, уровни и пропуска. Доступ — клубный токен X-Club-Token.
Результат матча с корта #
/v1/ingest/match-resultДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Создаёт матч по счёту с корта и пересчитывает рейтинг участников. В ответе — matchId: на него ссылаются статистика, движение, клипы и розыгрыши. Игрок задаётся user_id, телефоном или кодом пропуска; незнакомый телефон заводит новый профиль, и игрок увидит матч, войдя в приложение с этим номером. Если счёт по сетам равный (не вели или не доиграли), матч принимается, но в рейтинг не идёт (voided=true). Если очков, отмеченных человеком (points_manual), больше, чем от камер (points_auto), матч считается ручным и весит в рейтинге вдвое меньше. Бронь можно передать в booking_id, иначе облако найдёт её по корту, дню и времени. Метод не идемпотентен: каждый успешный вызов создаёт новый матч.
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Тело запроса application/json
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
court | строка | нет | Имя корта |
day | строка | да | Дата матча YYYY-MM-DD |
time | строка | да | Время начала HH:MM |
sets | строка | да | Счёт по сетам «команда1:команда2» через запятую шаблон ^\d+:\d+(,\d+:\d+)*$ |
players | массив [объект] | да | Состав: 2–4 игрока, обе команды элементов от 2; элементов до 4 |
players[].user_id | строка (uuid), или null | нет | Идентификатор игрока (по QR или привязке) |
players[].phone | строка, или null | нет | Телефон игрока, если id неизвестен |
players[].team | целое | да | Команда: 1 или 2 не меньше 1; не больше 2 |
players[].name | строка | нет | Имя с терминала — для нового профиля |
players[].pass_code | строка, или null | нет | Код QR-пропуска, который корт не смог проверить сам длина до 120 |
booking_id | строка (uuid), или null | нет | Бронь, из которой открыта сессия; не указана — облако найдёт по корту и времени |
points_auto | целое, или null | нет | Сколько очков засчитали камеры не меньше 0 |
points_manual | целое, или null | нет | Сколько очков отметил человек не меньше 0 |
Пример запроса
curl -X POST "https://адрес-вашего-сервера/api/v1/ingest/match-result" \
-H "X-Club-Token: <клубный токен>" \
-H "Content-Type: application/json" \
-d '{
"court": "court4",
"day": "2026-10-02",
"time": "18:00",
"sets": "6:4,3:6,7:5",
"players": [
{"user_id": "3d6e9a10-5b2c-4f8e-a1d7-6c4b2e0f9a83", "team": 1},
{"phone": "+79000000001", "team": 1, "name": "Олег"},
{"user_id": "a52e7c14-90bd-4e3f-8c61-7d2f0b9e4a15", "team": 2},
{"phone": "+79000000002", "team": 2, "name": "Мария"}
],
"points_auto": 54,
"points_manual": 3
}'Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 400 | bad_day_or_time | Неверная дата или время (YYYY-MM-DD и HH:MM) |
| 400 | both_teams_required | Нужны игроки обеих команд |
| 404 | player_not_found: … | Игрок не найден (в тексте — его идентификатор или телефон) |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{
"matchId": "8c0f4a52-2d1e-4b7a-9f63-1a5e7d9b3c20",
"winnerTeam": 1,
"ratingDeltas": {
"3d6e9a10-5b2c-4f8e-a1d7-6c4b2e0f9a83": 12,
"a52e7c14-90bd-4e3f-8c61-7d2f0b9e4a15": -12
},
"bookingId": "b71c2e94-0a3f-4d58-8e26-9f1d3c5a7b40",
"voided": false
}Статистика матча #
/v1/ingest/match-statsДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Статистика игроков матча: максимальная скорость мяча, пробег, удары по видам. Игрок — по user_id или телефону; он должен быть в составе матча. Игрокам с ненулевой скоростью мяча уходит уведомление «AI-разбор готов». Повтор перезаписывает значения.
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Тело запроса application/json
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
match_id | строка (uuid) | да | matchId из ответа match-result |
avg_rally_shots | число, или null | нет | Среднее число ударов за розыгрыш |
players | массив [объект] | да | Статистика по игрокам |
players[].user_id | строка (uuid), или null | нет | Игрок |
players[].phone | строка, или null | нет | Телефон, если id неизвестен |
players[].max_ball_kmh | целое, или null | нет | Максимальная скорость мяча, км/ч |
players[].run_m | целое, или null | нет | Пробег, м |
players[].shots | массив [объект] | нет | Удары по видам: объекты class, count, avgKmh |
Пример запроса
curl -X POST "https://адрес-вашего-сервера/api/v1/ingest/match-stats" \
-H "X-Club-Token: <клубный токен>" \
-H "Content-Type: application/json" \
-d '{
"match_id": "8c0f4a52-2d1e-4b7a-9f63-1a5e7d9b3c20",
"avg_rally_shots": 6.8,
"players": [
{
"user_id": "3d6e9a10-5b2c-4f8e-a1d7-6c4b2e0f9a83",
"max_ball_kmh": 112,
"run_m": 2350,
"shots": [{"class": "смэш", "count": 7, "avgKmh": 104}]
}
]
}'Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 404 | match_not_found | Матч не найден, чужого клуба или вы не участник |
| 404 | player_not_in_match: … | Игрок не участвует в матче |
| 404 | player_not_found: … | Игрок не найден (в тексте — его идентификатор или телефон) |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{"ok": true}Движение каждого игрока матча #
/v1/ingest/match-movementДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Движение каждого игрока по трёхмерному трекингу корта: пробег, темп, пиковая скорость, рывки, доли зон, покрытие, сетка присутствия. Повторная отправка обновляет записи без дублей; пустое поле не затирает известное значение. Игрок, узнанный по телефону, но отсутствующий в составе, добавляется в состав без изменения рейтинга (joined). Гость без телефона хранится по имени.
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Тело запроса application/json
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
match_id | строка (uuid) | да | matchId |
source | строка | нет | Источник трекинга длина до 16; по умолчанию "court3d" |
players | массив [объект] | да | Игроки, 1–8 элементов от 1; элементов до 8 |
players[].user_id | строка (uuid), или null | нет | Игрок |
players[].phone | строка, или null | нет | Телефон, если id неизвестен |
players[].name | строка | нет | Имя (для гостя без телефона) |
players[].team | целое | да | Команда: 1 или 2 не меньше 1; не больше 2 |
players[].distance_m | число, или null | нет | Пробег, м не меньше 0 |
players[].work_rate_m_per_min | число, или null | нет | Темп, м/мин не меньше 0 |
players[].top_speed_ms | число, или null | нет | Пиковая скорость, м/с не меньше 0 |
players[].sprints | целое, или null | нет | Число рывков не меньше 0 |
players[].zones | объект, или null | нет | Доли времени по зонам, %: net, mid, back |
players[].coverage_percent | число, или null | нет | Покрытие корта, % (0–100) не меньше 0; не больше 100 |
players[].grid | массив [массив [число]] | нет | Сетка присутствия: [x, y, n], до 4000 точекэлементов до 4000 |
Пример запроса
curl -X POST "https://адрес-вашего-сервера/api/v1/ingest/match-movement" \
-H "X-Club-Token: <клубный токен>" \
-H "Content-Type: application/json" \
-d '{
"match_id": "8c0f4a52-2d1e-4b7a-9f63-1a5e7d9b3c20",
"source": "court3d",
"players": [
{
"user_id": "3d6e9a10-5b2c-4f8e-a1d7-6c4b2e0f9a83",
"team": 1,
"distance_m": 2410.5,
"work_rate_m_per_min": 38.2,
"top_speed_ms": 5.9,
"sprints": 14,
"zones": {"net": 42.0, "mid": 31.0, "back": 27.0},
"coverage_percent": 63.0,
"grid": [[2.5, 4.0, 18]]
},
{"name": "Гость", "team": 2, "distance_m": 1980.0}
]
}'Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 404 | match_not_found | Матч не найден, чужого клуба или вы не участник |
| 404 | player_not_found: … | Игрок не найден (в тексте — его идентификатор или телефон) |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{"ok": true, "count": 4, "added": 4, "updated": 0, "joined": 0}Метаданные клипов от клуба #
/v1/ingest/clipsДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Метаданные клипов матча. Клип присылается дважды: сразу после матча — метаданные, затем, когда видео доехало до хранилища, — с object_key. Записи сопоставляются по clip_id, поэтому повтор обновляет клип, а не создаёт дубль; пустые поля не затирают известные. Ракурсы одного момента объединяются общим group.
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Тело запроса application/json
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
match_id | строка (uuid) | да | matchId |
clips | массив [объект] | да | Клипы |
clips[].clip_id | строка | нет | Идентификатор клипа на сервере корта — по нему повтор обновляет клип |
clips[].kind | строка | нет | Вид: highlight, highlight_angle (ракурс), highlight_vertical (копия 9:16); пусто — не менять |
clips[].title | строка | нет | Название |
clips[].url | строка | нет | Публичная ссылка, если есть; пусто — видео ещё едет |
clips[].object_key | строка | нет | Ключ объекта в хранилище — приходит вторым сообщением |
clips[].preview_url | строка | нет | Ссылка на превью |
clips[].duration_s | число | нет | Длительность, с (дробная допустима) по умолчанию 0 |
clips[].group | строка | нет | Общий ключ момента для ракурсов |
clips[].camera | строка | нет | Подпись камеры для переключателя в плеере |
Пример запроса
curl -X POST "https://адрес-вашего-сервера/api/v1/ingest/clips" \
-H "X-Club-Token: <клубный токен>" \
-H "Content-Type: application/json" \
-d '{
"match_id": "8c0f4a52-2d1e-4b7a-9f63-1a5e7d9b3c20",
"clips": [
{
"clip_id": "rally-012-cam1",
"kind": "highlight",
"title": "Смэш в сетку",
"duration_s": 12.5,
"group": "rally-012",
"camera": "Камера 1"
},
{
"clip_id": "rally-012-cam2",
"kind": "highlight_angle",
"duration_s": 12.5,
"group": "rally-012",
"camera": "Камера 2"
}
]
}'Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 404 | match_not_found | Матч не найден, чужого клуба или вы не участник |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{"ok": true, "count": 2, "added": 2, "updated": 0}Загрузка файла клипа #
/v1/ingest/clips/fileДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Загружает сам файл клипа (mp4) в облако, если облако хранит видео у себя. Тело — сырой mp4, без JSON. Ключ key вида «<id клуба>/<матч>/<имя>.mp4»: первый сегмент обязан совпадать с клубом токена. После загрузки отправьте POST /v1/ingest/clips с этим object_key — облако будет выдавать игрокам короткоживущую ссылку.
Параметры запроса
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
key | строка | да | Ключ объекта «<id клуба>/<матч>/<имя>.mp4» |
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Тело запроса
Тело запроса — файл mp4 целиком (двоичные данные, не JSON).
Пример запроса
curl -X PUT "https://адрес-вашего-сервера/api/v1/ingest/clips/file?key=c1/8c0f4a52-2d1e-4b7a-9f63-1a5e7d9b3c20/clip-001.mp4" \
-H "X-Club-Token: <клубный токен>" \
-H "Content-Type: video/mp4" \
--data-binary @clip-001.mp4Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 400 | local_storage_disabled | Облако хранит видео не у себя — загрузка файла выключена |
| 403 | bad_key | Ключ объекта не начинается с id клуба токена или содержит .. |
| 413 | clip_too_large | Файл больше допустимого размера |
| 507 | disk_full | Нет места на диске облака |
| 507 | write_failed | Файл не записан |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{
"ok": true,
"key": "c1/8c0f4a52-2d1e-4b7a-9f63-1a5e7d9b3c20/clip-001.mp4",
"bytes": 18734211
}Хайлайт игрока по ходу матча #
/v1/ingest/player-clipДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Крупный план игрока, уже лежащий в хранилище, отправляется ему уведомлением сразу, не дожидаясь конца матча. Игрок — по user_id или телефону (незнакомый телефон заводит профиль). Ссылка в уведомлении действует неделю.
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Тело запроса application/json
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
user_id | строка (uuid), или null | нет | Игрок |
phone | строка, или null | нет | Телефон, если id неизвестен |
name | строка | нет | Имя для нового профиля |
object_key | строка | да | Ключ объекта, начинается с «<id клуба>/» |
title | строка | нет | Название в уведомлении |
court | строка | нет | Корт — для подписи |
duration_s | число | нет | Длительность, с по умолчанию 0 |
Пример запроса
curl -X POST "https://адрес-вашего-сервера/api/v1/ingest/player-clip" \
-H "X-Club-Token: <клубный токен>" \
-H "Content-Type: application/json" \
-d '{
"user_id": "3d6e9a10-5b2c-4f8e-a1d7-6c4b2e0f9a83",
"name": "",
"object_key": "c1/8c0f4a52-2d1e-4b7a-9f63-1a5e7d9b3c20/zoom-001.mp4",
"title": "",
"court": "court4",
"duration_s": 9.0
}'Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 403 | bad_key | Ключ объекта не начинается с id клуба токена или содержит .. |
| 400 | no_player | Не указан ни user_id, ни phone |
| 409 | clip_not_stored | Видео по ключу ещё не в хранилище |
| 404 | player_not_found: … | Игрок не найден (в тексте — его идентификатор или телефон) |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{"ok": true, "user_id": "3d6e9a10-5b2c-4f8e-a1d7-6c4b2e0f9a83"}Живой счёт корта #
/v1/ingest/liveДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Текущий счёт корта для табло и трансляций. Хранится 180 секунд и гаснет сам, если не обновлять. Читается публичным методом GET /v1/live/{club_id}.
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Тело запроса application/json
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
court | строка | да | Имя корта |
score | строка | нет | Строка счёта для табло |
teams | строка | нет | Строка состава |
set_no | целое, или null | нет | Номер сета |
on_air | логическое | нет | Идёт ли видеотрансляция корта по умолчанию false |
Пример запроса
curl -X POST "https://адрес-вашего-сервера/api/v1/ingest/live" \
-H "X-Club-Token: <клубный токен>" \
-H "Content-Type: application/json" \
-d '{
"court": "court4",
"score": "6:4 3:2 · 30-15",
"teams": "Иван/Олег — Анна/Мария",
"set_no": 2,
"on_air": true
}'Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{"ok": true, "ttl_s": 180}Текущая игра американо на корте #
/v1/ingest/quick-gamesДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Игра текущего раунда американо или мексиканки, назначенная на этот корт и ещё без счёта. Нет такой игры — {"game": null}.
Параметры запроса
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
court | строка | да | Имя корта, как на сервере корта |
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Пример запроса
curl -X GET "https://адрес-вашего-сервера/api/v1/ingest/quick-games?court=court4" \
-H "X-Club-Token: <клубный токен>"Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{
"game": {
"gameId": 17,
"qtId": "6e2b9f41-c7a0-4d3e-9b15-8f4c2a7d0e93",
"round": 2,
"points": 24,
"format": "americano",
"team1": [
{"userId": "3d6e9a10-5b2c-4f8e-a1d7-6c4b2e0f9a83", "name": "Иван П."},
{"userId": null, "name": "Гость"}
],
"team2": [
{"userId": "a52e7c14-90bd-4e3f-8c61-7d2f0b9e4a15", "name": "Анна С."},
{"userId": null, "name": "Олег"}
]
}
}Счёт игры американо с корта #
/v1/ingest/quick-games/{game_id}/scoreДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Счёт игры американо с сервера корта (розыгрыши по машинным камерам). Только игра своего клуба. В ответе — текущее состояние американо целиком.
Параметры пути
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
game_id | целое | да | gameId из GET /v1/ingest/quick-games |
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Тело запроса application/json
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
score1 | целое | да | Очки команды 1, 0–64 не меньше 0; не больше 64 |
score2 | целое | да | Очки команды 2, 0–64 не меньше 0; не больше 64 |
Пример запроса
curl -X POST "https://адрес-вашего-сервера/api/v1/ingest/quick-games/17/score" \
-H "X-Club-Token: <клубный токен>" \
-H "Content-Type: application/json" \
-d '{"score1": 14, "score2": 10}'Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ |
| 401 | bad_club_token | Неверный клубный токен |
| 404 | game_not_found | Игра не найдена или чужого клуба |
| 409 | finished | Американо уже завершено |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Матч сетки турнира на корте #
/v1/ingest/bracketДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Ближайший несыгранный матч сетки идущего турнира клуба, назначенный на этот корт. Нет — {"match": null}.
Параметры запроса
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
court | строка | да | Имя корта, как на сервере корта |
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Пример запроса
curl -X GET "https://адрес-вашего-сервера/api/v1/ingest/bracket?court=court4" \
-H "X-Club-Token: <клубный токен>"Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{
"match": {
"matchId": "8c0f4a52-2d1e-4b7a-9f63-1a5e7d9b3c20",
"tournamentId": "6e2b9f41-c7a0-4d3e-9b15-8f4c2a7d0e93",
"title": "Кубок клуба",
"round": 1,
"startAt": "2026-10-04T12:00:00",
"team1": [
{"userId": "3d6e9a10-5b2c-4f8e-a1d7-6c4b2e0f9a83", "name": "Иван П."},
{"userId": null, "name": "Гость"}
],
"team2": [
{"userId": "a52e7c14-90bd-4e3f-8c61-7d2f0b9e4a15", "name": "Анна С."},
{"userId": null, "name": "Гость"}
]
}
}Итог матча сетки с сервера корта #
/v1/ingest/bracket/{match_id}/resultДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Итог матча сетки по автосчёту. Повтор после обрыва связи безопасен: если победитель уже записан, ответ {"ok": true, "already": true} и ничего не меняется.
Параметры пути
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
match_id | строка (uuid) | да | Идентификатор матча |
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Тело запроса application/json
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
score | строка | да | Счёт по сетам «6:4,3:6,7:5» шаблон ^\d+:\d+(,\d+:\d+)*$ |
winner | целое | да | Победившая команда: 1 или 2 не меньше 1; не больше 2 |
Пример запроса
curl -X POST "https://адрес-вашего-сервера/api/v1/ingest/bracket/8c0f4a52-2d1e-4b7a-9f63-1a5e7d9b3c20/result" \
-H "X-Club-Token: <клубный токен>" \
-H "Content-Type: application/json" \
-d '{"score": "6:4,3:6,7:5", "winner": 1}'Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 404 | match_not_found | Матч не найден, чужого клуба или вы не участник |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{"ok": true}Уровни игроков для терминала #
/v1/ingest/levelsДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Рейтинг AISOLUS игроков состава — для показа рядом с именем на терминале корта. До 16 идентификаторов (ids) и до 16 телефонов (phones) через запятую. Ответ — словарь, где один и тот же уровень лежит и под id, и под телефоном; игроки без рейтинга не возвращаются. Номер без «+» в адресе дополняется до «+7…».
Параметры запроса
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
ids | строка | нет | Идентификаторы игроков через запятую, до 16 |
phones | строка | нет | Телефоны через запятую, до 16 |
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Пример запроса
curl -X GET "https://адрес-вашего-сервера/api/v1/ingest/levels?ids=3d6e9a10-5b2c-4f8e-a1d7-6c4b2e0f9a83&phones=%2B79000000001" \
-H "X-Club-Token: <клубный токен>"Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{
"levels": {
"3d6e9a10-5b2c-4f8e-a1d7-6c4b2e0f9a83": {"value": 3.25, "step": "Уверенный любитель", "games": 14},
"+79000000001": {"value": 3.25, "step": "Уверенный любитель", "games": 14}
}
}Проверка пропуска игрока облаком #
/v1/ingest/player-passДоступ: Клубный токен Заголовок X-Club-Token: <клубный токен> — токен сервера корта клуба.
Терминал у корта не смог проверить QR-пропуск игрока сам (нет ключа дня в лицензии) — проверка облаком. Возвращаются только id и короткое имя.
Заголовки
| Имя | Тип | Обязательно | Описание |
|---|---|---|---|
x-club-token | строка | да | Клубный токен сервера корта |
Тело запроса application/json
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
code | строка | да | Код из QR-пропуска игрока длина до 120 |
Пример запроса
curl -X POST "https://адрес-вашего-сервера/api/v1/ingest/player-pass" \
-H "X-Club-Token: <клубный токен>" \
-H "Content-Type: application/json" \
-d '{"code": "<код пропуска>"}'Ответы
| Код | detail | Значение |
|---|---|---|
| 200 | — | Успешный ответ; пример ниже |
| 401 | bad_club_token | Неверный клубный токен |
| 404 | pass_not_found | Пропуск не распознан |
| 410 | pass_expired | Срок пропуска истёк |
| 422 | […] | Ошибка проверки параметров или тела: detail — список ошибок |
Пример ответа
{"userId": "3d6e9a10-5b2c-4f8e-a1d7-6c4b2e0f9a83", "name": "Иван П."}