WNBA Odds API: Live Moneylines, Spreads & Player Props (Python + Free Tier)

WNBA Odds API - OddsPapi API Blog
How To Guides July 10, 2026

The WNBA is the fastest-growing betting market in US sports, and through the summer it is the only major basketball on the board, the NBA is on its off-season break. Yet most generic odds APIs treat the WNBA as an afterthought: thin book coverage, no player props, no sharp lines to benchmark against.

This guide fixes that. You will pull live WNBA odds, moneylines, spreads, totals, and player-points props, from 17 bookmakers including two sharps (Pinnacle and SBOBet) and prediction markets (Polymarket, Kalshi), with a single free API key and a few lines of Python. Every number below was pulled live from the API as this post was written.

Why a WNBA Odds API Is Harder Than NBA

For the NBA, every book prices every game deep. WNBA coverage is shallower and more uneven across providers, which is exactly why an aggregator matters: the books that do price the WNBA disagree more, so the best available line is often meaningfully better than the market average. On the example game below, the best moneyline price on the underdog was a full prediction-market tick above the sharp book’s number.

OddsPapi covers basketball under sportId=11, and the WNBA is one tournament inside it. You filter by tournamentName, then parse the same nested JSON used for every other sport. If you have read our NBA Odds API guide, the market IDs are identical, basketball is basketball.

  Generic Odds API OddsPapi
WNBA books A handful 17 on a primetime game
Sharp lines Rarely Pinnacle + SBOBet
Prediction markets No Polymarket, Kalshi
Player props Often missing Player points, buckets (15+, 30+)
Spreads & totals Mainline only Every handicap & total line
Historical odds Paid Free
Price Per-call quotas Free tier

Tutorial: Pull Live WNBA Odds in Python

Step 1: Authenticate

Grab a free key. The one gotcha: the API key is a query parameter, not a header.

import requests

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

r = requests.get(f"{BASE_URL}/sports", params={"apiKey": API_KEY})
print(r.status_code)  # 200

Step 2: Find WNBA Fixtures

Basketball is sportId=11. Pull a date window (max 10 days) and filter to WNBA fixtures that have odds.

from datetime import date, timedelta

today = date.today()
params = {
    "apiKey": API_KEY,
    "sportId": 11,                       # basketball
    "from": today.isoformat(),
    "to": (today + timedelta(days=7)).isoformat(),
}
fixtures = requests.get(f"{BASE_URL}/fixtures", params=params).json()
wnba = [f for f in fixtures
        if f.get("hasOdds") and (f.get("tournamentName") or "").upper() == "WNBA"]

for f in wnba[:5]:
    print(f["participant1Name"], "vs", f["participant2Name"], "|", f["fixtureId"])

Worked example: Las Vegas Aces vs Golden State Valkyries (fixtureId id1100048668096446), priced by 17 books.

Step 3: Parse the Moneyline Across Every Book

Hit /odds and walk the nesting: bookmakerOdds -> {slug} -> markets -> {marketId} -> outcomes -> {outcomeId} -> players["0"] -> price. The basketball moneyline is market 111 (“Winner incl. overtime”), outcomes 111 (home) and 112 (away). Always check active.

fid = "id1100048668096446"
books = requests.get(f"{BASE_URL}/odds",
                     params={"apiKey": API_KEY, "fixtureId": fid}).json()["bookmakerOdds"]

def moneyline(slug):
    outs = books.get(slug, {}).get("markets", {}).get("111", {}).get("outcomes", {})
    row = {}
    for oid in ("111", "112"):
        node = outs.get(oid, {}).get("players", {}).get("0", {})
        if node and node.get("active"):
            row[oid] = node["price"]
    return row

for slug in sorted(books):
    p = moneyline(slug)
    if p:
        print(f"{slug:18} Aces {p.get('111')}  Valkyries {p.get('112')}")

Real output (13 active books on the moneyline):

Bookmaker Type Aces Valkyries
pinnacle Sharp 1.617 2.37
polymarket Prediction 1.639 2.50
kalshi Prediction 1.613 2.50
fanduel US book 1.63 2.28
draftkings US book 1.57 2.45
betmgm US book 1.59 2.40
caesars US book 1.606 2.40
circasports Sharp US 1.588 2.50

Step 4: De-Vig the Sharp and Find the Best Line

pin = moneyline("pinnacle")              # {'111': 1.617, '112': 2.37}
inv = 1/pin["111"] + 1/pin["112"]
print(f"Pinnacle overround: {(inv-1)*100:.2f}%")
print(f"Fair: Aces {1/(1/pin['111']/inv):.3f}  Valkyries {1/(1/pin['112']/inv):.3f}")

