Tennis Scraper
Pricing
from $6.00 / 1,000 successful results
Tennis Scraper
Extract normalized tennis data from SofaScore and Tennis Abstract, including live matches, tournaments, point-by-point records, and player statistics.
Pricing
from $6.00 / 1,000 successful results
Rating
0.0
(0)
Developer
Crawl Stone
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
2
Monthly active users
4 hours ago
Last modified
Categories
Share
Get live tennis scores, tournament information, match details, and player statistics in structured, ready-to-use datasets. Tennis Scraper collects public data from SofaScore and Tennis Abstract.
Unofficial Actor: Tennis Scraper is an independent tool and is not affiliated with or endorsed by SofaScore or Tennis Abstract.
What can this Actor do?
- Get a current snapshot of live tennis matches and scores.
- Find tournaments scheduled for a specific date.
- List the available seasons for a tournament.
- Get upcoming and historical matches from a tournament season.
- Extract point-by-point match data and available statistics.
- Look up supported players and their historical statistics.
- Export results as JSON, CSV, Excel, and other Apify Dataset formats.
- Manage the required proxy automatically at no additional setup cost.
Quick start
- Click Try for free on the Actor page.
- Choose what you want to collect.
- Enter the requested date or ID.
- Click Save & Start.
- Open the Output tab when the run finishes.
For your first run, choose Live matches. No additional input is required:
{"mode": "liveMatches"}
The Actor saves one result for each match that is live when the run starts. If no matches are live, the run still succeeds with an empty Dataset.
Choose a mode
| Mode | Use it for | Required input | Results |
|---|---|---|---|
liveMatches | See matches being played now | None | Live matches, participants, scores, tournaments, and available odds |
tournaments | Find tournaments on a date | date | Tournaments scheduled for that date |
pointByPoint | Inspect a match in detail | matchId | Sets, games, points, and available match statistics |
tournamentSeasons | Find seasons for a tournament | tournamentId | Available tournament seasons |
tournamentDetails | Browse matches from a tournament season | tournamentId; optional seasonId | Tournament information with upcoming and historical matches |
playerDetails | Look up a player's history | playerId | Player profile and supported historical statistics |
SofaScore provides live matches, tournaments, seasons, match details, and the player IDs used as input. Tennis Abstract provides the player history returned by playerDetails.
Input fields
| Field | Used by | What to enter |
|---|---|---|
mode | Every run | liveMatches, tournaments, pointByPoint, tournamentSeasons, tournamentDetails, or playerDetails |
maxMatches | liveMatches | Optional maximum number of matches; leave empty or use 0 for no limit |
date | tournaments | A date in YYYY-MM-DD format |
matchId | pointByPoint | A positive match ID from a match result |
tournamentId | tournamentSeasons, tournamentDetails | A positive tournament ID from a match or tournament result |
seasonId | tournamentDetails | Optional season ID; leave empty to use the newest available season |
playerId | playerDetails | A positive SofaScore player ID from a match result |
The Store form starts with liveMatches selected. Fill in only the fields needed for your chosen mode. The Actor checks dates and IDs when the run starts and displays an error if a required value is missing or invalid.
Find IDs for another search
Results include IDs that you can use in other modes:
- Live matches provide match, tournament, and player IDs.
- Tournament searches provide tournament IDs.
- Tournament season searches provide season IDs.
- Tournament details provide match and player IDs.
For example, to explore a tournament:
- Use
tournamentsto find its tournament ID. - Use
tournamentSeasonsto find a season ID. - Use
tournamentDetailsto list matches from that season. - Use
pointByPointto inspect one match.
For player history, use the SofaScore playerId from a match result. You do not need to find or enter a Tennis Abstract URL. If the player is not supported, the Actor returns an error result explaining what happened.
Input examples
Live matches
{"mode": "liveMatches","maxMatches": 10}
Tournaments on a date
{"mode": "tournaments","date": "2026-07-10"}
Point-by-point match data
{"mode": "pointByPoint","matchId": 16385412}
Tournament seasons
{"mode": "tournamentSeasons","tournamentId": 2361}
Tournament details
Use a specific season:
{"mode": "tournamentDetails","tournamentId": 2361,"seasonId": 63966}
Or leave out seasonId to use the newest available season:
{"mode": "tournamentDetails","tournamentId": 2361}
Player details
{"mode": "playerDetails","playerId": 206570}
The dates and IDs above are examples. Use current IDs from your own Actor results.
Understanding the results
Results are saved in the run's default Dataset. The counts below describe successful operations; a failed scrape operation saves one error result instead.
| Mode | Number of results | What each result contains |
|---|---|---|
liveMatches | Zero or one per live match | Match, participants, status, score, and available odds |
tournaments | Zero or one per tournament | Requested date and tournament information |
pointByPoint | One | Match ID, point-by-point data, and available statistics |
tournamentSeasons | Zero or one per season | Tournament ID and season information |
tournamentDetails | One | Tournament and season information with a list of matches |
playerDetails | One | Player profile and available historical statistics |
The Output tab includes a separate table view for each mode. Live matches opens by default. Select another view to see the most useful columns for that result type.
Detailed information remains grouped in lists and objects. For example:
- match scores keep their set breakdown;
- point-by-point results keep sets, games, and points together;
- tournament details keep matches in a list;
- player history keeps each statistical table in its own list.
This structure is preserved in JSON, CSV, Excel, and API exports.
Empty results and errors
An empty Dataset can be a valid result:
- no matches were live when
liveMatchesran; - no tournaments were scheduled for the selected date;
- no seasons were returned for the selected tournament.
If a scrape operation cannot be completed, the Actor saves one error result and marks the run as failed. The failed operation is not charged.
Error results for point-by-point, tournament-season, tournament-detail, and player operations include the requested ID. Live-match and tournament-collection errors contain the error object without an ID because those operations do not target one source record. For example:
{"matchId": 16385412,"error": {"message": "fetch point-by-point for match 16385412: get SofaScore /api/v1/event/16385412/point-by-point: GET from SofaScore failed: unexpected HTTP status 404: not found"}}
Read error.message for the source or parsing failure. Input, configuration, and Dataset-storage failures can stop the run without an error result because the Actor could not start the scrape or save the row.
Some information is optional. When live odds are unavailable, odds is an empty object. When point statistics are unavailable, statistics is an empty list. A player section that is not available is omitted from the result.
Use with Apify MCP
You can use Tennis Scraper from MCP-compatible AI clients through Apify's hosted MCP server:
https://mcp.apify.com?tools=crawlstone/tennis-scraper
Connect your Apify account using OAuth or an API token, then send the same inputs used in the Store form. For example:
{"mode": "liveMatches","maxMatches": 1}
The MCP response may return the run and Dataset information before returning all rows. Use the returned Dataset ID to retrieve the results when needed. See the Apify MCP documentation for setup instructions.
Managed proxy
You do not need to configure, supply, or pay for a separate proxy. The Actor automatically manages the residential proxy sessions needed for source requests. Proxy usage is included in the Actor price, and there are no proxy settings to configure.
Pricing
You pay for successful operations, not for the number of Dataset results. Every successful mode run charges one successful-result event, whether it returns zero, one, or many rows.
Failed scrape operations are not charged. When possible, the Actor saves one error result before marking the run as failed.
Platform and managed proxy usage are included in the Actor price. Check the Actor's Pricing tab for current rates and available plan pricing. Standard Apify storage costs may still apply if you access or retain data after the run.
Frequently asked questions
What should I do when there are no live matches?
Nothing is wrong. The run succeeds with an empty Dataset when no matches are live at that moment. Run it again later or use an Apify Schedule for regular snapshots.
Can I use Tennis Scraper from my application?
Yes. Open the API tab on the Actor page to copy a request for your preferred language. You can also use webhooks, schedules, integrations, or Apify MCP.
Can I enter a Tennis Abstract URL for player details?
No. Use a SofaScore player ID from a match result. The Actor finds the supported Tennis Abstract player internally.
Why did I receive an error result?
The selected scrape operation could not be completed. The source request may have failed, the requested record may not have been available, or the returned data could not be parsed. Read error.message for details and try again later when appropriate. The run is marked as failed and is not charged.
Privacy
The Actor uses your Apify run input and Dataset storage. Do not include API tokens, passwords, or other private information in the input.
You are responsible for your inputs, stored results, retention settings, and how the data is used.
Support
If you need help, contact support from this Actor's Apify Store page and include:
- the Apify run ID;
- the selected mode;
- the requested date or ID;
- the error message, if available;
- what you expected and what happened.
Never send your Apify API token or other secrets.