Tennis Match Stats Scraper - ATP & WTA
Pricing
from $16.15 / 1,000 match records
Tennis Match Stats Scraper - ATP & WTA
Scrape ATP and WTA tennis data from Sofascore by player name or match ID: results with set scores, serve and return statistics, point-by-point sequences, head-to-head history, betting odds and live rankings. Export CSV, Excel, JSON. No login or API key. Six record types per run.
Pricing
from $16.15 / 1,000 match records
Rating
0.0
(0)
Developer
RecordsData
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
9 days ago
Last modified
Categories
Share
๐พ Tennis Match Stats Scraper: ATP & WTA Results, Stats, Odds & Rankings
Tennis Match Stats Scraper collects ATP and WTA data from Sofascore: matches by player name, match ID, tournament season or calendar day (set scores, serve statistics, point-by-point, head-to-head, odds, seeds, rankings), plus player profiles, tournament profiles, name search and tournament lists. Filter by date, tour, singles or doubles and status, monitor only new matches, and export CSV, Excel or JSON. No login. $0.019 per match; extras are opt-in.
Tennis Match Stats Scraper by RecordsData turns a player name such as "Novak Djokovic", a tournament such as "Roland Garros" or a day such as 2026-10-10 into one row per match, with up to nine kinds of data attached. In our cloud verification of build 0.1.24 on 2026-10-10, 18 of 19 small runs succeeded (the one failure was a network error on our test machine) and the median run took 14.6 seconds. Blocked requests are retried with a fresh IP.
๐พ What does Tennis Match Stats Scraper do?
- Scrapes matches for any ATP or WTA player by name or Sofascore match ID, or a day schedule of up to 14 days (
dateFrom,dateTo, no player), biggest tournaments first. - Reads whole tournament seasons with
tournamentsandtournamentSeason. - Monitors with
onlyNew: delivered matches are skipped before any request and not charged. - Adds serve and return statistics (optionally per set), point-by-point, head-to-head, odds with opening price and movement, fan votes, seeds and rankings.
- Returns player profiles, tournament profiles, name search and tournament lists.
๐ What data can you extract from Sofascore tennis?
| Field | Description |
|---|---|
recordType | match, ranking, player, tournament or search |
matchId, url, tournament, tour, season, round, surface | Match ID, link, event, tour, season, round, surface |
player1, player2, player1Ranking, player1Seed | The two players, live ranking and seed |
setsWonPlayer1, setsWonPlayer2, scoreBySet, winner | Sets, games per set, winner |
status, startTime, durationMinutes | Status, UTC start time, duration |
statistics, setStatistics, pointByPoint | Serve and return lines, points of every game |
h2hRecord, h2hMeetings, odds, votes | Head-to-head, earlier meetings, odds, fan votes |
ranking, points, bestRanking, utrRating, heightCm, prizeMoneyCareer | Ranking and player profile |
titleHolder, mostTitles, prizeMoney, champions | Tournament profile |
The dataset has 103 columns (build 0.1.24) in five views. Match extras you did not switch on carry Not Requested; data a match does not have carries N/A. On profile, search and list rows, empty fields are left out.
๐งพ Sample output
Abridged real row from a cloud run on 2026-10-04 with {"playerNames": ["Novak Djokovic"], "maxItems": 1, "includeStatistics": true}; statistics is shortened to 2 of 20 lines.
{"recordType": "match","matchId": 14956421,"tournament": "Athens, Greece","round": "Final","surface": "Hardcourt indoor","player1": "Novak Djokovic","player2": "Lorenzo Musetti","setsWonPlayer1": 2,"setsWonPlayer2": 1,"scoreBySet": [{ "set": 1, "player1Games": 4, "player2Games": 6 }, { "set": 2, "player1Games": 6, "player2Games": 3 }],"status": "Ended","startTime": "2025-11-08T15:00:00.000Z","statistics": [{ "group": "Service", "stat": "Aces", "player1": "6", "player2": "10" },{ "group": "Service", "stat": "Double faults", "player1": "3", "player2": "3" }],"scrapedAt": "2026-10-04T07:27:47.026Z"}
๐ฐ How much does it cost to scrape tennis matches?
Pay per event, only for saved records. Error rows, empty results, skipped already-seen matches and failed runs are never billed. Prices are the live Free-plan prices read on 2026-10-10; higher Apify plans pay less for match and point-by-point records (Gold: $0.01615 and $0.0153); the other events cost the same on every plan.
- Match record: $0.019 per match
- Match statistics record: $0.01 per statistic line (20 to 42 per match). Off by default
- Set statistics line: $0.005, off by default
- Point-by-point record: $0.018 per set with its point sequence
- Head-to-head record: $0.01 per match; past meeting: $0.005 each
- Betting odds record: $0.01 per odds line (a normal match has 2)
- Fan votes: $0.01 per match
- Ranking record: $0.01 per unique player per run
- Profile record: $0.003 per player or tournament profile
- Search record: $0.0015 per result row
- Player result record $0.0001, season statistics record $0.0005, champion record $0.0005: one line each, all off by default
Tournament lists have no billed event yet and are free for now. Date windows, day schedules, seasons and only-new mode add no event.
Worked examples: 1,000 match rows with the defaults cost $19. A one-day ATP schedule capped at maxItems: 5 costs 5 x $0.019 = $0.095. Five matches with fan votes cost 5 x $0.019 + 5 x $0.01 = $0.145. A match with 5 earlier meetings adds 5 x $0.005 = $0.025 to its $0.019 row. Match statistics are off by default because they bill per line: roughly $0.20 to $0.42 extra per match. One player profile with 30 recent result lines costs $0.003 + 30 x $0.0001 = $0.006. oddsMarkets: all costs about three times main.
Use Max total charge to cap spending; the Actor stops cleanly and keeps saved data.
๐ How to scrape tennis data in 3 steps
- Type a player name, pick a tournament, or set
dateFromanddateTo. - Narrow with
tour,matchTypeandmatchStatus; switch on extras. - Click Start, then download the dataset as CSV, Excel, JSON or XML.
โ๏ธ Input
| Field | Default | Meaning |
|---|---|---|
playerNames | ["Novak Djokovic"] | Players to look up; recent and upcoming matches |
eventIds, liveOnly | empty, false | Sofascore match IDs; every match live now |
tournaments, tournamentSeason | empty, latest | Name, id or id:seasonId; latest or a year |
dateFrom, dateTo, gameWindow | empty, both | UTC YYYY-MM-DD (day schedule up to 14 days if no player); played, upcoming, both |
playerProfiles, tournamentProfiles | empty | Name, id or URL; one profile row each |
searchQueries, searchType, listTournaments | empty, all, false | Name search; tournament calendar |
includePlayerResults, playerResultsLimit | false, 30 | Results per profiled player, 1 to 150 |
includeSeasonStatistics, includeChampions, championSeasons | false, 5 | Season totals; champions, 1 to 30 seasons |
tour, matchType, matchStatus | any | atp, wta, challenger, itf, utr; singles, doubles; finished, live, upcoming |
maxItems | none | Maximum rows. Free users get 10 |
includeStatistics, includeSetStatistics | false | Statistic lines, whole match or per set |
includePointByPoint, includeH2h, includeH2hMeetings | false | Point sequence, tally, earlier meetings |
includeOdds, oddsMarkets | false, main | Odds; main or all |
includeVotes, includeRanking | false | Fan votes; ranking once per unique player |
onlyNew, stateKey, resetSeen | false, empty | Only undelivered matches; monitor label; clear state |
Day schedule of one ATP day (the default player is treated as untouched when you type dates, so this gives the schedule, not Djokovic's matches):
{ "dateFrom": "2026-10-10", "dateTo": "2026-10-10", "tour": "atp", "matchType": "singles", "matchStatus": "upcoming", "maxItems": 5, "includeOdds": true }
Monitor mode: rerun the same input on a schedule with "onlyNew": true. A match counts as new once per state: upcoming, finished, and while live every new game score. State lives in a store named tennis-seen.
๐ค Output
Results go to the default dataset with an Overview view and a full view, told apart by recordType. If nothing matches, the run ends successfully and bills nothing. If Sofascore blocks every request the run fails with an explicit message.
๐ Tennis Match Stats Scraper vs alternatives
Read on 2026-10-10 from the public Apify Store pages. "Not shown" means the page does not mention it.
| Capability | This Actor | crawlstone/tennis-scraper | devarq/tennis-scraper |
|---|---|---|---|
| Day schedule | Up to 14 days, with filters | Tournaments by date | 7 days back and ahead |
| Statistics, point-by-point | Both, plus per set | Point-by-point with period stats | Both |
| Head-to-head, only-new | Both | Not shown | Both |
| Odds | One bookmaker, opening and movement | Date-level, live matches only | One entry per bookmaker |
| Profiles, search | Yes; no Elo or titles list | Yes, with Elo and champions | Top-100 rankings, player mode |
| Price per 1,000 | $19 per 1,000 matches | from $6.00 per successful result | from $1.20 ($1.50 Free) plus add-ons |
Also read: tagadanar/tennis-live-scores ($4.00 per 1,000 matches, $2.80 on Gold, statistics $10 per 1,000, no odds or point-by-point) and extractify-labs/flashscore-tennis-matches (from $1.00, no statistics).
We are not the cheapest: every rival above costs less per match. We lack Elo ratings, player title lists and year-end rankings, and return one bookmaker's odds. The price buys one run joining schedule, statistics, point-by-point, head-to-head, odds, seeds and profiles. Pick a cheaper actor if you only need scores.
๐ผ Use cases
Betting analysis, daily tournament feeds, match previews and prediction-model data.
๐ Run via API, schedule and integrations
curl -X POST "https://api.apify.com/v2/acts/RecordsData~tennis-match-stats-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"dateFrom": "2026-10-10", "dateTo": "2026-10-10", "tour": "wta", "maxItems": 10, "onlyNew": true}'
Send results to Google Sheets, Zapier, Make or n8n, or use the Python and JavaScript Apify clients.
โ๏ธ Is it legal to scrape tennis data?
The Actor reads publicly available match data, does not log in and collects no private personal data. Use the data in line with Sofascore's terms and applicable laws. Odds are informational only and not betting advice.
๐ค Tennis Match Stats Scraper MCP server for AI agents
Agents can call this Actor through the Apify MCP server at https://mcp.apify.com?tools=RecordsData/tennis-match-stats-scraper, which loads only this Actor as a tool. Use it as the server URL in Claude Desktop, Cursor or VS Code.
Example agent prompt:
Use the Tennis Match Stats Scraper to list the first 5 ATP singles matches scheduled for 2026-10-10 with odds, and tell me which favourite has the shortest price.
Tool description: use this tool when you need structured ATP or WTA match results, serve statistics, point-by-point, odds, head-to-head or rankings for a named player, a tournament season or a calendar day. It takes the same fields as the Input table and also covers profiles, name search and tournament lists. Statistics, meetings, votes and oddsMarkets: all raise the cost.
โ Frequently asked questions
How do I scrape ATP and WTA match results with the Tennis Match Stats Scraper?
Enter a player name such as "Novak Djokovic" in playerNames and click Start. You get one row per recent or upcoming ATP or WTA match from Sofascore, with tournament, round, surface, set scores, status and start time. Use eventIds for specific matches.
Does the Tennis Match Stats Scraper need a login or API key?
No. It reads publicly available Sofascore match data and does not log in, so you need no Sofascore account or API key. You only need an Apify account to run the actor, export CSV, Excel, JSON or XML, or call the Apify API.
Why did my Tennis Match Stats Scraper run return 0 results?
The name did not match a tennis player on Sofascore, the player has no matches to list, or your filters excluded everything. Use the full name as Sofascore spells it, for example "Iga Swiatek". An empty run finishes successfully with a clear status message and bills nothing.
Why is my Tennis Match Stats Scraper run expensive?
Most likely includeStatistics is on, or oddsMarkets is set to all. Statistics bill one $0.01 event per statistic line, and a full match has 20 to 42 lines, so about $0.20 to $0.42 extra per match on the Free plan. All are off by default; set Max total charge to cap spending.
Is point-by-point data available for every tennis match?
Only where Sofascore recorded it. With includePointByPoint on, you get the point sequence of every game in a set where Sofascore has it. Otherwise the field shows N/A and no point-by-point event is billed. Each set with data bills one $0.018 point-by-point record.
Why is a player ranking billed once per player?
A ranking is one fact about a player, so the Tennis Match Stats Scraper bills one $0.01 ranking record per unique player in the run, not one per match. If a player has 10 matches in your dataset, you pay for that ranking only once.
Can the Tennis Match Stats Scraper get live tennis matches?
Yes. Switch on liveOnly to fetch every tennis match in progress on Sofascore at that moment, or set matchStatus to live. Each live match is one match record at $0.019 on the Free plan, with the status field showing it is live. Combine it with any extra.
What do Not Requested and N/A mean in the output?
Not Requested means you did not switch that extra on, such as statistics, point-by-point, head-to-head or odds. N/A means you did request it but Sofascore has no data for that match, or the match has not been played yet, so you can tell the two cases apart.
How do I get every tennis match of one day?
Set dateFrom and dateTo and leave player names, tournaments and match IDs empty. You get the day schedule: every tennis match of those UTC days, up to 14 days, biggest tournaments first, so maxItems keeps ATP and WTA main draws before Challenger and ITF.
How does only-new mode work?
Switch on onlyNew and run the same search again. The actor remembers delivered matches in a store named tennis-seen in your account and skips them before any request, so skipped matches are not charged. A match counts as new once per state: upcoming, finished, and while live every new game score. stateKey separates monitors; resetSeen starts over.
How do I get a tennis player or tournament profile?
Fill playerProfiles with a name, a Sofascore id or a player page URL, or tournamentProfiles with a tournament name, id or URL. You get one profile row each: ranking, UTR rating, hand, height and prize money for players; tour, surface, points, host city and title holder for tournaments. A profile row bills one $0.003 record; optional lines bill small separate events.
What can the Tennis Match Stats Scraper not do yet?
It has no Elo ratings, no list of a player's titles and finals, no year-end rankings and no backhand type, because Sofascore does not send them. It returns the odds of one bookmaker only, and gameWindow does not apply to the day schedule. Player history is capped at 150 matches and champions at 30 seasons.
๐ Want more sports data? Other RecordsData scrapers
- Sofascore Match Stats Scraper for football scores, odds and lineups
- Sports Reference Stats Scraper for NBA and NHL statistics
๐ Support
Problems or missing fields? Use the Issues tab or write to contact.punkrecordsdata@gmail.com. Independent tool, not affiliated with Sofascore, the ATP or the WTA.
Last updated: 2026-10-11