Introduction

Counter-Strike 2 odds, match data, and player stats — one REST + WebSocket API.

The EsportsOdds API gives you a derived market odds line, match data, and player stats for Counter-Strike 2 through a single, versioned REST API plus a WebSocket channel for update notifications. It's built for esports media, stats and developer tools, individual bettors and traders, and fantasy/prediction platforms.

Every response is plain JSON over HTTPS. Odds are decimal and carry an explicit source: eo_market is our de-vigged market line, combined from multiple bookmakers and exchanges — never any single book's price, and never naming the contributing books. Our own modeled line (eo_model) joins it once it clears validation. See the methodology note below.

Everything here is live

This documentation previously flagged some fields and parameters as intended-but-not-yet-shipped. That reconciliation finished on 2026-07-26 and nothing is flagged any more — if it's described here, it works. Two exceptions are called out explicitly where they appear: the model odds line isn't served until it clears its accuracy gate, and logo_url is deliberately always empty.

Base URL

https://api.esportsodds.gg

All endpoints are versioned and game-namespaced as /v1/{game}/{resource}. CS2 is the only game populated today (cs2), but the path shape is game-agnostic by construction — a second title would extend it as /v1/{game}/... without breaking existing paths.

Your first request

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.esportsodds.gg/v1/cs2/matches?status=live"
{
  "data": [
    {
      "id": "018f...e2a1",
      "game_id": "018f...0001",
      "tournament_id": "018f...7c3d",
      "team_a_id": "018f...aa10",
      "team_b_id": "018f...bb20",
      "format": "bo3",
      "status": "live",
      "stage": "Playoffs",
      "scheduled_at": "2026-07-01T18:00:00Z",
      "score_a": 1,
      "score_b": 0,
      "winner_team_id": null
    }
  ],
  "meta": {
    "count": 1,
    "next_cursor": null
  }
}

JSON field names are snake_case (id, team_a_id, scheduled_at) — exactly as documented in the OpenAPI reference. That's deliberate and stable; code against it exactly.

Every list endpoint responds with this {data, meta} envelope: data is the page of results, meta.count its size, and meta.next_cursor an opaque cursor for the next page — pass it back as ?cursor= to paginate; it's null on the final page. Single resources (/v1/cs2/matches/{id}, teams, players, tournaments) wrap the one object the same way: {"data": {...}}.

What's here

The full, interactive endpoint reference — generated directly from the API's OpenAPI spec, with a "try it" panel per endpoint — is in the sidebar, grouped by resource.

Machine-readable

  • OpenAPI specification — the complete contract: every endpoint, parameter, schema and a real response example. Point your client generator at it.
  • llms.txt and llms-full.txt — this documentation for coding agents. Any guide is also available as markdown by swapping /docs/ for /md/ in its URL.

Worked tutorials and background explainers live on the main site:

  • Guides — build a Discord score bot, a live dashboard, fantasy projections, and more.
  • Learn — the concepts behind the data: de-vigging, implied probability, ADR, KAST, map win rates.
  • Glossary — short definitions of the CS2 and odds terms used throughout these docs.

Odds methodology, briefly

This API serves exactly two odds lines, both derived, both explicit in the source field:

  • eo_market — live today. A de-vigged aggregate: we monitor prices across multiple bookmakers and exchanges, remove each book's margin, take the median fair probability, and re-normalize. Published only when at least two books contribute; each line carries a book_count. We never republish a single book's price and never name a contributing book.
  • eo_model — coming soon. Our own proprietary modeled line, gated behind an accuracy-validation step; it appears here once validation clears, with its track record (calibration + Brier score) published alongside.

Full detail on the methodology page.

On this page