HLTV has no official API. This is the CS2 API you build on.

27,000+ pro Counter-Strike matches (20,000+ on CS2), player and team stats and one market odds line, behind one REST and WebSocket API.

A sandbox key reads a fixed sample of past matches, no card. Plans from $99 a month.

GET /v1/cs2/matches?status=completed200 OK
$ curl -H "Authorization: Bearer $ESPORTSODDS_API_KEY" \
    "api.esportsodds.gg/v1/cs2/matches?status=completed"

{"data": [{
  "tournament_name": "ESL Pro League Season 24",
  "team_a_name": "Vitality",
  "team_b_name": "MOUZ",
  "format": "bo5",
  "status": "completed",
  "score_a": 3,
  "score_b": 0
}, …]}

What the CS2 API covers

One snake_case schema with stable IDs, so a team is the same team across tournaments, rosters and seasons.

Share of completed matches with each layer of data
From the map veto to the last clutchShare, as squaresShare of matches
Fixtures and results Effectively complete~100%
Map scores Completed matches with a played map91%
Player stats K/A/D, ADR, KAST, clutches, multi-kills86%
Round economy and duels Deepest on top-tier eventsVaries
One square is 5% of completed matches. A gap is shown as a gap, never filled in.
Players
5,600+
Teams
1,800+
Tournaments
1,100+

History back to 2020, on every paid plan.

Why build on this CS2 API

Official feeds are enterprise only

Built for operators: sales calls, annual contracts and four- to five-figure minimums.

One set of terms

Both paid plans cover every endpoint, the market line included, on the same terms.

Odds APIs skip the match data

A price has no rosters, stats or history. We publish both, in one schema.

CS2 API endpoints

Every endpoint is on both paid plans. Cadence is how often we refresh it.

The CS2 API endpoints, what each returns and how often it is refreshed
MethodPathReturnsCadence
Matches
GET/v1/cs2/matchesLive, scheduled and finished; filter by status, team or event≤90s
GET/v1/cs2/matches/{id}/statsPer-player K/A/D, ADR and KAST for one match≤90s
GET/v1/cs2/matches/bulkUp to 25 matches a request, everything embedded, plus a changed_since feed≤90s
GET/v1/cs2/matches/{id}/lineupsPre-match line-ups, recorded from July 2026≤90s
GET/v1/cs2/matches/{id}/streamsWhere a match in progress is broadcast≤5 min
Teams, players and events
GET/v1/cs2/teams/{id}/h2hHead-to-head record and recent formDaily
GET/v1/cs2/players/{id}/statsCareer stat aggregates for a playerDaily
GET/v1/cs2/tournamentsEvents, tiers, prize pools and standingsDaily
GET/v1/cs2/rankingsOur own team and player rankingsDaily
Odds and the stream
GET/v1/cs2/oddsThe market odds line (eo_market), append-only history≤90s
POST/v1/cs2/ws-tokenA short-lived ticket for the WebSocket streamStream

Plain REST with Bearer auth, so any language works. Prefer a client library? The official Python client is MIT licensed and handles paging, retries and typed errors. It also includes an MCP server, so Claude, Cursor and other AI assistants can query the API. The rankings endpoint powers our public CS2 team rankings.

pip install esportsoddsThe OpenAPI reference

CS2 API FAQ

What CS2 data does the API cover?

Fixtures, live scores and results; per-map scores and vetoes; per-player match stats (K/A/D, ADR, KAST, clutches, multi-kills) on most matches; per-round team economy and duels; teams, players and tournaments with head-to-head and recent form; and our own team and player rankings. That is 27,000+ professional Counter-Strike matches, 20,000+ of them on CS2, back to 2020.

Is there an official HLTV or Valve API?

No. Counter-Strike has no official public match-data API, and community scrapers get IP-blocked. EsportsOdds is a self-serve, documented alternative: normalized JSON, a versioned schema and one Bearer token.

How fresh is the CS2 data?

Matches and the market line are polled on a ≤90s cadence; teams, players, tournaments and rankings rebuild daily. Rather than poll us, mint a WebSocket ticket and we push you the row when it changes in our feed. Every line row carries the age of its inputs (input_oldest_at), and lines from after the start of a match are kept and flagged in_play. This is a polled feed, not a real-time one.

Does the CS2 API include odds?

Yes: one market odds line on currently active matches. Our own model line is coming soon, once it clears validation.

Where does the data come from?

It is normalized into one consistent schema from public competitive-match records. We never expose per-book prices or any single upstream's raw feed. See our methodology.

Is the CS2 API free?

Not for current data. Plans start at $99/mo for 50,000 requests, with every endpoint on this page included. To see the shapes first, a free sandbox key reads a fixed sample of past matches, and the demo runs against the real API with no signup. No account at all? The shared public sample key reads the same sample, within daily limits.

CS2 API pricing

Every endpoint on this page, on both plans. No sales call.

  • Standard

    Every endpoint and the WebSocket

    $99a month, or $990 a year

    50,000 requests a month

    Choose Standard
  • Pro

    Plus unlimited bulk export and a public display licence

    $299a month, or $2,990 a year

    150,000 requests a month

    Choose Pro

One square is 10,000 requests. Not ready to pay? Start free with a sandbox key: a fixed sample of past matches, no card. Full pricing

The CS2 dataset you were searching for

Matches, stats, tournaments and a market line: one key, one schema. Or start free with a sandbox key: a fixed sample of past matches, no card.