OddsPortal Scraper
Pricing
from $3.00 / 1,000 match with odds
OddsPortal Scraper
The OddsPortal Scraper extracts fixtures, results and betting odds from OddsPortal.com, capturing every bookmaker's price, average and best odds, payouts, final scores and full market books with opening and closing lines - ideal for betting models and odds backtesting.
Pricing
from $3.00 / 1,000 match with odds
Rating
0.0
(0)
Developer
FalconScrape
Maintained by CommunityActor stats
1
Bookmarked
78
Total users
13
Monthly active users
0.28 hours
Issues response
6 days ago
Last modified
Categories
Share
🚀 OddsPortal Scraper: Historical Odds, Results and Bookmaker Odds
Export historical odds, results and upcoming fixtures from OddsPortal as clean JSON, CSV or Excel. The OddsPortal Scraper returns every bookmaker's price for a match, not just the average, plus final scores, payout percentages and, on request, full market books with opening odds and closing odds. Use it as an OddsPortal API alternative for odds comparison, odds history and betting research across football, tennis, basketball, hockey, MMA and many more sports.
🎯 Use Cases
- Historical betting odds for modelling: pair decades of results with the odds that were actually available and backtest your betting or forecasting models.
- Odds comparison: put every bookmaker's price on the same market side by side and see which book offers the best odds.
- Closing line value research: measure how the market moved from opening odds to closing odds per bookmaker, the standard benchmark for judging a model's prices.
- Odds movement and dropping odds: schedule runs on upcoming fixtures and build your own odds history to spot prices that shorten before kick-off.
- Bookmaker margin analysis: compare payout percentages across bookmakers, leagues and seasons.
- Sports data feeds and dashboards: power an odds dashboard or a sports odds API of your own with a scheduled feed of fixtures and prices.
✨ Features: Opening Odds, Closing Odds and Every Bookmaker
- Every bookmaker, not just the average: average odds, best odds, which bookmaker offers them, each bookmaker's own price and its payout percentage.
- Upcoming fixtures: kick-off times, venues, teams, team pages and current match-winner odds.
- Historical results archive: final scores, half-time and period scores, winners and closing odds going back 20+ seasons for major leagues, one season per URL. The whole season is collected, page by page.
- Full market books: 1X2, Home/Away, Over/Under, Asian Handicap, Correct Score, Both Teams to Score, Double Chance, Draw No Bet, Half Time / Full Time, European Handicap and Odd or Even, across Full Time, 1st Half and 2nd Half.
- Line movement: opening odds with timestamps and closing odds per bookmaker, so you can measure how the market moved.
- Choose your bookmaker region: the country in the proxy settings decides which bookmakers you see. The default (Malta) returns the widest international selection.
- Fast and lightweight: a league's upcoming fixtures come back in seconds.
- Fair billing: you pay per match, and the market book is only charged when market odds actually came back.
🛠️ How It Works
- Paste OddsPortal league URLs. A plain league URL such as
https://www.oddsportal.com/football/england/premier-league/returns upcoming fixtures. Add/results/for finished matches, or use a season URL such ashttps://www.oddsportal.com/football/england/premier-league-2024-2025/results/for history. - Set Max matches and, if you need more than match-winner odds, turn on Scrape all betting markets.
- Run the scraper and download the results as JSON, CSV, Excel, HTML or XML, or pull them through the API.
⚙️ Input
| Field | What it does |
|---|---|
League URLs (startUrls) | OddsPortal league pages. Plain league URL gives upcoming fixtures; a /results/ URL gives finished matches with scores and closing odds. |
Max matches (maxItems) | Maximum number of matches across all URLs. Default 50. |
Scrape all betting markets (scrapeMatchMarkets) | Also collect every market per match with opening and closing odds. Slower and billed separately. Default off. |
Proxy configuration (proxyConfiguration) | Its country decides which bookmakers appear: Malta (default) gives the widest international list; UK, Germany or US return that country's licensed bookmakers. |
{"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}
Tips:
- Leave Scrape all betting markets off unless you need markets beyond the match winner. It is roughly 30 times more work per match and is billed separately.
- Season URLs are the cheapest way to build odds history. Open a league's results page, pick a season in the dropdown and add that URL to
startUrls.
💰 Pricing
Pay only for the matches you get. No monthly rental.
| Event | Price | What you get |
|---|---|---|
| Match with odds | $0.003 per match ($3.00 per 1,000) | One fixture or finished match with per-bookmaker match-winner odds, best and average prices, payouts and final score. |
| Full market book | $0.02 per match | Every betting market and scope for the match with opening and closing odds per bookmaker. Only when Scrape all betting markets is on. |
| Actor start | $0.00005 per run | Charged once when the run starts (per GB of memory; the default is 1 GB). |
Examples:
- 50 upcoming matches = $0.15.
- A full 380-match league season with closing odds = $1.14.
- The same 380 matches with every betting market = $8.74.
Apify's free plan includes $5 of monthly usage, enough to try the scraper on several full seasons.
📊 Sample Output Data
A finished Premier League match from a real run (bookmakerOdds trimmed to three of eleven bookmakers):
{"matchId": 7719147,"eventId": "44RKa9ke","url": "https://www.oddsportal.com/football/h2h/bournemouth-OtpNdwrc/leicester-KrrdAMyI/#44RKa9ke","sport": "Football","country": "England","league": "Premier League 2024/2025","leagueUrl": "https://www.oddsportal.com/football/england/premier-league-2024-2025/","homeTeam": "Bournemouth","awayTeam": "Leicester","homeTeamUrl": "https://www.oddsportal.com/football/team/bournemouth/OtpNdwrc/","awayTeamUrl": "https://www.oddsportal.com/football/team/leicester/KrrdAMyI/","startTime": "2025-05-25T15:00:00.000Z","startTimestamp": 1748185200,"status": "Finished","isFinished": true,"result": "2:0","partialResult": "0:0, 2:0","winner": "home","venue": "Vitality Stadium","venueTown": "Bournemouth","venueCountry": "England","bookmakerCount": 11,"odds": {"home": { "average": 1.34, "highest": 1.38, "highestBookmaker": "1xBet", "bookmakerCount": 11 },"draw": { "average": 5.64, "highest": 5.8, "highestBookmaker": "Stake.com", "bookmakerCount": 11 },"away": { "average": 8.43, "highest": 9.1, "highestBookmaker": "Betsson", "bookmakerCount": 11 }},"bookmakerOdds": [{ "bookmakerId": 3, "bookmaker": "bet-at-home", "payout": 95.1, "home": 1.33, "draw": 5.5, "away": 8.5 },{ "bookmakerId": 16, "bookmaker": "bet365", "payout": 94.5, "home": 1.33, "draw": 5.5, "away": 8 },{ "bookmakerId": 43, "bookmaker": "Betsson", "payout": 97.1, "home": 1.34, "draw": 5.75, "away": 9.1 },"…"]}
odds holds the average and best price per outcome and the bookmaker offering the best one; bookmakerOdds has one entry per bookmaker with its own price and payout percentage. partialResult lists the period scores. With Scrape all betting markets on, each match also carries a markets array, one entry per market, scope and line:
{"market": "Over/Under","marketId": 2,"scope": "Full Time","scopeId": 2,"handicap": 2.5,"bookmakers": [{"bookmakerId": 16,"bookmaker": "bet365","closingOdds": { "over": 1.5, "under": 2.63 },"openingOdds": { "over": 1.53, "under": 2.5 },"openingTime": { "over": "2025-05-18T16:08:48.000Z", "under": "2025-05-18T16:08:48.000Z" }},"…"]}
🔁 Schedule and Integrate: Track Odds Movement
For odds movement, run it once or several times a day on upcoming-fixture URLs with the same input: every run is a dated snapshot, and together they form your own odds history. For historical odds, one run per season URL is enough. Set up recurring runs in Apify Schedules, and send the results to Google Sheets, Zapier, Make, n8n or a webhook with Apify integrations, so new prices land where your model or dashboard already reads them.
🤖 Use with AI Agents (MCP)
This Actor works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (https://mcp.apify.com). An agent can call it with:
{ "startUrls": [{ "url": "https://www.oddsportal.com/football/england/premier-league/" }], "maxItems": 20 }
❓ FAQ
Does OddsPortal have an official API? No. OddsPortal does not offer a public API for its odds or results. This Actor is the practical alternative: no key, no approval and no rate-limit plumbing, and it returns the public data the site shows, including every bookmaker's price, payouts and opening and closing odds, as structured JSON you can call through the Apify API.
Do I need an OddsPortal account? No. Only publicly visible pages are read.
How far back does historical odds data go? Results for major leagues go back 20+ seasons; add one season URL per season you want. Older seasons have fewer bookmakers, and multi-bookmaker odds realistically start around 2008–2010. A plain league URL returns only the upcoming fixtures the league page currently lists. All sports on OddsPortal work: football, tennis, basketball, hockey, American football, baseball, handball, rugby, volleyball, cricket, darts, boxing, MMA, esports and more.
Can I get tick-by-tick odds movement? The scraper returns opening odds with timestamps and closing odds for every bookmaker, which is what closing line value analysis needs. Intermediate ticks between open and close are not publicly available; schedule runs on upcoming fixtures to record your own snapshots.
Why do I see different bookmakers than on the website? OddsPortal shows different bookmakers depending on where you connect from. Change the country in the proxy settings to target a specific market.
Why is a field empty? Upcoming matches have no result, partialResult or winner yet, and some matches have no market odds, so their markets array is empty. If something looks wrong, open an issue on the Actor's Issues tab.
Is scraping OddsPortal legal? The scraper only collects publicly available data and stores no personal information. OddsPortal's robots.txt asks crawlers not to access these pages, and its Terms of Service apply to you as the operator of the run. You are responsible for making sure your use complies with applicable law and terms; consult a lawyer if you are unsure.
🔗 Related Scrapers
- BetExplorer Scraper: fixtures, results and every bookmaker's odds from a second odds comparison site, to cross-check prices.
- Flashscore Scraper: live scores, fixtures and results with period breakdowns to pair with the odds.
- Tennis Scraper: ATP, WTA, Challenger and ITF matches with optional stats and point-by-point data for tennis models.
- Polymarket Price History Scraper: prediction-market price history to compare with bookmaker odds.
- Kalshi Scraper: prediction-market prices, implied probabilities and settled results.