API для серверов
После одобрения сервера и создания API-ключа ваш плагин отправляет результаты сыгранных матчей. Платформа сама пересчитает ELO игроков.
1. Получите API-ключ
Добавьте сервер в разделе Серверы и дождитесь одобрения. Затем нажмите «Создать ключ». Ключ показывается один раз — храните его в безопасности (формат cmc_…). Ключ нельзя восстановить, только перевыпустить.
2. Отправка результата матча
Когда матч завершён, отправьте POST-запрос на эндпоинт:
POST https://competitiveminecraft.com/api/match/result Content-Type: application/json X-Server-Key: cmc_ваш_ключ
Тело запроса:
{
"matchId": "<public_id матча>",
"winnerUuid": "<UUID победителя без дефисов>",
"timestamp": 1735000000,
"signature": "<HMAC-SHA256 подпись>"
}3. Подпись запроса (anti-tamper / anti-replay)
Чтобы исключить подделку результатов, каждый запрос подписывается вашим API-ключом. Подпись считается так:
message = matchId + "." + winnerUuid + "." + timestamp signature = HMAC_SHA256(apiKey, message) // hex
timestamp — текущее unix-время (секунды). Запрос принимается только если время совпадает в пределах окна (по умолчанию ±30 секунд) — это защита от повторной отправки. Идентификатор матча (public_id) виден игрокам в URL страницы матча и передаётся плагину при старте игры.
Пример (Java)
String msg = matchId + "." + winnerUuid + "." + timestamp;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(apiKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
byte[] raw = mac.doFinal(msg.getBytes(StandardCharsets.UTF_8));
String signature = HexFormat.of().formatHex(raw);Пример (curl)
curl -X POST https://competitiveminecraft.com/api/match/result \
-H "Content-Type: application/json" \
-H "X-Server-Key: cmc_xxx" \
-d '{"matchId":"abc123","winnerUuid":"06ec...","timestamp":1735000000,"signature":"a1b2..."}'Коды ответов
| 200 | Результат принят (или уже был применён — идемпотентно) |
| 401 | Отсутствует заголовок X-Server-Key |
| 403 | Неверный ключ или подпись |
| 404 | Матч не найден |
| 409 | Результат нельзя применить (матч в неподходящем статусе) |
| 429 | Превышен лимит запросов |
accepted или in_progress. Победитель должен быть одним из двух участников матча. Для режима Global ELO начисляется на кит, оставшийся после банов.