Docs/CS2 API/CS2 Live Scores API

CS2 Live Scores API

Everything about matches in progress: the live list, per-match state and scoreboard, rounds, kill events, live player stats, and the push stream so you do not have to poll. It follows the public scoreboard, which tournaments run behind a broadcast delay: built for live scoreboards, bots, overlays and models, not for betting on the next round.

11 endpoints in this section. Authenticate with the x-api-key header; every response is { success, data, meta }. Other sections: Player props, Odds, Matches, Maps & rounds, Rankings, Teams, Players, Events, Stats & leaderboards, Skins, Transfers, Search & reference.

Live update stream (SSE)

GET/api/v1/cs2/live/stream

Server-Sent Events stream of live match updates, on every plan. Keep the connection open; each `cs2.live.update` event carries the changed match. Pass `matchId` to follow one match. Events: `ready` (sent first; carries `delay_seconds` and `billing`), `cs2.live.update`, `ping` every 15 seconds, and `error` just before the server closes the stream. **Billing.** An open stream counts toward your monthly quota like polling: one request when it connects, then one request for every 15 seconds it stays open (the same as polling `/cs2/live` every 15 seconds; 5,760 requests a day if held open around the clock). When the quota runs out the stream sends an `error` event with code `RATE_LIMIT_EXCEEDED` and closes; connecting with no quota left returns 429. **Delay.** Free and Starter plans receive every update 60 seconds late, the same delay as the polled live endpoints. Other plans are real-time. Room-based WebSockets (Scale and Enterprise, or the Live WebSockets add-on): `wss://api.citoapi.com/api/v1/cs2/live/ws`.

Query parameters

ParameterTypeDescription
matchIdstringMatch id.

Example

bash
curl "https://api.citoapi.com/api/v1/cs2/live/stream" \
  -H "x-api-key: YOUR_API_KEY"

Live socket details

GET/api/v1/cs2/live/{matchId}/socket

Connection details for subscribing to one live match over the live stream.

Query parameters

ParameterTypeDescription
matchId (path)*stringMatch id, e.g. cs2-match-2398421.

Example

bash
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/socket" \
  -H "x-api-key: YOUR_API_KEY"

Response

json
{
  "success": true,
  "data": {
    "entityType": "cs2_live_transport",
    "matchId": "cs2-match-2399511",
    "transports": {
      "websocket": {
        "url": "wss://api.citoapi.com/api/v1/cs2/live/ws?matchId=cs2-match-2399511",
        "auth": "x-api-key header, Authorization: Bearer, or ?apiKey=",
        "subscribe": {
          "action": "subscribe",
          "rooms": [
            "match:cs2-match-2399511"
          ]
        },
        "allLiveMatches": {
          "action": "subscribe",
          "rooms": [
            "all"
          ]
        },
        "messages": [
          "ready",
          "cs2.live.snapshot (on subscribe)"
        ],
        "plans": "Scale / Enterprise, or the Live WebSockets add-on"
      },
      "sse": {
        "url": "/api/v1/cs2/live/stream?matchId=cs2-match-2399511",
        "note": "Same events as the WebSocket. Connect with Accept: text/event-stream. Available on every plan.",
        "billing": "Counts like polling: one request at connect, then one for every 15 seconds the stream stays open. When the monthly qu…",
        "delay": "Plans below Pro receive every update 60 seconds late, like the polled live endpoints. Pro and above are real-time."
      }
    },
    "v2Shape": "Append ?shape=v2 on REST live endpoints or send Accept: application/vnd.cito.cs2.v2+json"
  },
  "meta": {}
}

Live scoreboard

GET/api/v1/cs2/live/{matchId}/scoreboard

Series score, current map and round, the round score (`game.score`, per team `mapScore`), and per-player kills, deaths, money and equipment for a live match.

Query parameters

ParameterTypeDescription
matchId (path)*stringMatch id, e.g. cs2-match-2398421.
shapestringFilter by shape.