def best(oid):
    quotes = [(moneyline(s).get(oid), s) for s in books]
    return max((q for q in quotes if q[0]), default=(None, None))

print("Best Aces:", best("111"))
print("Best Valkyries:", best("112"))

Result: Pinnacle’s overround is 4.04%, with a no-vig fair line of Aces 1.682 (59.4%) / Valkyries 2.466 (40.6%). The best available prices were 1.639 on the Aces and 2.50 on the Valkyries, both at Polymarket. That 2.50 is the best available price on the dog and sits above Pinnacle’s fair, treat it as a line-shopping win, not a guaranteed edge, but it is real money versus the 2.37 the sharp book was posting. That is the line shopping payoff, invisible without an aggregator.

Step 5: Spreads and Totals

The WNBA spread is the Handicap (incl. overtime) market and the total is Over Under (incl. overtime). Each line variant has its own market ID, so the cleanest approach is to read each book’s mainLine: true flag rather than hardcoding a handicap. Build your lookup from /markets?sportId=11.

def main_lines(slug):
    out = {}
    for mid, m in books.get(slug, {}).get("markets", {}).items():
        for oid, o in m["outcomes"].items():
            node = o.get("players", {}).get("0", {})
            if node.get("mainLine") and node.get("active"):
                out[(mid, oid)] = node["price"]
    return out

For our game, Pinnacle’s main lines were the Aces -3 spread (1.892 / 1.961) and a 167 total (Over 1.925 / Under 1.925). Every alternate handicap and total is in the same payload, so you can build a full ladder, not just the headline number.

Step 6: Player Points Props

This is where the WNBA aggregator really earns its keep. The Over Under Player Points markets carry per-player lines (each price node has a playerName), and books also offer threshold buckets like 15+, 30+, and 35+ points. On this game FanDuel priced Jackie Young 15+ points at 1.47, 30+ at 2.10, and 35+ at 4.60, alongside lines for Chelsea Gray, Jewell Loyd, and Valkyries players.

# player props live under playerName inside each outcome's players dict
for mid, m in books["fanduel"]["markets"].items():
    for oid, o in m["outcomes"].items():
        for _, node in o.get("players", {}).items():
            name = node.get("playerName")
            if name and node.get("active"):
                print(mid, name, node["price"])

For a full prop deep-dive across the US books, see our player props API guide. The same parsing applies to WNBA, just with sportId=11.

Free Historical WNBA Odds

Backtesting a WNBA model? The full price history is free on /historical-odds. Note the shape change: the top key is bookmakers (not bookmakerOdds) and players["0"] is a list of timestamped snapshots. Max three bookmakers per call.

h = requests.get(f"{BASE_URL}/historical-odds",
                 params={"apiKey": API_KEY, "fixtureId": fid,
                         "bookmakers": "pinnacle,fanduel,draftkings"}).json()
snaps = h["bookmakers"]["pinnacle"]["markets"]["111"]["outcomes"]["111"]["players"]["0"]
for s in snaps[:5]:
    print(s["createdAt"], s["price"])

Compare the closing line you bet into against where the sharp book actually closed, the foundation of fair-odds and consensus analysis.

FAQ

Is there a WNBA odds API?

Yes. OddsPapi exposes WNBA odds under basketball (sportId=11), filtered by tournamentName == "WNBA". A primetime game is priced by up to 17 bookmakers including Pinnacle, SBOBet, FanDuel, DraftKings, BetMGM, Polymarket, and Kalshi, on a free tier.

What WNBA markets are available?

Moneyline (market 111), point spread / handicap, game and team totals, first-half lines, and player-points props (per-player Over/Under plus 15+, 30+, 35+ buckets). Every alternate spread and total line is in the same payload.

Does OddsPapi have WNBA player props?

Yes, player-points props with player names from the major US books (FanDuel, DraftKings, BetMGM) and Pinnacle. Each price node carries a playerName field.

Are WNBA odds available in-season only?

Odds appear for scheduled fixtures, so coverage is densest during the WNBA season (roughly May to October). Always discover fixtures live with the hasOdds flag rather than assuming.

Can I get historical WNBA odds for backtesting?

Yes, free. The /historical-odds endpoint returns the full timestamped price history for a fixture (up to three bookmakers per call).

Build Your WNBA Edge

WNBA betting is growing faster than the data tooling around it, which is the opportunity. With 17 books, two sharps, prediction-market prices, full player props, and free history in clean JSON, you have everything you need to line-shop, model, or build. New to the API? Start with the free odds API guide. Get your free OddsPapi API key and pull your first live WNBA line today.