Разработчикам

API для чтения турниров, подписанные вебхуки и встраиваемые виджеты для организаторов и партнёров MAXIMUS VEGAS. Доступ выдаёт владелец или администратор пространства организатора в разделе «API, вебхуки и виджеты».

Доступ

Ключ API и адреса вебхуков создаются в пространстве организатора. Ключ видит турниры только своего пространства, включая черновики; турнир другого пространства отвечает 404 так же, как несуществующий. До 10 действующих ключей и 5 адресов вебхуков на пространство.

Авторизация и лимиты

Передавайте ключ в заголовке Authorization. Не более 120 запросов в минуту на ключ: сверх лимита — 429 с заголовком Retry-After. Неверный, отозванный или отсутствующий ключ — 401. API только читает данные: изменить турнир через API нельзя.

curl -H "Authorization: Bearer mvk_…" https://www.maximus.vegas/api/v1/tournaments

Методы

  • GET /api/v1/organizationпространство, которому принадлежит ключ
  • GET /api/v1/tournamentsтурниры пространства: статус, формат, игра, старт, участники
  • GET /api/v1/tournaments/{slug}турнир и его участники с местами и посевом
  • GET /api/v1/tournaments/{slug}/matchesматчи: этап, раунд, стороны, счёт, победитель, время
  • GET /api/v1/tournaments/{slug}/standingsтаблица: очки (круговая, швейцарская), группы, leaderboard или итоговые места
{ "data": [ { "slug": "autumn-cup", "name": "Autumn Cup", "game": "cs2", "status": "REGISTRATION_OPEN", "registered": 12, "max_participants": 16, "starts_at": "2026-10-12T16:00:00.000Z", "url": "https://www.maximus.vegas/ru/tournaments/autumn-cup" } ] }

Ошибки

Ответ с ошибкой — JSON с кодом и пояснением; коды: unauthorized, rate_limited, not_found, method_not_allowed, unavailable.

{ "error": { "code": "not_found", "message": "No such resource for this key." } }

Вебхуки

Портал отправляет POST с JSON на ваш HTTPS-адрес. Ответьте кодом 2xx в течение 5 секунд; перенаправления не выполняются. При ошибке доставка повторяется через 1, 5, 30, 120, 360 минут; после шестой неудачной попытки её можно повторить вручную. Адреса во внутренних сетях не принимаются.

События

  • tournament.status_changedстатус турнира изменился
  • registration.createdновая заявка
  • registration.withdrawnзаявка отозвана
  • match.completedматч завершён
  • match.correctedрезультат матча исправлен
  • pingтестовое событие
{
  "id": "evt_1042",
  "type": "match.completed",
  "created_at": "2026-10-01T18:04:11.000Z",
  "data": {
    "tournament": { "id": "…", "slug": "autumn-cup", "name": "Autumn Cup", "game": "cs2", "format": "single_elimination", "status": "IN_PROGRESS", "url": "https://www.maximus.vegas/ru/tournaments/autumn-cup" },
    "match": { "id": "…", "round": 2, "position": 1, "status": "completed", "a_name": "Night Owls", "b_name": "Iron Wolves", "score_a": 2, "score_b": 1, "winner": "a" }
  }
}

Подпись и защита от повтора

Каждый запрос подписан секретом адреса (показывается один раз при создании и при смене). Проверьте подпись по сырому телу запроса, отклоните метку времени, отстоящую больше чем на 5 минут, и идентификатор события, который вы уже принимали: повторённый запрос тогда отклоняется. Во время смены секрета заголовок может содержать несколько значений v1=.

MV-Webhook-Id: evt_1042
MV-Webhook-Timestamp: 1790877851
MV-Webhook-Signature: v1=<hex HMAC-SHA256(secret, "evt_1042.1790877851." + body)>
import { createHmac, timingSafeEqual } from "node:crypto";

const seen = new Set(); // keep accepted ids in a database in production

export function verifyWebhook(headers, rawBody, secret) {
  const id = headers["mv-webhook-id"];
  const ts = headers["mv-webhook-timestamp"];
  const sig = headers["mv-webhook-signature"];
  if (!id || !ts || !sig) return false;
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false; // stale
  const expected = "v1=" + createHmac("sha256", secret).update(`${id}.${ts}.${rawBody}`).digest("hex");
  const ok = sig.split(" ").some((s) => s.length === expected.length && timingSafeEqual(Buffer.from(s), Buffer.from(expected)));
  if (!ok || seen.has(id)) return false; // forged or replayed
  seen.add(id);
  return true;
}

Виджеты

Виджет — страница для iframe на вашем сайте: сетка, регистрация и таблица турнира, календарь пространства. Показываются опубликованные турниры; ссылки открывают портал в новой вкладке; регистрация проходит на портале. Код вставки — в разделе «API, вебхуки и виджеты» пространства.

<iframe src="https://www.maximus.vegas/embed/ru/tournaments/{slug}/bracket" title="Bracket" width="100%" height="560" style="border:0" loading="lazy"></iframe>
/embed/ru/tournaments/{slug}/registration
/embed/ru/tournaments/{slug}/standings
/embed/ru/organizer/{space}/calendar

Проверка интеграции

Кнопка «Отправить тестовое событие» шлёт подписанное событие ping на выбранный адрес — так проверяется приёмник и проверка подписи. Для полного прогона создайте отдельное пространство организатора: его черновые и тестовые турниры видны только ключу этого пространства, а события его турниров уходят только на его адреса.