Tennis Scraper - Matches, Live Scores, Results, H2H & Rankings avatar

Tennis Scraper - Matches, Live Scores, Results, H2H & Rankings

Pricing

from $1.20 / 1,000 match (one row per match)s

Go to Apify Store
Tennis Scraper - Matches, Live Scores, Results, H2H & Rankings

Tennis Scraper - Matches, Live Scores, Results, H2H & Rankings

ATP, WTA, Challenger and ITF tennis data with no login: schedule, live scores with the server and game points, results with set-by-set scores, serve and return statistics, point by point, head-to-head records and ATP or WTA rankings. One row per match. From $0.005/run + $0.002/match.

Pricing

from $1.20 / 1,000 match (one row per match)s

Rating

0.0

(0)

Developer

Orbots

Orbots

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Unofficial tool. Orbots is not affiliated with, sponsored by, or endorsed by Flashscore (Livesport s.r.o.), TennisExplorer, the ATP, the WTA or the ITF. Those names are used here only to describe the public data this Actor collects.

Tennis data for ATP, WTA, Challenger, ITF and team events, with no login, no browser and no API key: the day's schedule, live scores with the server and the points of the current game, results with set-by-set scores and tiebreaks, serve and return statistics, the full point-by-point log, head-to-head records and the ATP or WTA ranking. One clean row per match, player pair or ranked player. You only pay for rows that are actually delivered.

Why this Actor

  • Seven things in one Actor. Pick a mode: schedule, live, results, all, match, h2h or rankings. Same row format for every match, whatever the source, so a schedule pulled in the morning and the results pulled at night line up by match_id.
  • Live scores that are actually live. Live rows carry the set in play, games of every set, the points of the current game (30:15) and who is serving. Run it every few minutes with onlyNew and you get only the matches whose score moved.
  • Statistics and point by point. Turn on includeDetails (or use the match mode) to get aces, double faults, first serve percentage, break points saved and converted, points and games won per set, every game's point sequence with break points marked, and set durations.
  • Head-to-head two ways. h2h mode takes plain player names ("Alcaraz vs Sinner") and returns their record, every previous meeting with year, tournament, surface, round and score, and both profiles. includeH2h attaches to every match row the last matches of both players and their mutual meetings.
  • Results back to the 1990s. The last week comes from Flashscore; any older date is read from the TennisExplorer archive, with the closing odds of each match.
  • Schedule as soon as it exists. Matches appear the moment the order of play is published, which in tennis is usually the evening before. A run in the morning gives you the whole day ahead.
  • Rankings with history. ATP or WTA singles ranking, up to 2000 players, current edition or any past Monday.
  • Filters that reduce what you pay. Tours, singles or doubles, tournament name, player names and a hard cap per run. Rows filtered out are not fetched in detail and not charged.
  • Fast and cheap to run. Pure HTTP against public endpoints. In our benchmark, a full day of ATP and WTA singles came back in seconds for well under a cent of platform usage (numbers below).
  • Honest billing. maxMatches is respected exactly. A run that delivers nothing is not charged at all, not even the start fee.

What you get

Match rows (schedule, live, results, all, match)

{
"type": "match",
"source": "flashscore",
"match_id": "M3TdTTy8",
"match_url": "https://www.flashscore.com/match/tennis/M3TdTTy8/",
"tour": "ATP",
"gender": "men",
"match_type": "singles",
"tournament": "Chengdu",
"tournament_place": "China",
"surface": "hard",
"tournament_url": "https://www.flashscore.com/tennis/atp-singles/chengdu/",
"date": "2026-09-25",
"start_time": "2026-09-25T05:10:00Z",
"status": "finished",
"home_name": "Kopriva V.",
"away_name": "Shapovalov D.",
"home_players": ["Kopriva V."],
"away_players": ["Shapovalov D."],
"home_country": "Czech Republic",
"away_country": "Canada",
"home_url": "https://www.flashscore.com/player/kopriva-vit/EHGKxKDL/",
"away_url": "https://www.flashscore.com/player/shapovalov-denis/zXddgn9o/",
"home_sets": 0,
"away_sets": 2,
"sets": [
{"set": 1, "home": 2, "away": 6, "home_tiebreak": null, "away_tiebreak": null, "duration": null},
{"set": 2, "home": 4, "away": 6, "home_tiebreak": null, "away_tiebreak": null, "duration": null}
],
"score": "2-6 4-6",
"winner": "away",
"serving": null,
"game_points": null,
"scraped_at": "2026-09-25T07:00:09Z"
}

