Skip to content

OddsPortal Scraper

Try for free

Odds from every bookmaker on OddsPortal: upcoming fixtures, results archives with closing odds, scores, best and average prices, payouts and optional full market books with opening and closing odds. Any sport. No login needed.

📊 OddsPortal Scraper

Export odds from every bookmaker on OddsPortal as JSON, CSV or Excel: upcoming fixtures with current prices, results archives with final scores and closing odds, and, on request, the full market book with opening and closing odds for every match. Paste a league link and get one clean row per match in seconds. No login, no API key, and a price per match well below comparable tools.

✨ Why use OddsPortal Scraper?

  • 🏦 Every bookmaker, not just the average — each bookmaker's own match-winner price and payout, plus the average and best price per outcome and who offers it.
  • 📚 Whole seasons of history — a results link is read page by page until the season ends, with final scores, half-time and period scores, winners and closing odds.
  • 📈 Opening and closing odds — the optional market book adds Over/Under, Asian Handicap, Correct Score, Both Teams to Score, Double Chance, Draw No Bet, HT/FT, European Handicap and more, for every period, with the opening price and its timestamp per bookmaker.
  • ⚡ Fast — in our test runs a league's upcoming fixtures took about 5 seconds, a full 380-match season 8 seconds and 10,000 matches about 3 minutes; market books run at roughly one match per second.
  • 🌍 Any sport, any bookmaker region — football, tennis, basketball, hockey, baseball, handball, esports and everything else on the site; the proxy country decides which bookmakers you see.
  • 💸 Pay per match — no rental, and the market book is billed only for matches that actually have market odds.

🎯 Use cases

  • 🤖 Betting models and backtests — pair years of results with the odds that were actually available at kick-off.
  • 📉 Closing line value — compare opening and closing prices per bookmaker to judge your own prices.
  • 🔔 Odds movement tracking — schedule runs on upcoming fixtures and build your own price history to spot dropping odds.
  • ⚖️ Odds comparison and arbitrage research — every bookmaker's price on the same outcome side by side.
  • 🧮 Bookmaker margin analysis — payout percentages per bookmaker, league and season.
  • 📊 Dashboards and data feeds — a scheduled feed of fixtures, results and prices for your own app or spreadsheet.

