EV calculator

EV calculator for sports bets: enter the odds and your fair probability or the fair odds, and get the expected value per bet, the edge and the break-even price.

Expected value, edge and break-even price for a bet, from the odds and your fair probability.

The calculator runs in your browser with JavaScript; the formulas it uses are explained below.

An EV calculator tells you what a bet is worth on average. Enter the odds a book is offering and your estimate of the true probability, or the fair odds from a no-vig calculation, and it returns the expected value per bet, the edge as a percentage of the stake, and the break-even price: the shortest odds at which the bet still pays its way. Below: the inputs and outputs, the betting EV formula, two worked examples, the mistakes that make an edge look bigger than it is, and how to get both inputs from the API.

How to use the EV calculator

There are two inputs, plus an optional stake:

It returns three numbers:

Used as a positive EV calculator, the question becomes simple: is the offered price longer than the break-even price? If it is, the edge is above zero.

The betting EV formula

With decimal odds D, fair probability p and stake S:

EV   = p × (D − 1) × S − (1 − p) × S
     = S × (p × D − 1)

edge                     = p × D − 1
break-even probability   = 1 / D
break-even (fair) price  = 1 / p      (decimal odds)

The first line is the textbook version: the chance of winning times the profit, minus the chance of losing times the stake. It simplifies to one multiplication, the edge formula the MCP find_outliers tool uses. If you have fair odds rather than a probability, convert them first: p = 1 / fair decimal odds.

Worked example 1: an underdog priced above fair

A sharp book has a game at -165 / +140. De-vigged with the multiplicative method in the no vig calculator, the underdog's fair probability is 40.09%, fair odds +149.4. Another book offers the underdog at +155, decimal 2.55.

On average, bets like this return $2.23 per $100 staked, yet any single one still loses about 60% of the time. With the additive no-vig method the fair probability is 39.70% and the edge falls to about 1.24%, a reminder that the edge is only as precise as the fair probability behind it.

Worked example 2: a prop priced below fair

A pitcher's strikeouts, Over 6.5. The consensus fair probability of the over, from several books' no-vig prices, is 53.5%. One book offers the over at -125, decimal 1.80.

The over is more likely than not to hit, but the price is shorter than fair, so the bet loses money on average. A likely outcome isn't the same as a good price; the expected value calculator measures the price against the probability.

Common mistakes

Getting the inputs from the API

Both inputs come from odds data. For the fair probability, pull a sharp book with format=probability and de-vig it. For the offered price, /v1/best-lines returns the best price per outcome across every sportsbook and exchange at identical lines, with best_books naming where it is.

const headers = { Authorization: `Bearer ${process.env.PRECISEAPI_KEY}` };
const base = 'https://api.preciseapi.com/v1';

const [sharp, best] = await Promise.all([
  fetch(`${base}/odds?league=nba&markets=moneyline&books=pinnacle&format=probability`, { headers }).then((r) => r.json()),
  fetch(`${base}/best-lines?league=nba&markets=moneyline&format=decimal`, { headers }).then((r) => r.json()),
]);

// Fair probability per event and side, from Pinnacle's no-vig moneyline.
const fair = new Map();
for (const e of sharp.data) for (const b of e.bookmakers) for (const m of b.markets) {
  const total = m.outcomes.reduce((s, o) => s + o.price, 0);
  for (const o of m.outcomes) fair.set(`${e.id}|${o.side}`, o.price / total);
}

for (const e of best.data) for (const m of e.markets) for (const o of m.outcomes) {
  const p = fair.get(`${e.id}|${o.side}`);
  if (p) console.log(o.name, o.best_price, o.best_books.join(', '), `edge ${((p * o.best_price - 1) * 100).toFixed(2)}%`);
}

There is no /v1/ev endpoint: the calculation runs on your side, so you choose the reference book and the de-vig method. A /v1/odds call costs 2 credits and a /v1/best-lines call 3. The positive EV API page walks through the full workflow, and on the MCP server the find_outliers tool scans a league for prices above the no-vig consensus or a sharp book and ranks them by edge. Prices move and books limit winning players, so verify every number at the book before betting.

Frequently asked questions

What is a good EV percentage?

There's no fixed threshold. Large apparent edges on main markets are rare, and they usually turn out to be a stale price or a mismatched line. Check the price at the book and the timestamps before treating an edge as real.

What is the difference between expected value and edge?

Edge is expected value divided by the stake. An expected value of $2.23 on a $100 bet is a 2.23% edge.

Where should the fair probability come from?

Usually a no-vig price from a sharp book such as Pinnacle, or the median of several books' no-vig prices. A model's probability also works if it is well calibrated against results.

Does the EV calculator work for parlays?

For independent legs, multiply the legs' fair probabilities and their decimal odds, then apply the same formula. Same-game parlays have correlated legs, and their prices aren't in the feed. API access for the inputs starts on Edge; see pricing.

More calculators