Tennis Scraper — Live Scores, Results, Stats & Odds
Pricing
from $3.50 / 1,000 matches
Tennis Scraper — Live Scores, Results, Stats & Odds
Tennis matches from SofaScore for any date range, player or match: scores with set and tiebreak detail, match statistics, betting odds and point-by-point, across ATP, WTA, Challenger and ITF. Pay per match.
Pricing
from $3.50 / 1,000 matches
Rating
0.0
(0)
Developer
astravalabs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Tennis match data for any date range, player or match: final and live scores with set and tiebreak detail, match statistics, betting odds and point-by-point. Covers ATP, WTA, Challenger, WTA 125, ITF and UTR. One clean row per match, ready for spreadsheets, models and dashboards.
Use it to build betting and prediction models, track players and tournaments, research serve and return patterns, or feed live scores into your own app.
Quick start
A week of main-tour results with everything:
{"dateFrom": "2026-10-01","dateTo": "2026-10-07","matchStatus": "finished","includePointByPoint": true}
Today's schedule across every tour:
{ "dateFrom": "today", "matchStatus": "upcoming", "tours": [] }
Matches in play right now:
{ "matchStatus": "live" }
A player's last 50 matches:
{"players": ["https://www.sofascore.com/tennis/player/sinner-jannik/206570"],"maxMatchesPerPlayer": 50}
players and matches take SofaScore URLs or numeric IDs. Dates are
calendar days in UTC, up to 31 per run.
What you get
One row per match (real data, abridged):
{"matchId": 17257382,"url": "https://www.sofascore.com/tennis/match/aleksandar-kovacevic-matteo-berrettini/IfVsicAb#id:17257382","startTime": "2026-10-07T04:00:00+00:00","status": "finished","statusDescription": "Ended","tour": "ATP","tournament": "Shanghai","tournamentPoints": 1000,"round": "Round of 128","surface": "Hardcourt outdoor","matchType": "singles","city": "Shanghai","player1": {"name": "Aleksandar Kovačević", "id": 187608, "country": "USA", "ranking": 81, "seed": null},"player2": {"name": "Matteo Berrettini", "id": 112783, "country": "ITA", "ranking": 46, "seed": null},"winner": "player2","winnerName": "Matteo Berrettini","setsPlayer1": 1,"setsPlayer2": 2,"score": "7-6(3) 1-6 4-6","sets": [{"set": 1, "player1": 7, "player2": 6, "tiebreakPlayer1": 7, "tiebreakPlayer2": 3, "durationSeconds": 3527}],"durationSeconds": 8124,"oddsPlayer1": 2.63,"oddsPlayer2": 1.5,"odds": [{"market": "Full time", "line": null, "isLive": false, "suspended": false,"choices": [{"name": "player1", "decimal": 2.63, "openingDecimal": 3.0, "winning": false},{"name": "player2", "decimal": 1.5, "openingDecimal": 1.4, "winning": true}]}],"statistics": {"aces": {"player1": 3, "player2": 23},"firstServeAccuracy": {"player1": 64, "player2": 47, "player1Total": 111, "player2Total": 73},"breakPointsScored": {"player1": 0, "player2": 3}},"pointByPoint": [{"set": 1, "game": 1, "server": "player1", "winner": "player1", "tiebreak": false,"break": false, "gamesAfter": "1-0", "points": ["15-0", "15-15", "30-15", "40-15"]}],"collectedAt": "2026-10-08T20:33:00+00:00"}
- Statistics: about 20 items per match, keyed by stable names: aces,
double faults, first and second serve in and won, return points, break
points, games won, tiebreaks and more. Ratios keep both counts
(
player1made ofplayer1Total). - Odds: match winner, first set winner and total games, as decimal odds
with opening prices. Each choice is flagged
winningonce settled. - Point-by-point: every game in order with server, winner, breaks and the point sequence. Tiebreak games are marked and never counted as breaks.
- Doubles: each side also lists its two
players.
Options
| Field | Default | What it does |
|---|---|---|
dateFrom / dateTo | today | Days to collect (UTC). today, yesterday and tomorrow work too. |
tours | ATP, WTA, Challenger, WTA 125 | Add ITF Men/Women or UTR Men/Women, or leave empty for every tour. |
matchStatus | all | finished, upcoming or live (live ignores the dates). |
matchType | all | singles or doubles. |
players | — | Player URLs or IDs; returns their most recent matches. |
maxMatchesPerPlayer | 30 | Matches per player. |
matches | — | Specific match URLs or IDs. |
includeStatistics | true | Match statistics for played matches. |
includeOdds | true | Betting odds. |
includePointByPoint | false | Every game and point. Larger rows. |
maxMatches | 1000 | Whole-run limit on matches saved (and charged). |
Pricing
$3.50 per 1,000 matches ($0.0035 each), with statistics, odds and point-by-point included at no extra cost, plus Apify's small Actor-start fee. You pay only for matches saved. Matches SofaScore doesn't have, and matches your filters exclude, are not charged.
Coverage and reliability
Measured on 688 matches over seven days of ATP, WTA, Challenger and WTA 125 (October 2026):
- Every match collected (688 of 688), in about three minutes.
- Statistics on 97%, point-by-point on 95%, odds on 93%. The rest are
walkovers, retirements, cancellations and smaller events where the source
has no such data. Those fields are
null, never guessed. - Cross-checked: the winner agrees with sets won on every finished match.
ITF and UTR matches have results and usually statistics, but odds are patchier at those levels.
Run report
The RUN_REPORT record in the run's key-value store lists matches per day
and tour, each match's outcome, and any detail that was unavailable for a
match.
Notes
- Data comes from SofaScore's public match pages. This Actor is independent and not affiliated with SofaScore, the ATP, the WTA or the ITF.
- Player 1 is the first-listed player on SofaScore.
- Rankings in a row are the players' rankings at the time of collection.