Liquidity and Limits
SharpAPI surfaces every liquidity and limit signal we receive from upstream books. These fields are optional on /api/v1/odds rows because traditional sportsbooks and exchange-style books expose different data.
Fields on odds rows
| Field | Type | Meaning | Emitting books |
|---|---|---|---|
max_bet | number | The largest size available on the row. On a traditional sportsbook, the maximum wager the book will accept on this market or selection at the current line. On an exchange-style book, the money resting at the best price — see below. | Pinnacle, Circa Sports, SBOBET, and exchange-style books that publish a size |
size_currency | string | ISO-4217 code the money figures on the row are denominated in: max_bet, best_bid_liquidity and total_liquidity. GBP on Betfair and Smarkets, USD on every other book that publishes a size. Never converted. | Exchange-style books that publish a size |
best_bid_liquidity | number | Money resting at the published price — what a taker can match without moving the price. | Exchange-style books that publish a size |
total_liquidity | number | Risk-able size summed across the whole book for the selection, not just the best price. | Exchange-style books that publish a size |
volume | number | Cumulative traded volume on the selection, in the exchange’s native units. | Kalshi |
volume_24h | number | Rolling 24-hour traded volume in the exchange’s native units. | Polymarket, Kalshi |
open_interest | number | Outstanding open contracts on the selection. | Kalshi |
exchange_token_id | string | Exchange-native token or market hash for downstream order routing. | Polymarket (token_id), SX Bet (marketHash) |
exchange | string | The venue a re-fronted market actually lives on, resolved per contract. | Robinhood (kalshi, rothera) |
These values are returned only when present in the source feed. Absence means the upstream book did not expose that signal for the row; it does not imply zero liquidity or a zero limit. For max_bet specifically, the book list above is a point-in-time snapshot: /api/v1/sportsbooks publishes the live per-book answer as has_limits, derived from each book’s current rows (null until rows have been observed).
The exchange-side fields (volume, volume_24h, open_interest, and exchange_token_id) are liquidity proxies, not a full depth-of-book feed. Their units are not directly comparable across books.
Money figures on exchange rows
An exchange quotes a price that only a finite amount of money can be matched at, so the size fields mean something different there than they do on a traditional sportsbook.
max_betis the size resting at the best price, not a posted ceiling. A traditional sportsbook’smax_betis the most it will accept on the market — a rule it has set. An exchange’s is how much money is actually sitting at the quoted price right now. The field name is the same; the fact is not. The presence ofsize_currencyis what tells the two apart.size_currencylabels the currency. Nothing is converted. The number is the venue’s own figure in the venue’s own currency, handed through unchanged. Sorting or filtering exchanges by size without readingsize_currencycompares pounds against dollars.- One rule for all three money fields: absent means “the venue does not publish this figure”, and a number — including
0.0— is a real measurement. Never read an absent field as zero, and never read a0.0as missing data. - On an exchange,
max_betappears only while money is resting at the best price. It tracks that resting size, so an empty best price arrives asbest_bid_liquidity: 0.0with nomax_betalongside it. Read that pair as one fact stated once — nothing is resting at the quoted price — not as a size that is unknown and zero at the same time. On these booksmax_bet: 0.0is not sent, because it would read as the much stronger claim “this market accepts no wager”. - Not every exchange publishes both depth figures. Some give the size at the best price only, some the whole-book total only. Neither can be derived from the other, so read each field rather than inferring one from the other.
What we do not surface
- Price-by-price order-book depth. Exchange-style books that publish depth give us the size at the best price (
best_bid_liquidity) and a whole-book total (total_liquidity), both listed above. The full ladder — every price level with the size resting at each one — is not available on any endpoint today. Traditional sportsbooks do not operate a visible order book at all. - Pre-bet limit checks. No upstream book exposes a public “will this wager be accepted at this size” probe. On a traditional sportsbook
max_betis the book’s posted ceiling on the market; on an exchange-style book it is the size resting at the best price. Either way, the actual accept-or-reject decision is made at slip-submission time. - Real-time suspension reasons. When a book pulls a line,
/api/v1/odds/deltacan emit a removal and the row disappears from/api/v1/odds, but upstream feeds usually do not include a structured reason.
Detecting coverage gaps
If a customer-side coverage check relies on liquidity:
- Filter
/api/v1/oddsby the books you care about. - For exchange-style books, filter rows where
volume_24horopen_interestexceeds your minimum threshold. - For traditional books, use
max_betwhen emitted as a coarse limit signal. - For everything else, fall back to row presence: an odds row is a positive signal that the book is currently quoting that market.