Value Bets require a Pro plan or higher.
GET /api/value-bets
Returns betting opportunities detected in the last 30 minutes where a bookmaker’s implied probability is lower than Pinnacle’s devigged fair probability — i.e., the bookmaker is offering higher-than-fair odds. All results have already passed the quality filters described below. No stale or suspicious bets are returned.How EV Is Calculated
EV ≥ 1%.
Quality Filters Applied Before Response
All returned bets have passed every gate — nothing stale or suspicious is returned:| Filter | Threshold | Reason |
|---|---|---|
EV ≥ 1% | Minimum edge | Sub-1% is noise; line movement eliminates it before placement |
EV ≤ 20% | Maximum edge | Above this = stale or miscoded odds, not real edge |
EV ≤ 10% (moneyline / spread) | Efficient market cap | These markets don’t produce 10%+ edges legitimately |
payout_rate ∈ [99%, 105%] | Quality gate | Combines bookmaker price with raw opposite Pinnacle odds — must form a near-100% market |
Raw Pinnacle TRJ ≤ 1.05 | Structural sanity | Above 1.05 = duplicate sides or arbitrage data |
| Bookmaker odds freshness | ≤ 15 minutes old | Rejects stale prices |
| Both Pinnacle sides present | Required | Prevents single-side devig errors |
| Odds ratio | ≤ 1.15× fair price | Rejects structural mismatches |
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
sport | string | — | Filter by sport name (e.g. Football, Basketball) |
competition | string | — | Filter by competition code (e.g. EPL, NBA) |
bookmaker | string | — | Filter by bookmaker name |
min_ev | float | 1.0 | Minimum EV % (e.g. 2.5 for 2.5%+ edge only) |
max_ev | float | 20.0 | Maximum EV % guard cap (don’t raise above 20) |
limit | integer | 100 | Max results, up to 500 |
Response
Response Fields
| Field | Type | Description |
|---|---|---|
match_name | string | Event name |
selection | string | The specific outcome (e.g. "Over 2.5", "PSG", "R. Barrett Rebounds Under 4.5") |
bookmaker | string | Bookmaker offering the +EV odds |
market_type | string | Market type |
period | integer | Time period (0=full time, 1=first half) |
odds | float | Bookmaker’s current decimal odds for this selection |
pinnacle_odds | float | Pinnacle’s raw quoted odds for the same selection |
fair_odds | float | Devigged fair-value price — the true market consensus |
ev_pct | float | Expected value as a percentage (e.g. 5.8 = +5.8% edge over fair price) |
payout_rate | float | Pinnacle TRJ (Total Return on Juice). Value near 1.0 = very sharp line, e.g. 1.018 = 1.8% juice |
liquidity | float | null | Pinnacle’s maximum bet size for this line — proxy for market confidence |
competition | string | Competition code |
sport | string | Sport |
detected_at | ISO-8601 string | When this opportunity was detected |
match_date | ISO-8601 string | null | Scheduled kick-off time (UTC) |
Key Fields Explained
fair_odds — This is the critical reference price. It’s the implied price after removing Pinnacle’s margin. A bookmaker offering odds > fair_odds means their market underestimates the true probability for this outcome.
ev_pct — Direct measure of edge. A 5% EV bet means you expect to profit 100 wagered, long-run. Only bets with EV between min_ev and 20% are returned.
payout_rate — Pinnacle’s TRJ: the sum of implied probabilities across all outcomes. A value of 1.018 means Pinnacle takes 1.8% margin. The closer to 1.0, the sharper the line. Bets are only shown when Pinnacle’s TRJ is between 0.99 and 1.05 (very sharp market).
liquidity — Pinnacle’s max bet size. Higher values indicate more confidence in the line. A 200 max bet on a niche prop may be less reliable.
Code Examples
EV Math Guide
Full step-by-step walkthrough of implied probability, devigging, fair odds, EV%, and payout rate with worked examples.
Best Practices
Freshness checks, retry patterns, and production tips.