General
What is the difference between V1 and V2?
What is the difference between V1 and V2?
moneyline, spread, and total objects. V2 uses a market-based model where each market type (moneyline, spread, total, player props, etc.) is a separate entry with participants, lines, and prices nested inside. V2 is recommended for all new integrations — it supports player props, alternate lines, and new market types that V1 cannot represent. See the V1 to V2 Migration Guide for a detailed comparison.What does the 0.0001 sentinel value mean?
What does the 0.0001 sentinel value mean?
0.0001 means the sportsbook has taken the line off the board — it is temporarily unavailable. This is not an error. Common causes include pending injury news, line recalculation, or approaching game time. Display it as “Off Board” or “N/A” and never use it in calculations. See Sentinel Values and Errors — The 0.0001 Sentinel Value for handling guidance.How do I filter events or markets by sport?
How do I filter events or markets by sport?
sport_id as a path parameter when calling event endpoints: GET /api/v2/sports/{sportID}/events/{date}. For market discovery, use GET /api/v2/sports/{sportID}/markets/{date} to see which markets have active pricing for a sport on a given date. See Sport IDs for the full list of sport identifiers.Should I use WebSocket or REST polling?
Should I use WebSocket or REST polling?
Which sports support player props?
Which sports support player props?
GET /api/v2/sports/{sportID}/markets/{date} to check which prop markets are active for a sport on a given day. See the Market IDs reference for prop market IDs like Player Points (29), Player Rebounds (35), and Player Assists (39).Data & IDs
How are soccer event IDs generated?
How are soccer event IDs generated?
What are season-specific sport IDs?
What are season-specific sport IDs?
23, NBA Playoffs is 24, and NFL Preseason is 25. This lets you filter or subscribe to specific parts of a season independently. Season-specific sports share the same data model and endpoints as their parent sport. See the full list of season-specific IDs.How do I get futures / championship odds?
How do I get futures / championship odds?
GET /api/v2/sports/{sportID}/futures — futures (outrights) are served as competition events with their own stable event_id, separate from the dated game endpoints. Championship winner boards are live for NFL, MLB, NCAAF, NHL, NBA, NCAAB, WNBA, and EPL, plus per-tournament PGA Tour golf (sport ID 40) and Formula 1 season championships (sport ID 41). Futures are in early access and require an Ultra plan or higher on API keys. See the Futures guide for the data model, window semantics, and the delta polling recipe.How do I get historical or closing lines?
How do I get historical or closing lines?
GET /api/v2/events/{eventID}/openers for opening lines and GET /api/v2/events/{eventID}/closing for closing lines. For full price history over time, use GET /api/v2/events/{eventID}/markets/history or GET /api/v2/events/{eventID}/markets/{marketID}/history for chart-ready time series data. These endpoints are available after the event has started or completed. See the Events reference and Markets reference for details.What is `liquidity_usd` on Kalshi and Polymarket prices?
What is `liquidity_usd` on Kalshi and Polymarket prices?
liquidity_usd is an approximate USD reading of how much money is resting in a prediction-market exchange’s order book for that price. It’s populated only for the two exchange affiliates — Kalshi (affiliate 25) and Polymarket (affiliate 26) — never for a traditional sportsbook, and is designed to extend to future exchange-style sources as they’re added. It appears on the standard price object wherever prices do — event detail, sport/date listings, best-line/odds comparisons, and WebSocket market frames (both live deltas and subscribe-time snapshots). The field itself carries no separate plan or tier requirement of its own — any key that can already reach a given surface sees it there (REST on any plan; WebSocket on the existing real-time WebSocket entitlement, Ultra and above).The two venues compute it differently:- Polymarket reports its own liquidity-pool figure directly, in USD.
- Kalshi doesn’t publish a usable liquidity figure on its own market listings, so it’s derived from Kalshi’s live order book instead: the total resting cost — price × contract count, summed — across every level on both the YES and NO sides, including levels far from the current best bid/ask. It answers “how much money is resting in this book,” not “how much can trade right at today’s price.”
liquidity_usd is omitted entirely — never null, never a fabricated 0 — whenever a venue doesn’t currently report a reading, including every sportsbook price and any exchange price without one yet. Don’t treat a missing field as zero liquidity.It’s a passenger value, not a live tick. The figure rides along whenever the price updates; Kalshi additionally re-reads the order book on its own background cycle roughly every 3 minutes per market, so treat it as accurate “as of the last refresh” rather than tick-by-tick. A liquidity-only change never produces a price update, a WebSocket message, or counts as line movement on its own.Why you won’t see it on every price: coverage concentrates on open, actively-quoted game markets, and Kalshi’s futures-family boards aren’t covered yet. It’s also worth knowing that every price you see has already cleared each venue’s own minimum liquidity/volume floor before it publishes at all — Polymarket requires at least 1,000 in lifetime trading volume (UFC prop markets use a higher 50), and Kalshi requires at least 100 contracts of volume or an actively quoted two-sided book within a 0.02–$0.98 band. So a published price already represents a real, minimally-liquid market even on the rare occasions liquidity_usd itself is momentarily missing.See the Price object reference for the field’s exact shape.Billing & Plans
What happens when I upgrade my plan?
What happens when I upgrade my plan?
How do I downgrade my plan?
How do I downgrade my plan?
Can I pay weekly instead of monthly?
Can I pay weekly instead of monthly?
X-Datapoints-Period header reads weekly on these plans. See Weekly Billing.Is there a free trial?
Is there a free trial?
Why can't I cancel or create new API keys?
Why can't I cancel or create new API keys?
Integration
How do rate limits work and how do I stay under them?
How do rate limits work and how do I stay under them?
X-Datapoints, X-Datapoints-Used, X-Datapoints-Remaining, X-Tier, and X-Rate-Limit. To stay efficient: use delta endpoints instead of repeated full snapshots, filter by market_ids and affiliate_ids, cache reference data, and use WebSocket on real-time tiers when you need live updates. When you get a 429, read Retry-After and the billing headers to determine whether you hit a short burst throttle or a usage cap. See Rate Limits and the Efficient Polling guide.Do WebSocket messages count toward usage?
Do WebSocket messages count toward usage?
game_stats frame costs one stats data point per changed team or player stat row; a zero-row completion marker or invalidation fallback costs one. Keep subscriptions narrow by filtering to the sports, markets, events, and sportsbooks you actually need.How does the delta cursor work?
How does the delta cursor work?
/api/v2/markets/delta(price changes) takes an integer cursor. Bootstrap it from the integermeta.delta_last_idin a/api/v2/sports/{id}/events/{date}response, then follow the integermeta.delta_last_idreturned by each markets-delta response. This is the endpoint for odds polling./api/v2/delta(full event-object changes — status, scores, the whole event) takes an ordered UUID cursor (e.g.11f1-23b3-f4d42784-8057-a3a997572248) that is only returned by/api/v2/delta’s own responses. The events snapshot does not provide it, and passing the integer cursor here returns a400.
last_id=0 — cursors that fall too far behind the current head are rejected; always seed from a fresh events snapshot. Each delta entry contains the full updated object, so replace (don’t merge) in your local cache. See the Efficient Polling guide for the complete flow.Can I use an MCP server to query the docs from my editor?
Can I use an MCP server to query the docs from my editor?
Where can I find SDKs or client libraries?
Where can I find SDKs or client libraries?