What's in the data
An honest inventory of what exists, what's thin, and what isn't there at all.
Before you design around this API, here's what it actually contains.
Ask the API itself
/v1/{game}/coverage is the authoritative answer, and it's deliberately unflattering:
curl -H "Authorization: Bearer $ESPORTSODDS_API_KEY" \
"https://api.esportsodds.gg/v1/cs2/coverage"Each row carries a status:
| Status | Meaning |
|---|---|
live | Available now |
pending_validation | Built, held back until it clears an accuracy bar |
schema_ready | The shape exists but isn't populated |
planned | Intended, not built |
licence_required | Blocked on rights, not engineering |
Read it before you build, not after.
The layers
Fixtures and results — teams, tournaments, schedule, format, scores, winners. The broadest and deepest layer.
Map results — per-map scores with half-by-half splits, and overtime where it happened.
Player stats — kills/assists/deaths, ADR and our own rating on every row; KAST, opening duels, trades, clutches, multi-kills and utility where the source carried them.
Round stats — two rows per round, one per team: economy, opening duels, trades, clutches, bomb events, utility. This is where genuine tactical analysis lives.
Player depth — weapons, grenades, hitgroups, killer/victim duels and flash pairs. The newest and least universal layer.
Odds — one de-vigged market line per outcome, as a time series, with movement fields and closing flags.
Derived — Glicko-2 ratings, leaderboards, team form, head-to-head, per-map records, playstyle profiles, roster history.
What's thin
Worth knowing before you filter on it:
roleon players: about 14% populated. Filtering by role excludes everyone whose role is unknown, which is most.seedon tournament participants: alwaysnull— no upstream we ingest publishes seeding.- Depth: check
data_available.depth; it's absent on plenty of matches. tieron tournaments: ~98% populated,SthroughC.
What isn't there
- Per-book odds. One aggregate line, never individual bookmaker prices or names.
- The model line. Empty until it clears its gate — check
/v1/cs2/model/metrics. - Team logos.
logo_urlis always empty; no redistribution rights. - Sub-second live ticks. The WebSocket pushes at ingestion cadence.
Known limitations has the full list.
Checking depth for yourself
Rather than trusting a figure in a doc that could go stale, count:
# How many completed matches have round-level data?
curl -H "Authorization: Bearer $ESPORTSODDS_API_KEY" \
"https://api.esportsodds.gg/v1/cs2/matches?status=completed&has=rounds&limit=1"?has= accepts any subset of maps,stats,vetoes,rounds,depth, so you can size the population that
actually supports your analysis before committing to it.