Example

bash
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/scoreboard" \
  -H "x-api-key: YOUR_API_KEY"

Response

json
{
  "success": true,
  "data": {
    "matchId": "cs2-match-2399511",
    "status": "completed",
    "bestOf": 3,
    "currentGame": null,
    "seriesScore": {
      "teamA": 2,
      "teamB": 0
    },
    "game": {
      "id": null,
      "map": null,
      "round": null,
      "phase": "completed",
      "clockSeconds": null,
      "bomb": null,
      "score": {
        "ct": null,
        "t": null
      },
      "sides": {
        "ctTeamId": null,
        "tTeamId": null
      }
    },
    "teams": [
      {
        "id": "cs2-team-14079",
        "name": "6yuBoJlbl",
        "side": null,
        "score": 2,
        "mapScore": null,
        "playersAlive": null,
        "equipmentValue": null,
        "money": null,
        "timeoutsRemaining": null
      },
      {
        "id": "cs2-team-13759",
        "name": "mellren",
        "side": null,
        "score": 0,
        "mapScore": null,
        "playersAlive": null,
        "equipmentValue": null,
        "money": null,
        "timeoutsRemaining": null
      }
    ],
    "players": [],
    "lastEvent": null,
    "meta": {
      "updatedAt": "2026-10-26T23:00:08.908Z",
      "latencyMs": null,
      "coverage": "listing_only",
      "unavailableFields": [
        "players.hp",
        "players.armor"
      ]
    }
  },
  "meta": {}
}

Live rounds

GET/api/v1/cs2/live/{matchId}/rounds

Round-by-round results so far in a live match: winner, side and how the round ended.

Query parameters

ParameterTypeDescription
matchId (path)*stringMatch id, e.g. cs2-match-2398421.

Example

bash
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/rounds" \
  -H "x-api-key: YOUR_API_KEY"

Response

json
{
  "success": true,
  "data": {
    "entityType": "cs2_live_rounds",
    "matchId": "cs2-match-2399511",
    "rounds": [],
    "currentRound": null
  },
  "meta": {
    "count": 0,
    "limit": 0,
    "total": 0,
    "page": 1,
    "totalPages": 1,
    "hasNext": false,
    "hasPrev": false
  }
}

Live events

GET/api/v1/cs2/live/{matchId}/events

Kills, bomb plants and defuses, and round ends recorded during a live match.

Query parameters

ParameterTypeDescription
matchId (path)*stringMatch id, e.g. cs2-match-2398421.

Example

bash
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/events" \
  -H "x-api-key: YOUR_API_KEY"

Response

json
{
  "success": true,
  "data": {
    "entityType": "cs2_live_events",
    "matchId": "cs2-match-2399511",
    "events": []
  },
  "meta": {
    "count": 0,
    "limit": 0,
    "total": 0,
    "page": 1,
    "totalPages": 1,
    "hasNext": false,
    "hasPrev": false
  }
}

Live player stats

GET/api/v1/cs2/live/{matchId}/player-stats

Running per-player stats for a live match.

Query parameters

ParameterTypeDescription
matchId (path)*stringMatch id, e.g. cs2-match-2398421.

Example

bash
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/player-stats" \
  -H "x-api-key: YOUR_API_KEY"

Response

json
{
  "success": true,
  "data": {
    "entityType": "cs2_live_player_stats",
    "matchId": "cs2-match-2399511",
    "status": "completed",
    "isCurrent": false,
    "dataAvailable": false,
    "unavailableReason": "not_currently_live",
    "source": null,
    "capturedAt": null,
    "players": [],
    "lastVerified": "2026-10-26T23:00:07.894Z"
  },
  "meta": {
    "count": 0,
    "dataAvailable": false,
    "confirmationMaxAgeMs": 45000,
    "limit": 0,
    "total": 0,
    "page": 1,
    "totalPages": 1,
    "hasNext": false,
    "hasPrev": false
  }
}

