EV / value bets

Returns positive expected value opportunities for a sport: for each event, the sportsbooks offering a moneyline price that beats our fair price. The fair is Pinnacle's de-vigged line; the other books do not move it, they only block a side when they disagree with it by more than 1.5 points. EV is computed at the fair minus a 1-point safety margin, the same math as the public markets page.

Returns positive expected value opportunities for a sport: for each event, the sportsbooks offering a moneyline price that beats our fair price. The fair is Pinnacle's de-vigged line; the other books do not move it, they only block a side when they disagree with it by more than 1.5 points. EV is computed at the fair minus a 1-point safety margin, the same math as the public markets page.

fairProbability is the conservative fair: the fair minus 1 point. fairPrice, evPct, edgePp and kellyFraction are all computed at it, so for a sportsbook evPct = (fairProbability x decimal odds - 1) x 100. The fair before that margin is fairUnadjusted on each opportunity and fair.home / fair.away / fair.draw on each event.

Each sportsbook price is scored against a fair that leaves that book's own feed out, so a book never votes on its own price. Sportsbook prices are scored only when Pinnacle prices the game; exchange prices (Novig, and Kalshi and Polymarket with venues=true) can also be scored against the agreement of at least three independent books. booksInConsensus on an opportunity counts the independent sources behind the fair that price was scored against (1 means Pinnacle alone); on an event it counts the sources behind the event's fair.

tradeable is true when the opportunity clears the markets page trade bar (sportsbooks: EV of at least 2%; prediction markets: at least 4%, a bid, a spread of 4 cents or less and at least $50 at the ask); reason says why not. For a prediction market, evPct = (fairProbability - ask - fee) / (ask + fee) x 100.

No opportunity is listed while the odds snapshot behind the answer is over 90 seconds old, or for a game that has started. Within that, a sportsbook price must be under 3 minutes old and an exchange quote under 2 minutes, each by its own timestamp; quoteAgeMs is its age when the answer was served. meta.freshness and meta.board say how old the data is; with no data at all, meta.timestamp is 1970-01-01T00:00:00.000Z and meta.freshness.stale is true.

Moneyline only and pregame only; meta.market and meta.pregame_only state this on every response.

Prices are American odds (meta.odds_format).

get/api/v1/{sport}/ev

Request

  • Base URL: https://api.owlsinsight.com
  • URL: https://api.owlsinsight.com/api/v1/{sport}/ev
  • Auth: HTTP bearer

Path parameters

sportstring required

Query parameters

min_evstring

Minimum EV percentage to include. Default 0 (every positive-EV price). Clamped to meta.max_ev; anything above that ceiling is treated as a stale-line artifact and dropped.

bookstring

Restrict opportunities to one sportsbook key (or kalshi / polymarket with venues=true).

venuesstring

true also lists Kalshi and Polymarket buys, with their trading fee included in the EV. The first request for a sport starts their prices; they appear within about 15 seconds and stay on while you keep asking.

Response

OK

successboolean

Changes

No recorded changes to this operation across all 1 revision of this API.