Historical CS2 data for your model.
Every finished pro match with its veto, maps and per-player lines (kills, deaths, ADR, KAST, rating, opening kills, headshots), the world ranking and VRS as they stood on any past date, and the odds and prop lines with every price change. Pull it over the API, or ask for a one-time CSV export.
- 32,222 finished matches
- 723,564 player-map lines
- CSV export on request
{ "success": true, "data": [ { "matchId": "cs2-match-2399758", "playerName": "ZywOo", "teamName": "Vitality", "kills": 7, "deaths": 14, "adr": 46.9, "kast": 0.65, "rating": 0.76, "headshotPercent": 0.4286, "firstKills": 1, "map": { "mapName": "Inferno", "team1Score": 7, "team2Score": 13, "match": { "eventName": "PGL Masters Bucharest 2026", "team1Name": "Vitality", "team2Name": "MOUZ" } } } ]}Seamless Integration with our MCP Server
Give Claude, Cursor, and ChatGPT the CS2 data. One command writes the MCP config; agents call live scoreboard, team map stat, opening duel, and transfer tools instead of inventing match IDs, and your key stays on your machine.
MCPInstall the Cito MCP serverHow much historical CS2 data is there?
32,222 finished matches and 723,564 per-map player stat lines across 67,149 maps and 8,532 players, counted on 9 November 2026. Coverage is dense from 2023, when CS2 launched, with a smaller set of earlier matches back to 2017.
| Year | Finished matches | Maps with per-player stats |
|---|---|---|
| 2026 (to 9 Nov) | 10,024 | 21,245 |
| 2025 | 10,245 | 21,735 |
| 2024 | 9,206 | 18,258 |
| 2023 | 2,317 | 5,151 |
| 2017 to 2022 | 430 | 760 |
What tables can I build from it?
The same tables every CS2 model ends up with. Each one is a GET, keyed by stable ids, so a nightly job can extend them without duplicates.
| Table | Columns | Endpoint |
|---|---|---|
| matches | match_id, date, event, tier, best_of, teams, series score, winner, veto | GET /cs2/matches/results?date_start=&date_end= |
| maps | map_id, map, number, picked by, score, halves, winner | GET /cs2/matches/{matchId}/maps |
| player_map_stats | kills, deaths, assists, ADR, KAST, rating, headshots, opening kills and deaths, with CT and T side splits where recorded | GET /cs2/matches/{matchId}/player-stats |
| rounds and economy | round winner, side, how it ended, team buy per round | GET /cs2/maps/{mapId}/rounds and /economy |
| rankings | rank and points per team on a given date (no look-ahead) | GET /cs2/rankings/world?date=2025-06-02 and /cs2/rankings/vrs |
| rosters | who played for whom, with dates | GET /cs2/teams/{slug}/roster-history |
| odds | match and map winner prices, every change since 16 Oct 2026 | GET /cs2/matches/{matchId}/odds/history |
| prop lines | kills and headshot lines with every line change since 26 Oct 2026 | GET /cs2/props?status=all&include_history=true |
How do I load it into pandas?
Walk the results one day at a time, then fetch each match's player lines. This builds a player-map table you can save as Parquet and extend each night.
import os, datetime as dt, requests, pandas as pd
API = "https://api.citoapi.com/api/v1"
S = requests.Session()
S.headers["x-api-key"] = os.environ["CITO_API_KEY"]
def get(path, **params):
r = S.get(API + path, params=params, timeout=30)
r.raise_for_status()
return r.json()["data"]
rows = []
day, end = dt.date(2025, 1, 1), dt.date(2025, 1, 31)
while day <= end:
for m in get("/cs2/matches/results", date_start=day.isoformat(), date_end=day.isoformat(), limit=100):
for p in get(f"/cs2/matches/{m['id']}/player-stats") or []:
rows.append({"match_id": m["id"], "date": m["startsAt"], "event": m["eventName"],
"best_of": m["bestOf"], "winner": m["winnerTeamId"],
**{k: p.get(k) for k in ("mapId", "playerId", "playerName", "teamId", "kills", "deaths",
"assists", "adr", "kast", "rating", "headshots", "firstKills",
"firstDeaths", "ctRating", "tRating")}})
day += dt.timedelta(days=1)
df = pd.DataFrame(rows)
df.to_parquet("cs2_player_maps_2025_01.parquet")
print(len(df), "player-map rows")How do I avoid look-ahead bias?
Use values as they stood before the match. Rankings take a date parameter and return the table on or before that day, odds history marks each price with capturedAt, and prop lines carry recordedAt on every change, so features can be cut at kick-off.
Can I get it as one CSV file instead?
Yes. If you would rather start from a file than from 30,000 API calls, we run a one-time export of the matches, maps and player lines you need (by date range, tier or team) as CSV or Parquet. Pricing depends on the size of the extract: email support@citoapi.com with what you need.
Endpoints you can ship with
Start on results: finished matches, their maps, and each player's line.
Live matches
Poll the live list for every match in progress, open one match for its round, timer, bomb and players, or keep an SSE stream open and get each update pushed.
- GET
/api/v1/cs2/liveMatches in progress: series score, map in play, map score, current round.
- GET
/api/v1/cs2/live/{matchId}/stateOne live match: score, round, round timer, bomb status and players.
- GET
/api/v1/cs2/live/{matchId}/scoreboardSeries score, current map and round, and each player's kills, deaths, money and equipment.
- GET
/api/v1/cs2/live/{matchId}/roundsRound-by-round results so far: winner, side and how each round ended.
- GET
/api/v1/cs2/live/streamServer-Sent Events push of every live update. Every plan; counts like polling.
- GET
/api/v1/cs2/live/wsWebSocket with a room per match. Scale and Enterprise; Pro with the Live WebSockets add-on.
Results
Finished matches with the series score and winner, every map and its score, and the player lines behind them.
- GET
/api/v1/cs2/matches/recentFinished matches with final series score and winner, newest first.
- GET
/api/v1/cs2/matches/{matchId}One match: event, teams, series score, and maps.
- GET
/api/v1/cs2/matches/{matchId}/mapsEach map: name, score, winner, and the team that picked it.
- GET
/api/v1/cs2/matches/{matchId}/player-statsPer-player stats for each map: kills, deaths, ADR, KAST and rating.
- GET
/api/v1/cs2/teams/{teamIdOrSlug}/resultsOne team's finished matches, newest first.
- GET
/api/v1/cs2/events/{eventIdOrSlug}/resultsFinal placements and prize money of a tournament.
Schedule
What is on next: upcoming matches soonest first, today's slate, one team's fixtures, and the tournament calendar.
- GET
/api/v1/cs2/matches/upcomingScheduled matches, soonest first.
- GET
/api/v1/cs2/matches/todayMatches scheduled, live or finished today (UTC).
- GET
/api/v1/cs2/teams/{teamIdOrSlug}/upcomingOne team's scheduled matches.
- GET
/api/v1/cs2/events/upcomingScheduled tournaments, soonest first.
- GET
/api/v1/cs2/events/calendarTournaments in a date range, with from and to.
- GET
/api/v1/cs2/matches/{matchId}/streamsBroadcast links for a match, when known.
Odds & models
Match and map winner prices with implied probability, liquidity and spread, every price change since the market opened, and the team form, map stats and head-to-head a model needs next to them.
- GET
/api/v1/cs2/matches/upcoming?include=oddsUpcoming matches with each one's current market prices attached.
- GET
/api/v1/cs2/matches/{matchId}/oddsMatch and map winner odds: decimal price, implied probability, liquidity, spread, status.
- GET
/api/v1/cs2/matches/{matchId}/odds/historyEvery captured price change for the match and each map, oldest first.
- GET
/api/v1/cs2/teams/{teamIdOrSlug}/formA team's recent results and win rate.
- GET
/api/v1/cs2/teams/{teamIdOrSlug}/map-statsWin rate and matches played on each map.
- GET
/api/v1/cs2/h2h/{teamIdOrSlug}/{opponentIdOrSlug}Head-to-head record and the meetings behind it.
Positions & heatmaps
Where every grenade went off, where each kill and death happened, and where the bomb was planted, in game coordinates and already placed on the map's radar, plus heatmaps per map or per player.
- GET
/api/v1/cs2/maps/{mapId}/utilityEvery smoke, flash, HE and molotov on a map: landing spot, thrower, round, duration.
- GET
/api/v1/cs2/maps/{mapId}/positionsGrenades, bomb plants and kills with attacker and victim spots and callouts, in order.
- GET
/api/v1/cs2/maps/{mapId}/heatmap?kind=smokeCounts per radar cell for smokes, flashes, molotovs, plants, kills or deaths.
- GET
/api/v1/cs2/players/{playerIdOrSlug}/utility?map=MirageWhere one player's grenades land across recent maps, with a heatmap.
- GET
/api/v1/cs2/map-radarsRadar calibration per map to draw any point on a radar image.
Player stats
K/D and rating per map played (ADR and KAST on over 95% of map lines), rolled up into career, yearly and recent-form views.
- GET
/api/v1/cs2/players/{playerIdOrSlug}Nickname, real name, photo, country, team, role and headline stats.
- GET
/api/v1/cs2/players/{playerIdOrSlug}/statsCareer totals plus a stat line per map played.
- GET
/api/v1/cs2/players/{playerIdOrSlug}/seasonsA player's stats by year.
- GET
/api/v1/cs2/players/{playerIdOrSlug}/formThe most recent maps with kills, deaths, ADR, KAST and rating.
- GET
/api/v1/cs2/leaderboards/{metric}Top players by rating, ADR, KAST, K/D, kills or opening kills.
- GET
/api/v1/cs2/players/search?q={name}Find a player by nickname or real name.
Teams & rosters
Team profiles with the current roster, every past lineup, player moves between teams, and how each team plays each map.
- GET
/api/v1/cs2/teams/{teamIdOrSlug}Name, logo, country, region, world ranking and current roster.
- GET
/api/v1/cs2/teams/{teamIdOrSlug}/roster-historyEvery player who has played for the team, with start and end dates.
- GET
/api/v1/cs2/teams/{teamIdOrSlug}/map-statsPer-map win rate, rounds and pick/ban tendencies.
- GET
/api/v1/cs2/teams/{teamIdOrSlug}/vs/{opponentIdOrSlug}Record and past matches between two teams.
- GET
/api/v1/cs2/roster-changes/recentPlayers joining and leaving teams, newest first.
- GET
/api/v1/cs2/transfers/recentPlayer moves between teams, newest first.
Rankings
The world team ranking and the Valve Regional Standings, with points and movement, plus one table per region.
- GET
/api/v1/cs2/rankings/worldThe latest world team ranking.
- GET
/api/v1/cs2/rankings/vrsThe latest Valve Regional Standings (VRS).
- GET
/api/v1/cs2/rankings/region/{region}One region, with each team's world and regional rank.
- GET
/api/v1/cs2/rankingsOne row per team, with points and change since the previous ranking.
Skin prices
The current price of a skin on each marketplace, its daily price history, sell listings across markets, and the week's biggest movers.
- GET
/api/v1/cs2/skins?q={name}Search skins by name, weapon, rarity or price range.
- GET
/api/v1/cs2/skins/{skinIdOrSlug}/pricesThe current price on each marketplace, cheapest first, with offer counts.
- GET
/api/v1/cs2/skins/{skinIdOrSlug}/historyDaily cheapest price across marketplaces, years back on long-listed skins.
- GET
/api/v1/cs2/skins/{skinIdOrSlug}/order-bookSell listings per marketplace with counts, and the lowest ask.
- GET
/api/v1/cs2/skins/trendingBiggest gainers and losers over 1 day to 1 year, with sparklines.
- GET
/api/v1/cs2/skins/{skinIdOrSlug}One skin: weapon, rarity, collection, image and price summary.
Tournaments
Tournaments with dates, prize pool, tier and format, plus every match, the standings and the bracket.
- GET
/api/v1/cs2/events/liveTournaments being played now.
- GET
/api/v1/cs2/events/{eventIdOrSlug}Dates, location, prize pool, tier, teams and format.
- GET
/api/v1/cs2/events/{eventIdOrSlug}/matchesEvery match of the tournament.
- GET
/api/v1/cs2/events/{eventIdOrSlug}/standingsTeams with seed, final placement and prize.
- GET
/api/v1/cs2/events/{eventIdOrSlug}/bracketBracket, groups, play-in and Swiss, each slot with teams, scores and winner.
FAQs
Depth, plans, exports and backtesting
Can't find what you're looking for? Contact our customer support team
More for CS2 models
The pages model builders read next.
- CS2 APILive scores, results, player stats, rankings, and skin prices in one API.
- CS2 betting APIOdds, form, map stats and history for betting models.
- CS2 odds APIMatch and map winner odds with full price history.
- CS2 player props APIKills and headshot lines with their full line history.
- CS2 player stats APIKills, deaths, and rating per map, plus ADR and KAST.
- CS2 rankings APIThe world ranking and Valve Regional Standings.
- Cito vs PandaScore vs GRIDThe three CS2 data APIs side by side, with prices.
- CS2 API docsEvery endpoint, its parameters, and a real response.
Train match models
Pull a month on a free key, then open the full archive on Pro.