Use with Claude Code, Codex & AI Agents

A fresh agent session, given nothing but this page, should be able to discover and use SportWizzard's live sports betting data with no human help. Everything below is copy-paste — real endpoints, real responses, verified this session.

Base URL & authentication

Base URL  →  https://api.sportwizzard.com

Every endpoint lives under /api/v1 and returns one consistent envelope: { success, data, nextCursor, meta }. Authenticate with the X-Api-Key header — Authorization: Bearer <api_key> also works, if that's what your tooling defaults to. Reference endpoints (/leagues, /seasons, /sportsbooks, /teams, /players, /markets, /status, /events) require no key at all.

Current state (pre-billing, transitional): billing enforcement hasn't flipped on yet, so every endpoint — including odds, stats, edges, and arbitrage — is currently reachable with no key. Send one anyway if you have it; don't build automation that assumes anonymous access stays open. Get a key at your account (API Keys tab, requires sign-in).

The endpoints to start with

1. Discover what's live

Leagues are seasonal and rotate — call this before assuming a league has no data.

curl "https://api.sportwizzard.com/api/v1/leagues"
# {"success":true,"data":["mma","dota2","mlb","brazil-sa","lol","fifa-world-cup",
#   "tennis","wnba","cs2","pga-tour","mls"],"meta":{"count":11}}

A league not in that list (e.g. nba/nfl outside their season) still returns 200 from /odds//events//edges — with a valid, empty data: []. That means "out of season," not "broken" or "unsupported." Those responses also carry a meta.note explaining which requested league has no season and listing the active ones — the hint travels with the response, so you don't have to guess.

2. List events for a league

curl "https://api.sportwizzard.com/api/v1/events?league=mlb&limit=3"

3. Pull live odds

Scope with any of league/sportsbook/market/event_id/player_id/team_id — unscoped paginates hard.

curl "https://api.sportwizzard.com/api/v1/odds?league=mlb&limit=5" \
  -H "X-Api-Key: sw_live_your_api_key_here"

4. Season-long futures

/api/v1/odds also takes a scope filter: event (game markets), season (season-long futures — division, conference and championship winners, win totals, awards, season leaders, season-long player totals) or tournament (tournament outrights). Matching is exact: scope=season excludes tournament outrights. Omit it and you get all scopes — the default, unchanged. An unrecognized value returns 400 naming the valid ones, so a typo can never look like "no futures exist." This parameter is on /odds only — not /odds/updated, /players/{id}/odds, or /teams/{id}/odds.

curl "https://api.sportwizzard.com/api/v1/odds?scope=season&league=nfl&limit=200" \
  -H "X-Api-Key: sw_live_your_api_key_here"

# A futures row is a normal odds row plus two fields:
#   "marketScope": "SEASON"     <- absent entirely on game markets
#   "segment":     "AFC_EAST"   <- only when the market is segment-scoped
# and "period" carries the window: REG_SEASON or FULL (through playoffs).
#
# 18 books post futures, and every future for one competition hangs off
# ONE synthetic season eventId -- all 32 DIVISION_WINNER selections come
# back under the same eventId. Group by (eventId, marketSubtype, segment)
# or you will read 8 four-team divisions as a single 32-team race.
# 'segment' is a RESPONSE field, not a query filter: split client-side.

Two things to relay accurately if you surface futures to a user. They are deliberately excluded from /edges and /arbitrage — a 32-way categorical market has no clean two-way no-vig fair value, so season and tournament markets never enter that math. Their absence there is a design decision, not a gap or an outage. And eventStartTime on a futures row is the season anchor's settlement date, not a kickoff — normalized server-side, so it is always present and identical for every book on that anchor. It says when the market resolves, not when anything starts. Use updated for freshness.

5. DFS edges & arbitrage (derived signals)

Soft DFS lines vs. sharp-book no-vig fair value — a screening signal to verify yourself, not a guaranteed +EV bet.

curl "https://api.sportwizzard.com/api/v1/edges?min_edge=0.02&limit=5" \
  -H "X-Api-Key: sw_live_your_api_key_here"

curl "https://api.sportwizzard.com/api/v1/arbitrage?min_profit=0.01&limit=5" \
  -H "X-Api-Key: sw_live_your_api_key_here"

6. Bootstrap a full local copy

curl --compressed "https://api.sportwizzard.com/api/v1/snapshot" \
  -H "X-Api-Key: sw_live_your_api_key_here" -o snapshot.json
# then stay in sync: /api/v1/odds/updated?since={last-sync-timestamp}

MCP server setup

Model Context Protocol

20 read-only tools over the same v1 API

Live odds, DFS edges, cross-book arbitrage, events, box-score stats, and reference data — as MCP tools instead of raw HTTP. Open source: github.com/adamruehle/sportwizzard-mcp.

Hosted (recommended, no install): Streamable HTTP at mcp.sportwizzard.com, bearer-key auth. Verified live this session — a request with no key gets a clear JSON-RPC error pointing at /account, not a connection failure.

claude mcp add --transport http sportwizzard https://mcp.sportwizzard.com/mcp \
  --header "Authorization: Bearer sw_live_your_api_key_here"

From source (stdio): no clone/build step needed — npx installs it from npm:

npx -y sportwizzard-mcp

Published on npm as sportwizzard-mcp (also installable straight from GitHub via npx -y github:adamruehle/sportwizzard-mcp).

.mcp.json — hosted (recommended)
{
  "mcpServers": {
    "sportwizzard": {
      "type": "http",
      "url": "https://mcp.sportwizzard.com/mcp",
      "headers": {
        "Authorization": "Bearer sw_live_..."
      }
    }
  }
}
.mcp.json — from source (stdio)
{
  "mcpServers": {
    "sportwizzard": {
      "command": "npx",
      "args": ["-y", "sportwizzard-mcp"],
      "env": { "SPORTWIZZARD_API_KEY": "sw_live_..." }
    }
  }
}
Try before you have a key
{ "env": { "SPORTWIZZARD_MOCK": "1" } }

Ground rules for agents

Don't hardcode a league list — resolve it from /api/v1/leagues at call time. Odds rows are flat and self-describing (one row per sportsbook × market × selection) — group by eventId to reconstruct a board, and filter on side/market/marketSubtype rather than parsing the human-readable selection string. A row carrying marketScope is a future, not a game line — check it before you treat a PLAYER_TOTAL_PASS_YARDS of 3,750.5 as a game total, and carry segment into your grouping key. /edges and /arbitrage are convenience signals computed from the same odds data, not guarantees — relay that caveat if you surface them to a user. Cursors (nextCursor) are opaque — pass them back verbatim.

Further reading

AGENTS.md (this content, plain text) · llms-full.txt (every endpoint, full example requests/responses) · openapi.json (machine-readable spec, source of truth for response shapes) · Interactive reference (try-it console) · Human-readable docs.

Get an API key

Free tier includes 5,000 credits/month. Data endpoints work with no key at all today (pre-billing) — a key is still recommended.