Skip to content

Commit f712fcd

Browse files
paperclip-resolver[bot]paperclip-resolver[bot]
authored andcommitted
docs(odds): document exchange liquidity fields + correct max_bet coverage
Adds documentation for the four exchange liquidity signals already emitted on /api/v1/odds (volume, volume_24h, open_interest, exchange_token_id) and corrects the max_bet field to mention SBObet alongside Pinnacle. Introduces a new concepts/liquidity.mdx page that enumerates what we surface, what we don't, and why — so future customer questions land on a docs page instead of generating Crisp follow-ups. Field emission verified against sharp-api-go/main.go (REST struct) and api-adapters: max_bet from Pinnacle + SBObet; volume + open_interest from Kalshi; volume_24h from Polymarket + Kalshi; exchange_token_id from Polymarket + SX Bet. Fixes #232
1 parent 0c599b8 commit f712fcd

3 files changed

Lines changed: 70 additions & 4 deletions

File tree

content/en/api-reference/odds.mdx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -330,10 +330,11 @@ X-Request-Id: req_abc123def456
330330
| `home_pitcher` | string\|undefined | MLB only. Home-team starting pitcher when published by the book. |
331331
| `away_pitcher` | string\|undefined | MLB only. Away-team starting pitcher when published by the book. |
332332
| `public_bet_pct` | number\|undefined | Public betting ticket percentage (0.0-1.0). Currently BetMGM only. |
333-
| `max_bet` | number\|undefined | Maximum wager amount (USD) for this market type. Currently Pinnacle only. |
334-
| `volume` | number\|undefined | Matched-volume on this selection. Exchange books only (Betfair, Novig, ProphetX, Polymarket). Units follow the originating book (e.g. matched stake for Betfair, share volume for prediction markets). |
335-
| `volume_24h` | number\|undefined | Trailing 24-hour matched volume on this selection. Exchange books only. |
336-
| `open_interest` | number\|undefined | Outstanding open interest (matched stake / shares currently held) on this selection. Exchange books only. |
333+
| `max_bet` | number\|undefined | Maximum wager amount (USD) for this market type. Emitted by Pinnacle and SBObet. |
334+
| `volume` | number\|undefined | Cumulative traded volume on the selection, in the exchange's native units (USD for Kalshi). Exchanges only — currently Kalshi. |
335+
| `volume_24h` | number\|undefined | Rolling 24-hour traded volume, in the exchange's native units. Exchanges only — currently Polymarket and Kalshi. |
336+
| `open_interest` | number\|undefined | Outstanding open contracts on the selection. Exchanges only — currently Kalshi. |
337+
| `exchange_token_id` | string\|undefined | Exchange's native token / market hash for the selection — useful for downstream order routing. Exchanges only — currently Polymarket (`token_id`) and SX Bet (`marketHash`). See [Liquidity & limits](/en/concepts/liquidity/). |
337338
| `polymarket_resolution` | string\|undefined | Polymarket only. UMA optimistic-oracle resolution status when the market has terminated — one of `settled_normal`, `voided`, `disputed`, `proposed`, `unknown`. Absent for live (unresolved) Polymarket markets and for every non-Polymarket book. |
338339
| `home` | object\|undefined | **New (May 2026).** Nested home-team reference: `{id, numerical_id, name, abbreviation, logo, city, mascot, conference, division}`. See [Entity reference IDs](/en/concepts/entity-reference-ids/). |
339340
| `away` | object\|undefined | **New (May 2026).** Nested away-team reference: `{id, numerical_id, name, abbreviation, logo, city, mascot, conference, division}`. |

content/en/concepts/_meta.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export default {
44
arbitrage: "Arbitrage",
55
"event-matching": "Event Matching",
66
"entity-reference-ids": "Entity Reference IDs",
7+
liquidity: "Liquidity & Limits",
78
"live-vs-prematch": "Live vs. Pre-Match",
89
"pinnacle-odds-changed-at": "Pinnacle `odds_changed_at`",
910
"polymarket-resolution": "Polymarket Resolution",

content/en/concepts/liquidity.mdx

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
---
2+
description: "What liquidity and limit signals SharpAPI surfaces (max_bet, volume, volume_24h, open_interest, exchange_token_id) and what upstream books don't expose."
3+
---
4+
5+
import { Callout } from 'nextra/components'
6+
7+
# Liquidity & Limits
8+
9+
SharpAPI surfaces every liquidity and limit signal we receive from upstream
10+
books. This page enumerates exactly what's available, which books emit each
11+
field, and what isn't surfaced (with a note on why).
12+
13+
## What we surface
14+
15+
Each field below is an optional column on the `/api/v1/odds` response. The
16+
field is only present on rows where the upstream book actually publishes it —
17+
treat all five as `undefined`-tolerant.
18+
19+
| Field | Type | Meaning | Emitting books |
20+
|-------|------|---------|----------------|
21+
| `max_bet` | number (USD) | Maximum wager the book will accept on this market / selection at the current line. | Pinnacle, SBObet |
22+
| `volume` | number | Cumulative traded volume on the selection, in the exchange's native units (USD for Kalshi). | Kalshi |
23+
| `volume_24h` | number | Rolling 24-hour traded volume in the exchange's native units. | Polymarket, Kalshi |
24+
| `open_interest` | number | Outstanding open contracts on the selection. | Kalshi |
25+
| `exchange_token_id` | string | Exchange's native token / market hash — used for downstream order routing on the exchange. | Polymarket (`token_id`), SX Bet (`marketHash`) |
26+
27+
<Callout type="info">
28+
The exchange-side fields (`volume`, `volume_24h`, `open_interest`,
29+
`exchange_token_id`) are the closest thing to a depth-of-book proxy that any
30+
public sportsbook API exposes. Use them as a coverage / liquidity signal when
31+
ranking selections within an exchange book; they are not directly comparable
32+
across books with different units.
33+
</Callout>
34+
35+
## What we don't surface (and why)
36+
37+
These are commonly asked about but are not surfaced today, because upstream
38+
books don't expose them in the public APIs we consume:
39+
40+
- **Bid / ask order-book depth.** Traditional sportsbooks don't operate a
41+
visible order book. Exchanges (Polymarket, Kalshi, Novig, SX Bet) operate an
42+
internal book but only publish aggregate volume / open-interest, not depth.
43+
- **Pre-bet limit checks.** No upstream book exposes a "will this wager be
44+
accepted at this size" probe via public API. The `max_bet` field above is
45+
the book's posted ceiling on the market — the actual accept-or-reject
46+
decision is made at slip-submission time.
47+
- **Real-time book-side suspension reasons.** When a book pulls a line we
48+
emit a `removed` delta on `/api/v1/odds/delta` and the row disappears from
49+
`/api/v1/odds`, but we do not publish a structured reason code (suspended /
50+
void / cashout-only / etc.) — upstream books don't expose one.
51+
52+
## Detecting coverage gaps
53+
54+
If a customer-side coverage check relies on liquidity, the recommended
55+
pattern is:
56+
57+
1. Filter `/api/v1/odds` by your books of interest.
58+
2. For exchange books, additionally filter rows where `volume_24h` or
59+
`open_interest` exceeds your minimum threshold.
60+
3. For traditional books, use `max_bet` (when emitted) as a coarse limit
61+
signal — Pinnacle and SBObet only.
62+
4. For everything else, fall back to row presence: an odds row in
63+
`/api/v1/odds` is a positive signal that the book is currently quoting
64+
that market.

0 commit comments

Comments
 (0)