Skip to content

Sports Odds Scraper

Try for free

Sports betting odds from DraftKings, Pinnacle and Bovada on one row per game: moneyline, spread and total for NFL, NBA, NHL, MLB, college, UFC, tennis and top soccer leagues, with the best price per outcome and arbitrage. No login needed.

🏈 Sports Odds Scraper

Get live pregame betting odds from DraftKings, Pinnacle and Bovada side by side, one row per game. Pick your leagues and every game comes back with moneyline, spread and total from each sportsbook, the best available price per outcome and any arbitrage between the books. No login, no API key, no browser: a full NBA or Premier League slate takes a few seconds.

✨ Why use Sports Odds Scraper?

  • 📚 Three books on one line — DraftKings, Pinnacle (the sharpest market) and Bovada matched game by game, so you compare prices without lining up feeds yourself.
  • 💸 Best price and arbitrage built in — every outcome priced by two or more books gets its best price, the book offering it and its edge over the average; sure-profit combinations come with the stake split per leg.
  • 🌍 25 leagues out of the box — NFL, NCAA football and basketball, NBA, WNBA, MLB, NHL, UFC, boxing, ATP and WTA tennis and 14 soccer competitions, plus any other league ESPN covers. All of them together came to about 380 games in one 15-second pass in our tests.
  • 📈 Opening lines included — DraftKings rows carry the opening price and line next to the current one, so you can see how the market moved.
  • ⚡ Fast and light — public JSON feeds read in parallel; in our tests four leagues took about 4 seconds of scraping.
  • 🔓 No login, no keys — only public odds that anyone can see on the sportsbooks' sites.

🎯 Use cases

  • 📊 Line shopping and odds comparison — find the best price for a bet across DraftKings, Pinnacle and Bovada.
  • 🧮 Arbitrage and value betting — flag games where the books disagree enough to lock in a profit, or where a soft book beats Pinnacle's sharp line.
  • 🤖 Betting models and research — feed clean, normalized moneylines, spreads and totals (American, decimal, fractional or implied probability) into your models.
  • 🔔 Alerts and bots — schedule the scraper and push new games or line moves to Discord, Telegram or Slack.
  • 📰 Sports content and media — show today's lines next to previews, power rankings or fantasy content.

🚀 How to use

  1. Pick one or more Sports and leagues (for example NBA, NFL and Premier League).
  2. Set Max games (20 by default; 0 returns every game with odds).
  3. Optionally narrow it down: sportsbooks, teams, a time window, a minimum number of books per game, or only games with arbitrage.
  4. Click Start and wait a few seconds.
  5. Download the results as JSON, CSV, Excel or HTML, or read them over the API.

📥 Input

FieldWhat it does
sportsLeagues to read: nfl, ncaaf, nba, wnba, ncaab, mlb, nhl, ufc, boxing, tennis_atp, tennis_wta, soccer_epl, soccer_laliga, soccer_bundesliga, soccer_seriea, soccer_ligue1, soccer_mls, soccer_uefa_cl, soccer_uefa_el, soccer_uefa_ecl, soccer_championship, soccer_eredivisie, soccer_primeira, soccer_brazil, soccer_ligamx
maxItemsMaximum game rows for the run, spread across the leagues (0 = all)
customLeaguesAny other ESPN league as sport/league, e.g. soccer/sco.1 (DraftKings lines)
booksdraftkings, pinnacle, bovada (empty = all three)
marketsh2h (moneyline), spreads, totals, team_totals, first_half
oddsFormatamerican, decimal, fractional or implied_probability
teams, lookAheadHours, includeLive, minBooks, maxItemsPerLeagueFilters
computeBestPrice, computeArbitrage, minArbPct, minBestEdgePct, onlyArbitrageBest price and arbitrage options
onlyNewGamesSkip games returned in earlier runs (a new-games feed for schedules)
{
  "sports": ["nba", "nfl", "mlb", "soccer_epl"],
  "maxItems": 20,
  "oddsFormat": "american",
  "minBooks": 2
}

📤 Output

One row per game:

FieldDescription
sport, sportName, leagueLeague key, sport and league name
home, away, commenceTime, statusTeams (or players), start time in UTC, upcoming or live
books, bookCountSportsbooks that price the game
bestHomeMoneyline, bestAwayMoneyline, bestDrawMoneylineBest moneyline across books
spreadLine, totalLineMain home spread and total (most common line across books)
markets[]Each market with its outcomes; each outcome has name, side, point, prices per book (price, decimal, and for DraftKings openPrice / openPoint) and bestPrice
hasArbitrage, maxArbitragePct, arbitrage[]Arbitrage found across books, with legs, books and stake split
bookEventIds, url, sources, espnUrlEvent ids and pages at each sportsbook
eventKey, oddsFormat, scrapedAtStable game key, price format and read time

Example (trimmed to the moneyline and total of one NBA game):

