Tennis Match Stats Scraper - ATP & WTA avatar

Tennis Match Stats Scraper - ATP & WTA

Pricing

from $16.15 / 1,000 match records

Go to Apify Store
Tennis Match Stats Scraper - ATP & WTA

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

RecordsData

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

9 days ago

Last modified

Share

RecordsData

๐ŸŽพ 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 tournaments and tournamentSeason.
  • 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?

FieldDescription
recordTypematch, ranking, player, tournament or search
matchId, url, tournament, tour, season, round, surfaceMatch ID, link, event, tour, season, round, surface
player1, player2, player1Ranking, player1SeedThe two players, live ranking and seed
setsWonPlayer1, setsWonPlayer2, scoreBySet, winnerSets, games per set, winner
status, startTime, durationMinutesStatus, UTC start time, duration
statistics, setStatistics, pointByPointServe and return lines, points of every game
h2hRecord, h2hMeetings, odds, votesHead-to-head, earlier meetings, odds, fan votes
ranking, points, bestRanking, utrRating, heightCm, prizeMoneyCareerRanking and player profile
titleHolder, mostTitles, prizeMoney, championsTournament 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

  1. Type a player name, pick a tournament, or set dateFrom and dateTo.
  2. Narrow with tour, matchType and matchStatus; switch on extras.
  3. Click Start, then download the dataset as CSV, Excel, JSON or XML.

โš™๏ธ Input

FieldDefaultMeaning
playerNames["Novak Djokovic"]Players to look up; recent and upcoming matches
eventIds, liveOnlyempty, falseSofascore match IDs; every match live now
tournaments, tournamentSeasonempty, latestName, id or id:seasonId; latest or a year
dateFrom, dateTo, gameWindowempty, bothUTC YYYY-MM-DD (day schedule up to 14 days if no player); played, upcoming, both
playerProfiles, tournamentProfilesemptyName, id or URL; one profile row each
searchQueries, searchType, listTournamentsempty, all, falseName search; tournament calendar
includePlayerResults, playerResultsLimitfalse, 30Results per profiled player, 1 to 150
includeSeasonStatistics, includeChampions, championSeasonsfalse, 5Season totals; champions, 1 to 30 seasons
tour, matchType, matchStatusanyatp, wta, challenger, itf, utr; singles, doubles; finished, live, upcoming
maxItemsnoneMaximum rows. Free users get 10
includeStatistics, includeSetStatisticsfalseStatistic lines, whole match or per set
includePointByPoint, includeH2h, includeH2hMeetingsfalsePoint sequence, tally, earlier meetings
includeOdds, oddsMarketsfalse, mainOdds; main or all
includeVotes, includeRankingfalseFan votes; ranking once per unique player
onlyNew, stateKey, resetSeenfalse, emptyOnly 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.

CapabilityThis Actorcrawlstone/tennis-scraperdevarq/tennis-scraper
Day scheduleUp to 14 days, with filtersTournaments by date7 days back and ahead
Statistics, point-by-pointBoth, plus per setPoint-by-point with period statsBoth
Head-to-head, only-newBothNot shownBoth
OddsOne bookmaker, opening and movementDate-level, live matches onlyOne entry per bookmaker
Profiles, searchYes; no Elo or titles listYes, with Elo and championsTop-100 rankings, player mode
Price per 1,000$19 per 1,000 matchesfrom $6.00 per successful resultfrom $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.

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

๐Ÿ†˜ 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