> ## Documentation Index
> Fetch the complete documentation index at: https://oddsstream.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Value Bets

> Pre-calculated +EV opportunities relative to the Pinnacle sharp line.

<Note>
  Value Bets require a **Pro plan** or higher.
</Note>

## 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

```
# 1. Sum Pinnacle implied probabilities → raw TRJ (their margin)
TRJ = 1/pinnacle_odds_home + 1/pinnacle_odds_draw + 1/pinnacle_odds_away

# 2. Devig: remove Pinnacle's margin to get fair price
fair_odds = (N × pinnacle_odds) / (N − pinnacle_odds × (1/TRJ − 1))
# N = 2 for two-way markets, N = 3 for three-way (football 1X2)

# 3. Apply safety floor (prevents noise at edge of threshold)
fair_odds_final = fair_odds × 1.01          # all markets
fair_odds_final = fair_odds × 1.01 × 1.03  # player props only

# 4. Compute edge
EV% = (bookmaker_odds / fair_odds_final − 1) × 100
```

**Devigging** removes Pinnacle's margin to produce the true consensus probability. Requires all Pinnacle sides — a single-side devig produces unreliable fair odds.

**Why some 2–3% EV bets don't appear:** The fair-odds floor means bookmakers need roughly +2% raw edge (standard markets) or +5% raw edge (player props) over devigged Pinnacle before a bet passes `EV ≥ 1%`.

<Tip>
  See the [EV Math Guide](/guides/ev-math) for full step-by-step worked examples of implied probability, devigging, fair odds, EV%, and payout rate.
</Tip>

### 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

```json theme={null}
{
  "data": [
    {
      "match_name": "Cleveland Cavaliers / Toronto Raptors",
      "selection": "RJ Barrett Rebounds Under 4.5",
      "bookmaker": "Unibet.fr",
      "market_type": "player_prop",
      "period": 0,
      "odds": 2.12,
      "pinnacle_odds": 1.70,
      "fair_odds": 1.883,
      "ev_pct": 12.59,
      "payout_rate": 1.018,
      "liquidity": 750.0,
      "competition": "NBA",
      "sport": "Basketball",
      "detected_at": "2026-04-20T13:51:28Z",
      "match_date": "2026-04-20T23:00:00Z"
    },
    {
      "match_name": "PSG - Lyon",
      "selection": "Over 2.5",
      "bookmaker": "Betsson",
      "market_type": "total",
      "period": 0,
      "odds": 2.10,
      "pinnacle_odds": 2.05,
      "fair_odds": 1.98,
      "ev_pct": 5.8,
      "payout_rate": 1.018,
      "liquidity": 4500.0,
      "competition": "LIG1",
      "sport": "Football",
      "detected_at": "2026-04-20T14:30:00Z",
      "match_date": "2026-04-20T20:00:00Z"
    }
  ],
  "meta": {
    "count": 12,
    "rate_limit_remaining": 294
  }
}
```

### 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 $5 for every $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 $4500 max bet on an EPL moneyline is a reliable reference; a $200 max bet on a niche prop may be less reliable.

### Code Examples

```bash theme={null}
# Football value bets with EV > 2%
curl "https://api.oddsstream.io/api/value-bets?sport=Football&min_ev=2" \
  -H "X-Api-Key: os_live_YOUR_KEY"

# High-EV basketball props from Unibet
curl "https://api.oddsstream.io/api/value-bets?sport=Basketball&bookmaker=Unibet.fr&min_ev=5" \
  -H "X-Api-Key: os_live_YOUR_KEY"
```

```python theme={null}
import requests

resp = requests.get(
    "https://api.oddsstream.io/api/value-bets",
    params={"sport": "Football", "min_ev": 2.0, "limit": 50},
    headers={"X-Api-Key": "os_live_YOUR_KEY"}
)
for bet in resp.json()["data"]:
    print(
        f"{bet['match_name']} | {bet['selection']} @ {bet['odds']} "
        f"({bet['ev_pct']:.1f}% EV) via {bet['bookmaker']}"
    )
```

```javascript theme={null}
const resp = await fetch(
  "https://api.oddsstream.io/api/value-bets?sport=Football&min_ev=2",
  { headers: { "X-Api-Key": "os_live_YOUR_KEY" } }
);
const { data: bets, meta } = await resp.json();
console.log(`${meta.count} value bets found`);

for (const bet of bets) {
  const edge = bet.ev_pct.toFixed(1);
  console.log(`${bet.match_name} — ${bet.selection}: ${bet.odds} (+${edge}% EV) @ ${bet.bookmaker}`);
}
```

<Warning>
  Always verify the current price on the bookmaker's site before placing a bet.
  Odds can move significantly between detection and placement. A bet with +5% EV at
  detection time may be 0% or negative if the line has moved.
</Warning>

<CardGroup cols={2}>
  <Card title="EV Math Guide" icon="calculator" href="/guides/ev-math">
    Full step-by-step walkthrough of implied probability, devigging, fair odds, EV%, and payout rate with worked examples.
  </Card>

  <Card title="Best Practices" icon="shield-check" href="/guides/best-practices">
    Freshness checks, retry patterns, and production tips.
  </Card>
</CardGroup>
