Esports Odds API: CS2, LoL & Dota 2 Betting Data from 350+ Bookmakers
Why Most Esports APIs Fall Short
If you’ve tried to build anything with esports odds data, you already know the problem. The enterprise providers (Sportradar, PandaScore, Abios) charge $2,000-$10,000/month and lock you into annual contracts. The generic sports APIs cover 5-10 bookmakers for esports, maybe Bet365 and a few soft books. Neither option gives you what actually matters: sharp bookmaker odds from Pinnacle alongside the crypto and offshore books that price tier-2 esports, all in one feed.
OddsPapi fills that gap. 350+ bookmakers, including sharp books (Pinnacle, Singbet), crypto and offshore books (Stake, Duelbits, 1xBet, Roobet) and prediction markets (Polymarket, Kalshi), all through one REST API with a free tier. No enterprise sales call. No scraping. JSON in, odds out.
This guide covers everything: what’s covered, how to fetch it, and how it compares to every alternative.
Esports Odds Feed: What’s Covered
OddsPapi treats each esports title as its own sport, with dedicated sport IDs, tournament structures, and market types. Here’s the coverage breakdown:
| Game | Sport ID | Example Tournaments | Markets |
|---|---|---|---|
| Counter-Strike 2 | 17 | PGL Major, ESL Pro League, BLAST Premier, IEM | Match Winner, Map Winner, Map Handicap, Total Maps, Correct Score |
| League of Legends | 18 | Worlds, LEC, LCS, LCK, LPL, CBLOL | Match Winner, Map Winner, Map Handicap, Total Maps |
| Dota 2 | 16 | The International, DreamLeague, ESL One, DPC | Match Winner, Map Winner, Map Handicap, Total Maps |
| Valorant | 61 | VCT Champions Tour, Game Changers, EMEA Clash | Match Winner, Map Winner, Map Handicap |
| Call of Duty | 56 | CDL Major, Call of Duty League | Match Winner, Map Markets |
| Rocket League | 59 | RLCS, Rocket League Championship Series | Match Winner, Map Markets |
Key Bookmakers for Esports
The bookmakers that matter for esports aren’t the same ones that matter for NFL or Premier League. Here’s who you get through OddsPapi:
| Bookmaker | Type | Why It Matters |
|---|---|---|
| Pinnacle | Sharp | The benchmark line for esports. Priced all 8 Blast Premier fixtures on 24 August 2026, at a 4.52% median Winner margin. |
| Polymarket | Prediction Market | Tightest Winner margin on the board at 0.99%, first of 84 ranked books. On all 8 fixtures. |
| Bet365 | Soft Global | Largest soft book. On all 8, plus its .ar, .br, .de, .es, .fr, .gr, .it and .nl slugs. |
| Stake | Crypto | Major CS2 sponsor. Priced all 8 fixtures. |
| Duelbits | Crypto | Priced all 8 fixtures. Dedupe against the other crypto slugs before averaging. |
| 1xBet | Crypto/Global | Covers tier-2 and tier-3 tournaments most books ignore. On 7 of 8, at a 4.15% median margin. |
| Betfair Exchange | Exchange | Exchange prices rather than a book line. On all 8 fixtures. |
The bench behind those is crypto and offshore. On the same 24 August 2026 Blast Premier board, 22Bet, BC.Game, BetFury, Duel, Gamdom, MegaDice, MyStake, Rainbet, Roobet, Stake.bet.br and Vave each priced 7 of the 8 fixtures, with Cloudbet on 4.
REST API vs WebSocket
OddsPapi offers two ways to consume esports odds data:
| Method | Use Case | Update Speed | Tier |
|---|---|---|---|
| REST API | Pre-match analysis, line shopping, model building | Seconds (poll-based) | Free |
| WebSocket | Live betting bots, real-time dashboards, arb detection | Sub-second (push-based) | Paid |
For pre-match esports data, the REST API on the free tier is all you need. If you’re building something that reacts to live odds movements during a CS2 match, the WebSocket feed on the paid tier pushes updates as they happen — no polling delay.
Esports Betting API Comparison (2026)
Here’s how OddsPapi stacks up against the alternatives for esports odds data specifically:
| Feature | OddsPapi | PandaScore | Abios | The Odds API |
|---|---|---|---|---|
| Esports Bookmakers | median 86 per fixture (Blast Premier, Aug 2026) | N/A (stats only) | N/A (stats only) | 5-10 |
| Total Bookmakers | 350+ | 0 (no odds) | 0 (no odds) | ~40 |
| Sharp Books (Pinnacle) | Yes | No | No | Yes |
| Games Covered (Odds) | 6+ titles | 20+ (stats only) | 30+ (stats only) | 4-5 |
| Match Stats/Scores | No | Yes (deep) | Yes (deep) | No |
| Historical Odds | Free tier | N/A | N/A | Paid only |
| WebSocket | paid tier | Yes | Yes | No |
| Free Tier | Yes (350+ books) | No | No | Yes (~40 books) |
| Price | Free / Custom | $2,000+/mo | Enterprise | Free – $199/mo |
The honest take: If you need match stats, player performance data, or in-game events (kills, objectives, round scores), PandaScore and Abios are built for that, but they don’t provide odds data. If you need odds from multiple bookmakers to build line shopping tools, arb scanners, or predictive models, OddsPapi gives you a sharp book, two prediction markets and a deep crypto and offshore bench on a free tier.
Supported Esports Games & Tournaments
Counter-Strike 2 (Sport ID: 17)
CS2 has the deepest esports odds coverage across bookmakers. Sampled on 24 August 2026, all 8 Blast Premier Series fixtures on the board carried a median of 86 bookmakers each (min 29, max 89), with 92 distinct bookmakers across the 8 fixtures. Pinnacle, Bet365 and Polymarket priced all 8 of them. Dedupe before you average: 589 slug-quotes collapse to 247 independent prices, a 58.1% collapse. Minor circuits run thinner, at a median of 24.5 books per fixture (12 to 58).
Tournaments with odds coverage: PGL Majors, ESL Pro League, BLAST Premier, IEM Katowice/Cologne, ESL Challenger League (regional), CCT Series, NODWIN Clutch Series
Coverage follows the circuit calendar, not the sport. On 24 August 2026 only 5 of the 336 CS2 tournament rows carried future fixtures: Blast Premier Series (8), United21 (2), CCT South America Series (2), NODWIN Clutch Series (1) and Fiesta Series (1). The ESL Pro League, Intel Extreme Masters, PGL Major and DreamHack rows all reported zero that day. Check futureFixtures before you poll (see below).
Market depth: Match Winner (171), Map Winner (per map), Maps Handicap, Total Maps Over/Under, Correct Score
League of Legends (Sport ID: 18)
LoL coverage spans all major regional leagues and international events.
Tournaments with odds coverage: Worlds, LEC (Europe), LCS (North America), LCK (Korea), LPL (China), CBLOL (Brazil), LJL (Japan), Prime League Pro Division
Typical coverage: on 24 August 2026 the 10-day board carried 42 League of Legends fixtures with odds, at a median of 47.5 bookmakers per fixture (min 4, max 88) and 101 distinct bookmakers across the sample. The LCK fixture drew 87 books and Prime League 88. Dedupe collapse was 54.5%.
Dota 2 (Sport ID: 16)
Dota 2 coverage focuses on the DPC circuit and major LANs.
Tournaments with odds coverage: The International, DreamLeague, ESL One, DPC Regional Leagues, BetBoom Dacha
Esports boards are tournament driven, so a title with no live circuit reads as uncovered. On 24 August 2026 Dota 2 returned 2 fixtures, 1 of them with odds, priced by 16 bookmakers in a single tournament (EPL Masters). That is an off-season reading rather than a coverage gap, but it is what your parser sees on a quiet week. Check futureFixtures on /tournaments before you judge a title.
Valorant (Sport ID: 61)
Valorant coverage has grown rapidly since VCT franchising.
Tournaments with odds coverage: VCT Champions Tour, VCT Game Changers, EMEA Clash, Americas League, Pacific League
Call of Duty (Sport ID: 56) & Rocket League (Sport ID: 59)
Coverage for CoD and Rocket League is available for major events — CDL Majors for Call of Duty, RLCS for Rocket League. Market depth is narrower (primarily Match Winner), but Pinnacle and other sharp books do price these events.
Sport ID Reference
| Game | Sport ID | API Slug |
|---|---|---|
| Dota 2 | 16 | esport-dota |
| Counter-Strike 2 | 17 | esport-counter-strike |
| League of Legends | 18 | esport-league-of-legends |
| Call of Duty | 56 | esport-call-of-duty |
| Rocket League | 59 | esport-rocket-league |
| Valorant | 61 | esport-valorant |
Check a Tournament Is Live Before You Poll
Esports tournament lists are long and mostly dormant. CS2 carries 336 tournament rows and on 24 August 2026 only 5 of them had a future fixture. /tournaments returns a futureFixtures count per row, so one call tells you what is actually on the board before you spend requests on it:
# Which CS2 tournaments actually have fixtures on the board?
tournaments = requests.get(f"{BASE}/tournaments", params={
"apiKey": API_KEY,
"sportId": 17 # CS2
}).json()
live = [t for t in tournaments if t.get("futureFixtures", 0) > 0]
print(f"{len(live)} of {len(tournaments)} CS2 tournaments have future fixtures\n")
for t in sorted(live, key=lambda t: -t["futureFixtures"]):
print(f"{t['futureFixtures']:>3} {t['tournamentName']}")
# Output (24 August 2026):
# 5 of 336 CS2 tournaments have future fixtures
#
# 8 Blast Premier Series
# 2 United21
# 2 CCT South America Series
# 1 NODWIN Clutch Series
# 1 Fiesta Series
Run this before assuming a named event is live. Between events the row still exists and still returns zero fixtures.
Esports Markets & Odds Types
Esports markets follow a different structure than traditional sports. The core unit is a map (or game/round depending on the title), not a half or quarter. The one market every esports book prices is Match Winner:
| Market | Market ID | Outcomes |
|---|---|---|
| Match Winner | 171 |
171 (Team 1), 172 (Team 2) |
Beyond Match Winner, esports books price map-level markets: Map Winner (First/Second/Third Map Winner), Maps Handicap, Total Maps Over/Under, and Correct Score. Each of these spans many market IDs — one per line and period — so don’t hardcode them. Pull the live catalog and build your own lookup instead:
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://api.oddspapi.io/v4"
# Build a {marketId: marketName} lookup for CS2 (sportId 17)
catalog = requests.get(f"{BASE}/markets", params={"apiKey": API_KEY, "sportId": 17}).json()
market_names = {m["marketId"]: m["marketName"] for m in catalog}
# List every Maps Handicap / Total Maps / Correct Score line on offer
for m in catalog:
if m["marketName"] in ("Total Maps Over Under", "Maps Handicap", "Correct Score"):
print(m["marketId"], m["marketName"], "| handicap:", m.get("handicap"))
Note: Market availability varies by bookmaker and tournament tier. The 24 August 2026 Blast Premier fixtures carried 26 distinct market IDs each, except Team Vitality v IC eSports, which carried 9. Smaller bookmakers may only price the Match Winner (171) market.
Python Tutorial: Fetch Esports Odds in 5 Minutes
Everything below uses the free tier. No credit card required.
Step 1: Get Your API Key
Sign up at oddspapi.io and grab your API key from the dashboard. Authentication is via query parameter — no headers, no OAuth.
Step 2: Discover Esports Sports
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://api.oddspapi.io/v4"
# List all sports — filter for esports
response = requests.get(f"{BASE}/sports", params={"apiKey": API_KEY})
sports = response.json()
esports = [s for s in sports if s["slug"].startswith("esport")]
for s in esports:
print(f"{s['sportId']:>3} {s['sportName']}")
# Output:
# 16 ESport Dota
# 17 ESport Counter-Strike
# 18 ESport League of Legends
# 56 ESport Call of Duty
# 57 ESport Overwatch
# 58 ESport Rainbow Six
# 59 ESport Rocket League
# 60 ESport StarCraft
# 61 ESport Valorant
# 62 ESport Arena of Valor
# 63 ESport King of Glory
# 65 ESport Honor of Kings
Step 3: Find CS2 Matches with Odds
# Fetch CS2 fixtures for the next 7 days
from datetime import datetime, timedelta
today = datetime.now().strftime("%Y-%m-%d")
week_out = (datetime.now() + timedelta(days=7)).strftime("%Y-%m-%d")
response = requests.get(f"{BASE}/fixtures", params={
"apiKey": API_KEY,
"sportId": 17, # CS2
"from": today,
"to": week_out,
"hasOdds": "true" # Only fixtures with odds
})
fixtures = response.json()
print(f"CS2 fixtures with odds: {len(fixtures)}\n")
for f in fixtures[:5]:
print(f"{f['participant1Name']} vs {f['participant2Name']}")
print(f" Tournament: {f['tournamentName']}")
print(f" Fixture ID: {f['fixtureId']}")
print(f" Start: {f['startTime']}\n")
Step 4: Compare Odds Across Bookmakers
# Get odds for a specific fixture
fixture_id = fixtures[0]["fixtureId"]
response = requests.get(f"{BASE}/odds", params={
"apiKey": API_KEY,
"fixtureId": fixture_id
})
data = response.json()
print(f"{data.get('participant1Name', 'Team 1')} vs {data.get('participant2Name', 'Team 2')}\n")
print(f"{'Bookmaker':<20} {'Team 1':>8} {'Team 2':>8}")
print("-" * 38)
for slug, bk_data in data["bookmakerOdds"].items():
markets = bk_data.get("markets", {})
if "171" in markets: # Match Winner market
outcomes = markets["171"]["outcomes"]
p1 = outcomes.get("171", {}).get("players", {}).get("0", {}).get("price", "—")
p2 = outcomes.get("172", {}).get("players", {}).get("0", {}).get("price", "—")
print(f"{slug:<20} {p1:>8} {p2:>8}")
This prints something like:
Natus Vincere vs M80
Bookmaker Team 1 Team 2
--------------------------------------
pinnacle 1.189 4.89
polymarket 1.235 5.0
bet365 1.167 4.5
stake 1.17 4.4
duelbits 1.2 4.2
1xbet 1.21 4.665
betfair-ex 1.21 4.8
paddypower 1.17 4.5
roobet 1.19 4.9
bcgame 1.18 4.6
(first 10 of 87 books on this fixture, BLAST Premier, 24 Aug 2026)
Step 5: Fetch Odds for Multiple Esports
# Scan all esports titles for upcoming matches
ESPORTS = {
16: "Dota 2",
17: "CS2",
18: "League of Legends",
61: "Valorant",
}
import time
for sport_id, name in ESPORTS.items():
response = requests.get(f"{BASE}/fixtures", params={
"apiKey": API_KEY,
"sportId": sport_id,
"from": today,
"to": week_out,
"hasOdds": "true"
})
fixtures = response.json()
print(f"{name}: {len(fixtures)} fixtures with odds")
time.sleep(2) # Respect rate limits
# Output (10-day sample, 24 August 2026. Counts move with the tournament calendar):
# Dota 2: 1 fixtures with odds
# CS2: 8 fixtures with odds on Blast Premier Series, plus minor circuits
# League of Legends: 42 fixtures with odds
# Valorant: 11 fixtures with odds
Historical Esports Odds: Free Backtesting Data
Most APIs charge extra for historical data. OddsPapi includes it on the free tier — every odds movement, timestamped, for every bookmaker that priced the match.
This is the data you need to backtest esports betting models: Did Pinnacle’s opening line predict the winner? How much did odds move after map vetoes? Where did the value sit before the market corrected?
# Fetch historical odds for a CS2 match
fixture_id = "id1704591169167084" # PGL Major match
response = requests.get(f"{BASE}/historical-odds", params={
"apiKey": API_KEY,
"fixtureId": fixture_id,
"bookmakers": "pinnacle" # Up to 3 bookmakers per request
})
data = response.json()
# Historical odds are timestamped arrays
pinnacle = data["bookmakers"]["pinnacle"]["markets"]["171"]
team1_history = pinnacle["outcomes"]["171"]["players"]["0"]
print(f"Pinnacle odds history ({len(team1_history)} snapshots):\n")
for snap in team1_history[:5]:
print(f" {snap['createdAt'][:19]} → {snap['price']}")
Output:
Pinnacle odds history (7 snapshots):
2026-02-22T04:18:46 → 1.303
2026-02-22T04:18:41 → 1.307
2026-02-22T04:17:52 → 1.3
2026-02-22T04:17:52 → 1.317
2026-02-22T04:17:51 → 1.308
You get the full line movement history — from opening price to kickoff — for free. Compare this to The Odds API, where historical data requires a paid plan, or PandaScore, which doesn’t provide odds data at all.
Esports Odds API FAQ
Is the esports odds API free?
Yes. OddsPapi’s free tier includes odds from 350+ bookmakers across all esports titles — CS2, League of Legends, Dota 2, Valorant, Call of Duty, and Rocket League. Historical odds data is also included for free.
Which esports titles are covered?
Counter-Strike 2 (CS2), League of Legends, Dota 2, Valorant, Call of Duty, Rocket League, Overwatch, Rainbow Six, StarCraft, Arena of Valor, King of Glory, and Honor of Kings. Each title has its own sport ID and tournament structure.
Does the API include Pinnacle esports odds?
Yes. Pinnacle priced all 8 Blast Premier Series fixtures on the board on 24 August 2026, at a 4.52% median Winner margin, 7th of 84 ranked books. It sits alongside Bet365, Betfair Exchange, Polymarket and a deep bench of crypto and offshore books including Stake, Duelbits, 1xBet and Roobet. Pinnacle is the industry benchmark for sharp esports pricing.
What’s the difference between an esports odds feed and an API?
An odds feed is a real-time push-based stream (WebSocket) that delivers updates as they happen. An API is request-response — you poll for data. OddsPapi provides both: a REST API (free tier) and a WebSocket feed (paid tier).
How fast are esports odds updates?
REST API: seconds. WebSocket feed: sub-second. For pre-match line shopping and model building, REST is sufficient. For live betting automation during a CS2 match, use the WebSocket feed.
Can I get BLAST Premier or IEM odds through the API?
Yes, when the event is on. Esports boards are tournament driven: on 24 August 2026 Blast Premier Series was the only CS2 major with future fixtures, and all 8 of its matches carried a median of 86 bookmakers each. ESL Pro League, IEM, PGL Major and the DreamHack rows reported zero future fixtures that day. Use sportId=17, check futureFixtures on /tournaments before you poll, then filter fixtures by tournament.
Start Building
350+ bookmakers. CS2, LoL, Dota 2, Valorant, and more. Historical odds included. Free forever on the starter tier.
Stop scraping. Stop paying enterprise rates for esports data you can get in 5 minutes.