Live maps

GET/api/v1/cs2/live/{matchId}/maps

Map list for a live match with per-map score and status.

Query parameters

ParameterTypeDescription
matchId (path)*stringMatch id, e.g. cs2-match-2398421.

Example

bash
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/maps" \
  -H "x-api-key: YOUR_API_KEY"

Response

json
{
  "success": true,
  "data": [
    {
      "entityType": "cs2_map",
      "id": "cs2-match-2399511-map-1",
      "matchId": "cs2-match-2399511",
      "mapNumber": 1,
      "mapName": "Ancient",
      "status": "completed",
      "team1Score": 13,
      "team2Score": 7,
      "team1Halves": null,
      "team2Halves": null,
      "winnerTeamId": "cs2-team-14079",
      "durationRounds": 20,
      "lastSyncedAt": "2026-10-26T23:00:08.134Z",
      "playerStats": [
        {
          "id": "live-source-match-2399511-map-1-ICY",
          "mapId": "cs2-match-2399511-map-1",
          "matchId": "cs2-match-2399511",
          "playerId": "cs2-player-21439",
          "playerName": "ICY",
          "teamId": "cs2-team-14079",
          "teamName": "6yuBoJlbl",
          "kills": 19,
          "deaths": 8,
          "assists": 4,
          "plusMinus": 11,
          "adr": 93.3,
          "kast": 1,
          "rating": 1.48,
          "ratingVersion": "cito_rating_1",
          "headshots": 9,
          "headshotPercent": 0.474,
          "firstKills": 3,
          "firstDeaths": 0,
          "lastSyncedAt": "2026-10-26T23:00:08.365Z",
          "mapNameCanonical": null,
          "imageUrl": null,
          "mapImageUrl": null,
          "coverImageUrl": null,
          "…": "6 more fields"
        },
        {
          "id": "live-source-match-2399511-map-1-Maksilvl",
          "mapId": "cs2-match-2399511-map-1",
          "matchId": "cs2-match-2399511",
          "playerId": "cs2-player-26060",
          "playerName": "Maksilvl",
          "teamId": "cs2-team-13759",
          "teamName": "mellren",
          "kills": 13,
          "deaths": 17,
          "assists": 4,
          "plusMinus": -4,
          "adr": 64.4,
          "kast": 0.7,
          "rating": 0.82,
          "ratingVersion": "cito_rating_1",
          "headshots": 7,
          "headshotPercent": 0.538,
          "firstKills": 2,
          "firstDeaths": 0,
          "lastSyncedAt": "2026-10-26T23:00:09.044Z",
          "mapNameCanonical": null,
          "imageUrl": null,
          "mapImageUrl": null,
          "coverImageUrl": null,
          "…": "6 more fields"
        }
      ],
      "bombEvents": [],
      "bombStats": [],
      "weaponAggregates": [
        {
          "id": "80c76a18-b5be-4f4d-a3e5-542e4a62afdf",
          "scopeType": "map",
          "scopeId": "cs2-match-2399511-map-1",
          "eventId": "cs2-event-9457",
          "matchId": "cs2-match-2399511",
          "mapId": "cs2-match-2399511-map-1",
          "weapon": "AK-47",
          "kills": 48,
          "headshots": 27,
          "percent": 34.5324,
          "demoCount": 1,
          "confidence": "high",
          "lastSyncedAt": "2026-10-26T21:27:02.801Z",
          "mapNameCanonical": null,
          "imageUrl": null,
          "mapImageUrl": null,
          "coverImageUrl": null,
          "resultType": "played",
          "resultStatus": "completed",
          "isForfeit": false,
          "statsEligible": true,
          "unavailableReason": null,
          "dataAvailability": {
            "playerStats": {
              "…": "…"
            }
          }
        },
        {
          "id": "ced4ddd3-6f54-4564-b6f1-ec8e52c5d4f7",
          "scopeType": "map",
          "scopeId": "cs2-match-2399511-map-1",
          "eventId": "cs2-event-9457",
          "matchId": "cs2-match-2399511",
          "mapId": "cs2-match-2399511-map-1",
          "weapon": "M4A1-S",
          "kills": 25
…

Live snapshots

GET/api/v1/cs2/live/{matchId}/snapshots

Timestamped snapshots of a live match (score, round, players) so the match can be replayed over time. Filter with `from` / `to`.

Query parameters

ParameterTypeDescription
matchId (path)*stringMatch id, e.g. cs2-match-2398421.
fromstringStart of the date range (ISO 8601, UTC).
limitintegerRows to return. Maximum 100; larger values are reduced to 100.
sourcestringRanking to use: omit for Valve Regional Standings, or world for the world ranking filtered to this region.
tostringEnd of the date range (ISO 8601, UTC).

Example

bash
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/snapshots" \
  -H "x-api-key: YOUR_API_KEY"

Response

json
{
  "success": true,
  "data": [
    {
      "entityType": "cs2_live_snapshot",
      "snapshotId": "bb237899-acca-4c45-b9b7-80117c3a3f8a",
      "matchId": "cs2-match-2399511",
      "status": "live",
      "source": "live",
      "capturedAt": "2026-10-26T19:43:10.390Z",
      "teams": {
        "team1Name": "6yuBoJlbl",
        "team2Name": "mellren",
        "terroristTeamName": null,
        "counterTerroristTeamName": null
      },
      "score": {
        "team1": 1,
        "team2": 0
      },
      "currentMap": null,
      "currentRound": null,
      "roundTimeSeconds": null,
      "currentScoreCt": 0,
      "currentScoreT": 0,
      "roundTimeLeft": null,
      "bombPlanted": null,
      "players": [],
      "liveBombEvents": [],
      "roundEndEvents": []
    },
    {
      "entityType": "cs2_live_snapshot",
      "snapshotId": "51ef833c-4fcb-418e-b337-cdf3de971b86",
      "matchId": "cs2-match-2399511",
      "status": "live",
      "source": "live",
      "capturedAt": "2026-10-26T19:42:48.564Z",
      "teams": {
        "team1Name": null,
        "team2Name": null,
        "terroristTeamName": null,
        "counterTerroristTeamName": null
      },
      "score": {
        "team1": 1,
        "team2": 0
      },
      "currentMap": "Mirage",
      "currentRound": null,
      "roundTimeSeconds": null,
      "currentScoreCt": 0,
      "currentScoreT": 0,
      "roundTimeLeft": null,
      "bombPlanted": null,
      "players": [],
      "liveBombEvents": [],
      "roundEndEvents": []
    }
  ],
  "meta": {
    "count": 2,
    "dataAvailable": true,
    "source": "live",
    "limit": 2,
    "total": 2,
    "page": 1,
    "totalPages": 1,
    "hasNext": false,
    "hasPrev": false
  }
}

Live state

GET/api/v1/cs2/live/{matchId}/state

The latest state of one live match: score, round, round timer, bomb status and players.

Query parameters

ParameterTypeDescription
matchId (path)*stringMatch id, e.g. cs2-match-2398421.

Example

bash
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/state" \
  -H "x-api-key: YOUR_API_KEY"

Response

json
{
  "success": true,
  "data": {
    "entityType": "cs2_live_state",
    "matchId": "cs2-match-2399511",
    "status": "completed",
    "source": "live",
    "teams": {
      "team1Id": "cs2-team-14079",
      "team1Name": "6yuBoJlbl",
      "team1LogoUrl": "https://api.citoapi.com/api/v1/public/images/cs2/logos/2bd9b801afba9b3dc5c28afd15014756.webp",
      "team1AlternateLogoUrl": null,
      "team1DarkUiLogoUrl": null,
      "team2Id": "cs2-team-13759",
      "team2Name": "mellren",
      "team2LogoUrl": "https://api.citoapi.com/api/v1/public/images/cs2/logos/6d9ceaed8dc50267468af33e17b91310.webp",
      "team2AlternateLogoUrl": null,
      "team2DarkUiLogoUrl": null
    },
    "score": {
      "team1": 2,
      "team2": 0
    },
    "currentMap": null,
    "currentRound": null,
    "roundTimeSeconds": null,
    "roundTimeLeft": null,
    "currentScoreCt": null,
    "currentScoreT": null,
    "bombPlanted": null,
    "players": [],
    "liveBombEvents": [],
    "roundEndEvents": [],
    "latestSnapshot": null,
    "tracking": {
      "status": "stopped",
      "detectedAt": "2026-10-26T18:13:05.303Z",
      "lastPolledAt": "2026-10-26T19:43:48.711Z",
      "lastSnapshotAt": "2026-10-26T19:43:10.420Z",
      "pollCount": 2387
    },
    "dataAvailable": false,
    "unavailableReason": "not_currently_live",
    "lastVerified": "2026-10-26T23:00:07.894Z"
  },
  "meta": {}
}

Live match

GET/api/v1/cs2/live/{matchId}

One live match with teams, series score and live-coverage details. **Round history for every map in one call:** add `?include=rounds`. The response then carries `mapRounds`, one entry per map played so far (finished maps and the map in play): - `mapNumber`, `mapName`, `status`, `team1Score`, `team2Score`: the map, as in `/cs2/live/{matchId}/maps`. - `rounds`: `round` (1, 2, ...), `winnerSide` (`CT` / `T`), `winnerTeamId`, `winnerTeamName`, `winReason` (`t_killed`, `ct_killed`, `bomb_exploded`, `bomb_defused`, `time_ran_out`) and `endedAt` when known. - `complete`: `true` when every round is there. For a finished map that also means the rounds each team won add up to the map score; for the map in play, that no round so far is missing. - `missingRounds`: round numbers we hold no result for. The team is `null` on a round where it cannot be stated with certainty (some overtime rounds). - `source`: `live` (recorded as the match was played) or `post_match` (from the match demo, once it is processed). Without `include`, the response is unchanged. Live-data delay on your plan applies to this endpoint as a whole, `mapRounds` included.

Query parameters

ParameterTypeDescription
matchId (path)*stringMatch id, e.g. cs2-match-2398421.
includestringrounds adds mapRounds: the round history of every map played so far (see below).

Example

bash
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID" \
  -H "x-api-key: YOUR_API_KEY"

Response

json
{
  "success": true,
  "data": {
    "entityType": "cs2_live_match",
    "id": "cs2-match-2399511",
    "matchId": "cs2-match-2399511",
    "status": "completed",
    "eventId": "cs2-event-9457",
    "eventName": "CCT 2026 Europe Series 12",
    "eventSlug": "cct-2026-europe-series-12",
    "eventLogoUrl": null,
    "eventImageUrl": null,
    "eventBannerImageUrl": null,
    "event": {
      "eventId": "cs2-event-9457",
      "name": "CCT 2026 Europe Series 12",
      "slug": "cct-2026-europe-series-12",
      "logoUrl": null,
      "imageUrl": null,
      "bannerImageUrl": null
    },
    "bestOf": 3,
    "teams": {
      "team1Id": "cs2-team-14079",
      "team1Name": "6yuBoJlbl",
      "team1LogoUrl": "https://api.citoapi.com/api/v1/public/images/cs2/logos/2bd9b801afba9b3dc5c28afd15014756.webp",
      "team1AlternateLogoUrl": null,
      "team1DarkUiLogoUrl": null,
      "team2Id": "cs2-team-13759",
      "team2Name": "mellren",
      "team2LogoUrl": "https://api.citoapi.com/api/v1/public/images/cs2/logos/6d9ceaed8dc50267468af33e17b91310.webp",
      "team2AlternateLogoUrl": null,
      "team2DarkUiLogoUrl": null
    },
    "score": {
      "team1": 2,
      "team2": 0
    },
    "currentMapScore": {
      "team1": 13,
      "team2": 7
    },
    "team1Id": "cs2-team-14079",
    "team2Id": "cs2-team-13759",
    "team1Name": "6yuBoJlbl",
    "team2Name": "mellren",
    "team1Score": 2,
    "team2Score": 0,
    "liveSource": "live",
    "currentMap": "de_mirage",
    "currentRound": 20,
    "mapRounds": [
      {
        "mapNumber": 1,
        "mapName": "Ancient",
        "status": "completed",
        "team1Score": 13,
        "team2Score": 7,
        "source": "live",
        "complete": true,
        "missingRounds": [],
        "rounds": [
          {
            "round": 1,
            "winnerSide": "T",
            "winnerTeamId": "cs2-team-13759",
            "winnerTeamName": "mellren",
            "winReason": "bomb_exploded",
            "endedAt": "2026-10-26T18:13:57.682Z"
          },
          {
            "round": 2,
            "winnerSide": "T",
            "winnerTeamId": "cs2-team-13759",
            "winnerTeamName": "mellren",
            "winReason": "bomb_exploded",
            "endedAt": "2026-10-26T18:13:58.209Z"
          }
        ]
      },
      {
        "mapNumber": 2,
        "mapName": "Mirage",
        "status": "completed",
        "team1Score": 13,
        "team2Score": 7,
        "source": "live",
        "complete": true,
        "missingRounds": [],
        "rounds": [
          {
            "round": 1,
            "winnerSide": "T",
            "winnerTeamId": "cs2-team-14079",
            "winnerTeamName": "6yuBoJlbl",
            "winReason": "ct_killed",
            "endedAt": "2026-10-26T19:02:51.778Z"
          },
          {
            "round": 2,
            "winnerSide": "T",
            "winnerTeamId": "cs2-team-14079",
            "winnerTeamName": "6yuBoJlbl",
            "winReason": "ct_killed",
            "endedAt": "2026-10-26T19:04:24.426Z"
          }
        ]
      }
    ],
    "…": "11 more fields"
  },
  "meta": {
    "source": "live",
    "dataAvailable": true
  }
}

Live matches

GET/api/v1/cs2/live
GET/api/v1/cs2/matches/live

Matches in progress now. `score` / `team1Score` / `team2Score` are the series (maps won); the map being played is `currentMapScore`. Use a `matchId` with the `/cs2/live/{matchId}/…` endpoints for round-level detail. These routes are equivalent; use whichever reads best.

Query parameters

ParameterTypeDescription
includestringOdds are embedded by default for keys with odds access (Pro and above, or the 3-day trial): every row has odds[] (series winner h2h first, then each map, with implied probabilities and market depth: liquidityUsd, volumeUsd, spread), h2hOdds (the match-winner line, or null) and oddsAvailable. Without access rows carry odds: [] and meta.oddsError. include=odds is accepted and changes nothing here. include=player_props adds playerProps[]: the match's open pick'em lines per player and market, every provider side by side with lineSpread (same access as odds).

Example

bash
curl "https://api.citoapi.com/api/v1/cs2/live" \
  -H "x-api-key: YOUR_API_KEY"

Response

json
{
  "success": true,
  "data": [],
  "meta": {
    "count": 0,
    "source": "live",
    "filteredUnconfirmedLive": 0,
    "confirmationMaxAgeMs": 45000,
    "limit": 0,
    "total": 0,
    "page": 1,
    "totalPages": 1,
    "hasNext": false,
    "hasPrev": false,
    "oddsIncluded": true,
    "matchesWithOdds": 0
  }
}

Try the CS2 Live Scores API

Run a real request with your key, then wire the same call into your app. The free plan includes 500 requests a month.

bash
curl "https://api.citoapi.com/api/v1/cs2/live" \
  -H "x-api-key: YOUR_API_KEY"