Skip to content

Commit 4f68883

Browse files
Mlaz-codeclaude
andcommitted
docs(opportunities): update EV/arb/middles, add low-hold endpoint
EV: add missing query params (market, event, sort), fix live default (null not false), increase limit max to 500, add response fields (odds_decimal, true_probability, devig_method, devig_book, confidence_score, kelly_fraction, book_count, arb_available, is_player_prop, line), update response envelope to match actual API, add by_market to summary. Arbitrage: fix tier requirement (Hobby not Pro), add missing query params (sportsbook, market, live, format/CSV), add response fields (id, league, line, is_live, start_time, is_alternate_line, possibly_stale, warnings, game_state, ev_available, is_player_prop), add leg fields (implied_probability, timestamp, external_event_id), document CSV export format. Middles: add missing query params (live, max_odds_age, sort), fix min_size default (0.5), increase limit max to 500, add quality_score and market_overround fields, add fair_probability and deep_link to side object, document detail endpoint (GET /middles/:id). Low Hold: create new endpoint documentation page with full query params (max_hold, state, sort), response schema with side1/side2/side3, deep links, hold calculation explanation, and best practices. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 5770d74 commit 4f68883

5 files changed

Lines changed: 551 additions & 97 deletions

File tree

content/api-reference/_meta.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export default {
3838
"opportunities-arbitrage": "Arbitrage",
3939
"opportunities-middles": "Middles",
4040
"opportunities-middles-summary": "Middles Summary",
41+
"opportunities-low-hold": "Low Hold",
4142
"---Streaming": {
4243
type: "separator",
4344
title: "Streaming",

content/api-reference/opportunities-arbitrage.mdx

Lines changed: 95 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,21 @@ GET /api/v1/opportunities/arbitrage
1010

1111
## Authentication
1212

13-
Requires API key. **Pro tier or higher required.**
13+
Requires API key. **Hobby tier or higher required.** Your account must have the `arbitrage` feature enabled.
1414

1515
## Query Parameters
1616

1717
| Parameter | Type | Default | Description |
1818
|-----------|------|---------|-------------|
19-
| `sport` | string | all | Filter by sport (e.g., `basketball`, `football`) |
20-
| `league` | string | all | Filter by league (e.g., `nba`, `nfl`, `nhl`) |
21-
| `min_profit` | number | 0.5 | Minimum profit percentage (e.g., `1.0` = 1%) |
22-
| `limit` | integer | 50 | Results per page (max 200) |
23-
| `offset` | integer | 0 | Pagination offset |
19+
| `sport` | string | all | Filter by sport(s), comma-separated (e.g. `basketball`, `football`) |
20+
| `league` | string | all | Filter by league(s), comma-separated (e.g. `nba`, `nfl`, `nhl`) |
21+
| `sportsbook` | string | tier-allowed | Filter by sportsbook(s), comma-separated. Tier limits enforced. |
22+
| `market` | string | all | Filter by market type(s), comma-separated |
23+
| `min_profit` | number | 0.5 | Minimum profit percentage (e.g. `1.0` = 1%) |
24+
| `live` | boolean || `true` = live only, `false` = prematch only, omit = both |
25+
| `format` | string | `json` | Response format: `json` or `csv`. CSV downloads as `arbitrage_YYYY-MM-DD.csv`. |
26+
| `limit` | integer | 50 | Results per page (max 500) |
27+
| `offset` | integer | 0 | Pagination offset (max 5000) |
2428

2529
### Filtering Multiple Values
2630

@@ -82,45 +86,80 @@ for arb in data['data']:
8286
{
8387
"data": [
8488
{
89+
"id": "arb_dk_pin_nba_lal_bos_ml",
8590
"event_id": "evt_nba_lal_bos_20260208",
8691
"event_name": "Los Angeles Lakers @ Boston Celtics",
8792
"sport": "basketball",
93+
"league": "nba",
8894
"market_type": "moneyline",
95+
"line": null,
8996
"profit_percent": 1.83,
9097
"implied_total": 98.2,
98+
"is_live": false,
99+
"start_time": "2026-02-08T19:00:00Z",
100+
"is_alternate_line": false,
101+
"possibly_stale": false,
102+
"oldest_odds_age_seconds": 8,
103+
"warnings": [],
104+
"game_state": null,
105+
"ev_available": true,
106+
"ev_percentage": 3.5,
107+
"is_player_prop": false,
108+
"player_name": null,
109+
"stat_category": null,
91110
"legs": [
92111
{
93112
"sportsbook": "draftkings",
94113
"selection": "Los Angeles Lakers",
95-
"odds": 145,
96-
"decimal_odds": 2.45,
97-
"stake_percent": 41.5
114+
"odds_american": 145,
115+
"odds_decimal": 2.45,
116+
"implied_probability": 0.408,
117+
"stake_percent": 41.5,
118+
"timestamp": "2026-02-08T14:22:05.000Z",
119+
"external_event_id": "33483153",
120+
"selection_id": "sel_lal_ml",
121+
"market_id": "mkt_ml_33483153"
98122
},
99123
{
100124
"sportsbook": "pinnacle",
101125
"selection": "Boston Celtics",
102-
"odds": -135,
103-
"decimal_odds": 1.74,
104-
"stake_percent": 58.5
126+
"odds_american": -135,
127+
"odds_decimal": 1.74,
128+
"implied_probability": 0.574,
129+
"stake_percent": 58.5,
130+
"timestamp": "2026-02-08T14:22:08.000Z",
131+
"external_event_id": null,
132+
"selection_id": null,
133+
"market_id": null
105134
}
106135
],
107136
"detected_at": "2026-02-08T14:22:10.456Z"
108137
}
109138
],
110-
"meta": {
111-
"count": 3,
139+
"pagination": {
140+
"limit": 50,
141+
"offset": 0,
112142
"total": 3,
113-
"pagination": {
114-
"limit": 50,
115-
"offset": 0,
116-
"has_more": false,
117-
"next_offset": null
143+
"maxOffset": 5000
144+
},
145+
"meta": {
146+
"source": "cache",
147+
"summary": {
148+
"count": 3,
149+
"avg_profit": 1.23,
150+
"max_profit": 1.83,
151+
"by_market": { "moneyline": 2, "point_spread": 1 },
152+
"by_sport": { "basketball": 3 }
118153
},
119-
"updated_at": "2026-02-08T14:22:10.456Z",
120154
"filters": {
121-
"league": "nba",
122-
"min_profit": 1
123-
}
155+
"sport": null,
156+
"league": ["nba"],
157+
"sportsbook": null,
158+
"market": null,
159+
"live": null,
160+
"min_profit": 1.0
161+
},
162+
"books_analyzed": 8
124163
}
125164
}
126165
```
@@ -154,7 +193,7 @@ X-Request-Id: req_arb789xyz012
154193
{
155194
"error": {
156195
"code": "tier_restricted",
157-
"message": "Arbitrage detection requires Pro tier or higher",
196+
"message": "Arbitrage detection requires Hobby tier or higher",
158197
"docs": "https://sharpapi.io/docs/pricing"
159198
}
160199
}
@@ -175,12 +214,27 @@ X-Request-Id: req_arb789xyz012
175214

176215
| Field | Type | Description |
177216
|-------|------|-------------|
217+
| `id` | string | Unique arbitrage identifier (hash) |
178218
| `event_id` | string | Event identifier |
179219
| `event_name` | string | Human-readable event name |
180-
| `sport` | string | Sport identifier |
181-
| `market_type` | string | Market type (`moneyline`, `spread`, `total`) |
220+
| `sport` | string | Sport identifier (lowercase) |
221+
| `league` | string | League identifier |
222+
| `market_type` | string | Market type (`moneyline`, `point_spread`, `total_points`, etc.) |
223+
| `line` | number\|null | Spread/total line (e.g., `-3.5`) |
182224
| `profit_percent` | number | Guaranteed profit as a percentage (e.g., `1.83` = 1.83%) |
183225
| `implied_total` | number | Sum of implied probabilities across all legs (below 100 = arb exists) |
226+
| `is_live` | boolean | Whether the event is currently live |
227+
| `start_time` | string\|null | ISO 8601 event start time |
228+
| `is_alternate_line` | boolean | Whether this uses a non-standard line |
229+
| `possibly_stale` | boolean | Whether odds may have moved since detection |
230+
| `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`) |
232+
| `game_state` | object\|null | Live game state (`period`, `clock`, `score_home`, `score_away`) |
233+
| `ev_available` | boolean | Whether an EV opportunity exists on this market |
234+
| `ev_percentage` | number\|null | EV percentage if available |
235+
| `is_player_prop` | boolean | Whether this is a player prop market |
236+
| `player_name` | string\|null | Player name (if player prop) |
237+
| `stat_category` | string\|null | Stat type (if player prop, e.g., `points`, `rebounds`) |
184238
| `legs` | array | Array of bet legs that form the arbitrage |
185239
| `detected_at` | string | ISO 8601 timestamp when the arb was first detected |
186240

@@ -190,9 +244,22 @@ X-Request-Id: req_arb789xyz012
190244
|-------|------|-------------|
191245
| `sportsbook` | string | Sportsbook for this leg |
192246
| `selection` | string | The selection (team name, Over/Under, etc.) |
193-
| `odds` | number | American odds for this leg |
194-
| `decimal_odds` | number | Decimal odds for this leg |
247+
| `odds_american` | number | American odds for this leg |
248+
| `odds_decimal` | number | Decimal odds for this leg |
249+
| `implied_probability` | number | Implied probability (0.0 to 1.0) |
195250
| `stake_percent` | number | Percentage of total stake to place on this leg |
251+
| `timestamp` | string\|null | When these odds were captured (ISO 8601) |
252+
| `external_event_id` | string\|null | Sportsbook's native event ID |
253+
| `selection_id` | string\|null | Sportsbook's selection/outcome ID |
254+
| `market_id` | string\|null | Sportsbook's market ID |
255+
256+
### CSV Format
257+
258+
When `?format=csv`, the response downloads as `arbitrage_YYYY-MM-DD.csv` with columns:
259+
260+
```
261+
event,sport,market,line,profit%,implied_total,book1,selection1,odds1,stake1%,book2,selection2,odds2,stake2%,is_live,is_alternate_line,possibly_stale,warnings,detected_at
262+
```
196263

197264
---
198265

0 commit comments

Comments
 (0)