Skip to Content
API Reference+EV History

+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/history

Enterprise tier required. This endpoint is gated by the history feature. Lower tiers receive 403 tier_restricted.

Query ParametersPermalink for this section

ParameterTypeDefaultDescription
game_idstring—Required. The game to read.
sportsbookstringallFilter by sportsbook(s), comma-separated. Exactly one is required when include_book_trail=true.
market_typestringallFilter by market type. Required when include_book_trail=true.
selectionstringallFilter by selection. Required when include_book_trail=true.
linenumberallFilter 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.
playerstringallExact match on the player name, for player props.
sincestring60 minutes agoStart of the window: RFC 3339 timestamp or Unix seconds.
limitinteger200Maximum rows, 1–500.
include_book_trailbooleanfalsetrue 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 trailPermalink for this section

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_inPermalink for this section

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 a book_trail point, or null.
  • Present on every response with include_book_trail=true. Without that parameter the key is absent.
  • It is null when no row exists within 36 hours of now (or of since, if that is earlier). A bet last touched more than 36 hours before the window therefore also reads null.
  • It is not part of book_trail: it is never merged with those points, and it is not counted in meta.book_trail_count or meta.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_closePermalink for this section

The book’s last pre-match price for the pinned bet, or null. It is null until the event has started.

Last updated on