Use cases/Team analytics & scouting

[UC 05]

How teams and analysts build scouting archives with Cito

Seen in our API traffic

Pro teams and analytics products sync full match archives for CDL, LoL, CS2 and UFC.

GET /cs2/teams/{teamIdOrSlug}/results
{
  "success": true,
  "data": [
    {
      "id": "cs2-match-2398757",
      "eventName": "ESL Pro League Season 24",
      "startsAt": "2026-10-11T15:00:00.000Z",
      "bestOf": 5,
      "status": "completed",
      "team1Name": "Vitality", "team1Score": 3,
      "team2Name": "MOUZ", "team2Score": 0,
      "winnerTeamId": "cs2-team-9565"
    }
  ]
}

Challenge

Scouting means every map an opponent played, every player's form and how a roster changed. Building that by hand from match pages takes days and breaks on the next roster move.

Solution

Full match, map and player history with roster changes, synced into your own database with stable IDs so dashboards keep working as rosters move.

What you get

  • Per-map results and player stats for every opponent
  • Roster history and transfers
  • Player form and career stats
  • Sync into your own warehouse

Sync once, query forever

Analysts usually mirror the archive into their own database: page through results, store each match by its ID, then pull maps and player stats for the matches that matter.

for (let page = 1; ; page++) {
  const { data } = await cito(`/cod/matches?page=${page}&limit=50`);
  if (!data.length) break;
  await db.matches.upsert(data);
}

Follow rosters

Roster history and transfers keep a team's numbers honest when players move mid-season.

Endpoints used

GET/cod/matches/{id}/mapsMode, map and score per CDL map
GET/cod/matches/{id}/player-statsPlayer stats per map
GET/cs2/teams/{teamIdOrSlug}/resultsA team's results
GET/cs2/teams/{teamIdOrSlug}/roster-historyWho played when
GET/lol/players/{playerId}/formRecent form for a player

Build it on a free key

500 requests a month, every game, no card.

More use cases