🚀 How to use

  1. Paste one or more OddsPortal links into League or match URLs:
    • a league link such as https://www.oddsportal.com/football/england/premier-league/ for upcoming fixtures;
    • the same link with results/ added for finished matches of the current season;
    • a season link such as https://www.oddsportal.com/football/spain/laliga-2024-2025/results/ for an older season (pick the season on the site's results page and copy the link);
    • a match link (it ends with # and the match id) for one match.
  2. Set Max matches (0 reads everything the links list).
  3. Turn on Scrape all betting markets if you need more than match-winner odds. Narrow it with Markets to include or Full time only.
  4. Click Start and download the results as JSON, CSV, Excel or HTML, or read them through the API.

📥 Input

FieldWhat it does
League or match URLs (startUrls)OddsPortal league, results, season or match links. Any sport.
Max matches (maxItems)Maximum matches across all links. Default 20; 0 means no limit.
Scrape all betting markets (scrapeMatchMarkets)Adds the full market book of each match with opening and closing odds. Default off.
Markets to include (marketTypes)Only these markets in the market book, e.g. ["Over/Under", "Asian Handicap"]. Empty means all.
Full time only (mainPeriodOnly)Market book without halves, quarters, periods or sets.
Proxy configuration (proxyConfiguration)Its country decides which bookmakers OddsPortal lists. Residential Malta (default) gives the widest international list.
{
  "startUrls": [
    { "url": "https://www.oddsportal.com/football/england/premier-league/" },
    { "url": "https://www.oddsportal.com/football/spain/laliga-2024-2025/results/" }
  ],
  "maxItems": 200,
  "scrapeMatchMarkets": false
}

📤 Output

One row per match:

FieldDescription
matchId, eventId, urlOddsPortal match number, match id and match link
sport, country, league, leagueUrl, seasonWhere the match belongs (season is set for results pages)
homeTeam, awayTeam, homeTeamUrl, awayTeamUrlTeams or players and their pages
startTime, startTimestampStart time in UTC (ISO 8601 and Unix seconds)
status, isFinishedScheduled, Finished, Postponed, Canceled...
result, homeScore, awayScore, partialResult, winnerFinal score, period scores and the winner (home, away or draw)
venue, venueTown, venueCountryWhere the match is played
oddsAverage and best price per outcome, the bookmaker with the best price and the bookmaker count
avgHomeOdds, avgDrawOdds, avgAwayOdds, bestHomeOdds, bestDrawOdds, bestAwayOddsThe same prices as flat columns for spreadsheets
bookmakerOddsEvery bookmaker's own match-winner prices and payout percentage
bookmakerCountNumber of bookmakers with match-winner odds
marketsWith Scrape all betting markets: one entry per market, period and line, with closing odds, opening odds and opening time per bookmaker
scrapedAtWhen the row was saved

A finished LaLiga match from a test run, with bookmakerOdds trimmed to 3 of 11 bookmakers and markets to one line:

{
  "matchId": 7722277,
  "eventId": "4xBMgyvp",
  "url": "https://www.oddsportal.com/football/h2h/ath-bilbao-IP5zl0cJ/barcelona-SKbpVP5K/#4xBMgyvp",
  "sport": "Football",
  "country": "Spain",
  "league": "LaLiga 2024/2025",
  "leagueUrl": "https://www.oddsportal.com/football/spain/laliga-2024-2025/",
  "season": "2024/2025",
  "homeTeam": "Ath Bilbao",
  "awayTeam": "Barcelona",
  "homeTeamUrl": "https://www.oddsportal.com/football/team/ath-bilbao/IP5zl0cJ/",
  "awayTeamUrl": "https://www.oddsportal.com/football/team/barcelona/SKbpVP5K/",
  "startTime": "2025-05-25T19:00:00.000Z",
  "startTimestamp": 1748199600,
  "status": "Finished",
  "isFinished": true,
  "result": "0:3",
  "homeScore": 0,
  "awayScore": 3,
  "partialResult": "0:2, 0:1",
  "winner": "away",
  "venue": "Estadio San Mamés",
  "venueTown": "Bilbao",
  "venueCountry": "Spain",
  "bookmakerCount": 11,
  "odds": {
    "home": { "average": 3.28, "highest": 3.49, "highestBookmaker": "1xBet", "bookmakerCount": 11 },
    "draw": { "average": 3.92, "highest": 4.04, "highestBookmaker": "GGBET", "bookmakerCount": 11 },
    "away": { "average": 2.08, "highest": 2.15, "highestBookmaker": "Betsson", "bookmakerCount": 11 }
  },
  "bookmakerOdds": [
    { "bookmakerId": 3, "bookmaker": "bet-at-home", "payout": 94.2, "home": 3.1, "draw": 3.8, "away": 2.1 },
    { "bookmakerId": 16, "bookmaker": "bet365", "payout": 94.6, "home": 3.2, "draw": 3.9, "away": 2.05 },
    { "bookmakerId": 43, "bookmaker": "Betsson", "payout": 95.8, "home": 3.2, "draw": 3.75, "away": 2.15 }
  ],
  "avgHomeOdds": 3.28,
  "bestHomeOdds": 3.49,
  "avgDrawOdds": 3.92,
  "bestDrawOdds": 4.04,
  "avgAwayOdds": 2.08,
  "bestAwayOdds": 2.15,
  "markets": [
    {
      "market": "Over/Under",
      "marketId": 2,
      "scope": "Full Time",
      "scopeId": 2,
      "handicap": 2.5,
      "bookmakers": [
        {
          "bookmakerId": 16,
          "bookmaker": "bet365",
          "closingOdds": { "over": 1.44, "under": 2.75 },
          "openingOdds": { "over": 1.62, "under": 2.3 },
          "openingTime": { "over": "2025-05-19T08:37:30.000Z", "under": "2025-05-19T08:37:30.000Z" }
        }
      ]
    }
  ],
  "scrapedAt": "2026-10-22T03:43:21.738Z"
}

Two-way sports (tennis, basketball, baseball...) have home and away prices only. Correct Score and HT/FT lines carry the score in handicap (e.g. "1:0", "1/1") and one odds price per bookmaker. For upcoming matches closingOdds holds the current price.

💰 Pricing

Pay per result, no monthly rental:

  • Match with odds: $2.00 per 1,000 matches ($0.002 each): the match row with every bookmaker's match-winner odds, best and average prices, payouts and the score.
  • Full market book: $14 per 1,000 matches ($0.014 each), only with Scrape all betting markets and only for matches that came back with market odds.

Examples:

  • 50 upcoming fixtures ≈ $0.10.
  • A full 380-match season with closing odds ≈ $0.76.
  • The same 380 matches with every betting market ≈ $6.08.

Platform usage (compute and residential proxy traffic) is billed on top and is small: about $0.001 for a 380-match season in our tests, and about $0.30 per 1,000 matches with market books.

❓ FAQ

Is it legal to scrape OddsPortal? The scraper reads only publicly visible pages and stores no personal data. Check OddsPortal's terms and the rules that apply to you before using the data; ask a lawyer if you are unsure.

Do I need an account, cookies or my own proxy? No. The run uses residential exits in Malta by default, which shows the widest international bookmaker list. Pick another country in the proxy settings to see that country's licensed bookmakers instead (datacenter exits are in the US and show US sportsbooks only).

How many matches can I get? As many as the links list. A results or season link is read page by page to the end of the season (OddsPortal shows 50 matches per page). A plain league link lists only the upcoming fixtures the league page shows right now. Set Max matches to 0 for no limit.

How far back does the history go? As far as OddsPortal has seasons for the league: add one season link per season. Older seasons usually list fewer bookmakers.

Why is a field empty? Upcoming matches have no result, winner or scores yet, some matches have no odds at all (odds is null), and some matches have no market odds (markets is empty and the market book is not charged).

Can I schedule it or use it through the API? Yes. Schedule runs on upcoming-fixture links to record your own odds history, and start runs or read datasets through the API with any HTTP client.

⚠️ Limits

  • Odds are pre-match odds. Live in-play odds and the full tick-by-tick history between opening and closing prices are not collected.
  • Outright (league winner) markets are not included.
  • Date pages such as "today's matches", sport and country overview pages, team pages and head-to-head overview pages are not supported; use league, results, season or match links.
  • The bookmaker list depends on the proxy country, as on the website.
  • A plain league link returns only the fixtures the league page currently lists (usually the next one or two rounds).
  • Market books need about 30 requests per match (roughly 3,000 to 3,600 matches per hour in our tests). The default run timeout is one hour, so raise the timeout in the run options for bigger market-book jobs; rows saved before a timeout are kept.

Related actors

//From the blog\\

Latest articles

All articles
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.