Odds
Access real-time betting odds and player props from US sportsbooks, supported DFS pick'em platforms, and exchange/prediction-market venues, normalized into one consistent format. DFS prices are indicative and exposed in American odds for side-by-side comparison. All plans can access the full tracked bookmaker set. Every market carries lastUpdate and isStale: isStale: true means the book hasn't refreshed that price in 12 hours, so it may no longer be available.
For a player-grouped prop response using the same canonical event IDs, see the Player Props docs. For a product overview, see the Sports Odds API page.
Browse Odds
/v1/oddsBrowse odds with filtering by league, market, bookmaker, and source type. If you omit market, the API returns game-level markets only (moneyline, spread, total). First-half markets are not included here; use the event odds endpoint.
| Parameter | Type | Required | Description |
|---|---|---|---|
| league | string | No | Filter by league identifier |
| sourceType | string | No | all, sportsbook, dfs, exchange |
| market | string | No | moneyline, spread, total, player_points, player_pass_yds, etc. |
| bookmaker | string | No | One or more bookmaker keys or names, comma-separated (e.g. draftkings,kalshi) |
| limit | number | No | Max 50, default 25 |
| page | number | No | Page number for pagination |
Response
{
"success": true,
"data": [
{
"eventId": "nba-ev-311286",
"leagueId": "nba",
"sport": "basketball",
"bookmakers": [
{
"bookmakerId": "draftkings",
"bookmakerName": "DraftKings",
"sourceType": "sportsbook",
"markets": [
{
"marketType": "moneyline",
"lastUpdate": "2026-01-15T23:58:12Z",
"isStale": false,
"outcomes": [
{ "name": "Boston Celtics", "price": -180 },
{ "name": "Los Angeles Lakers", "price": 155 }
]
}
]
}
]
}
],
"meta": { "count": 1, "page": 1 }
}
Event Odds
/v1/events/:eventId/oddsGet odds for a specific event. Includes a summary object with the sportsbook fair (no-vig) and average odds, and the best price at any venue.
| Parameter | Type | Required | Description |
|---|---|---|---|
| eventId | string | Yes | The event identifier |
| sourceType | string | No | all, sportsbook, dfs, exchange |
| market | string | No | Optional exact market filter such as moneyline, spread, total, or (NFL, NBA) h2h_h1, spreads_h1, totals_h1 |
Response
{
"success": true,
"data": {
"eventId": "nba-ev-311286",
"leagueId": "nba",
"sport": "basketball",
"summary": {
"moneyline": [
{ "name": "Boston Celtics", "fairOdds": -172, "bestOdds": -165, "avgOdds": -175 },
{ "name": "Los Angeles Lakers", "fairOdds": 148, "bestOdds": 155, "avgOdds": 145 }
],
"spread": [
{ "name": "Boston Celtics", "point": -4.5, "fairOdds": -108, "bestOdds": -105, "avgOdds": -110 },
{ "name": "Los Angeles Lakers", "point": 4.5, "fairOdds": -104, "bestOdds": -102, "avgOdds": -108 }
],
"total": [
{ "name": "Over", "point": 220.5, "fairOdds": -106, "bestOdds": -104, "avgOdds": -110 },
{ "name": "Under", "point": 220.5, "fairOdds": -106, "bestOdds": -105, "avgOdds": -108 }
]
},
"bookmakers": [
{
"bookmakerId": "draftkings",
"bookmakerName": "DraftKings",
"sourceType": "sportsbook",
"markets": [
{ "marketType": "moneyline", "lastUpdate": "2026-01-15T23:58:12Z", "isStale": false, "outcomes": [{ "name": "Boston Celtics", "price": -175 }, { "name": "Los Angeles Lakers", "price": 150 }] }
]
}
]
},
"meta": { "league": "nba", "event": "nba-ev-311286" }
}
Summary field
- fairOdds — No-vig price: each sportsbook's margin is removed across every side it quotes by the odds-ratio method (every side's odds divided by one ratio, so a long shot gives up more of the margin than a favorite), then those prices are averaged with one vote per brand.
nullwhen no sportsbook quotes every side. - bestOdds — The highest American odds offered by any single bookmaker for that outcome.
- avgOdds — The same sportsbooks' average price with the margin left in. Exchanges, prediction markets, and books with a broken line never count.
nullwhenever fairOdds is. - Summary is computed from the full bookmaker set for the event, using only prices refreshed in the last 12 hours. It is empty when every price is stale.
First-half markets (NFL, NBA)
- From 36 hours before the start, NFL and NBA event odds also carry the first-half moneyline, spread and total under
h2h_h1,spreads_h1andtotals_h1: in each book's markets (US sportsbooks only, next to that book's full-game markets) and insummarywith the same row fields. - The first-half moneyline is two-way: a tied half is a push.
- They refresh every 3 hours, every 30 minutes in the last 3 hours and every 10 minutes in the last hour, so a first-half price can be older than the full-game one. Check
isStaleandlastUpdate. market=spreads_h1returns one of them alone. Other leagues andGET /v1/oddsleave them out.
Odds History
Track how a line has moved over time. Each snapshot is a consensus row per (marketType, player, outcome, point) with the cross-book average, best, and no-vig fair price at that moment. Game markets and player props are both included. A moneyline, spread or total row is the consensus of 3 or more sportsbooks that updated in the last 12 hours, one per brand; exchanges can hold the best price but never move the average. A player-prop row averages the price for that side at each book that updated it in the last 12 hours, including books that quote only that side. Its fair price comes from the sportsbooks that quote both sides of the line, and is null when none does, such as an anytime-scorer Yes. DFS is excluded because its prices are indicative, not tradeable.
Snapshots are written on a tiered cadence based on time-to-game so storage and payload sizes stay small:
- More than 7 days out → every 24 hours
- 24 hours to 7 days out → every 12 hours
- 3 to 24 hours out → every 60 minutes
- Less than 3 hours out → every 20 minutes
The first snapshot for an event is written the first time the API fetches odds for it (typically within ~10 minutes of a new event being seeded). History for an event is automatically deleted shortly after the game goes final.
/v1/events/:eventId/odds-historyConsensus line-movement history for a specific event, sorted ascending by snapshot time so the first entry is the opening line captured and the last is the most recent.
| Parameter | Type | Required | Description |
|---|---|---|---|
| eventId | string | Yes | The event identifier |
| market | string | No | Optional exact market filter (e.g. moneyline, spread, total, player_points) |
| playerId | string | No | Optional canonical player ID — returns only rows belonging to that player within the event |
| from | string | No | Optional ISO 8601 timestamp lower bound on snapshotAt |
| to | string | No | Optional ISO 8601 timestamp upper bound on snapshotAt |
| limit | number | No | Max snapshots returned. Default 500, max 2000 |
Response
{
"success": true,
"data": {
"eventId": "nba-ev-311286",
"count": 14,
"snapshots": [
{
"eventId": "nba-ev-311286",
"leagueId": "nba",
"sport": "basketball",
"snapshotAt": "2026-04-08T19:00:00.000Z",
"markets": [
{
"marketType": "moneyline",
"outcome": "Boston Celtics",
"avgPrice": -175,
"avgImpliedProb": 0.6364,
"bestPrice": -165,
"bestBook": "draftkings",
"fairOdds": -172,
"bookCount": 12
},
{
"marketType": "player_points",
"outcome": "Over",
"player": "Jayson Tatum",
"playerId": "nba-p-4065648",
"point": 28.5,
"avgPrice": -112,
"avgImpliedProb": 0.5283,
"bestPrice": -105,
"bestBook": "fanduel",
"fairOdds": -108,
"bookCount": 9
}
],
"playerIds": ["nba-p-4065648"]
}
]
},
"meta": { "event": "nba-ev-311286" }
}
Bookmakers
/v1/odds/bookmakersList all tracked sportsbooks, DFS platforms, and exchanges.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sourceType | string | No | all, sportsbook, dfs, exchange |
Response
{
"success": true,
"data": [
{ "bookmakerId": "draftkings", "bookmakerName": "DraftKings", "sourceType": "sportsbook", "sourceRegion": "us" },
{ "bookmakerId": "prizepicks", "bookmakerName": "PrizePicks", "sourceType": "dfs", "sourceRegion": "us_dfs" },
{ "bookmakerId": "espnbet", "bookmakerName": "ESPN BET", "sourceType": "sportsbook", "sourceRegion": "us2" },
{ "bookmakerId": "kalshi", "bookmakerName": "Kalshi", "sourceType": "exchange", "sourceRegion": "us_ex" }
],
"meta": { "count": 4 }
}