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:
| API field | What it represents |
|---|---|
pinnacle_odds | Raw Pinnacle quoted price |
fair_odds | Pinnacle devigged (margin removed) |
ev_pct | Edge over fair value (bookmaker_odds / fair_odds - 1) |
payout_rate | Display quality gate (raw opposite Pinnacle odds substituted in) |
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:
| Filter | Threshold | Why |
|---|---|---|
EV ≥ 1% | Minimum edge | Noise below this — line movement can eliminate sub-1% edges before placement |
EV ≤ 20% | Maximum edge | Above this = almost certainly stale or miscoded odds, not real |
EV ≤ 10% (ML / spread) | Efficient market cap | Moneylines and spreads in efficient markets don’t produce 10%+ edges legitimately |
Raw Pinnacle TRJ ≤ 1.05 | Structural sanity | Above 1.05 = duplicate sides or arbitrage data — structurally invalid, not a value bet |
payout_rate ∈ [99%, 105%] | Quality gate | Below 99% = edge is noise; above 105% = fair odds calculation error |
Odds freshness ≤ 15 min | Staleness guard | Rejects outdated bookmaker prices |
| Both Pinnacle sides present | Devig requirement | Single-side devig produces absurd fair odds — skip |
Odds ratio ≤ 1.15× | Sanity check | bookmaker_odds / fair_odds > 1.15 = likely data mismatch |
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
| Formula | Expression |
|---|---|
| Implied probability | 1 / decimal_odds |
| Raw Pinnacle TRJ | Σ (1 / pinnacle_odds_i) |
| Fair odds (2-way) | (2 × pin) / (2 − pin × (1/TRJ − 1)) |
| Fair odds (3-way) | (3 × pin) / (3 − pin × (1/TRJ − 1)) |
| Fair odds floor | × 1.01 all markets; × 1.01 × 1.03 props |
| EV% | (bookmaker_odds / fair_odds_final − 1) × 100 |
| Payout rate (2-way) | 1 / (1/book + 1/pin_opposite) |
| Payout rate (3-way) | 1 / (1/book + Σ 1/pin_others) |
Value Bets Reference
Full endpoint docs with all response fields.
Best Practices
Polling, freshness checks, and production patterns.