status is one of scheduled, live, finished, retired, walkover, interrupted, postponed, cancelled, awarded, abandoned or other. Live rows also fill live_set, serving (home or away) and game_points. Doubles rows list both players of each side in home_players and away_players.

With includeDetails each Flashscore row also carries:

  • stats: per period (match, set_1, set_2...) and group (Service, Return, Points, Games), every statistic with home and away values, exactly as the source prints them ("53% (34/64)").
  • point_by_point: one entry per set with every game: score after the game, server, winner, a break flag and the point sequence (["15:0", "30:0", "40:0 |B1|", ...]; |B1| marks a break point for the first player).
  • duration of the match and of each set.

With includeH2h each Flashscore row carries h2h: the last matches of both players and their previous meetings, each with date, tournament, surface, score and winner.

Rows read from the TennisExplorer archive (results older than 7 days) have source: "tennisexplorer", a te- prefixed match_id, the closing odds in odds_home and odds_away, seeds, and no statistics.

Head-to-head rows (h2h)

{
"type": "h2h",
"query": "Alcaraz vs Sinner",
"player_a_name": "Alcaraz Carlos",
"player_b_name": "Sinner Jannik",
"player_a_url": "https://www.tennisexplorer.com/player/alcaraz-5ab70/",
"player_b_url": "https://www.tennisexplorer.com/player/sinner-8b8e8/",
"wins_a": 12,
"wins_b": 9,
"meetings_count": 21,
"meetings": [
{"year": 2026, "tournament": "Monte Carlo", "surface": "clay", "round": "F", "winner": "b", "winner_name": "Sinner J.", "loser_name": "Alcaraz C.", "score": "7-6(5) 6-3", "sets": [{"set": 1, "winner": 7, "loser": 6, "winner_tiebreak": null, "loser_tiebreak": 5}, {"set": 2, "winner": 6, "loser": 3, "winner_tiebreak": null, "loser_tiebreak": null}]}
],
"player_a_profile": {"atp_rankings": "3", "birthdate": "5. 5. 2003", "height": "185 cm", "weight": "72 kg", "plays": "right"},
"player_b_profile": {"atp_rankings": "1", "birthdate": "16. 8. 2001", "height": "188 cm", "weight": "76 kg", "plays": "right"},
"scraped_at": "2026-09-25T07:00:09Z"
}

Ranking rows (rankings)

{
"type": "ranking",
"tour": "ATP",
"ranking_date": "2026-09-21",
"rank": 3,
"rank_change": 0,
"previous_rank": 3,
"player_name": "Alcaraz Carlos",
"player_url": "https://www.tennisexplorer.com/player/alcaraz-5ab70/",
"country": "Spain",
"points": 5560,
"scraped_at": "2026-09-25T07:00:09Z"
}

Input

