Skip to content

Bet365 Sports Data Scraper

Try for free

Scrape football, basketball, tennis and 6 more sports: scores, fixtures, full seasons, match stats with xG, lineups, player box scores, player profiles, standings, transfers, Bet365 odds and betting trends. Names instead of IDs. No login.

⚽ Bet365 Sports Data Scraper

Get scores, fixtures, full seasons, match stats with xG, lineups, player box scores, player profiles, standings, transfers, Bet365 odds and betting trends for football, basketball, tennis and 6 more sports. Type a league, team or player name and get clean rows back in seconds. No login, no API key, no browser.

✨ Why use Bet365 Sports Data Scraper?

  • ⚡ Fast — plain JSON requests, no browser: 20 games take about a second of scraping, a full 380-game Premier League season a few seconds, 10,000 box-score rows under two minutes.
  • 🧠 Names, not IDs — write premier-league, Real Madrid or Haaland; the scraper finds the right competition, team or player.
  • 📊 Deep match data — events, lineups with player ratings, 40+ team statistics (xG, possession, big chances, passes), missing players with injury and expected return, officials and top performers.
  • 🏀 9 sports, 2,000+ competitions — football, basketball, tennis, ice hockey, handball, American football, baseball, volleyball and rugby.
  • 💸 Bet365 odds included — 1X2 or moneyline prices in decimal, fractional and American format with opening prices, every market for a game, and betting trends with hit rates.
  • 💰 Cheap — $2.50 per 1,000 results, no monthly fee.

🎯 Use cases

  • 📈 Betting research and models — build season datasets with results, xG and Bet365 opening and closing prices.
  • 🧾 Settle player props — one row per player per game with points, rebounds, assists, shots, goals and minutes.
  • 🔍 Scouting — player profiles with season and career stats, transfers with fees, trophies and contract dates.
  • 🗓️ Fixture and results feeds — keep your app or spreadsheet in sync with upcoming games and final scores.
  • 🏆 League tables — current and past standings with form, goal difference and qualification places.
  • 📰 Transfer tracking — latest transfers and rumours per league or club with fees and status.

🚀 How to use

  1. Pick What to scrape (for example Scores or Match detail).
  2. Fill in the field that action needs: Competitions (premier-league, nba), Game IDs, Teams, Players or Search query.
  3. Set Max results (default 20) and, if you like, a status, season or date window under Filters.
  4. Click Start. Rows appear in the dataset as they are collected.
  5. Export to JSON, CSV, Excel or HTML, or read them through the API.

📥 Input

FieldUsed byExample
actionallscores, fixtures, gameDetail, boxScores, teamGames, odds, trends, standings, playerProfile, playerGames, squadStats, teamStats, transfers, search, competitions
competitionsscores, fixtures, standings, odds, trends, transfers, stats["premier-league", "laliga", "nba"] or IDs like 7
gameIdsgameDetail, boxScores, odds, trends["4742036"] (the gameId of a scores row)
teamsteamGames, squadStats, teamStats, transfers["Real Madrid"]
playersplayerProfile, playerGames["Haaland", "Mbappe"]
searchQuerysearchBarcelona
maxResultsall20 (0 = no limit)
gameStatusgame listsfinished, upcoming, live, all
seasonfixtures, standingsCurrent season, Last season, 2 seasons ago
startDateFrom / startDateTogame lists2026-10-01 / 2026-10-20
includeOddsscores, fixtures, teamGamestrue
statTypessquadStats, teamStats["Goals", "Expected Goals (xG)"]
languageallEnglish, Deutsch, Español, ...
{
  "action": "scores",
  "competitions": ["premier-league", "bundesliga"],
  "startDateFrom": "2026-10-01",
  "startDateTo": "2026-10-20",
  "includeOdds": true,
  "maxResults": 50
}

More examples:

  • Full last season: {"action": "fixtures", "competitions": ["premier-league"], "season": "Last season", "maxResults": 0}
  • Match detail: {"action": "gameDetail", "gameIds": ["4742036"]}
  • Last night's NBA box scores: {"action": "boxScores", "competitions": ["nba"], "maxResults": 300}
  • Squad ranking: {"action": "squadStats", "teams": ["Real Madrid"], "competitions": ["laliga"], "statTypes": ["Goals", "Assists", "Expected Goals (xG)"]}
  • Upcoming Bet365 odds: {"action": "odds", "competitions": ["premier-league", "champions-league"]}

📤 Output

Each action writes its own row type; the dataset has a view for each.

