Esports odds API · sport_id 11

Esports odds API: Pinnacle's CS2, Dota 2 and LoL lines.

In PinnRadar, esports is sport_id 11: CS2, Dota 2, League of Legends and the other titles Pinnacle prices, in play and before the match, in the same JSON layout as every other sport. This page covers what the feed has for esports, and what it does not.

Email only · no Pinnacle account · independent, not affiliated with Pinnacle

Sport id
11
Titles
CS2 · Dota 2 · LoL
Phases
Live + prematch
Live game state
Mostly absent

01 · Coverage

One sport id, every esports title.

PinnRadar's sport ids are stable integers, each mapped to one or more Pinnacle sports. 11 is Esports, which maps to Pinnacle's esports sport and holds CS2, Dota 2, LoL and more. Every title sits under that single id, so to split them, group events by the competition in league_name and league_id.

Each esports event uses the standard Event object. Prices live in periods: num_0 is the whole match, and further periods appear only when they are priced. Inside each period you find the usual market types, filled where Pinnacle offers them:

  • money_line: the match winner in decimal odds
  • spreads: handicap lines keyed by handicap, with a max stake
  • totals: over/under lines keyed by total
  • team_total and team_totals: per-side totals, when listed
shapean esports event, trimmed
{ "sport_id": 11, "last": ...,
  "events": [{
    "event_id": ..., "league_id": ...,
    "league_name": "<competition>",
    "home": "<team>", "away": "<team>",
    "starts": "<ISO time>", "event_type": "prematch",
    "periods": {
      "num_0": {
        "money_line": { "home": ..., "away": ... },
        "spreads": { "<hdp>": { "hdp", "home", "away", "max" } },
        "totals":  { "<points>": { "points", "over", "under", "max" } }
      }
    }
  }]
}

02 · Requests

Ask for sport_id 11, live or prematch.

Send the key as x-portal-apikey. Upcoming matches come from the prematch board, matches in play from the live board, in the same layout.

shellesports boards
# upcoming esports matches with every priced market
curl -sG https://pinnradar.com/kit/v1/prematch/fixtures \
  -H "x-portal-apikey: $PINNRADAR_KEY" -d sport_id=11

# esports matches in play right now
curl -sG https://pinnradar.com/kit/v1/markets \
  -H "x-portal-apikey: $PINNRADAR_KEY" \
  -d sport_id=11 -d event_type=live
websocketsubscribe message, /ws/feed add-on
{ "type": "subscribe", "streams": ["live", "prematch"], "sport_ids": [11] }
pythonprematch esports, grouped by competition
import os
from collections import defaultdict
import requests

BASE = "https://pinnradar.com"
s = requests.Session()
s.headers["x-portal-apikey"] = os.environ["PINNRADAR_KEY"]

r = s.get(BASE + "/kit/v1/prematch/fixtures",
          params={"sport_id": 11}, timeout=30)
r.raise_for_status()
print("feed:", r.headers.get("X-Data-Status"))   # fresh, stale, unknown

by_league = defaultdict(list)
for ev in r.json()["events"]:
    by_league[ev["league_name"]].append(ev)

for league, events in sorted(by_league.items()):
    print(league)
    for ev in events:
        game = (ev.get("periods") or {}).get("num_0") or {}
        ml = game.get("money_line") or {}
        print("  ", ev["starts"], ev["home"], "v", ev["away"],
              ml.get("home"), ml.get("away"))

Keeping a running copy. After the first full response, send its last value back as since= and each later reply holds only the esports events that changed. Fetch the full board now and then as well: a delta cannot show a match that left the board because it went live or was withdrawn.

Push instead of poll. The WebSocket feed relays every upstream frame for the sports you subscribe to, so a subscription to 11 gives you each esports price change as it happens. It is a $99 monthly add-on on REST, Edge or Scale.

03 · Honest limits

What to plan around with esports.

Live state

Prices yes, scoreboard mostly no

For most esports no live game state is published. The live object on drop alerts is then absent, and the REST state fields are optional. Build on prices, not on the score.

Handoff

Prematch to live

When a match starts and its in-play listing exists, it leaves the prematch board, and every later price for it, later esports maps included, comes from event_type=live. Read both boards.

Board size

Depends on the schedule

The board holds what Pinnacle is pricing at that moment. X-Data-Status tells an empty board (fresh) apart from a quiet feed (stale).

Drops

Same detector

Esports price falls go through the same drop detection as every sport. Filter the SSE stream on sport_id 11, or poll /api/drops?sport_id=11.

History

No archive

The service is real time. To test a model on past esports prices, record the feed yourself from day one.

AI tools

Ask in plain language

With the MCP server, Claude or Cursor can call find_matches with sport "esports" and a team name, then match_prices.

04 · Plans

Esports is in every plan.

Tiers change request rate and push delivery, never the sports or the markets. Longer billing terms cut up to about 24%.

PlanPriceRESTSSE drop streamsWebSocket
Free$020/min, 100/dayNoNo
Drops$99 / moFree limitsYesNo
REST$99 / mo10 req/sNo+$99 / mo add-on
Edge$149 / mo10 req/sYes+$99 / mo add-on
Scale$229 / mo30 req/sYes+$99 / mo add-on

05 · Questions

Esports, specifically.

Anything else goes to @PinnRadarSupport on Telegram or info@pinnradar.com, answered by the people who run the feed.

Which esports does the API cover?

Everything Pinnacle lists under its esports sport, served as PinnRadar sport_id 11: CS2, Dota 2, League of Legends and other titles. The sport id table shows the mapping.

Are live in-play esports odds available?

Yes. /kit/v1/markets?sport_id=11&event_type=live returns the matches in play with their current prices. What is mostly missing is live game state: for most esports no state is published, so do not build on a scoreboard being there.

Which esports markets are in the response?

The same market types as every sport: money_line, spreads, totals and team totals, inside each period the match has. num_0 is the whole match, and further periods appear only when they are priced, so read the keys that are present rather than assuming a fixed set.

How do I separate CS2 from Dota 2 or LoL?

All titles share sport_id 11, so group the events yourself by the competition each one belongs to, using league_name and league_id.

Can I get esports drop alerts?

Yes. The SSE drop streams cover every sport, so keep drops whose sport_id is 11, or poll /api/drops with sport_id=11. Live esports drops usually come without the live object, because no game state is published for most esports. See the dropping odds API.

Is there a free plan for esports odds?

Yes. A Free key covers every sport, esports included, with 20 requests a minute and 100 a day over REST and full line depth. Paid plans add request rate and push delivery; see the pricing page.

Can I get historical esports odds?

No. PinnRadar is a real-time service with no archive of past prices. If you need history, record the feed yourself and keep your own store.

Pull the esports board today.

A Free key covers sport_id 11 with full line depth. Check the current matches on the public board first, then make the same call from your code.