VALUEODDSAPI / DEVELOPER RESOURCES
How to find value bets: a step-by-step method
Value bets are found by comparison, not by prediction. This guide walks through the six steps from raw odds to a bet you can trust, shows where value usually appears and ends with a small Python scanner.
Published by ValueOddsAPI · 3 November 2026

In 30 seconds
- The method: take a sharp bookmaker’s price, remove its margin, and look for other bookmakers paying more than that fair price.
- The formula: EV = soft odds × fair probability − 1. Flag a bet when EV is above your threshold, for example +2%.
- Where they appear: mostly in the seconds and minutes after news, when soft bookmakers are slower to move than sharp ones.
- What breaks it: comparing different lines, periods or settlement rules, and using prices that are no longer live.
What you need before you start
Finding value bets is a comparison exercise. You need five things, and none of them is a gut feeling about who will win:
A fair reference: a price you trust to be close to the true probability, usually from a sharp bookmaker. Soft bookmakers: the bookmakers where you can actually place bets. Fresh odds: prices for both, captured at the same moment. A threshold: the minimum expected value you will act on. A log: a record of every bet, so you can check later whether the method works.
If the term itself is new to you, start with What is value betting? and come back.
Step 1: pick a fair reference
Every value bet is measured against a fair price, so the reference is the most important choice you make.
| Reference | Why it is used | Strength | Watch out for |
|---|---|---|---|
| Pinnacle | Low margins, high limits and fast reactions to information. | Strong | Coverage is thinner in small leagues and niche markets. |
| A betting exchange | Prices are set by other bettors, not a trader. | Good in liquid markets | Commission, and thin markets where the back and lay prices are far apart. |
| Consensus of many bookmakers | The average of many margin-free prices. | Medium | Slow soft bookmakers pull the average towards their own errors. |
Read more about using Pinnacle as a reference in Pinnacle odds API, and see the full list in Sharp vs soft bookmakers.
Step 2: match exactly the same bet

