---
title: "List main-line EV (Beta) opportunities"
method: GET
path: "/v1/intelligence/ev"
tags: ["events"]
---

# List main-line EV (Beta) opportunities

`GET /v1/intelligence/ev`

## Request

- Base URL: `https://lumify.ai`
- URL: `https://lumify.ai/v1/intelligence/ev`
- Auth: HTTP bearer

## Query parameters

- `sport` string, required: Sport slug. Predictive-framework sports only: soccer, mlb, tennis, nfl, ncaaf.
- `league` string, nullable: Optional league slug (e.g. mls, epl, atp). Soccer without a league scans every published soccer league (MLS + big-five).
- `market` 'h2h' | 'spreads' | 'totals': Main-line family: h2h (default, moneyline), spreads, or totals. Tennis totals return 400 — Stage 1 does not publish a games-total sharp.
- `min_ev` number: Minimum EV% to include. Clamped to 0–25. Default 0 (all positive).
- `book` string, nullable: Restrict opportunities to one sportsbook slug (e.g. fanduel).
- `limit` integer: Max opportunities to return (1–200).

## Response `200`

Pregame main-line rows (moneyline, spreads, or totals) whose sharp-fair price gap is positive and ≤ 25% EV, across upcoming predictive-framework events. Tennis totals are not offered. Beta. 1 credit. Field catalog: https://lumify.ai/docs/reference#intelligence-ev

- IntelligenceEvResponse
  - `sport` string, required: Sport slug this scan was run for.
  - `league` string, nullable: League filter, or null when the scan covered the whole sport.
  - `market` string: Main-line family scanned: h2h (moneyline), spreads, or totals.
  - `min_ev` number, required: Minimum EV% applied to this response.
  - `max_ev` number, required: Stale-line cap; opportunities above this EV% are dropped.
  - `book` string, nullable: Book filter, or null when every eligible book was considered.
  - `beta` boolean: Always true — this surface is an unverified market-consensus estimate.
  - `opportunities` IntelligenceEvOpportunity[]: Positive-EV main-line rows for the requested market, sorted by ev_pct descending. Empty when nothing currently clears the gates — still 200, still 1 credit.
    - `event_id` integer, required: Lumify event ID this opportunity belongs to.
    - `sport` string, required: Sport slug.
    - `league` string, nullable: League slug, if any.
    - `commence_time` string, nullable: ISO-8601 UTC scheduled start.
    - `home_team` string, nullable: Home team (or player_1) display name.
    - `away_team` string, nullable: Away team (or player_2) display name.
    - `side` string, required: 'home', 'away', 'p1', 'p2', 'draw', 'over', or 'under'.
    - `team` string, nullable: Display name of the side; 'Draw' / 'Over' / 'Under' for ML_DRAW / OVER / UNDER.
    - `bet_type` string, required: Main-line token. h2h: ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW. spreads: SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY. totals: OVER/UNDER.
    - `line` number, nullable: Posted line for spreads and totals. Null on moneyline.
    - `fair_probability` number, required: Sharp-fair probability (0–1) the gap is measured against.
    - `ev` object, required: Same Beta object as `bets[].ev` on GET /intelligence: {beta, book, price, ev_pct, kelly_fraction, quote_age_seconds, n_books}.
  - `total` integer, required: Count of `opportunities` on this page.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/lumify/apis/lumify-sports-intelligence-api.md) · [All operations](https://skmtc.dev/lumify/apis/lumify-sports-intelligence-api/llms.txt) · [OpenAPI document](https://skmtc.dev/lumify/apis/lumify-sports-intelligence-api/revisions/f91ea41a2606?raw)
