Betting Splits
Get public betting splits (handle % and bet %) from DraftKings and Circa Sports.
GET /api/v1/splitsAuthentication
Requires API key. Requires Pro tier ($229/mo) or higher.
What are betting splits?
Handle % is the percentage of total money wagered on each side. Bet % is the percentage of total tickets (bets placed) on each side.
The gap between bet % and handle % reveals sharp money. If 30% of tickets carry 60% of the money, sharp bettors are on that side.
Data Sources
| Source | Type | Update Frequency |
|---|---|---|
| DraftKings | Recreational book (~35% US market share) | Every 5 minutes |
| Circa Sports | Sharp-friendly book (attracts professionals) | Every 5 minutes |
Comparing DraftKings (recreational) vs Circa (sharp) splits reveals where professional money diverges from the public.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
sport | string | Filter by sport (comma-separated). Example: basketball |
league | string | Filter by league (comma-separated). Example: nba,ncaab |
sportsbook | string | Filter by splits source. Example: draftkings,circa |
event_id | string | Filter by canonical event ID (comma-separated) |
market | string | Filter to events that carry a given split market (comma-separated). One or more of spread, total, moneyline. |
limit | integer | Max results (default 100, max 200) |
offset | integer | Pagination offset (default 0) |
Response
{
"data": [
{
"event_id": "mlb_guardians_orioles_2026-04-16",
"sport": "baseball",
"league": "mlb",
"sportsbook": "draftkings",
"away_team": "Baltimore Orioles",
"home_team": "Cleveland Guardians",
"spread": {
"away_odds": -1.5,
"home_odds": 1.5,
"handle_pct": { "away": 0.22, "home": 0.78 },
"bets_pct": { "away": 0.20, "home": 0.80 }
},
"total": {
"line": 8,
"handle_pct": { "over": 0.53, "under": 0.47 },
"bets_pct": { "over": 0.57, "under": 0.43 }
},
"moneyline": {
"away_odds": 104,
"home_odds": -126,
"handle_pct": { "away": 0.28, "home": 0.72 },
"bets_pct": { "away": 0.33, "home": 0.67 }
},
"fetched_at": "2026-04-16T19:25:28.363825+00:00"
}
],
"pagination": {
"limit": 100,
"offset": 0,
"count": 1,
"total": 41,
"has_more": false,
"next_offset": null
},
"updated_at": "2026-04-16T19:29:38.920698424Z"
}In the /splits response the spread carries line values inside the away_odds/home_odds keys (e.g. -1.5 / +1.5) — the field naming is a known inconsistency. The historical endpoint uses away_line/home_line for the same data.
Response Fields
| Field | Type | Description |
|---|---|---|
event_id | string | Canonical event ID — use this to join with /odds data |
sport | string | Atlas-normalized sport name |
league | string | Atlas-normalized league name |
sportsbook | string | Source sportsbook for the splits data (draftkings or circa) |
away_team | string | Away team name |
home_team | string | Home team name |
spread.away_odds | number | Away spread line value (e.g., -1.5) — see callout above |
spread.home_odds | number | Home spread line value (e.g., +1.5) |
spread.handle_pct | object | Money % on each side (away, home; 0.0-1.0) |
spread.bets_pct | object | Ticket % on each side (away, home; 0.0-1.0) |
total.line | number | Over/under line (e.g., 225.5) |
total.handle_pct | object | Money % (over, under; 0.0-1.0) |
total.bets_pct | object | Ticket % (over, under; 0.0-1.0) |
moneyline.away_odds | number | Away moneyline odds (American format) |
moneyline.home_odds | number | Home moneyline odds (American format) |
moneyline.handle_pct | object | Money % on each side (away, home; 0.0-1.0) |
moneyline.bets_pct | object | Ticket % on each side (away, home; 0.0-1.0) |
fetched_at | string | ISO 8601 timestamp when data was last scraped |
The event_id field uses the same canonical ID format as the /odds endpoint, so you can join splits with odds data directly.
For example, fetch odds for a specific game and compare with its splits:
GET /api/v1/odds?event_id=nba_thunder_timberwolves_2026-03-15
GET /api/v1/splits?event_id=nba_thunder_timberwolves_2026-03-15Per-Selection Bet % (BetMGM)
In addition to the game-level splits from this endpoint, BetMGM odds items in the /odds response include an inline public_bet_pct field (0.0-1.0) representing ticket percentage per selection. This is available on NBA (100%), MLB (100%), and NHL (~60%) prematch markets.
Examples
All NBA Splits
curl "https://api.sharpapi.io/api/v1/splits?league=nba" \
-H "X-API-Key: YOUR_API_KEY"Splits History
Track how splits shift over time for a specific event.
GET /api/v1/splits/history?event_id={event_id}Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
event_id | string | Yes | Canonical event ID |
sportsbook | string | No | Filter by book (comma-separated). When set, limit is applied client-side after fetching all matching entries. |
start_time | string | No | Lower bound. RFC 3339 (2026-04-16T13:00:00Z) or Unix seconds (1776344602). |
end_time | string | No | Upper bound, same formats. |
limit | integer | No | Max entries (default 100, max 200). |
Response
Entries are sorted oldest-first. This endpoint emits the success envelope (success/data/meta) — distinct from /splits which emits data/pagination/updated_at.
The history payload uses book (not sportsbook) and the spread carries away_line/home_line (not away_odds/home_odds). Both are known inconsistencies vs /splits.
{
"success": true,
"data": [
{
"book": "circa",
"ts": "2026-04-16T13:03:21.071966+00:00",
"timestamp": 1776344602.36,
"spread": {
"away_line": -1.5,
"home_line": 1.5,
"handle_pct": { "away": 0.37, "home": 0.63 },
"bets_pct": { "away": 0.27, "home": 0.73 }
},
"total": {
"line": 8,
"handle_pct": { "over": 0.43, "under": 0.57 },
"bets_pct": { "over": 0.55, "under": 0.45 }
},
"moneyline": {
"away_odds": 104,
"home_odds": -126,
"handle_pct": { "away": 0.35, "home": 0.65 },
"bets_pct": { "away": 0.35, "home": 0.65 }
}
}
],
"meta": {
"event_id": "mlb_guardians_orioles_2026-04-16",
"total": 3,
"books": ["circa", "draftkings"],
"oldest": "2026-04-16T13:03:22.360588312Z",
"newest": "2026-04-16T13:08:41.199237823Z",
"updated_at": "2026-04-16T19:28:50.525875452Z"
}
}Data is collected every ~5 minutes and retained for 48 hours via a Valkey sorted set (splits_history:{event_id}) scored by Unix timestamp.
Full History
curl "https://api.sharpapi.io/api/v1/splits/history?event_id=nba_thunder_timberwolves_2026-03-15" \
-H "X-API-Key: YOUR_API_KEY"Interpreting Splits
| Signal | What it means |
|---|---|
| Bet % high, Handle % low | Public side — lots of small bets |
| Bet % low, Handle % high | Sharp side — fewer but larger bets |
| DK and Circa agree | Market consensus — both public and sharp aligned |
| DK and Circa diverge | Sharp-public split — Circa (sharp) disagrees with DK (public) |
Splits data only comes from recreational books (DraftKings) and one sharp-adjacent book (Circa). No sharp book publishes splits. Use splits as one signal alongside line movement and +EV analysis, not in isolation.