Most false value bets come from comparing two bets that only look the same. Over 2.5 and Over 2.75 goals are different bets, and so are full time and first half. Player markets can have different rules for a player who does not start.
Match on event, market, period, line and settlement rules, and only use a reference market that is complete and open. If no exact match exists, skip the bet instead of using the closest one.
Step 3: remove the margin from the reference
Even a sharp price contains a margin. If Over and Under both cost 1.95, the implied probabilities are 51.3% each and add up to 102.6%. Divide each one by 1.026 and you get the fair probability: 50.0% each, or a fair price of 2.00.
That proportional method is the most common starting point. Other methods, such as power or Shin, shift more of the margin onto outsiders. The differences and the code are in How to remove the bookmaker margin.
Step 4: calculate the expected value of every price
Now compare each soft bookmaker with the fair probability: EV = odds × fair probability − 1. With a fair price of 2.00 (50%):
| Soft price | Calculation | Expected value | Verdict |
|---|---|---|---|
| 1.95 | 1.95 × 0.500 − 1 | −2.5% | No value |
| 2.03 | 2.03 × 0.500 − 1 | +1.5% | Below a +2% threshold |
| 2.10 | 2.10 × 0.500 − 1 | +5.0% | Value bet |
More worked examples in How to calculate expected value.
Step 5: filter before you bet
| Filter | A common starting point | Why |
|---|---|---|
| Minimum EV | +1% to +3% | Leaves room for small errors in the fair price. |
| Maximum price age | A few seconds pre-match, less in-play | Old prices are often gone by the time you try to bet. |
| Odds range | For example 1.50 to 5.00 | Fair prices on long shots are less certain, and results swing more. |
| Market status | Open, complete reference market | A suspended or partial market cannot be de-margined correctly. |
| Stake rule | Flat stake or a fraction of Kelly | Decided in advance, so one bet never decides your month. |
Step 6: log every bet and check closing line value
Record the price you took, the fair price at that moment, the time and the stake. After the event, add the closing price. If you consistently beat the closing price, your method is finding real value, even in a month where results are poor. Profit and loss take thousands of bets to say the same thing.
How to calculate it, with code: Closing line value (CLV).
Where value bets usually show up
Value bets are not spread evenly. They appear where soft bookmakers are slow, and disappear when they catch up:
| Situation | Why value appears | How long it lasts |
|---|---|---|
| After news | Line-ups, injuries or weather move the sharp price first. | Seconds to minutes |
| Early prices | New markets are opened before much money has corrected them. | Minutes to hours |
| Smaller leagues | Bookmakers spend less trading effort on them. | Varies |
| Secondary markets | Corners, cards and player props get less attention than 1X2. | Varies |
| In-play | Prices change constantly and some bookmakers lag. | Seconds |
Main markets in top leagues close to kick-off are the most efficient. Value there is rare and small.
Finding value bets in football
Football is the most common sport for value betting because almost every bookmaker covers it and the sharp reference markets are deep. A practical order to work in:
Totals and Asian handicaps in the top leagues have the most reliable sharp prices, so the fair price is trustworthy. 1X2 works the same way but needs a three-way margin removal. Corners, cards and player props have more value, but weaker references and more settlement differences between bookmakers, so check step 2 carefully.
Three ways to do it
| By hand | Value bet finder tool | Odds API + your own code | |
|---|---|---|---|
| How it works | Compare odds sites and calculate in a spreadsheet | A subscription service lists bets for you | You fetch odds and apply your own rules |
| Speed | Slow | Fast | Fast |
| Control over the method | Full | Little | Full |
| Scale | A few matches | What the tool covers | Every bookmaker and market you subscribe to |
| Best for | Learning the method | Individual bettors | Products, models and serious volume |
A minimal value bet scanner in Python
This script does steps 2 to 5 against the ValueOddsAPI response format: each row has the bookmaker’s original price, the margin-free fair probability and the age of the observation. Use the bookmaker IDs your key is entitled to.
import os
import requests
BASE = os.environ["VALUEODDS_BASE_URL"]
KEY = os.environ["VALUEODDS_API_KEY"]
REFERENCE = "pinnacle" # the sharp price you trust
SOFT = ["bet365", "unibet", "betano"] # the prices you can take
MIN_EV = 0.02 # flag +2% or better
MAX_AGE = 10 # seconds; older prices are skipped
def fetch(bookmakers):
r = requests.get(f"{BASE}/v1/odds",
params={"phase": "prematch", "bookmakers": ",".join(bookmakers)},
headers={"Authorization": f"Bearer {KEY}"}, timeout=10)
r.raise_for_status()
return r.json()["data"]
def same_bet(row, outcome):
m = row["market"]
return (row["event_id"], m["id"], m["period"], m["line"], m["settlement"], outcome["id"])
rows = [r for r in fetch([REFERENCE, *SOFT])
if r["market"]["status"] == "open" and r["data_age_seconds"] <= MAX_AGE]
# Step 3: fair probabilities from the reference (the API has removed the margin)
fair = {same_bet(r, o): o["fair_probability"]
for r in rows if r["bookmaker"] == REFERENCE and r["market"]["fair_status"] == "available"
for o in r["market"]["outcomes"]}
# Steps 4-5: expected value for every soft price, filtered by threshold
for r in rows:
if r["bookmaker"] == REFERENCE:
continue
for o in r["market"]["outcomes"]:
p = fair.get(same_bet(r, o))
if p is None:
continue # no matching reference: skip, never guess
ev = o["bookmaker_odds"] * p - 1
if ev >= MIN_EV:
print(f'{r["event_id"]} {r["market"]["id"]} {o["id"]} @ {r["bookmaker"]}: '
f'{o["bookmaker_odds"]:.2f} vs fair {1 / p:.2f} -> EV {ev:+.1%}')In production you would run it on a WebSocket stream instead of polling, store every flagged bet, and add the closing price after kick-off. See the integration guide and the value betting API.
Frequently asked questions
How do you identify a value bet?
Find a fair probability for the outcome, usually by removing the margin from a sharp bookmaker’s price, and compare it with the odds on offer. If odds × fair probability − 1 is positive, the bet has value.
How do I calculate value bets?
Multiply the decimal odds by the fair probability and subtract 1. With odds of 2.10 and a fair probability of 50%, 2.10 × 0.50 − 1 = +5%.
What is a value bet finder?
A tool that compares many bookmakers with a fair reference and lists the prices above it. You can use a ready-made service, or build your own with an odds API and the steps in this guide.
Do I need a Pinnacle account to use it as a reference?
No. You only need its prices. Many bettors use Pinnacle as the fair reference and place their bets with other bookmakers.
Which sport is best for finding value bets?
Football is the most common, because coverage is wide and the sharp markets are deep. Tennis, basketball and ice hockey work too. What matters most is a reliable reference for the exact market.
Can you find value bets live?
Yes, but it is harder. Prices change every few seconds, so both the reference and the soft price must be very fresh, and bookmakers often delay in-play bets.
Related reading
ValueOddsAPI provides odds data, not betting advice. Betting involves risk of loss and is for adults (18+) only. If gambling stops being fun, contact your local support service, such as StopSpillet in Denmark.
Get the data into your product
Solo €899/month (personal use), Pro €1,800, Scale €4,000, Elite €8,000 and Enterprise from €13,000/month, excluding VAT. Coverage and usage rights are confirmed before activation. Missing a bookmaker? We add the sources you need, scoped and priced per project.