Skip to content

Commit 54cb3f3

Browse files
Mlaz-codeclaude
andcommitted
docs: fix undocumented API behaviors in EV, arbitrage, and streaming docs
EV endpoint (opportunities-ev.mdx): - Add 6 missing query params: min_odds, max_odds, min/max_market_width, max_odds_age, date_range (with ET timezone note) - Update devig_method from "multiplicative" to "power" (matches code change) - Update devigging explanation to show power method formula Arbitrage endpoint (opportunities-arbitrage.mdx): - Document the 10% profit cap (phantom arb filtering) - List actual arb warning values: LIVE_GAME, LIVE_HIGH_PROFIT_SUSPICIOUS, LOW_IMPLIED_TOTAL, POTENTIALLY_STALE_ODDS, VERY_STALE_ODDS WebSocket streaming (websocket.mdx): - Document snapshot chunking (1000 odds / 300 opps per frame) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent ed5dc8c commit 54cb3f3

3 files changed

Lines changed: 22 additions & 7 deletions

File tree

content/api-reference/opportunities-arbitrage.mdx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ Requires API key. **Hobby tier or higher required.** Your account must have the
2626
| `limit` | integer | 50 | Results per page (max 500) |
2727
| `offset` | integer | 0 | Pagination offset (max 5000) |
2828

29+
<Callout type="info">
30+
**Profit cap:** Opportunities with profit above 10% are automatically filtered out. These are almost always phantom arbs caused by stale or suspended odds rather than real opportunities.
31+
</Callout>
32+
2933
### Filtering Multiple Values
3034

3135
Use comma-separated values for multi-select filters:
@@ -228,7 +232,7 @@ X-Request-Id: req_arb789xyz012
228232
| `is_alternate_line` | boolean | Whether this uses a non-standard line |
229233
| `possibly_stale` | boolean | Whether odds may have moved since detection |
230234
| `oldest_odds_age_seconds` | number\|null | Age of the stalest leg's odds in seconds |
231-
| `warnings` | string[] | Warning flags (e.g., `POTENTIALLY_STALE_ODDS`) |
235+
| `warnings` | string[] | Warning flags. Possible values: `LIVE_GAME`, `LIVE_HIGH_PROFIT_SUSPICIOUS`, `LOW_IMPLIED_TOTAL`, `POTENTIALLY_STALE_ODDS`, `VERY_STALE_ODDS` |
232236
| `game_state` | object\|null | Live game state (`period`, `clock`, `score_home`, `score_away`) |
233237
| `ev_available` | boolean | Whether an EV opportunity exists on this market |
234238
| `ev_percentage` | number\|null | EV percentage if available |

content/api-reference/opportunities-ev.mdx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ Requires API key. **Pro tier or higher required.** Your account must have the `e
2828
| `min_ev` | number | 0 | Minimum EV percentage threshold |
2929
| `max_ev` | number || Maximum EV percentage threshold |
3030
| `live` | boolean || `true` = live only, `false` = prematch only, omit = both |
31+
| `min_odds` | number || Minimum American odds (e.g., `-200`) |
32+
| `max_odds` | number || Maximum American odds (e.g., `+500`) |
33+
| `min_market_width` | number || Minimum market width (vig indicator). Lower width = sharper market. |
34+
| `max_market_width` | number || Maximum market width |
35+
| `max_odds_age` | number || Maximum odds age in seconds. Filters out stale opportunities where the underlying odds are older than this threshold. |
36+
| `date_range` | string || Filter by event date: `today`, `tomorrow`, or `week`. Dates are evaluated in **US Eastern Time (ET)**. |
3137
| `sort` | string | `-ev` | Sort field. Options: `ev`, `confidence`/`confidence_score`, `kelly`/`kelly_fraction`, `time`/`start_time`, `book_count`/`books`. Prefix with `-` for descending. |
3238
| `include` | string || Set to `scoring` to add confidence, Kelly, and edge fields |
3339
| `limit` | integer | 50 | Results per page (max 500) |
@@ -102,7 +108,7 @@ for opp in data['data']:
102108
"no_vig_odds": -118,
103109
"true_probability": 0.541,
104110
"market_width": 3.2,
105-
"devig_method": "multiplicative",
111+
"devig_method": "power",
106112
"devig_book": "pinnacle",
107113
"selection": "PHO Suns",
108114
"market": "moneyline",
@@ -247,7 +253,7 @@ X-Request-Id: req_abc123def456
247253
| `no_vig_odds` | number\|null | Fair (no-vig) American odds derived from the sharp line |
248254
| `true_probability` | number\|null | Fair probability (0.0 to 1.0) |
249255
| `market_width` | number\|null | Width of the market (vig indicator) |
250-
| `devig_method` | string | De-vig method used (e.g., `multiplicative`) |
256+
| `devig_method` | string | De-vig method used (e.g., `power`) |
251257
| `devig_book` | string | Sharp book used as reference (e.g., `pinnacle`) |
252258
| `selection` | string | The selection (team name, Over/Under, player, etc.) |
253259
| `market` | string | Market type (`moneyline`, `point_spread`, `total_points`, etc.) |
@@ -319,17 +325,18 @@ SharpAPI uses **Pinnacle** (a sharp book with efficient odds) as the source of t
319325
Pinnacle: Team A -115 / Team B +105
320326
```
321327

322-
**Step 2: Remove the vig to find fair probability**
328+
**Step 2: Remove the vig to find fair probability (Power method)**
323329

324330
```javascript
325331
// Implied probabilities (with vig)
326332
probA = 1 / 1.87 = 0.535 // -115 in decimal = 1.87
327333
probB = 1 / 2.05 = 0.488 // +105 in decimal = 2.05
328334
total = 1.023 // 2.3% vig
329335

330-
// No-vig (fair) probabilities
331-
fairProbA = 0.535 / 1.023 = 0.523 (52.3%)
332-
fairProbB = 0.488 / 1.023 = 0.477 (47.7%)
336+
// Power devig: solve for k where probA^k + probB^k = 1
337+
// k ≈ 1.036 for this market
338+
fairProbA = 0.535^1.036 = 0.522 (52.2%)
339+
fairProbB = 0.488^1.036 = 0.478 (47.8%)
333340
```
334341

335342
**Step 3: Compare to a soft book**

content/streaming/websocket.mdx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ On connect you receive messages in order:
101101
4. **`initial`** -- Per-sportsbook odds snapshot (only if `odds` channel is subscribed)
102102
5. **`snapshot_complete`** -- Signals all initial data has been sent
103103

104+
<Callout type="info">
105+
**Snapshot chunking:** Large snapshots are split across multiple frames to prevent backpressure. Odds snapshots are chunked at 1,000 items per frame, and opportunity snapshots at 300 items per frame. Wait for `snapshot_complete` before treating the initial data as fully loaded.
106+
</Callout>
107+
104108
After that, you receive incremental updates for your subscribed channels:
105109

106110
- **`odds_update`** -- Odds changed for a sportsbook (requires `odds` channel)

0 commit comments

Comments
 (0)