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)
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
| Parameter | Type | Description |
|---|---|---|
| matchId | string | Match id. |
Example
curl "https://api.citoapi.com/api/v1/cs2/live/stream" \
-H "x-api-key: YOUR_API_KEY"Live socket details
Connection details for subscribing to one live match over the live stream.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| matchId (path)* | string | Match id, e.g. cs2-match-2398421. |
Example
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/socket" \
-H "x-api-key: YOUR_API_KEY"Response
{
"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
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
| Parameter | Type | Description |
|---|---|---|
| matchId (path)* | string | Match id, e.g. cs2-match-2398421. |
| shape | string | Filter by shape. |
Example
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/scoreboard" \
-H "x-api-key: YOUR_API_KEY"Response
{
"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
Round-by-round results so far in a live match: winner, side and how the round ended.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| matchId (path)* | string | Match id, e.g. cs2-match-2398421. |
Example
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/rounds" \
-H "x-api-key: YOUR_API_KEY"Response
{
"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
Kills, bomb plants and defuses, and round ends recorded during a live match.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| matchId (path)* | string | Match id, e.g. cs2-match-2398421. |
Example
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/events" \
-H "x-api-key: YOUR_API_KEY"Response
{
"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
Running per-player stats for a live match.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| matchId (path)* | string | Match id, e.g. cs2-match-2398421. |
Example
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/player-stats" \
-H "x-api-key: YOUR_API_KEY"Response
{
"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
Map list for a live match with per-map score and status.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| matchId (path)* | string | Match id, e.g. cs2-match-2398421. |
Example
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/maps" \
-H "x-api-key: YOUR_API_KEY"Response
{
"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
Timestamped snapshots of a live match (score, round, players) so the match can be replayed over time. Filter with `from` / `to`.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| matchId (path)* | string | Match id, e.g. cs2-match-2398421. |
| from | string | Start of the date range (ISO 8601, UTC). |
| limit | integer | Rows to return. Maximum 100; larger values are reduced to 100. |
| source | string | Ranking to use: omit for Valve Regional Standings, or world for the world ranking filtered to this region. |
| to | string | End of the date range (ISO 8601, UTC). |
Example
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/snapshots" \
-H "x-api-key: YOUR_API_KEY"Response
{
"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
The latest state of one live match: score, round, round timer, bomb status and players.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| matchId (path)* | string | Match id, e.g. cs2-match-2398421. |
Example
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID/state" \
-H "x-api-key: YOUR_API_KEY"Response
{
"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
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
| Parameter | Type | Description |
|---|---|---|
| matchId (path)* | string | Match id, e.g. cs2-match-2398421. |
| include | string | rounds adds mapRounds: the round history of every map played so far (see below). |
Example
curl "https://api.citoapi.com/api/v1/cs2/live/MATCH_ID" \
-H "x-api-key: YOUR_API_KEY"Response
{
"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
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
| Parameter | Type | Description |
|---|---|---|
| include | string | Odds 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
curl "https://api.citoapi.com/api/v1/cs2/live" \
-H "x-api-key: YOUR_API_KEY"Response
{
"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.
curl "https://api.citoapi.com/api/v1/cs2/live" \
-H "x-api-key: YOUR_API_KEY"