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

GET/v1/odds

Browse 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.

ParameterTypeRequiredDescription
leaguestringNoFilter by league identifier
sourceTypestringNoall, sportsbook, dfs, exchange
marketstringNomoneyline, spread, total, player_points, player_pass_yds, etc.
bookmakerstringNoOne or more bookmaker keys or names, comma-separated (e.g. draftkings,kalshi)
limitnumberNoMax 50, default 25
pagenumberNoPage 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

GET/v1/events/:eventId/odds

Get 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.

ParameterTypeRequiredDescription
eventIdstringYesThe event identifier
sourceTypestringNoall, sportsbook, dfs, exchange
marketstringNoOptional 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. null when 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. null whenever 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_h1 and totals_h1: in each book's markets (US sportsbooks only, next to that book's full-game markets) and in summary with 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 isStale and lastUpdate.
  • market=spreads_h1 returns one of them alone. Other leagues and GET /v1/odds leave 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.

GET/v1/events/:eventId/odds-history

Consensus 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.

ParameterTypeRequiredDescription
eventIdstringYesThe event identifier
marketstringNoOptional exact market filter (e.g. moneyline, spread, total, player_points)
playerIdstringNoOptional canonical player ID — returns only rows belonging to that player within the event
fromstringNoOptional ISO 8601 timestamp lower bound on snapshotAt
tostringNoOptional ISO 8601 timestamp upper bound on snapshotAt
limitnumberNoMax 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

GET/v1/odds/bookmakers

List all tracked sportsbooks, DFS platforms, and exchanges.

ParameterTypeRequiredDescription
sourceTypestringNoall, 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 }
}