CMcompetitiveminecraft.com
Войти через Microsoft

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Превышен лимит запросов
Важно: ELO применяется только к матчам в статусе accepted или in_progress. Победитель должен быть одним из двух участников матча. Для режима Global ELO начисляется на кит, оставшийся после банов.