CS2 Search and Reference API
Search across teams, players, events and matches, the reference catalogs, webhook event types and freshness endpoints.
11 endpoints in this section. Authenticate with the x-api-key header; every response is { success, data, meta }. Other sections: Live, Player props, Odds, Positions & heatmaps, Watch live (embeds), Pro skins & 3D, Matches, Maps & rounds, Rankings, Teams, Players, Events, Stats & leaderboards, Skins, Transfers.
CS2 API overview
Coverage counts (matches, teams, players, events, demos) and links to the main endpoints.
Example
curl "https://api.citoapi.com/api/v1/cs2" \
-H "x-api-key: YOUR_API_KEY"Response
{
"success": true,
"data": {
"entityType": "cs2_api_overview",
"name": "Counter-Strike 2 API",
"status": "available",
"coverage": {
"matches": 33387,
"live": 4,
"upcoming": 31,
"teams": 5153,
"players": 10412,
"events": 2467,
"rosterChanges": 153936,
"demos": 40292,
"playerPeriodStats": 144419,
"teamPeriodStats": 6095
},
"endpoints": {
"live": "/api/v1/cs2/live",
"liveState": "/api/v1/cs2/live/{matchId}/state",
"liveScoreboard": "/api/v1/cs2/live/{matchId}/scoreboard",
"liveEvents": "/api/v1/cs2/live/{matchId}/events",
"matches": "/api/v1/cs2/matches",
"matchPlayerStats": "/api/v1/cs2/matches/{matchId}/player-stats",
"matchMaps": "/api/v1/cs2/matches/{matchId}/maps",
"matchDemos": "/api/v1/cs2/matches/{matchId}/demos",
"gameStats": "/api/v1/cs2/games/{gameId}/stats",
"gameRounds": "/api/v1/cs2/games/{gameId}/rounds",
"gameEvents": "/api/v1/cs2/games/{gameId}/events",
"teams": "/api/v1/cs2/teams",
"teamRosterHistory": "/api/v1/cs2/teams/{teamId}/roster-history",
"teamTrends": "/api/v1/cs2/teams/{teamId}/trends",
"players": "/api/v1/cs2/players",
"playerCareer": "/api/v1/cs2/players/{playerId}/career",
"playerSeasons": "/api/v1/cs2/players/{playerId}/seasons",
"playerTransfers": "/api/v1/cs2/players/{playerId}/transfers",
"events": "/api/v1/cs2/events",
"activeEvents": "/api/v1/cs2/events/active",
"eventCalendar": "/api/v1/cs2/events/calendar",
"eventParticipants": "/api/v1/cs2/events/{eventId}/participants",
"rosterChanges": "/api/v1/cs2/roster-changes/recent",
"rankings": "/api/v1/cs2/rankings/teams",
"…": "1 more fields"
}
},
"meta": {}
}CS2 data freshness
Whether CS2 data is current: `current_status`, `freshness` (`fresh` or `stale`) and the time of the last successful update.
Example
curl "https://api.citoapi.com/api/v1/cs2/status/sync" \
-H "x-api-key: YOUR_API_KEY"Response
{
"success": true,
"data": {
"entity_type": "cs2_sync_health",
"current_status": "healthy",
"freshness": "fresh",
"last_successful_sync_at": "2026-09-23T01:21:07.356Z",
"checked_at": "2026-09-23T01:21:30.000Z"
},
"meta": {}
}CS2 data changelog
Recent changes to CS2 records: the field, its public before and after values, and the time. Each entry names the records it belongs to (matchId, mapId, playerId, teamId, statLineId; null when not applicable) and resourcePath, the GET that returns the changed record. For a player stat line, entityId is `<mapId>:<player name>`, a record key rather than a route id: request resourcePath instead. Values longer than 500 characters are truncated; pass `entity_id` with `full=true` for complete values. By default only applied changes are listed (action `merge_accepted` and `overwrite`); pass `action=merge_rejected` for changes that were considered and not applied, or `include=not_applied` for every change.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| action | string | Filter by action. |
| entity_id | string | Only changes to this record. |
| entity_type | string | Only changes to this kind of record. |
| full | boolean | true returns complete values instead of truncated ones. |
| include | string | Filter by include. |
| limit | integer | Rows to return. Maximum 200; larger values are reduced to 200. |
| offset | integer | Rows to skip, for paging. |
Example
curl "https://api.citoapi.com/api/v1/cs2/changelog" \
-H "x-api-key: YOUR_API_KEY"Response
{
"success": true,
"data": [
{
"id": "cmwc4fw96054kf9z0yl1qn2jw",
"entityType": "cs2_map_player_stat",
"entityId": "cs2-match-2400332-map-1:Chill",
"matchId": "cs2-match-2400332",
"mapId": "cs2-match-2400332-map-1",
"playerId": "cs2-player-19812",
"teamId": "cs2-team-13704",
"statLineId": "cs2-match-2400332-map-1-cs2-player-19812",
"resourcePath": "/api/v1/cs2/games/cs2-match-2400332-map-1/stats",
"fieldPath": "*",
"oldValue": {
"playerId": "cs2-player-19812",
"playerName": "Chill",
"teamId": "cs2-team-13704",
"teamName": "Drama",
"kills": 9,
"deaths": 16,
"assists": 2,
"plusMinus": -7,
"headshots": 5,
"headshotPercent": 0.5556,
"adr": 52.45,
"kast": 0.5,
"firstKills": 2,
"firstDeaths": 4,
"rating": 0.67,
"ratingVersion": "cito_rating_1"
},
"newValue": {
"kills": 9,
"deaths": 16,
"assists": 2,
"plusMinus": -7,
"headshots": 5,
"headshotPercent": 0.5556,
"adr": 52.5,
"kast": 0.5,
"firstKills": 2,
"firstDeaths": 4,
"sideStats": {
"ct": {
"kills": 3,
"deaths": 6,
"adr": 30.1,
"kast": 0.375
},
"t": {
"kills": 6,
"deaths": 10,
"adr": 67.3,
"kast": 0.583
}
}
},
"action": "overwrite",
"createdAt": "2026-11-11T12:54:59.082Z"
},
{
"id": "cmwc4fw65054jf9z00wdvhr1v",
"entityType": "cs2_map_player_stat",
"entityId": "cs2-match-2400332-map-1:choiv7",
"matchId": "cs2-match-2400332",
"mapId": "cs2-match-2400332-map-1",
"playerId": "cs2-player-20685",
"teamId": "cs2-team-13704",
"statLineId": "cs2-match-2400332-map-1-cs2-player-20685",
"resourcePath": "/api/v1/cs2/games/cs2-match-2400332-map-1/stats",
"fieldPath": "*",
"oldValue": {
"playerId": "cs2-player-20685",
"playerName": "choiv7",
"teamId": "cs2-team-13704",
"teamName": "Drama",
"kills": 6,
"deaths": 15,
"assists": 0,
"plusMinus": -9,
"headshots": 2,
"headshotPercent": 0.3333,
"adr": 35.4,
"kast": 0.55,
"firstKills": 1,
"firstDeaths": 1,
"rating": 0.57,
"ratingVersion": "cito_rating_1"
},
"newValue": {
"kills": 6,
"deaths": 15,
"assists": 0,
"plusMinus": -9,
"headshots": 2,
"headshotPercent": 0.3333,
"adr": 35.4,
"kast": 0.55,
"firstKills": 1,
"firstDeaths": 1,
"sideStats": {
"ct": {
"kills": 3,
"deaths": 5,
"adr": 32.6,
"kast": 0.625
},
"t": {
"kills": 3,
"deaths": 10,
"adr": 37.2,
"kast": 0.5
}
}
},
"action": "overwrite",
"createdAt": "2026-11-11T12:54:58.973Z"
}
],
"meta": {
"total": 562964,
"limit": 2,
"valuesTruncatedAt": 500,
"dataAvailable": true,
"unavailableReason": null,
"count": 2,
"page": 1,
"totalPages": 281482,
"hasNext": true,
"hasPrev": false
}
}CS2 webhook event types
The event types a CS2 webhook can subscribe to, with example payloads. These routes are equivalent; use whichever reads best.
Example
curl "https://api.citoapi.com/api/v1/cs2/webhooks/events" \
-H "x-api-key: YOUR_API_KEY"Response
{
"success": true,
"available_on_plans": [
"PRO",
"BUSINESS"
],
"management_endpoint": "/api/v1/webhooks",
"create_endpoint": "POST /api/v1/webhooks",
"events": [
"cs2.match.started",
"cs2.match.live_started"
],
"example_payload": {
"event": "cs2.score.updated",
"id": "7f4c2d0d8f2f4b2ca6c6f35c4d53c2aa",
"timestamp": "2026-11-11T12:57:12.794Z",
"data": {
"matchId": "cs2-match-2395230",
"team1Score": 1,
"team2Score": 0,
"currentMap": "mirage"
}
},
"signature_headers": [
"X-Cito-Signature",
"X-Cito-Event"
],
"signing": {
"algorithm": "HMAC-SHA256",
"signedContent": "UTF-8 bytes of the exact JSON request body sent by Cito",
"bodySerialization": "JSON.stringify(payload)",
"signatureHeader": "X-Cito-Signature",
"signatureEncoding": "hex",
"signaturePrefix": "none",
"secretFormat": "Use the exact webhook secret value shown when the webhook is created or regenerated. No whsec_ prefix is used.",
"verificationRule": "Verify against the raw request body bytes before reparsing or reserializing JSON.",
"sampleSecret": "cito_test_secret_123",
"samplePayload": {
"event": "lol.live.state",
"id": "sample-event-id-123",
"timestamp": "2026-06-07T16:00:00.000Z",
"data": {
"gameId": "lol-game-123",
"matchId": "lol-match-123",
"league": "LEC",
"gameTime": 1337,
"blueTeam": {
"tag": "G2",
"kills": 7,
"gold": 24800,
"towers": 3,
"dragons": 2,
"barons": 0
},
"redTeam": {
"tag": "FNC",
"kills": 5,
"gold": 23700,
"towers": 2,
"dragons": 1,
"barons": 0
}
}
},
"samplePayloadString": "{\"event\":\"lol.live.state\",\"id\":\"sample-event-id-123\",\"timestamp\":\"2026-06-07T16:00:00.000Z\",\"data\":{\"gameId\":\"lol-gam…",
"sampleSignature": "97db77f5cd96e09a70dcf6cc75fc5d92d780c41ce82c853b51e4070954c54171",
"sampleHeaders": {
"Content-Type": "application/json",
"X-Cito-Signature": "97db77f5cd96e09a70dcf6cc75fc5d92d780c41ce82c853b51e4070954c54171",
"X-Cito-Event": "lol.live.state",
"X-Cito-Event-Id": "sample-event-id-123",
"X-Cito-Timestamp": "2026-06-07T16:00:00.000Z",
"X-Cito-Delivery-Attempt": "1"
}
},
"live_sse_stream": "/api/v1/cs2/live/stream?matchId={matchId}",
"docs": "https://citoapi.com/docs/api/cs2",
"data": {
"available_on_plans": [
"PRO",
"BUSINESS"
],
"management_endpoint": "/api/v1/webhooks",
"create_endpoint": "POST /api/v1/webhooks",
"events": [
"cs2.match.started",
"cs2.match.live_started"
],
"example_payload": {
"event": "cs2.score.updated",
"id": "7f4c2d0d8f2f4b2ca6c6f35c4d53c2aa",
"timestamp": "2026-11-11T12:57:12.794Z",
"data": {
"matchId": "cs2-match-2395230",
"team1Score": 1,
"team2Score": 0,
"currentMap": "mirage"
}
},
"signature_headers": [
"X-Cito-Signature",
"X-Cito-Event"
],
"signing": {
"algorithm": "HMAC-SHA256",
"signedContent": "UTF-8 bytes of the exact JSON request body sent by Cito",
"bodySerialization": "JSON.stringify(payload)",
"signatureHeader": "X-Cito-Signature",
"signatureEncoding": "hex",
"signaturePrefix": "none",
"secretFormat": "Use the exac
…How to register a CS2 webhook
Returns the steps and payload for registering a CS2 webhook in the dashboard. It does not create a subscription. Same response as `GET /api/v1/cs2/webhooks/events`.
Example
curl "https://api.citoapi.com/api/v1/cs2/webhooks" \
-H "x-api-key: YOUR_API_KEY"Search CS2
Search teams, players, events and matches by name. Requires `q`. Player photos: `imageUrl` on a player (`playerImageUrl` on roster and transfer rows) is always an image URL. A player with no photo gets a neutral silhouette placeholder (400x417 transparent WebP, the same size as the photos) and `imageIsPlaceholder: true` (`playerImageIsPlaceholder` on roster and transfer rows); a real photo has `false`. Check the flag, not the URL.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| q* | string | Search text. |
Example
curl "https://api.citoapi.com/api/v1/cs2/search" \
-H "x-api-key: YOUR_API_KEY"Response
{
"success": true,
"data": {
"teams": [
{
"id": "cs2-team-9565",
"name": "Vitality",
"slug": "vitality",
"teamTag": "VITALITY",
"logoUrl": "https://api.citoapi.com/api/v1/public/images/cs2/logos/0cd34febd1ad61ff888f21b55756003b.webp",
"countryName": "Europe",
"countryCode": null,
"region": "Europe",
"worldRanking": 3,
"lastSyncedAt": "2026-11-11T12:51:12.392Z",
"lastVerified": "2026-11-11T12:51:12.392Z",
"confidence": "high",
"worldRankingStatus": "ranked",
"vrsRanking": 2,
"vrsRankingStatus": "ranked",
"vrsRegion": "Europe",
"alternateLogoUrl": "https://api.citoapi.com/api/v1/public/images/cs2/logos/c5e463f9b2347d3aa58794fb8f7ec967.webp",
"darkUiLogoUrl": "https://api.citoapi.com/api/v1/public/images/cs2/logos/c5e463f9b2347d3aa58794fb8f7ec967.webp",
"logoIsPlaceholder": false
},
{
"id": "cs2-team-13815",
"name": "Vitality Academy",
"slug": "vitality-academy",
"teamTag": "VA",
"logoUrl": "https://api.citoapi.com/api/v1/public/images/cs2/logos/ad13083b7d0f2fdc6fc7032fe719467f.webp",
"countryName": "Europe",
"countryCode": null,
"region": "Europe",
"worldRanking": null,
"lastSyncedAt": "2026-11-07T04:55:10.577Z",
"lastVerified": "2026-11-07T04:55:10.577Z",
"confidence": "high",
"worldRankingStatus": "not_ranked",
"vrsRanking": null,
"vrsRankingStatus": "not_ranked",
"vrsRegion": null,
"alternateLogoUrl": "https://api.citoapi.com/api/v1/public/images/cs2/logos/88a33f664082f564bcdea7a4c2983cfa.webp",
"darkUiLogoUrl": "https://api.citoapi.com/api/v1/public/images/cs2/logos/88a33f664082f564bcdea7a4c2983cfa.webp",
"logoIsPlaceholder": false
}
],
"players": [],
"events": [],
"matches": [
{
"id": "cs2-match-2400201",
"eventId": "cs2-event-8251",
"eventName": "BLAST Rivals 2026 Season 2",
"eventSlug": "blast-rivals-2026-season-2",
"stageName": null,
"startsAt": "2026-11-12T04:30:00.000Z",
"endsAt": null,
"bestOf": 3,
"status": "upcoming",
"team1Id": "cs2-team-8297",
"team2Id": "cs2-team-9565",
"team1Name": "FURIA",
"team2Name": "Vitality",
"team1Score": null,
"team2Score": null,
"winnerTeamId": null,
"liveState": {
"status": "upcoming",
"team1Score": null,
"team2Score": null,
"winnerTeamId": null
},
"vetoOrder": [
{
"map": "dust2",
"order": 1,
"action": "pick",
"teamId": null,
"teamName": null,
"mapName": "dust2",
"mapNumber": null,
"played": false
},
{
"map": "cache",
"order": 2,
"action": "pick",
"teamId": null,
"teamName": null,
"mapName": "cache",
"mapNumber": null,
"played": false
}
],
"streamLinks": [
{
"url": "https://www.youtube.com/watch?v=gSL0kbwMusY",
"label": null,
"language": null,
"platform": "youtube"
},
{
"url": "https://www.twitch.tv/blastpremier",
…CS2 autocomplete
Typeahead for search boxes. Requires `q`. Returns an array of at most `limit` items (default 10, max 20), best match first: `{ id, type, name, slug, logo, score }` plus one context field (team `rank` = world rank, player `team` = current team name, event `startsAt`, match `startsAt`, `status`, `eventName`). `type` is `team`, `player`, `event` or `match`; `types=team,player,event,match` picks which (default `team,player,event`; `type=` also works). **Relevance:** `score` 100 = exact name, slug, former name or short alias (`navi`, `c9`, `vp`); 80 = the name starts with the query; 60 = a word of the name starts with it; 40 = the query is inside a word (queries of 4+ characters). Nothing below 40 is returned. Ties: world rank, maps played, event recency, shorter name. **Shape:** `meta` has `query`, `types`, `limit`, `count`, `shape: "slim"` and `fullShape`. `?expand=full` returns the previous response, the same as `/cs2/search` (`{teams, players, events, matches}` with full rows). API keys that called this endpoint in the 90 days before 2026-11-02 keep that full response by default and can opt in to the slim list with `?expand=slim`.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| expand | string | full: the previous response ({teams, players, events, matches}, same as /cs2/search); slim: the typeahead list (for keys whose default is full). |
| limit | integer | Items to return, 1-20 (default 10). Maximum 100; larger values are reduced to 100. |
| q* | string | Search text (at least one letter or digit). |
| query | string | Filter by query. |
| type | string | Same as types. |
| types | string | Comma-separated team, player, event, match (plural forms accepted). Default team,player,event. |
Example
curl "https://api.citoapi.com/api/v1/cs2/autocomplete" \
-H "x-api-key: YOUR_API_KEY"Response
{
"success": true,
"data": [
{
"id": "cs2-team-9565",
"type": "team",
"name": "Vitality",
"slug": "vitality",
"logo": "https://api.citoapi.com/api/v1/public/images/cs2/logos/0cd34febd1ad61ff888f21b55756003b.webp",
"score": 100,
"rank": 3
},
{
"id": "cs2-team-13815",
"type": "team",
"name": "Vitality Academy",
"slug": "vitality-academy",
"logo": "https://api.citoapi.com/api/v1/public/images/cs2/logos/ad13083b7d0f2fdc6fc7032fe719467f.webp",
"score": 80,
"rank": null
}
],
"meta": {
"query": "vitality",
"types": [
"team",
"player"
],
"limit": 2,
"shape": "slim",
"fullShape": "/api/v1/cs2/autocomplete?expand=full",
"count": 2,
"dataAvailable": true,
"unavailableReason": null,
"total": 2,
"page": 1,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}Weapon catalog
CS2 weapons with their category (rifle, pistol, SMG and so on).
Example
curl "https://api.citoapi.com/api/v1/cs2/weapons" \
-H "x-api-key: YOUR_API_KEY"Response
{
"success": true,
"data": [
{
"id": "ak47",
"slug": "ak47",
"name": "AK-47",
"category": "rifle"
},
{
"id": "m4a1",
"slug": "m4a1",
"name": "M4A1-S",
"category": "rifle"
}
],
"meta": {
"count": 18,
"dataAvailable": true,
"unavailableReason": null,
"limit": 18,
"total": 18,
"page": 1,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}Regions
Regions used for teams and regional rankings.
Example
curl "https://api.citoapi.com/api/v1/cs2/regions" \
-H "x-api-key: YOUR_API_KEY"Response
{
"success": true,
"data": [
{
"id": "europe",
"slug": "europe",
"name": "Europe"
},
{
"id": "americas",
"slug": "americas",
"name": "Americas"
}
],
"meta": {
"count": 7,
"dataAvailable": true,
"unavailableReason": null,
"limit": 7,
"total": 7,
"page": 1,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}Leagues
Leagues and circuits that group events.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Rows to return. Maximum 200; larger values are reduced to 200. |
Example
curl "https://api.citoapi.com/api/v1/cs2/leagues" \
-H "x-api-key: YOUR_API_KEY"Response
{
"success": true,
"data": [
{
"entityType": "cs2_event",
"id": "cs2-event-7427",
"name": "ESL Impact Summer 2023 Cash Cup 6 Europe",
"slug": "esl-impact-summer-2023-cash-cup-6-europe",
"tier": null,
"region": null,
"status": "completed",
"location": null,
"bannerImageUrl": null,
"eventStructure": null,
"prizeDistribution": null,
"stats": null,
"availableSubresources": [
"teams",
"results"
],
"unavailableSubresources": [
"matches",
"standings"
],
"unavailableFields": {
"imageUrl": {
"reason": "event_field_unavailable"
},
"prizePool": {
"reason": "event_field_unavailable"
},
"currency": {
"reason": "event_field_unavailable"
},
"location": null,
"format": {
"reason": "event_field_unavailable"
},
"teamCount": {
"reason": "event_field_unavailable"
},
"standings": {
"reason": "event_field_unavailable"
},
"startsAt": {
"reason": "event_field_unavailable"
},
"endsAt": {
"reason": "event_field_unavailable"
}
},
"dataQuality": "partial",
"confidence": "medium",
"confidenceScore": 0.7,
"lastVerified": null
},
{
"entityType": "cs2_event",
"id": "cs2-event-7432",
"name": "ESL Impact Summer 2023 Cash Cup 6 North America",
"slug": "esl-impact-summer-2023-cash-cup-6-north-america",
"tier": null,
"region": null,
"status": "completed",
"location": null,
"bannerImageUrl": null,
"eventStructure": null,
"prizeDistribution": null,
"stats": null,
"availableSubresources": [
"teams",
"results"
],
"unavailableSubresources": [
"matches",
"standings"
],
"unavailableFields": {
"imageUrl": {
"reason": "event_field_unavailable"
},
"prizePool": {
"reason": "event_field_unavailable"
},
"currency": {
"reason": "event_field_unavailable"
},
"location": null,
"format": {
"reason": "event_field_unavailable"
},
"teamCount": {
"reason": "event_field_unavailable"
},
"standings": {
"reason": "event_field_unavailable"
},
"startsAt": {
"reason": "event_field_unavailable"
},
"endsAt": {
"reason": "event_field_unavailable"
}
},
"dataQuality": "partial",
"confidence": "medium",
"confidenceScore": 0.7,
"lastVerified": null
}
],
"meta": {
"count": 2,
"dataAvailable": true,
"unavailableReason": null,
"limit": 2,
"total": 2,
"page": 1,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}Head-to-head by query
The same head-to-head record as `/cs2/h2h/{teamIdOrSlug}/{opponentIdOrSlug}`, with the two teams as query parameters: `team1` and `team2` (id or slug). Missing either returns 400. Same response as `GET /api/v1/cs2/h2h`.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| bestOf | string | Filter by bestOf. |
| limit | integer | Rows to return. Maximum 250; larger values are reduced to 250. |
| team1 | string | Filter by team1. |
| team2 | string | Filter by team2. |
Example
curl "https://api.citoapi.com/api/v1/cs2/head-to-head" \
-H "x-api-key: YOUR_API_KEY"Try the CS2 Search and Reference 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/search?q=vitality" \
-H "x-api-key: YOUR_API_KEY"