FieldWhat it does
modeschedule (not finished yet), live (in play now), results (finished), all (every match of the day), match (details of given match IDs), h2h (player pairs) or rankings. Default schedule.
dateFrom, dateToDays to collect, YYYY-MM-DD, UTC. Empty = today. The schedule covers what the source has already scheduled (today and, once the order of play is out, tomorrow; the feed reaches 6 days ahead); results cover the last 7 days from Flashscore and any older date from the TennisExplorer archive. At most 31 days per run.
toursAny of ATP, WTA, Challenger, ITF, Teams. Default ATP, WTA, Challenger and Teams; ITF is opt-in because it is often half of a day.
matchTypesingles (default), doubles or all.
tournamentKeep only tournaments whose name contains this text.
playersKeep only matches with one of these names on either side.
maxMatchesHard cap on match rows per run. Default 500.
includeDetailsStatistics, point by point and set durations on every Flashscore row (match-detail event). Always on in match mode.
includeH2hLast matches and mutual meetings on every Flashscore row (h2h event).
matchIdsmatch mode: Flashscore match IDs (the match_id of any row) or Flashscore match URLs.
pairsh2h mode: one pair per line, "Alcaraz vs Sinner" or "Swiatek - Sabalenka".
rankingTour, rankingTop, rankingDaterankings mode: atp, wta or both; how many players (up to 2000); a past edition (Mondays).
onlyNewOnly matches that are new or changed since earlier runs of the same mode and filters (status, score or start time moved). History is kept for 30 days in your own account.
proxyConfigurationOff by default. Both sources answer Apify servers directly.

Minimal runs:

{ "mode": "results", "tours": ["ATP", "WTA"], "matchType": "singles" }
{ "mode": "live", "tours": ["ATP", "WTA", "Challenger"], "matchType": "all", "onlyNew": true }
{ "mode": "h2h", "pairs": ["Alcaraz vs Sinner", "Swiatek vs Sabalenka"] }

When a run returns nothing

The Actor separates "something broke" from "there was nothing to return":

  • Every request refused by the sources even after retries: the run fails with a message, so a schedule notices.
  • No match matched the date and filters, no player matched a name, or onlyNew found nothing new: the run succeeds with a status message explaining why, and nothing is charged.

Player names in h2h mode are looked up on TennisExplorer; when a surname is shared ("Cerundolo"), add the first name. The row's player_a_name and player_b_name show who was matched.

Notes and limits

  • Flashscore covers today minus 7 to plus 6 days, but tennis schedules only exist once the order of play is published, so in practice the schedule is today and tomorrow. Results before that window come from TennisExplorer, which lists finished matches with odds but without statistics or player countries.
  • Rounds are not part of the day feeds and are left null on match rows; head-to-head meetings do carry the round.
  • Times are UTC. A TennisExplorer row whose start time is not listed keeps date and leaves start_time empty.
  • Live data is read at the moment of the run; a run that takes a minute reports the scores as they were when each row was read.
  • Data comes from public pages as they are at run time. Sources change their markup now and then; the Actor is monitored daily and repaired when that happens.

Pricing: what a run actually costs

Pay per event. A run that delivers nothing costs nothing.

EventPriceWhen
Actor start$0.005Once per run, on the first delivered row
Match (match)$0.002 per match on the free plan, down to $0.0012 on higher plansEvery match row delivered
Match details (match-detail)$0.005Every match enriched with statistics and point by point (includeDetails, or match mode)
Head-to-head (h2h)$0.005Every H2H row in h2h mode, or every match row enriched with includeH2h
Ranking row (ranking)$0.001Every ranked player delivered

Example: a day of ATP and WTA singles, about 60 matches, costs $0.005 + 60 x $0.002 = $0.125 on the free plan; the same day with statistics and point by point costs $0.425. The top 100 of the ATP ranking costs $0.105. Platform usage on top of that was between $0.0001 and $0.002 per run in our benchmark runs.

Benchmark (measured on Apify, 2026-09-25)

RunRowsTimeRequests
Schedule of the day, ATP and WTA singles186 s1
Results of one day with statistics, point by point and H2H87 s33
Two days of results from the 2024 archive, singles and doubles27923 s2
ATP and WTA rankings, top 120 each24020 s6

Changelog

  • 0.1 (2026-09-25): first release. Schedule, live, results, all, match, h2h and rankings modes; details and head-to-head enrichment; TennisExplorer archive for older results; onlyNew for schedules.