ActionOne row perKey fields
scores, fixtures, teamGames, oddsgamegameId, startTime, competition, homeTeam, awayTeam, homeScore, awayScore, status, result, round, team IDs, codes and logos, odds, webUrl
gameDetailgameeverything above plus periodScores, half-time score, events, lineups (formation, players, ratings, per-player stats), statistics, missingPlayers, coaches, officials, topPerformers, venue
boxScoresplayer in a gameplayer, teamName, group (starter or bench), position, stats (minutes, points, rebounds, goals, shots, passes, ...)
playerProfileplayerage, birthdate, nationality, club, position, height, preferredFoot, contractUntil, seasonStats, careerStats, transfers, trophies
playerGamesplayer in a gameteams, score, played, didNotPlayReason, stats
squadStats / teamStatsplayer / stat rankstat values and ranks per category (goals, xG, assists, rating, ...)
standingsteamposition, played, won, drawn, lost, goalsFor, goalsAgainst, points, recentForm
transferstransferplayerName, origin, target, type, price, priceValue, priceCurrency, status, time
trendstrendtext, recommendation, percentage, Bet365 odds and opening odds
search, competitionsentitytype, name, id, sport, country, popularityRank

Example scores row with includeOdds (from a test run):

{
  "gameId": 4742032,
  "sportType": "Football",
  "competition": "Premier League",
  "competitionId": 7,
  "country": "England",
  "season": 132,
  "round": 7,
  "startTime": "2026-10-19T19:00:00Z",
  "status": "finished",
  "homeTeam": "Tottenham",
  "homeTeamId": 114,
  "homeTeamCode": "TOT",
  "awayTeam": "Coventry",
  "awayTeamId": 24,
  "awayTeamCode": "COV",
  "homeScore": 3,
  "awayScore": 1,
  "result": "home",
  "odds": {
    "bookmaker": "Bet365",
    "market": "Full Time Result",
    "settled": true,
    "homeWinOdds": 1.53, "homeWinFractional": "8/15", "homeWinAmerican": "-189", "homeWinOpeningOdds": 1.5, "homeWinWon": true,
    "drawOdds": 4.5, "drawFractional": "7/2", "drawAmerican": "+350", "drawOpeningOdds": 4.33,
    "awayWinOdds": 5.5
  },
  "webUrl": "https://www.365scores.com/football/match/premier-league-7/coventry-tottenham-24-114-7#id=4742032"
}

Example boxScores row:

{
  "gameId": 4808909,
  "competition": "NBA",
  "homeTeam": "San Antonio Spurs",
  "awayTeam": "Oklahoma City Thunder",
  "homeScore": 104,
  "awayScore": 116,
  "teamName": "San Antonio Spurs",
  "player": "Victor Wembanyama",
  "group": "Starters",
  "position": "Center",
  "stats": {"Minutes": "34:09", "Points": 12, "Rebounds": 13, "Assists": 3, "Blocks": 6, "Field Goals": "1/13", "Free Throws": "10/12", "Plus/Minus": -2}
}

💰 Pricing

$2.50 per 1,000 results ($0.0025 per row), plus a small amount of platform usage (compute and datacenter proxy traffic, usually well under $0.001 per run).

  • 20 games ≈ $0.05
  • A full 380-game Premier League season ≈ $0.95
  • 1,000 player box-score rows ≈ $2.50

Invalid input and empty results are not charged. Set a maximum charge per run and the scraper stops cleanly when it is reached.

❓ FAQ

Is it legal to scrape this data? The scraper reads public sports data that anyone can see without an account. You are responsible for how you use it; check the terms that apply to you, especially before republishing odds.

Do I need a login, API key or proxy? No login and no key. Datacenter proxies are on by default and work well.

How many results can I get? Set maxResults to 0 for everything: a whole season of fixtures, every competition of a sport, or all past results the source keeps (about two years: the current and last season in full).

Why is a field empty? The source does not publish every field for every game or sport (for example xG for lower leagues, or a venue for some fixtures). Missing values are null; nothing is invented.

Where do game IDs come from? From the gameId field of scores, fixtures, teamGames or odds rows. You can also paste a 365Scores match URL.

Can I schedule it or use the API? Yes. Save an input as a task, schedule it (for example every morning for yesterday's box scores), and read results through the API or webhooks.

⚠️ Limits

  • Odds are the Bet365 prices the source shows next to each match; markets and live prices can lag Bet365's own site.
  • Player market values and the daily tipster pick are not available; trends returns today's top betting trends instead.
  • Date windows are read in 28-day steps and one run accepts up to 800 days.
  • History goes back about two years: the current and last season are complete, older seasons only partly or not at all.
  • Coverage varies by sport and competition (football has the most).

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.