ParlayAPI is wire-compatible with the-odds-api v4 on the
core /sports and /sports/{key}/odds
surface. You change one base URL and your code keeps working
for the shared endpoints. You also gain 22 additional
bookmakers (Pinnacle, the exchange Novig,
prediction markets Kalshi and Polymarket and Robinhood,
DFS pick'em PrizePicks / Underdog / Sleeper, plus French and
European books). Starter tier is 6x cheaper per credit;
see the pricing table below for the honest comparison.
If you're using the-odds-api.com directly, swap the base URL to parlay-api.com. That's it.
# Python (requests) - BASE_URL = "https://api.the-odds-api.com/v4" + BASE_URL = "https://parlay-api.com/v1" r = requests.get( f"{BASE_URL}/sports/baseball_mlb/odds", params={"markets": "h2h", "regions": "us"}, headers={"X-API-KEY": "YOUR_PARLAYAPI_KEY"}, )
If you're using their official the-odds-api SDK, point it at our base URL via the SDK's config option, or migrate to plain requests / fetch. Most users do the latter; the response is identical.
// JavaScript (fetch) - const BASE = "https://api.the-odds-api.com/v4"; + const BASE = "https://parlay-api.com/v1"; const events = await fetch( `${BASE}/sports/baseball_mlb/odds?markets=h2h®ions=us`, { headers: { "X-API-KEY": YOUR_KEY } } ).then(r => r.json());
| the-odds-api | ParlayAPI | Compat |
|---|---|---|
/v4/sports | /v1/sports | Identical |
/v4/sports/{key}/odds | /v1/sports/{key}/odds | Identical + more bookmakers + prop markets |
/v4/sports/{key}/events | /v1/sports/{key}/events | Identical |
/v4/historical/sports/{key}/odds | /v1/historical/sports/{key}/odds | Same shape + deeper history (NFL 2005+, NBA 2017+). One difference: last_update and commence_time are nullable here and null on most rows. See Response timestamps below. |
| (none) | /v1/sports/{key}/props | Player props from DK, FanDuel, BetMGM, Caesars, PrizePicks, Underdog, Sleeper, Novig, plus DFS-pick'em books |
| (none) | /v1/ws/odds/{key} | WebSocket streaming (push updates, no polling). Sport key is part of the path. |
| (none) | /v1/sse/odds/{key} | Server-Sent Events streaming (HTTP/2 friendly, EventSource-compatible) |
| (none) | /v1/sports/{key}/compare | Side-by-side bookmaker prices with the best line highlighted per outcome. Also reachable at /v1/sports/{key}/best-line. |
You don't need to change a single sport_key string for these:
baseball_mlb, basketball_nba, americanfootball_nfl, icehockey_nhlamericanfootball_ncaaf, basketball_ncaab, basketball_wnbamma_mixed_martial_arts, mma_ufcsoccer_epl, soccer_spain_la_liga, soccer_germany_bundesliga, soccer_italy_serie_a, soccer_france_ligue_onesoccer_uefa_champs_league, soccer_uefa_europa_league, soccer_conmebol_copa_libertadoresWe add 60+ sport keys the-odds-api doesn't carry: French Ligue 2, Brazilian Serie B, Korean KBO baseball, Japanese NPB, Polish Ekstraklasa, Swiss Super League, Czech table tennis, esports leagues (CS2, LoL, Valorant, Dota 2), and more. Full list at /v1/sports?all=true.
The authoritative list is GET /v1/bookmakers. Below is what's live today. If the key isn't in /v1/bookmakers, it isn't ingested; we do not maintain placeholder entries.
draftkings, fanduel, betmgm, caesars, betrivers, bovada, pinnacle, fanatics, bet365.
Some books the-odds-api lists (PointsBet US, William Hill US, Wynn, Unibet US) are not in our ingest. We avoid maintaining a dead key just for parity; if you depended on those, check the corresponding feed below or contact support.
pinnacle (US-blocked at the-odds-api)novigkalshi, polymarket, robinhoodprizepicks, underdog, sleeper, betrfliff, hardrock, parxbwin, unibet, pmu, betclic, winamaxThe honest per-credit math. Read the rightmost column. Bigger plans on the-odds-api are cheaper per credit than our equivalent tier; smaller plans (Free, Starter, Pro) are dramatically cheaper on ParlayAPI. Pick the row that matches your monthly volume.
| Tier | the-odds-api | ParlayAPI | Per-credit comparison |
|---|---|---|---|
| Free | 500 credits/mo | 1,000 credits/mo | 2x more credits, same $0 |
| Starter | $30/mo (20K) = $1.50 per 1K | $5/mo (20K) = $0.25 per 1K | 6x cheaper per credit |
| Pro | $59/mo (100K) = $0.59 per 1K | $20/mo (100K) = $0.20 per 1K | 3x cheaper per credit |
| Business | $119/mo (5M) = $0.024 per 1K | $40/mo (1M) = $0.040 per 1K | Total bill is lower on our plan but you get 5x fewer credits. If you need 5M credits/mo on ParlayAPI, jump to Scale ($200/mo for 50M = $0.004 per 1K, 6x cheaper than their Business per credit). |
| Enterprise | Contact sales | Scale: $200/mo (50M) | Self-serve; no sales call required |
Credit costs per call vary by endpoint (1 credit for most reads, 5 credits for /v1/sports/{key}/compare and /v1/clv). Hit /v1/usage on your account to see your actual burn rate before migrating.
Every September the same thing happens: an app that ran fine all summer dies during the
1 o'clock NFL window with a quota error. The cause is credit math, not traffic:
a credit is not a request. Per
the-odds-api's own usage docs
(read 2026-08-25), one call to their /odds endpoint costs
[markets specified] × [regions specified] credits, and player props are only
reachable through per-event calls billed on the markets each event returns.
Polling markets=h2h,spreads,totals®ions=us is 3 × 1 =
3 credits per poll, not 1. Add player props on a typical 13-game Sunday main
slate — 13 per-event calls, each returning ~5 prop markets in one region — and each
full sweep of the slate costs ~65 credits.
# One NFL Sunday, ~1:00 pm to ~11:30 pm ET (630 minutes), on the-odds-api Game lines every 60s: 630 polls x 3 credits = 1,890 credits Props every 2 minutes: 315 sweeps x ~65 credits = ~20,475 credits total ~22,365 credits # Their 20,000-credit month is gone before Sunday Night Football ends.
Their 20K plan size per their pricing page (read 2026-08-25). In fairness: their per-event billing counts only markets actually returned, so a thin slate costs less than this worst case.
| What you poll | the-odds-api | ParlayAPI |
|---|---|---|
Game lines (h2h,spreads,totals, one region), one poll | 3 credits (3×1) | 3 credits (3×1) — same formula, no trick |
| Full-slate player props, one sweep | ~65 credits (13 per-event calls × ~5 markets) | 3 credits flat — one /v1/sports/americanfootball_nfl/props call returns every event, book, and market |
| Game lines every 60s, all Sunday | ~1,890 credits | ~1,890 credits |
| Props every 2 minutes, all Sunday | ~20,475 credits | 945 credits |
| The whole Sunday above | ~22,365 credits | 2,835 credits — roughly 8x less, entirely from the flat-rate props endpoint |
What those credit allowances cost is on
/pricing — and note the game-line formula is identical here, so if
props aren't your problem, migrating changes what a credit costs you, not how many each poll burns.
Historical odds are 10 × markets × regions on both APIs. Every paid response
here carries an x-requests-last header reporting the exact credit charge for that call,
and streaming endpoints (/v1/ws, /v1/sse) can replace polling outright on
tiers that include them — see /pricing.
https://api.the-odds-api.com/v4 → https://parlay-api.com/v1. Same X-API-KEY header, your new key.markets/regions params — identical for US majors (americanfootball_nfl et al.).GET /v1/sports/americanfootball_nfl/props (flat 3 credits).x-requests-last on each response and /v1/usage for the running total — no surprise math./v1/sports/{key}/props endpoint, with full market-key support (player_points, player_anytime_td, etc.)/v1/ws/odds/{key} and Server-Sent Events at /v1/sse/odds/{key} for push updates instead of polling/v1/sports/{key}/compare (also aliased to /v1/sports/{key}/best-line) for line-shopping botsGET /v1/status and GET /v1/meta/provider-state; treat the documented values as steady-state guidance, not strict SLA. Business+ adds WebSocket and SSE streaming for push updates with sub-second wire latency from the broadcast layer (still bounded by upstream cadence)./healthz ~500 ms, /v1/sports/{key}/odds 600 to 900 ms, /v1/sports/{key}/props 800 to 1200 ms (limit 5000), /v1/sports/{key}/compare 1.5 to 2.5 s, /v1/historical/coverage ~250 ms warm.x-result-page-size, x-result-limit, x-result-offset, x-result-has-more, x-next-offset) so you can walk pages without guessing. Body shape stays a flat list, preserving back-compat./v1/sports?all=true first.Both APIs accept X-API-KEY as a header. We also accept ?apiKey= as a query param for compatibility with code that uses the-odds-api's older docs. Either works.
None on paid tiers. Burst at whatever rate your client wants; you're metered on monthly credits, not per-second throughput. Free trial keeps a 60 req/s cap purely for anti-abuse during evaluation. If you need >10,000 req/s sustained from a single key (almost always a misconfigured retry loop), contact support to shard across keys.
Same commence_time ISO-8601 UTC format. Same last_update per bookmaker on the live odds endpoints. No code change needed there.
One exception, on /v1/historical/sports/{key}/odds only: last_update and commence_time are nullable, and are null on most rows today. We serve the archive row's real capture time where we have one and null where we do not, rather than a placeholder; last_update_source tells you which (archive_snapshot, unavailable, or error_no_capture_column). Measured 2026-08-14: 68 of 397 bookmaker blocks stamped on a representative MLB date, and none on blocks carrying a moneyline. Guard both fields before parsing them on the historical route.
Same ?bookmakers= comma-separated key list. We support all keys the-odds-api does plus the additional ones above.
Sign up gets you an API key in 30 seconds. No credit card. Free tier supports real testing volume (1,000 credits/month).