Overview
Every value bet in/api/value-bets passes through 5 mathematical layers before reaching you. This page explains each one in plain language, with formulas and worked examples.
The fields returned by the API map directly to these layers:
Step 1 — Implied probability
Every decimal odds price implies a win probability:2.00→1 / 2.00 = 0.500(50%)3.50→1 / 3.50 = 0.286(28.6%)1.70→1 / 1.70 = 0.588(58.8%)
Step 2 — Raw Pinnacle TRJ (devig input only)
For a market with N outcomes, Raw TRJ is the sum of all implied probabilities:- 2-way markets (spread, total, tennis): ~1.02–1.05
- 3-way markets (football 1X2): ~1.05–1.10
Raw TRJ is a devig input — it feeds into the fair-odds formula below. It is not the quality gate shown as
payout_rate in the API. See Step 5 for the distinction.Step 3 — Fair odds (devigging)
Devigging removes Pinnacle’s margin to produce the true consensus probability for each outcome. Formula for 2-way markets (spread, total, tennis moneyline, BTTS):Worked example — 2-way total
Worked example — 3-way football
Step 4 — Fair odds floor (safety buffer)
Before EV is computed, a small safety buffer is applied to the fair odds to prevent noise:ev_pct ≥ 1%. For player props, it’s roughly +5% raw edge. This explains why many bets that look close don’t appear in the feed.
Step 5 — EV% calculation
Once fair odds are established (with floor applied):Worked example
ev_pct means in plain English:
A +5.0% EV bet means that if you placed this exact bet repeatedly under the same conditions, you’d expect to profit an average of 100 wagered over the long run.
Short-term variance is high — a single bet can win or lose. EV only plays out over large sample sizes. The edge comes from the bookmaker mispricing one outcome relative to Pinnacle’s efficient market.
Step 6 — Payout rate (quality gate)
payout_rate in the API response is not the raw Pinnacle TRJ. It is a distinct quality metric: the TRJ of the market with the bookmaker’s odds substituted in for its own Pinnacle side, keeping raw Pinnacle odds for all other sides.
Worked example — 2-way
Worked example — 3-way (fails)
Quality filters applied before the API responds
All results from/api/value-bets have already passed every filter. Nothing is returned that fails any gate:
Why bets with “3% EV” sometimes don’t appear
The fair odds floor (+1% for all markets, +4% for props) means:- A bookmaker offering 3% raw edge over raw devigged Pinnacle on a moneyline needs ~2% net after the floor → passes
EV_MIN=1% - A bookmaker offering 3% raw edge on a player prop needs ~5% net after the prop floor → does not pass
EV_MIN=1%
payout_rate < 99% can reject a bet even when EV% is positive — this happens when the bookmaker’s “edge” disappears once you price it against raw (non-devigged) opposing Pinnacle odds.
Formula reference
Value Bets Reference
Full endpoint docs with all response fields.
Best Practices
Polling, freshness checks, and production patterns.