Skip to main content
Esports betting is one of the fastest-growing verticals in the industry, and the hardest part for most teams is the data layer: live odds across enough bookmakers, fast enough to be useful, for the titles your users actually care about. This guide walks through building an esports betting app on top of a real-time Esports Odds API.

1. Pick your titles

Start with the titles that drive volume. The big four for betting are CS2, Valorant, League of Legends and Dota 2, followed by Rainbow Six, Rocket League, Mobile Legends and Call of Duty. The Odds-API.io platform covers 15 titles and 550+ upcoming matches, so you can launch with a few and expand without changing your integration.

2. List upcoming matches

Every esports event lives under the esports sport. List upcoming matches with a single call:
curl "https://api.odds-api.io/v3/events?sport=esports&apiKey=YOUR_KEY"
Each event returns an id, the two competitors (home/away), the league, and its status. Store the id, you’ll use it to fetch odds and to subscribe to live updates.

3. Fetch odds across bookmakers

Pull odds for an event from the books you want to display or compare:
curl "https://api.odds-api.io/v3/odds?eventId=58231904&\
bookmakers=Bet365,GG.BET,Thunderpick&apiKey=YOUR_KEY"
For esports you’ll want more than match winner. Map handicaps, total maps, correct map score, per-map winners, first blood and round handicaps are the bread and butter, see the per-title pages for the exact market list each game supports.

4. Stream live scores and status over WebSocket

The feature that makes a betting app feel live is real-time scores. Subscribe to the odds, scores and status channels on one WebSocket connection:
const ws = new WebSocket(
  "wss://api.odds-api.io/v3/ws?apiKey=YOUR_KEY&channels=odds,scores,status"
);

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "score") updateScoreboard(msg.id, msg.scores);
  if (msg.type === "status") handleStatusChange(msg.id, msg.status);
};
Heads up: channels is an allowlist, you only receive what you list. Keep odds in there to keep receiving odds.
Scores update in roughly one second, and the status channel tells you the moment a match is added, goes live, settles (with final score) or is cancelled, exactly the events you need to open and close markets in your UI.

5. Handle map/period data correctly

Esports scores are reported per period. Period keys are p1, p2, … for live periods, ft for full-time, ot for overtime and ap for any decider (formerly fulltime/overtime, update your parser if you stored the old keys).

6. Settle and store

When a status: settled message arrives it includes the final score, so you can settle bets immediately. Settled events also stay queryable via /v3/events?status=settled for 24 hours, and land in /v3/historical/events straight away.

Ship it

That’s the whole loop: list events → fetch odds → stream scores/status → settle. Grab a free key and start with the Esports Odds API, no credit card required, 5,000 requests/hour on the free tier.