Retrieve betting odds with optimized single-query performance.
Required: At least one of league_id or event_id must be provided.
By default, returns only the latest odd per outcome/sportsbook/aggregator combination
(latest_only=true). Set latest_only=false to retrieve full historical odds data.
Finished games (prediction markets): latest prices from prediction venues (Kalshi,
Polymarket, ProphetX, Limitless, Predict.fun, Polymarket US) for a final or cancelled event are kept for at
least 14 days after the event's scheduled start. After that they may be removed, and a latest
read for that event_id returns no rows for those venues. Use latest_only=false for the
price history.
Use additional filters to narrow results by sportsbook, market type, etc.
line_alignment (prediction markets, event-scoped requests only): each row's additive
line_alignment block is only present when this is an event-scoped, latest_only=true
request (event_id given). It is derived at read time from
CommonModel.Betting.PredictionMarkets.LineLadder and never rewrites the sibling is_main
column. For non-event-scoped league_id requests the key is omitted from the response row
entirely (not present with a null body) -- computing a ladder per event across a whole
league's worth of events in one request is intentionally out of scope; see
docs/plans/2026-09-24-prediction-market-is-main-line-ladder.md Phase D.
Crypto (league_id=CRYPTO or a crypto window event_id; tenants entitled to the
CRYPTO league only). One row per venue per outcome (Up/Down) with
market_type = "up_down" and market_id = the contract family. Polymarket and
Limitless rows of the same window share one market_id (same Chainlink 60s TWAP
reference and tie rule); Kalshi resolves off a different reference and has its own
market_id. Each row's additive reference_alignment lists the other markets of the
window in different_reference_market_ids, and canonical_outcome_id is a crypto
namespaced id (join it only against other crypto rows, never sports prediction-market
canonical_outcome_ids). Prices are indicative: captured by our one-minute poll
(timestamp/observed_at are our capture time, never a provider clock), so
provider_freshness is unknown (a fresh snapshot) or stale (older than
metadata.crypto_quote.stale_after_ms; 150 s for 5m/15m, 300 s for 1h, 600 s for
1d), never fresh, and execution_readiness.ready is false: treat both as
"indicative, not executable", use stale to grey out a price. A quote older than 15
minutes, a market with no quote, and any window at or after its window_end yield no
row. Crypto odds are latest-only: latest_only=false or since is a 400
historical_unavailable_for_league. line_alignment is omitted on crypto rows.
league_id=CRYPTO returns the board of live windows plus upcoming windows starting
within 60 minutes (default and maximum per_page 100, exact meta.total_count).
asset and horizon filter the board. Crypto at the polling cadence is too slow for
5m-market trading use.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
