CS2 odds API
Counter-Strike 2 prices in one fixture shape, from match result to individual maps. Esports is included on every plan at no extra cost.
Use cs2 to request Counter-Strike 2 fixtures. Each fixture carries its tournament, with a best_of field when the series format is known and the books agree.
Request upcoming fixtures with /odds and in-play prices with /odds/live. Live odds follow your plan's in-play access. Availability varies by fixture and bookmaker.
curl -H "X-API-Key: $ODDSLINK_KEY" \
"https://oddslink.app/v1/sports/cs2/odds?tournament=example_cup&markets=h2h,maps_handicap,maps_total,rounds_handicap,rounds_total&periods=full,map1"import os, requests
r = requests.get(
"https://oddslink.app/v1/sports/cs2/odds",
params={"tournament": "example_cup", "markets": "h2h,maps_handicap,maps_total,rounds_handicap,rounds_total", "periods": "full,map1"},
headers={"X-API-Key": os.environ["ODDSLINK_KEY"]},
)
r.raise_for_status()
for game in r.json():
print(game["away_team"], "at", game["home_team"])[
{
"id": "cs2:exampleaway-examplehome:2026-10-28",
"sport_key": "cs2",
"sport_title": "CS2",
"commence_time": "2026-10-28T15:00:00.000Z",
"is_live": false,
"status": "scheduled",
"home_team": "Example Home",
"away_team": "Example Away",
"tournament": {
"key": "example_cup",
"title": "Example Cup"
},
"best_of": 3,
"bookmakers": [
{
"key": "example",
"title": "Example bookmaker",
"last_update": "2026-10-28T12:00:00.000Z",
"markets": [
{
"key": "h2h",
"last_update": "2026-10-28T12:00:00.000Z",
"outcomes": [
{
"name": "Example Away",
"price": -110
},
{
"name": "Example Home",
"price": -110
}
]
},
{
"key": "maps_handicap",
"last_update": "2026-10-28T12:00:00.000Z",
"outcomes": [
{
"name": "Example Away",
"price": -110,
"point": -1.5,
"main": true
},
{
"name": "Example Home",
"price": -110,
"point": 1.5,
"main": true
}
]
},
{
"key": "maps_total",
"last_update": "2026-10-28T12:00:00.000Z",
"outcomes": [
{
"name": "Over",
"price": -110,
"point": 2.5,
"main": true
},
{
"name": "Under",
"price": -110,
"point": 2.5,
"main": true
}
]
},
{
"key": "h2h",
"period": "map1",
"last_update": "2026-10-28T12:00:00.000Z",
"outcomes": [
{
"name": "Example Away",
"price": -110
},
{
"name": "Example Home",
"price": -110
}
]
},
{
"key": "rounds_handicap",
"period": "map1",
"last_update": "2026-10-28T12:00:00.000Z",
"outcomes": [
{
"name": "Example Away",
"price": -110,
"point": -2.5,
"main": true
},
{
"name": "Example Home",
"price": -110,
"point": 2.5,
"main": true
}
]
},
{
"key": "rounds_total",
"period": "map1",
"last_update": "2026-10-28T12:00:00.000Z",
"outcomes": [
{
"name": "Over",
"price": -110,
"point": 22.5,
"main": true
},
{
"name": "Under",
"price": -110,
"point": 22.5,
"main": true
}
]
}
]
}
],
"unmatched_bookmakers": []
}
]Illustrative CS2 request and response. Teams, tournament, bookmaker and prices are examples, not measured coverage.
More than the main line
Match and map results
Use h2h for two-way results. A BO2 result with a 1-1 Draw uses the separate h2h_3_way market.
Map-count lines
maps_handicap and maps_total say exactly what the line measures.
Per-map rounds
Select map1 through map5 separately from rounds_handicap and rounds_total.
One tournament
Read the fixture's tournament.key and pass it as tournament= to narrow your next request.
Markets
| Market | Periods |
|---|---|
| h2h: match or map result | Full match; map1 through map5 |
| h2h_3_way: BO2 result including Draw | Full match |
| maps_handicap: map-count handicap | Full match |
| maps_total: total maps | Full match |
| rounds_handicap: rounds handicap | map1 through map5 |
| rounds_total: total rounds | map1 through map5 |
Books for CS2
Book availability varies by fixture. See the esports guide for request examples.
Every book on every plan
| Plan | Per month | Requests a month | In-play | History |
|---|---|---|---|---|
| Free | $0 | 1,000 | No | No |
| Starter | $24 | 20,000 | No | No |
| Growth | $49 | 100,000 | Yes | No |
| Scale | $99 | 500,000 | Yes | 2 years |
| Business | $199 | 5,000,000 | Yes | All of it |
Questions
Does esports cost extra?
No. All four games are included on every plan. In-play access and history follow the plan's existing entitlements.
Is the series format always present?
No. best_of is present only when known and the books agree. An absent field does not mean zero.
Are player props included?
Player props are a later step. These markets cover teams, matches and maps.
How far back does history go?
Recording starts with esports coverage. Earlier prices are not backfilled; history access follows your plan.