Перейти к основному содержимому

Tracker киберспортивных матчей (CS2 / Dota 2 / LoL)

Esports-матч в API содержит объект match.esports.games[] — массив игр серии со своей статистикой. Структура одного EsportsGame варьируется по дисциплине.

Получить полную статистику матча

curl -H "Authorization: YOUR_API_KEY" \
"https://api.api-sport.ru/v2/esports/matches/12345678"

Ответ содержит:

  • esports.bestOf1, 3 или 5 (максимум игр серии).
  • esports.games[] — массив игр.

Структура EsportsGame

{
"id": 1001,
"gameNumber": 1,
"status": "finished",
"winnerCode": 1,
"durationSeconds": 2160,
"startTimestamp": 1714123200000,
"homeScore": { "current": 16, "period1": 9, "period2": 7 },
"awayScore": { "current": 12, "period1": 6, "period2": 6 },
"map": "Mirage",
"homeTeamStartingSide": "T",
"homeTeamPlayers": [
{
"player": {
"id": 100,
"name": "Oleksandr Kostyliev",
"nickName": "s1mple",
"shortName": "s1mple",
"position": null,
"positionName": null,
"translations": { "ru": "Александр Костылёв" },
"image": "..."
},
"kills": 28,
"deaths": 17,
"assists": 6,
"adr": 92.4,
"kast": "78%",
"kdDiff": 11,
"firstKillsDiff": 4,
"flashAssists": 3,
"headshots": 13
}
],
"awayTeamPlayers": [ /* … */ ],
"statistics": { "home": { /* objectives */ }, "away": { /* … */ } },
"rounds": {
"roundsInAHalf": 12,
"normaltime": [
{ "roundNumber": 1, "outcome": "elimination", "winnerCode": 1, "homeTeamSide": "T" }
],
"overtime": null,
"overtimeChunkSize": null
},
"bans": null
}

Поля homeTeamPlayers / awayTeamPlayers / statistics / rounds / bans доступны только если для игры есть детализированные данные. Если нет — приходят [] / null. winnerCode: 1 = home, 2 = away, null = ничья / игра идёт.

Имя игрока vs ник

Для киберспорта player.name — это настоящее имя (firstName + lastName), player.nickNameигровой ник (например, s1mple), player.shortName — короткий ник. translations.ru дублирует настоящее имя. Для CS2 player.position / positionNamenull (позиции/роли заполняются только в Dota 2 и LoL).

CS2-специфика

  • homeTeamStartingSide: "T" или "CT".
  • rounds.roundsInAHalf — обычно 12 (формат MR12, актуальный с 2023 г.).
  • rounds.normaltime[].outcome: одно из elimination, defuse, explosion, timeout.
  • rounds.normaltime[].winnerCode: 1 = home, 2 = away.
  • rounds.normaltime[].homeTeamSide: "T" / "CT" — на какой стороне домашняя команда в этом раунде.
  • В homeTeamPlayers[] — поля adr, kast, kdDiff, firstKillsDiff, flashAssists, headshots.

Dota 2 / LoL

  • homeTeamStartingSide:
    • Dota 2: "Radiant" или "Dire".
    • LoL: "Blue" или "Red".
  • player.position:
    • Dota 2: hc, mid, off, ss, hs (плюс positionName — расшифровка из DOTA_POSITION_MAP).
    • LoL: top, jun, mid, adc, sup.
  • player.character: { name, slug } (если есть) — играемый герой / чемпион.
  • bans: { home: [{name, slug}], away: [{name, slug}] } — драфт.
  • Дополнительные поля статистики по игроку (там, где есть): goldPerMin, xpPerMin, denies (Dota); level, goldEarned, minionsKilled (LoL).

Пример: топ-фрагер серии

def top_fragger(match):
candidates = []
for game in match['esports']['games']:
for p in game.get('homeTeamPlayers', []) + game.get('awayTeamPlayers', []):
candidates.append({
'name': p['player'].get('nickName') or p['player'].get('shortName') or p['player']['name'],
'kills': p.get('kills') or 0,
'deaths': p.get('deaths') or 0,
'assists': p.get('assists') or 0,
})
return max(candidates, key=lambda x: x['kills']) if candidates else None

Live-обновления

Esports-матчи поддерживают WebSocket. Delta может содержать:

  • esports.games[N].statistics.home — счётчики команды.
  • esports.games[N].homeTeamPlayers[N].kills (и т.д.) — KDA игрока.
  • esports.games[N].rounds.normaltime[N] — новый CS-раунд.
  • esports.games[N].bans — обновление драфта (MOBA).

См. WebSocket → snapshot vs delta и полную схему — API Reference (выберите sportSlug=esports).