League of Legends Odds API

League of Legends prices from the same endpoint as every other tournament we carry. tournamentId 2452, 2454, 39985, sportId 18.

0Fixtures scheduledfrom /v4/tournaments
133Bookmakers quotedlast measured 2026-09-20
184Market familiessportId 18

Measured live at 2026-10-25 04:14 UTC. This page is regenerated from the API, so the numbers move.

Get a free API key Read the docs

Quick start: League of Legends fixtures and prices

Copy it as it stands. It was run against the live API before this page rendered.

import datetime as dt
import time

import requests

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.oddspapi.io/v4"


def get(path, params):
    """The key is the query parameter apiKey, never a header.
    Read the status code first: a 429 body is valid JSON too."""
    query = dict(params, apiKey=API_KEY)
    for attempt in range(3):
        response = requests.get(f"{BASE_URL}/{path}", params=query, timeout=180)
        if response.status_code == 429:
            time.sleep(5 * (attempt + 1))
            continue
        if response.status_code == 404:
            return None
        response.raise_for_status()
        return response.json()
    raise RuntimeError("rate limited on /" + path)


# tournamentId filters /v4/fixtures and lifts the 10 day range cap, so a
# whole month arrives in one call. It also cuts the payload about 20x.
fixtures = get("fixtures", {
    "tournamentId": 2452,
    "from": "2026-10-25",
    "to": "2026-11-24",
}) or []
print(len(fixtures), "League of Legends fixtures")

# The same bet ships under more than one market id on several sports, so
# resolve the result market from /v4/markets by name and read every id that
# maps to it. Reading one id drops part of the board.
MAIN_MARKET_IDS = ["181", "187975"]

# hasOdds is a flag, not a depth signal, and it is false on every finished
# fixture. Boards open on their own clock, so the fixtures nearest kick-off
# carry the prices, and a fixture already in play often has the result market
# suspended. Read the ones still ahead of us, soonest first.
now = dt.datetime.now(dt.timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z")
upcoming = sorted(
    (f for f in fixtures if f["hasOdds"] and f["startTime"] > now),
    key=lambda f: f["startTime"],
)
for fixture in upcoming[:10]:
    odds = get("odds", {
        "fixtureId": fixture["fixtureId"],
        "bookmakers": "pinnacle,bet365,1xbet",
    })
    boards = (odds or {}).get("bookmakerOdds") or {}
    printed = False
    for slug, board in boards.items():
        for market_id in MAIN_MARKET_IDS:
            market = board["markets"].get(market_id)
            if not market:
                continue
            # players is keyed "0" on a match market. On a player prop it is
            # keyed by player id, so never hardcode "0" outside this case.
            prices = {
                outcome_id: leg["players"]["0"]["price"]
                for outcome_id, leg in market["outcomes"].items()
                if leg["players"]["0"]["active"]
            }
            if prices:
                print(fixture["participant1Name"], "v",
                      fixture["participant2Name"], slug, market_id, prices)
                printed = True
    if printed:
        break
    time.sleep(1.0)

Bookmakers pricing League of Legends

Board last measured 2026-09-20 on G2 Esports v Movistar Koi: 133 bookmakers quoted, 29 independent prices. Identical price tuples are grouped before the second count, because distinct slugs publish the same price and cloneOf does not track that.

and 17 more on https://oddspapi.io/sportsbooks

Counted from one /v4/odds call with no bookmaker filter, on the main result market for the sport. Regional feeds of one brand are shown once and link to that brand.

Market families

Read off /v4/markets and filtered on the sport. A family that carries many market ids is a ladder, with one id per line, so resolve a market on its name and collect every id that maps to it.

Market family Market ids Type
1X2 1 Match market
Winner 1 Match market
Total Maps Over Under 7 Match market
Maps Handicap 15 Match market
Correct Map Score 1 Match market
Kills – Over Under 301 Match market
Kills – Over Under Team 1 161 Match market
Kills – Over Under Team 2 161 Match market
Kills – Handicap 122 Match market
Turrets – Handicap 110 Match market
Turrets – Over Under 109 Match market
Kills – Over Under Fifth Map 91 Match market

Read the study

League of Legends Odds API study. The write-up behind these numbers, with the code that produced them.

Other Esports tournaments

Questions developers ask

What is the League of Legends tournamentId?

2452, 2454, 39985, on sportId 18. Confirm it against /v4/tournaments?sportId=18 before you hardcode it; the endpoint returns the id, the slug and the count of scheduled fixtures on one object.

How many bookmakers price a League of Legends fixture?

133 bookmakers quoted G2 Esports v Movistar Koi, and those group into 29 independent prices once identical price tuples are collapsed, last measured 2026-09-20. Group the tuples before you average, because distinct slugs publish the same price.

How far ahead can I pull League of Legends fixtures?

0 fixtures were scheduled at 2026-10-25 04:14 UTC. /v4/fixtures caps the from and to range under 10 days when sportId is the only filter, and adding tournamentId lifts that cap.

Pull the League of Legends board yourself

The free tier reads the same endpoints as the paid one. Pass tournamentId=2452, 2454, 39985 and the payload drops about 20x against a sport wide call.

Get a free API key Read the docs