Sandbox key
A free key that reads a fixed sample of past CS2 matches, so you can build against real responses before you subscribe.
A sandbox key is a free API key for trying the API. It reads a fixed sample of past matches with the same endpoints and response shapes as a paid key, so the code you write against it works unchanged when you subscribe. No card is needed, and nothing is ever charged for it.
It is not a trial of a paid plan: it never turns into a subscription. Current and full data come with a paid plan.
Get one
Sign up at esportsodds.gg, accept the Terms, and click Create sandbox key in the
dashboard. It shows the key with a first call in curl and Python to copy. Copy the key when it appears: it is shown once. Keys start with
eo_sandbox_. There is one per account. Lost it? Email support@esportsodds.gg for a new one.
export ESPORTSODDS_API_KEY="eo_sandbox_..."
curl -H "Authorization: Bearer $ESPORTSODDS_API_KEY" \
"https://api.esportsodds.gg/v1/cs2/matches?tournament=019f23d2-5a32-71d0-ac4b-dfc7eb5dd3f0&limit=5"The Python client reads the same ESPORTSODDS_API_KEY.
What it reads
The sample is every completed match of two events, about a hundred matches in all:
| Event | Tournament id |
|---|---|
| Esports World Cup 2026 | 019f23d2-5a32-71d0-ac4b-dfc7eb5dd3f0 |
| CCT Europe 2026 Series 7 | 019ff0f2-3b3e-75ec-b89e-a9fefaeee00a |
One event is top tier and one is lower tier, so you see what a full match looks like and what a thinner one looks like. We may change the sample; the events above are the current one.
A sandbox key can call:
| Endpoint | Inside the sample when |
|---|---|
GET /v1/cs2/matches | ?tournament= is a sample event |
GET /v1/cs2/matches/{id} and its /maps, /stats, /vetoes, /rounds, /history, /depth, /lineups, /streams | the match is in the sample |
GET /v1/cs2/tournaments/{id} and /tournaments/{id}/teams | the id is a sample event |
GET /v1/cs2/odds | ?match= is a sample match |
GET /v1/cs2/coverage, GET /v1/cs2/model/metrics | always |
Follow any match from that list into its sub-resources:
curl -H "Authorization: Bearer $ESPORTSODDS_API_KEY" \
"https://api.esportsodds.gg/v1/cs2/matches/MATCH_ID/stats"Limits
- 2,000 requests in total, for the life of the key. It does not reset.
X-Quota-LimitandX-Quota-Remainingon each counted response show where you are. - 5 requests per second, with a burst of 20 (
X-RateLimit-*headers, as on any key). - No WebSocket:
POST /v1/cs2/ws-tokenanswers403 sandbox_scope. - Once the 2,000 are used, every call answers
429 sandbox_quota_exceeded, inside the sample or not.
Errors you will only see on a sandbox key
| Status | Code | Meaning | What to do |
|---|---|---|---|
403 | sandbox_scope | The request is outside the sample (another event, a current match, a team or player route). Not counted against your 2,000. The message names the sample's events and a call that works, /v1/cs2/matches?tournament=<id>. | Ask for something inside the sample, or subscribe for current data from your dashboard. |
429 | sandbox_quota_exceeded | All 2,000 requests are used. There is no Retry-After: the allowance does not come back. | Subscribe for a monthly allowance from your dashboard. |
Every other error behaves as on a paid key: see Errors.
Moving to a paid key
When you subscribe, create a paid key in the dashboard and swap it in for ESPORTSODDS_API_KEY. Paths, parameters and response
shapes do not change; the only difference is that every match, event, team and player is in reach.