Tennis Scraper — ATP/WTA Matches, Sofascore Stats & Odds
Pricing
from $3.50 / 1,000 matches
Tennis Scraper — ATP/WTA Matches, Sofascore Stats & Odds
Scrape ATP, WTA, Challenger, ITF and UTR tennis from Sofascore and Flashscore. Flat rows for matches (surface, round, seeds, live ranks, set scores, winner, pre-match odds, H2H), match statistics (serve, return, break points, point-by-point) and player rankings.
Pricing
from $3.50 / 1,000 matches
Rating
0.0
(0)
Developer
WebDataLabs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Scrape tennis matches, statistics, odds and rankings from Sofascore and Flashscore in one run — ATP, WTA, Challenger, ITF and UTR.
What is Tennis Scraper?
This tennis scraper turns a day of professional tennis into clean, flat rows you can model on directly: who plays whom, on what surface, in what round, with live rankings and seeds, the set-by-set score, the winner, match duration, pre-match odds and the head-to-head record. Turn on statistics and you also get serve, return and break-point numbers plus point-by-point rallies.
It reads two independent sources and merges them. Sofascore supplies the depth (surface, seeds, live ranks, statistics, odds, H2H); Flashscore supplies a second opinion on the fixture list and catches events Sofascore does not carry — Billie Jean King Cup ties, for example. Every row names the sources it came from, so you can always tell which data is corroborated.
What data can it extract?
The full field list is rendered automatically from the dataset schema. These are the ones people build on:
Match
| Field | Description |
|---|---|
tour, tournament, round | ATP / WTA / Challenger / ITF / UTR, event name, round |
surface | Hardcourt outdoor, Clay, Grass, Carpet — as the source states it |
startTime, status | ISO start time and notstarted / inprogress / finished / canceled … |
homePlayer, awayPlayer | Player or doubles pair |
homeRanking, awayRanking | Live ATP/WTA rank at match time |
homeSeed, awaySeed | Tournament seed; empty when the player is unseeded |
set1Home … set5Away, scoreSummary | Per-set games plus a readable 6-4 3-6 6-2 |
winner, winnerPlayer, durationMinutes | Result and how long it took |
oddsHome, oddsAway | Pre-match decimal odds; oddsOpeningHome / oddsOpeningAway give the opening line |
h2hHomeWins, h2hAwayWins | Career head-to-head between these two |
sources, sofascoreId, flashscoreId | Provenance and join keys |
Match statistics
Aces, double faults, first/second serve percentages, first/second serve points won, service and return games, break points saved, faced and converted, points and games won, tiebreaks — each for both players — plus pointByPoint, the rally of every game where the source publishes it.
Player
ATP/WTA ranking, ranking points, previous ranking and points, best ranking, tournaments played, country. Scraped by player ID you also get age, birth date, plays (handedness), height, turned pro, prize money and recent form.
Example output
One match row, trimmed:
{"recordType": "match","matchId": "sofascore:17149654","tour": "atp","tournament": "Chengdu, China","round": "Round of 32","surface": "Hardcourt outdoor","startTime": "2026-09-23T05:00:00.000Z","status": "notstarted","homePlayer": "Sebastián Báez","awayPlayer": "Jenson Brooksby","homeCountry": "Argentina","awayCountry": "USA","homeRanking": 51,"awayRanking": 77,"homeSeed": "8","awaySeed": null,"scoreSummary": null,"winner": null,"oddsHome": 2.38,"oddsAway": 1.57,"oddsOpeningHome": 2.38,"oddsOpeningAway": 1.57,"sources": ["sofascore"],"matchUrl": "https://www.sofascore.com/tennis/match/sebastian-baez-jenson-brooksby/yMBbsgLNb"}
Empty means "the source does not have it" — an unseeded player, a match with no published odds line, a match that has not been played yet. Nothing is ever filled in with a guess.
How to use it
- Pick a mode — matches on a date, live matches, by tournament, by player, or rankings.
- Choose your tours. ATP, WTA and Challenger are on by default; add ITF and UTR for a full day.
- Optionally turn on statistics and odds.
- Run it, then download JSON, CSV or Excel, or read the dataset over the API.
A day of main-tour tennis:
{"mode": "date","date": "2026-09-22","tours": ["atp", "wta"],"includeOdds": true,"maxMatches": 200}
Everything, with statistics:
{"mode": "date","tours": ["atp", "wta", "challenger", "itf", "utr"],"includeStats": true,"includeOdds": true,"maxMatches": 2000}
Live scoreboard:
{ "mode": "live", "tours": ["atp", "wta", "challenger"] }
ATP and WTA rankings:
{ "mode": "rankings", "tours": ["atp", "wta"], "maxMatches": 500 }
How much does it cost to scrape tennis data?
This actor is pay-per-event: you are charged per row it actually delivers, at the rates shown in the pricing box above. Matches, match statistics and player rows are metered separately, so a plain fixture list is the cheapest thing it can do and statistics cost more because they take an extra request per match.
Two levers control your spend:
maxMatchescaps the run.includeStatsis the expensive switch. Leave it off unless you want serve and return numbers — it adds two requests per match and bills at the statistics rate.
Selecting only the tours you need is the other big saving: a typical day has roughly ten times more ITF and UTR matches than main-tour ones.
Use cases
- Prediction-market and betting models — join
oddsOpeningHomeagainstoddsHometo see how a line moved before a match, then grade it againstwinner. ATP became an official prediction-market data partner in 2026 and this is the raw material. - Surface-specific player form — filter
surface = "Clay"and group by player to build clay-only win rates that a season-long record hides. - Serve analytics — turn on statistics and compare
homeFirstServePctagainsthomeBreakPointsSavedto find players who hold serve on second-serve quality rather than raw power. - Upset and seeding research — filter to rows where the winner's
rankingis far worse than the loser's to build a dataset of genuine upsets, with the seed and round they happened in. - Live dashboards — run
mode: "live"on a schedule for an in-progress scoreboard with set scores and current rankings.
FAQ
Which tours and tournaments are covered?
ATP, WTA, Challenger, ITF and UTR, singles and doubles, including qualifying draws. Team events such as the Billie Jean King Cup appear through the Flashscore source.
How current is the data?
It is read live at run time. In-progress matches return their current set scores and status, so running it on a schedule gives a live scoreboard.
Why do some matches have no odds?
Because no bookmaker line was published for that match. Lower-tier ITF and UTR events usually have none. The fields are left empty rather than filled with a placeholder.
What does the sources field mean?
Which sources contributed the row: ["sofascore","flashscore"] means both independently listed that match and it is corroborated. A single-source row is still correct, just not cross-checked. Player names are matched across sources by surname and start time, and a match is only merged when both players agree — the scraper will leave two rows unmerged rather than risk fusing two different matches.
Does it give season win-loss records?
It gives recent form — wins and losses over the rolling window the source publishes, in recentWins / recentLosses / recentMatches. These are not season totals and are deliberately not labelled as such.
Can I scrape a specific match, player or tournament?
Yes. The Advanced section takes matchIds, playerIds and tournamentIds (Sofascore IDs), and statuses filters to finished, in-progress or upcoming matches only.
Why does a run sometimes say the day is incomplete?
Every tournament is a separate request, and occasionally one cannot be fetched even after retries. When that happens the run says so in its status message instead of quietly returning a short day. Re-running fills the gap.
Do I need a proxy?
Yes, and residential is required — Sofascore rejects datacenter IPs. The default proxy configuration is already correct; leave it alone unless you need a specific country.
Is it legal to scrape tennis data?
The actor reads only publicly available pages, with no login and no paywall bypass, and does not collect personal data — professional match results, rankings and published odds are public sporting facts. You are responsible for your own use: check the sources' terms, respect database rights in your jurisdiction (the EU grants sui generis protection to database compilations), and do not republish wholesale as a competing live-score service. For research, modelling and internal analytics this is normal practice.
Related actors
- Transfermarkt Scraper — football player market values, transfers and career stats
- Event Scraper Pro — events from Eventbrite, Meetup and Lu.ma
- Google Trends Reliable — search interest over time
- Reddit Scraper Pro — posts and comments for sentiment work
- YouTube Transcript RAG — transcripts for analysis pipelines
Support
Found a bug or need a field that is missing? Open a ticket on the Issues tab of this actor — it is monitored and is the fastest way to get a fix. Feature requests that fit the actor's scope are usually shipped.