---
title: "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."
method: GET
path: "/api/v1/{sport}/ev"
tags: ["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.

`GET /api/v1/{sport}/ev`

## Request

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

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).

## Path parameters

- `sport` string, required

## Query parameters

- `min_ev` string
- `book` string
- `venues` string

## Response `200`

OK

- EVResponse: Response for `GET /api/v1/{sport}/ev` (MVP+). Pre-game value bets only. 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 (Novig by default, Kalshi and Polymarket with `venues: true`) under 2 minutes, each by its own timestamp. The optional fields (`kind`, `fairUnadjusted`, `roi`, `fee`, `tradeable`, `reason`, `route`, `size`, `link` and `quoteAgeMs` on an opportunity, `canonicalEventId` and `fair` on an event, `board` in `meta`) come with `fair_method: "fair_v1"`.
  - `data` EVEvent[]
    - `awayTeam` string
    - `booksInConsensus` number, double: Independent price sources behind the event's fair.
    - `canonicalEventId` string, nullable: Our stable id of the game, `{sport}:{away}@{home}-{date}`: the `eventId` the odds board and the history endpoints use. Null when unknown.
    - `commenceTime` string
    - `eventId` string: The game's `id` on the odds board. The history endpoints take `canonicalEventId` instead.
    - `fair` EVFair: How an event's fair was formed, and the fair per side before the 1-point margin. Each side is de-vigged on its own, conservatively, so the sides can sum to slightly less than 1.
      - `anchor` string, nullable: Which Pinnacle line anchored the fair: the realtime feed or the /odds entry; null when Pinnacle did not.
      - `away` number, double, nullable: Fair probability of an away win before the margin; null when there is none.
      - `draw` number, double, nullable: Fair probability of a draw before the margin (three-way markets); null otherwise.
      - `home` number, double, nullable: Fair probability of a home win before the margin; null when there is none.
      - `method` string, nullable: `pinnacle`: Pinnacle's de-vigged line. `consensus`: no Pinnacle line, so the median of at least three independent books; only venues are scored against it, never a sportsbook. Null when there is no fair (`reason` says why).
      - `reason` string, nullable: Why there is no fair, in plain text; null when there is one.
      - `sources` number, double: Independent price sources behind the event's fair.
    - `fairProbability` object: The conservative fair per side (the fair minus 1 percentage point); null for a side with no fair. The fair before the margin is in `fair`.
      - `away` number, double, nullable
      - `draw` number, double, nullable
      - `home` number, double, nullable
    - `homeTeam` string
    - `market` string
    - `opportunities` EVOpportunity[]: Best EV first.
      - `book` string: Sportsbook or venue key. `kalshi` and `polymarket` are listed only with `venues: true`.
      - `bookImplied` number, double: Implied probability of `bookPrice` (a sportsbook's includes its vig; a venue's is its ask).
      - `bookPrice` number, double: American odds of the price: a sportsbook's price, or a venue's ask.
      - `booksInConsensus` number, double: Independent price sources behind the fair this price was scored against. A sportsbook's own feed never counts toward its own fair, so 1 means Pinnacle alone.
      - `edgePp` number, double: (fairProbability - bookImplied) * 100, in percentage points.
      - `evPct` number, double: Expected value %, at `fairProbability`. Sportsbook: `(fairProbability * decimalOdds - 1) * 100`. Venue, its fee included: `(fairProbability - ask - fee) / (ask + fee) * 100`.
      - `fairPrice` number, double: American odds of `fairProbability` (the break-even price).
      - `fairProbability` number, double: The conservative fair probability of this outcome: the fair minus 1 percentage point. `fairPrice`, `evPct`, `edgePp` and `kellyFraction` are computed at it.
      - `fairUnadjusted` number, double: The fair probability before the 1-point margin: `fairProbability` is this minus 0.01.
      - `fee` number, double: The venue's trading fee per contract, in dollars; 0 for a sportsbook.
      - `kellyFraction` number, double: Full-Kelly bankroll fraction at `fairProbability`.
      - `kind` string: `book` for a sportsbook, `venue` for an exchange or prediction market (Novig, Kalshi, Polymarket).
      - `link` string, nullable: The market's page at the venue; null for a sportsbook.
      - `market` string
      - `quoteAgeMs` number, double, nullable: Age of the price when this answer was served, in milliseconds, by its own timestamp; null when unknown.
      - `reason` string, nullable: Why it is not tradeable, in plain text (such as `EV under 2%`); null when it is.
      - `roi` number, double: `evPct / 100`, not rounded: EV per dollar staked (sportsbook) or per dollar paid, fee included (venue).
      - `route` string, nullable: Kalshi and Polymarket: the contract to buy, `yes`, or `no:<CODE>` (NO on the opponent's market). Null otherwise.
      - `side` string
      - `size` number, double, nullable: Dollars available at the ask; null when unknown (Polymarket, sportsbooks).
      - `team` string
      - `tradeable` boolean: Whether the opportunity clears the markets page trade bar. Sportsbook: EV of at least 2%. Venue: EV of at least 4%, a bid, a spread of 4 cents or less and at least $50 at the ask.
    - `sport` string
  - `meta` object
    - `board` EVBoard: The board an EV response was read from, and how old it is.
      - `ageMs` number, double, nullable: Age of the board when this response was sent, in milliseconds; null when there is no board.
      - `builtAt` string, nullable: When the board was built (ISO 8601); null when there is no board.
      - `stale` boolean: True when there is no board or it is too old: no EV is served from it.
      - `venueQuotes` boolean: Whether the board holds Kalshi or Polymarket quotes.
      - `venues` boolean: Whether this request asked for Kalshi and Polymarket (`venues=true`).
    - `book` string
    - `events` number, double
    - `fair_method` string: How the fair is computed: `fair_v1` (Pinnacle's de-vigged line, the other books only veto, a 1-point margin). `consensus_devig_median` is the method it replaced.
    - `freshness` object: Age of the odds snapshot behind the answer. `ageSeconds` is always a number; `stale` is true when the snapshot is over 90 seconds old or there is no data.
      - `ageSeconds` number, double
      - `stale` boolean
    - `market` string
    - `max_ev` number, double
    - `min_ev` number, double
    - `odds_format` string
    - `opportunities` number, double
    - `pregame_only` boolean
    - `sport` string
    - `timestamp` string: When the odds snapshot behind the answer was written (ISO 8601); `1970-01-01T00:00:00.000Z` when there is no data at all.
  - `success` boolean

---

[API](https://skmtc.dev/owlsinsight/apis/owls-insight-api.md) · [All operations](https://skmtc.dev/owlsinsight/apis/owls-insight-api/llms.txt) · [OpenAPI document](https://skmtc.dev/owlsinsight/apis/owls-insight-api/revisions/76c1ea016ff1?raw)
