Basketball Odds API

Two result markets settle differently on this sport, and the API ships both. Read 111 and 113.

176Tournaments with fixtures on the boardof 625 carried
1,802Fixtures, next 9 days2026-10-25 to 2026-11-03
90Market familiesfrom /v4/markets

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

Get a free API key Read the docs

Quick start: Basketball 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)


# Fixtures for Basketball. sportId 11 is the only filter here,
# so the from and to range has to stay under 10 days. Adding tournamentId
# lifts that cap.
fixtures = get("fixtures", {
    "sportId": 11,
    "from": "2026-10-25",
    "to": "2026-11-03",
}) or []
print(len(fixtures), "fixtures in the window")

# 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 = ["111", "113"]

# 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,draftkings",
    })
    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)

Run against the live API at 2026-10-25 04:19 UTC. First line of output: 1802 fixtures in the window

Basketball tournament pages

Tournaments carrying the most fixtures

Read from /v4/tournaments?sportId=11 at 2026-10-25 04:18 UTC. Pass the id straight to /v4/fixtures.

Tournament Category tournamentId Fixtures scheduled
NCAA Women, Regular Season USA 21384 2,655
NCAA, Regular Season USA 648 2,637
NBA USA 132 1,184
B League Premier Japan 1502 662
B League One Japan 1516 624
Serie B Italy 30574 542
CBA China 1566 435
LNB Elite 2 France 1189 396
Serie A2 Italy 1520 331
Pro B Germany 48014 329

Bookmakers pricing Basketball

196 bookmakers quoted, 70 independent prices, on Utah Jazz v Los Angeles Lakers, measured 2026-10-25 04:13 UTC. Identical price tuples are grouped before the second count, because distinct slugs publish the same price and cloneOf does not track that.

and 57 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
Regular Time Result 1 Match market
Winner (incl. overtime) 1 Match market
Over Under (incl. overtime) 600 Match market
Over Under First Half 340 Match market
Over Under Second Half 340 Match market
Over Under Second Half (incl. overtime) 340 Match market
Over Under First Quarter 200 Match market
Over Under Fourth Quarter 200 Match market
Over Under Fourth Quarter (incl. overtime) 200 Match market
Over Under Second Quarter 200 Match market
Over Under Third Quarter 200 Match market
Handicap (incl. overtime) 361 Match market

Read the study

NBA Odds API: player props and spreads. The measurements behind this page, written up in full.

Other sports

Questions developers ask

Which sportId do I pass for Basketball?

11. Read the full list from /v4/sports; the ids are stable and the slug is on the same object.

How many bookmakers price a Basketball fixture?

196 bookmakers quoted Utah Jazz v Los Angeles Lakers, and those group into 70 independent prices once identical price tuples are collapsed, measured 2026-10-25 04:13 UTC. Group the tuples before you average, because distinct slugs publish the same price.

How do I find the live tournaments for Basketball?

Call /v4/tournaments?sportId=11 and keep the rows where futureFixtures is above one. 176 rows passed that test at 2026-10-25 04:18 UTC. Confirm a circuit against /v4/fixtures grouped on tournamentId, which is the reliable way to discover one.

Pull Basketball prices yourself

One key, one fixture id, one JSON shape across every sport on this site. The free tier runs on the same endpoints as the paid one.

Get a free API key Read the docs