Tennis Player Match History: Results, H2H, Stats & Odds avatar

Tennis Player Match History: Results, H2H, Stats & Odds

Pricing

from $6.00 / 1,000 matches

Go to Apify Store
Tennis Player Match History: Results, H2H, Stats & Odds

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

Keelwright

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

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

  1. Click Try for free.
  2. Type the Players: names such as Carlos Alcaraz or Swiatek, or Flashscore player URLs.
  3. Optionally pick singles, doubles or mixed, a date range (2024-01-01, or a period such as 12 months), opponents for head-to-head, surfaces, tours or main draw only.
  4. Tick Match statistics and duration and Bookmaker odds if you want them.
  5. 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.

FieldWhat it holds
playerThe player you asked for: Flashscore id, short and full name, country and link
matchId, urlFlashscore match id and link
dateStart time (ISO 8601, UTC)
tour, matchTypeATP, WTA, Challenger Men/Women, ITF Men/Women or Exhibition; singles, doubles or mixed
tournamentName, country, main draw or qualification, surface, indoor, category, ids and link
round, roundCodeRound as Flashscore names it (Quarter-finals) and as a short code: R128 to R16, QF, SF, F, Q1 to Q3, RR
partner, opponentDoubles partner (empty in singles); the opponent's name and players with ids, countries and links
result, resultTypewon or lost; normal, retired, walkover or awarded
status, statusDetailfinished and Flashscore's wording (Finished, Finished / retired, Walkover)
score, setsThe 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, gamesLostTotals from the player's side
noteFlashscore's note, such as Alcaraz Carlos - withdrawn.
durationMinutesWith Match statistics and duration: match duration; each set's duration is in sets
statisticsWith Match statistics and duration: over 20 statistics for the match and each set
oddsWith Bookmaker odds: closing and opening match winner prices per bookmaker, best price, averages, implied probability and the favourite; optionally every market
missingDetailsParts 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.

WhatPrice
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.