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.bestOf—1,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= ничья / игра идёт.
Для киберспорта player.name — это настоящее имя (firstName + lastName), player.nickName —
игровой ник (например, s1mple), player.shortName — короткий ник. translations.ru дублирует
настоящее имя. Для CS2 player.position / positionName — null
(позиции/роли заполняются только в 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".
- Dota 2:
player.position:- Dota 2:
hc,mid,off,ss,hs(плюсpositionName— расшифровка изDOTA_POSITION_MAP). - LoL:
top,jun,mid,adc,sup.
- Dota 2:
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).