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.

Pre-release

This API is in pre-release. Endpoints and fields marked (TARGET) in the reference are the intended contract but aren't live yet, and response shapes may still change before the stable v1 release. Anything not marked (TARGET) is live today.

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 under the API reference.

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