{
  "eventKey": "nba|san-antonio-spurs|oklahoma-city-thunder|2026-10-21",
  "sport": "nba",
  "sportName": "Basketball",
  "league": "NBA",
  "home": "San Antonio Spurs",
  "away": "Oklahoma City Thunder",
  "commenceTime": "2026-10-21T01:30:00Z",
  "status": "upcoming",
  "books": [
    "draftkings",
    "pinnacle",
    "bovada"
  ],
  "bookCount": 3,
  "bestHomeMoneyline": -102,
  "bestAwayMoneyline": -108,
  "bestDrawMoneyline": null,
  "spreadLine": 1,
  "totalLine": 229.5,
  "hasArbitrage": false,
  "maxArbitragePct": null,
  "arbitrage": [],
  "markets": [
    {
      "key": "h2h",
      "label": "Moneyline",
      "outcomes": [
        {
          "name": "San Antonio Spurs",
          "side": "home",
          "point": null,
          "prices": {
            "draftkings": {
              "price": -102,
              "decimal": 1.9804,
              "openPrice": -125
            },
            "pinnacle": {
              "price": -102,
              "decimal": 1.9804
            },
            "bovada": {
              "price": -105,
              "decimal": 1.9524
            }
          },
          "bestPrice": {
            "book": "draftkings",
            "price": -102,
            "decimal": 1.9804,
            "averageDecimal": 1.9711,
            "edgePctVsAverage": 0.47
          }
        },
        {
          "name": "Oklahoma City Thunder",
          "side": "away",
          "point": null,
          "prices": {
            "draftkings": {
              "price": -118,
              "decimal": 1.8475,
              "openPrice": 105
            },
            "pinnacle": {
              "price": -108,
              "decimal": 1.9259
            },
            "bovada": {
              "price": -115,
              "decimal": 1.87
            }
          },
          "bestPrice": {
            "book": "pinnacle",
            "price": -108,
            "decimal": 1.9259,
            "averageDecimal": 1.8811,
            "edgePctVsAverage": 2.38
          }
        }
      ]
    },
    {
      "key": "totals",
      "label": "Total",
      "outcomes": [
        {
          "name": "Over",
          "side": "over",
          "point": 229.5,
          "prices": {
            "draftkings": {
              "price": -115,
              "decimal": 1.8696,
              "openPrice": -115,
              "openPoint": 228.5
            }
          }
        },
        {
          "name": "Under",
          "side": "under",
          "point": 229.5,
          "prices": {
            "draftkings": {
              "price": -105,
              "decimal": 1.9524,
              "openPrice": -105,
              "openPoint": 228.5
            }
          }
        }
      ]
    }
  ],
  "bookEventIds": {
    "draftkings": "34510039",
    "pinnacle": "1633801640",
    "bovada": "29469363"
  },
  "url": "https://sportsbook.draftkings.com/event/34510039",
  "sources": [
    "https://sportsbook.draftkings.com/event/34510039",
    "https://www.pinnacle.com/en/basketball/nba/san-antonio-spurs-vs-oklahoma-city-thunder/1633801640/",
    "https://www.bovada.lv/sports/basketball/nba/oklahoma-city-thunder-san-antonio-spurs-202610202130"
  ],
  "espnUrl": "https://www.espn.com/nba/game/_/gameId/401909090/thunder-spurs",
  "oddsFormat": "american",
  "scrapedAt": "2026-10-21T00:47:20.194Z"
}

💰 Pricing

You pay $0.01 per game row ($10 per 1,000 games), plus a small amount of platform usage (a few seconds of compute and a few hundred kilobytes of proxy traffic per run, about $0.001 in our tests). Games without odds are skipped and never charged, and a run that finds nothing costs only its usage.

Example: a 20-game slate across NBA, NFL and Premier League costs about $0.20 in events plus well under a cent of usage.

❓ FAQ

Where do the odds come from? DraftKings lines come from ESPN's public scoreboard (DraftKings is ESPN's odds provider). Pinnacle and Bovada prices come from the public feeds that power their own websites. Nothing needs a login.

Is it legal? The scraper reads publicly available odds that anyone can see without an account. Check the terms of the sites and the betting rules where you live before using the data commercially.

How are games matched across books? By team names (normalized for accents, abbreviations and suffixes such as FC or college mascots) and a start time within a few hours. A game is joined only when both sides agree, so a wrong pairing never invents a price gap.

Why does a game show only one or two books? Each book posts lines on its own schedule. ESPN only shows DraftKings lines for games in the next few days, and some leagues (UFC, boxing, tennis) are not on ESPN at all. Use minBooks to keep only games priced by several books.

Do I need a proxy? No setup needed. The default setting uses datacenter exits and switches to residential exits on its own where a sportsbook refuses datacenter or US visitors (Pinnacle is always read through residential exits outside the US). A typical run moves well under a megabyte through the proxy.

Can I schedule it or use the API? Yes. Schedule runs from the console or start them over the API, and turn on onlyNewGames if you only want games you have not received yet.

⚠️ Limits

  • Pregame moneyline, spread and total are the core markets. Team totals and first-half lines come from Pinnacle only; player props, futures and outrights (golf, F1, season winners) are not covered.
  • includeLive adds games that are in progress. Their prices are what the books still publish at that moment (mostly Bovada's in-play lines; DraftKings rows show the last pregame line).
  • Leagues out of season return no rows.
  • Odds change constantly; each row is a snapshot at scrapedAt.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.