Tennis Player Match History: Results, H2H, Stats & Odds
Pricing
from $6.00 / 1,000 matches
Tennis Player Match History: Results, H2H, Stats & Odds
Full match history of any tennis player from Flashscore: every result with tournament, surface, round, opponent and score, plus head-to-head, match statistics and opening and closing bookmaker odds. ATP, WTA, Challenger and ITF.
Pricing
from $6.00 / 1,000 matches
Rating
0.0
(0)
Developer
Keelwright
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Tennis Player Match History: results, head-to-head, stats and odds
Get the complete match history of any tennis player from Flashscore as clean JSON, CSV or Excel: every match with date, tournament, surface, round, opponent, score, sets and games, seen from the player's side. Covers ATP, WTA, Challenger and ITF, singles, doubles and mixed, with tour-level results back to the late 1990s. Add head-to-head filters, match statistics and opening and closing bookmaker odds when you need them.
- A whole career in under a minute. Roger Federer's 1,570 singles matches (1998 to 2021) come back in about 50 seconds, each with its round.
- Head-to-head in one run. Put one player in Players and another in Opponents to get every meeting, such as all 60 Djokovic vs Nadal matches (31-29, as in the official record).
- Titles and win-loss records for free. A player summary counts titles, finals, wins and losses by surface, year and tour. Federer's comes out at 103 titles from 157 finals, the same as the official record.
- Rounds you can sort by. R128 to the final, Q1 to Q3 in qualifying and RR for group stages, next to Flashscore's own round name.
- Statistics and odds on request. Over 20 statistics for the match and each set (aces, double faults, serve and return points, break points, winners, unforced errors, distance covered), match and set durations, and opening and closing odds from up to 20 bookmakers per country.
- Only new matches. Run it on a schedule and get each player's new results only.
What can I use tennis match history for?
- Betting models and backtesting: results with opening and closing odds, the favourite and implied probabilities, to test strategies and closing line value.
- Player analysis and scouting: form, surface splits, records against one opponent, serve and return statistics over a season or a whole career.
- Elo and rating systems: a clean, ordered list of results with walkovers and retirements flagged.
- Fantasy, tipping and prediction games: recent form and head-to-head for any matchup.
- Journalism, content and research: career milestones, title counts and season records for articles, social posts and academic work.
How to get a tennis player's match history
- Click Try for free.
- Type the Players: names such as
Carlos AlcarazorSwiatek, or Flashscore player URLs. - Optionally pick singles, doubles or mixed, a date range (
2024-01-01, or a period such as12 months), opponents for head-to-head, surfaces, tours or main draw only. - Tick Match statistics and duration and Bookmaker odds if you want them.
- Click Start and download the results as JSON, CSV, Excel or HTML, or read them through the API.
Two players with the same name? The log names the other players it found. Paste the Flashscore URL of the one you mean.
Input examples
The last 20 matches of two players:
{"players": ["Carlos Alcaraz", "Aryna Sabalenka"],"maxMatchesPerPlayer": 20}
A head-to-head on the ATP tour, main draw only, with statistics and odds:
{"players": ["Novak Djokovic"],"opponents": ["Rafael Nadal"],"tours": ["atp"],"mainDrawOnly": true,"includeStatistics": true,"includeOdds": true}
One season on one surface:
{"players": ["Iga Swiatek"],"dateFrom": "2024-01-01","dateTo": "2024-12-31","surfaces": ["clay"]}
A doubles specialist's last 12 months, by player URL:
{"players": ["https://www.flashscore.com/player/arevalo-marcelo/zLNFemL9/"],"matchTypes": ["doubles"],"dateFrom": "12 months"}
What data do you get?
Every row is one match of one player, newest first. Results, scores and statistics read from that player's side: player first, then opponent.
| Field | What it holds |
|---|---|
player | The player you asked for: Flashscore id, short and full name, country and link |
matchId, url | Flashscore match id and link |
date | Start time (ISO 8601, UTC) |
tour, matchType | ATP, WTA, Challenger Men/Women, ITF Men/Women or Exhibition; singles, doubles or mixed |
tournament | Name, country, main draw or qualification, surface, indoor, category, ids and link |
round, roundCode | Round as Flashscore names it (Quarter-finals) and as a short code: R128 to R16, QF, SF, F, Q1 to Q3, RR |
partner, opponent | Doubles partner (empty in singles); the opponent's name and players with ids, countries and links |
result, resultType | won or lost; normal, retired, walkover or awarded |
status, statusDetail | finished and Flashscore's wording (Finished, Finished / retired, Walkover) |
score, sets | The score from the player's side (6-7(7) 7-6(2) 6-3 6-4, empty for a walkover) and each set's games and tiebreak points |
setsWon, setsLost, gamesWon, gamesLost | Totals from the player's side |
note | Flashscore's note, such as Alcaraz Carlos - withdrawn. |
durationMinutes | With Match statistics and duration: match duration; each set's duration is in sets |
statistics | With Match statistics and duration: over 20 statistics for the match and each set |
odds | With Bookmaker odds: closing and opening match winner prices per bookmaker, best price, averages, implied probability and the favourite; optionally every market |
missingDetails | Parts you asked for that could not be loaded for this match |
Output example
A row with the default settings:
{"player": {"id": "UkhgIFEq","name": "Alcaraz C.","fullName": "Alcaraz Carlos","country": "Spain","url": "https://www.flashscore.com/player/alcaraz-garfia-carlos/UkhgIFEq/"},"matchId": "nBSdhTc4","url": "https://www.flashscore.com/match/tennis/nBSdhTc4/","date": "2026-10-06T09:15:00.000Z","tour": "ATP","matchType": "singles","tournament": {"name": "Tokyo","country": "Japan","stage": "Main draw","surface": "hard","indoor": false,"category": "ATP - Singles","id": "KEoT9gX7","stageId": "6Lja5eNc","url": "https://www.flashscore.com/tennis/atp-singles/tokyo/"},"round": "Final","roundCode": "F","partner": null,"opponent": {"name": "Lehecka J.","players": [{"id": "6PlgfXKR","name": "Lehecka J.","country": "Czech Republic","url": "https://www.flashscore.com/player/lehecka-jiri/6PlgfXKR/"}]},"result": "won","resultType": "normal","status": "finished","statusDetail": "Finished","score": "7-6(4) 6-4","sets": [{ "player": 7, "opponent": 6, "tiebreakPlayer": 7, "tiebreakOpponent": 4 },{ "player": 6, "opponent": 4, "tiebreakPlayer": null, "tiebreakOpponent": null }],"setsWon": 2,"setsLost": 0,"gamesWon": 13,"gamesLost": 10,"note": null,"scrapedAt": "2026-10-21T15:31:55.049Z"}
A match with statistics and odds (lists shortened with "…"):
{"player": { "id": "6HdC3z4H", "name": "Sinner J.", "fullName": "Sinner Jannik", "country": "Italy", "url": "…" },"matchId": "n5DWLXD5","url": "https://www.flashscore.com/match/tennis/n5DWLXD5/","date": "2026-07-12T15:10:00.000Z","tour": "ATP","matchType": "singles","tournament": {"name": "Wimbledon","country": "United Kingdom","stage": "Main draw","surface": "grass","…": "…"},"round": "Final","roundCode": "F","partner": null,"opponent": { "name": "Zverev A.", "players": ["…"] },"result": "won","resultType": "normal","status": "finished","statusDetail": "Finished","score": "6-7(7) 7-6(2) 6-3 6-4","sets": [{ "player": 6, "opponent": 7, "tiebreakPlayer": 7, "tiebreakOpponent": 9, "durationMinutes": 65 },{ "player": 7, "opponent": 6, "tiebreakPlayer": 7, "tiebreakOpponent": 2, "durationMinutes": 64 },{ "player": 6, "opponent": 3, "tiebreakPlayer": null, "tiebreakOpponent": null, "durationMinutes": 49 },{ "player": 6, "opponent": 4, "tiebreakPlayer": null, "tiebreakOpponent": null, "durationMinutes": 50 }],"setsWon": 3,"setsLost": 1,"gamesWon": 25,"gamesLost": 20,"note": null,"durationMinutes": 228,"statistics": {"match": {"aces": { "player": 15, "opponent": 17 },"doubleFaults": { "player": 2, "opponent": 2 },"firstServePointsWon": {"player": { "percent": 80, "won": 70, "total": 87 },"opponent": { "percent": 72, "won": 76, "total": 105 }},"breakPointsConverted": {"player": { "won": 2, "total": 5 },"opponent": { "won": 0, "total": 1 }},"winners": { "player": 58, "opponent": 49 },"unforcedErrors": { "player": 25, "opponent": 45 },"distanceCoveredMetres": { "player": 2591, "opponent": 2441 },"…": "…"},"set1": "…","set2": "…","set3": "…","set4": "…"},"odds": {"countries": ["GB", "US-NJ"],"bookmakers": ["bet365", "Betfred", "Unibetuk", "…"],"matchWinner": {"best": { "player": 1.22, "opponent": 5 },"average": { "player": 1.187, "opponent": 4.759 },"averageOpening": { "player": 1.213, "opponent": 4.21 },"impliedProbability": { "player": 0.8004, "opponent": 0.1996 },"favourite": "player","byBookmaker": [{ "bookmaker": "bet365", "player": 1.18, "opponent": 5, "playerOpening": 1.2, "opponentOpening": 4.8 },"…"]},"markets": [{"market": "total-games","period": "match","bookmaker": "bet365","selections": [{"selection": "over","odds": 1.83,"opening": 1.83,"active": true,"line": 37.5,"unit": "games"},{"selection": "under","odds": 1.83,"opening": 1.83,"active": true,"line": 37.5,"unit": "games"},"…"]},"…"]},"scrapedAt": "2026-10-21T15:26:17.398Z"}
Player summary
Each run also saves a free summary for each player and match type, built from the rows of that run. Find it in the run's Output tab or in the key-value store under PLAYER_SUMMARY:
[{"player": {"id": "GrsQDFC0","name": "Federer R.","fullName": "Federer Roger","country": "Switzerland","url": "…"},"matchType": "singles","firstMatch": "1998-07-06T09:00:00.000Z","lastMatch": "2021-07-07T15:25:00.000Z","matches": 1552,"won": 1270,"lost": 282,"winRate": 0.818,"walkovers": 18,"titles": 103,"finals": 157,"bySurface": {"grass": { "matches": 220, "won": 191, "lost": 29, "winRate": 0.868 },"clay": { "matches": 284, "won": 216, "lost": 68, "winRate": 0.761 },"hard": { "matches": 1015, "won": 834, "lost": 181, "winRate": 0.822 },"unknown": { "matches": 33, "won": 29, "lost": 4, "winRate": 0.879 }},"byYear": {"1998": { "matches": 5, "won": 2, "lost": 3, "winRate": 0.4 },"…": "…"},"byTour": {"ATP": { "matches": 1526, "won": 1252, "lost": 274, "winRate": 0.82 },"Exhibition": { "matches": 25, "won": 17, "lost": 8, "winRate": 0.68 },"…": "…"}}]
Walkovers are counted on their own and left out of the win rates. Titles and finals need Round turned on (the default) and leave out exhibitions. A Davis Cup tie has no surface on Flashscore, so it counts as unknown.
How much does it cost?
You pay only for the matches you get (pay per event); Apify platform usage is included.
| What | Price |
|---|---|
| Match | $6.00 per 1,000 matches |
| Match with statistics or odds | $12.00 per 1,000 matches |
| Run start | $0.05 per 1,000 runs |
A match costs the higher price only when it comes with statistics or odds. An old match that Flashscore has no statistics or odds for costs the lower price, even with those options on.
Examples:
- The last 20 matches of two players: about $0.24.
- Roger Federer's whole singles career (1,570 matches): about $9.40.
- Djokovic vs Nadal, all 60 meetings with statistics and odds: about $0.64 (the 14 meetings before 2009 have neither, so they cost the lower price).
Cap any run with Max results or Latest matches per player, or with the maximum cost per run in the run options; the run stops cleanly at the limit. Apify's free plan includes $5 of monthly credit, enough for about 830 matches.
Tips
- Names or URLs. Names go through Flashscore's player search. Accents and case don't matter, and a surname alone works for well-known players. For an exact pick, use the player URL.
- Dates are in UTC. Use a date (
2025-01-01) or a period back from today (6 months,2 years). - Coverage follows Flashscore. Tour-level results go back to the late 1990s; Challenger and ITF results cover fewer early years. Statistics exist for most tour-level matches since about 2018 (Grand Slams since about 2012), odds for most matches since about 2010. A part that Flashscore doesn't have for a match is
null. - More bookmakers. The UK has the most (about 7 to 9 for older matches, up to 20 for recent ones). Add the US, Italy or Spain to compare more; each extra country adds one request per match.
- Team events and exhibitions (Davis Cup, Laver Cup, Hopman Cup) are included, usually without a round. Pick tours to leave exhibitions out.
- Walkovers and retirements are kept and flagged in
resultType. A walkover has no score. - Doubles rows name the
partner. A deciding match tiebreak written like a set (10-8) is left out of the games totals. - Collect new results on a schedule. Turn on Only new matches and schedule the run daily or weekly. Each run returns only the matches the last one didn't.
- Integrations. Send results to Google Sheets, Slack, Zapier, Make or your own webhook with Apify integrations, or call the Actor through the API.
FAQ
How far back does the history go? Tour-level matches go back to the late 1990s: Roger Federer's history starts with his first ATP match in July 1998. Lower-level events cover fewer early years.
Does it include each player's ranking at the time of the match? No. Flashscore shows only current rankings, so rankings at the time of past matches are not part of the data.
How fast is it? About 30 matches per second with the default settings, so a 1,500-match career takes under a minute. Statistics and odds add one or two requests per match: the 60 Djokovic vs Nadal matches with both take about 40 seconds.
Do I need a proxy? No. Flashscore answers Apify's servers directly. The proxy option is there in case that changes.
Is it legal to scrape Flashscore? This Actor collects publicly available sports data: results, statistics, published odds and the public names of professional athletes. It does not log in or collect private information. Check the source's terms and your local laws for your use case, especially for commercial use.
Something is missing or broken? Open an issue in the Issues tab with the run link, and it will be looked at.
Tennis Player Match History is an independent tool. It is not affiliated with, endorsed by or connected to Flashscore or Livesport s.r.o., the ATP or the WTA. Odds are shown for information only.