+EV History
Price history for one bet on one game: every moment SharpAPI flagged the bet as +EV, and — opt-in — the sportsbook’s own price trail for the same bet.
GET /api/v1/ev/historyEnterprise tier required. This endpoint is gated by the history feature. Lower tiers receive 403 tier_restricted.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
game_id | string | — | Required. The game to read. |
sportsbook | string | all | Filter by sportsbook(s), comma-separated. Exactly one is required when include_book_trail=true. |
market_type | string | all | Filter by market type. Required when include_book_trail=true. |
selection | string | all | Filter by selection. Required when include_book_trail=true. |
line | number | all | Filter to one line. Optional, including with include_book_trail=true; when omitted the trail covers every line of that market and each point’s points says which. |
player | string | all | Exact match on the player name, for player props. |
since | string | 60 minutes ago | Start of the window: RFC 3339 timestamp or Unix seconds. |
limit | integer | 200 | Maximum rows, 1–500. |
include_book_trail | boolean | false | true or 1 adds book_trail, book_trail_carry_in and prematch_close to the response (see below). |
With include_book_trail=true, a request that does not pin one sportsbook, a market_type and a selection is rejected with 400 validation_error: trail points carry no sportsbook, market or selection label, so an under-specified request would mix several bets into one series.
Book trail
include_book_trail=true adds the sportsbook’s own price trail for the pinned bet — the prices the book showed, not only the moments SharpAPI flagged the bet as +EV.
{
"success": true,
"data": [ /* +EV rows */ ],
"book_trail": [ { "t": "2026-10-13T12:10:00Z", "price": -190, "points": 1.5, "locked": false } ],
"book_trail_carry_in": { "t": "2026-10-13T01:50:51.66Z", "price": -275, "points": 1.5, "locked": false },
"prematch_close": null,
"meta": {
"game_id": "…",
"count": 3,
"book_trail_available": true,
"book_trail_count": 1,
"book_trail_truncated": false
}
}book_trail_carry_in
The price already standing at the left edge of your window: the newest row for the same bet stamped before since. Draw it as the starting point of the line so the chart does not begin at the first change inside the window.
- Shape:
{ "t", "price", "points", "locked" }, the same fields as abook_trailpoint, ornull. - Present on every response with
include_book_trail=true. Without that parameter the key is absent. - It is
nullwhen no row exists within 36 hours of now (or ofsince, if that is earlier). A bet last touched more than 36 hours before the window therefore also readsnull. - It is not part of
book_trail: it is never merged with those points, and it is not counted inmeta.book_trail_countormeta.book_trail_truncated, which describe the window rows only.
Reading “line opened in window”. Treat the line as opened inside the window only when book_trail_carry_in is null and meta.book_trail_truncated is false. When the trail is truncated, a null carry-in says nothing about when the line opened.
prematch_close
The book’s last pre-match price for the pinned bet, or null. It is null until the event has started.