Flashscore Tennis Scraper - Stats, Scores, H2H
Pricing
from $1.00 / 1,000 match scrapeds
Flashscore Tennis Scraper - Stats, Scores, H2H
[$1/1K matches + $2.20/1K with full stats, no start fee] ATP, WTA, Challenger and ITF match results from Flashscore: aces, double faults, serve speed, winners and unforced errors, set scores with tiebreak points and durations, referee and venue. Covers 7 days back to 7 days ahead.
Pricing
from $1.00 / 1,000 match scrapeds
Rating
0.0
(0)
Developer
WebData Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 hours ago
Last modified
Categories
Share
Flashscore Tennis Scraper
ATP, WTA, Challenger and ITF match results with the statistics most tennis scrapers leave out - aces, double faults, serve speed, set durations and tiebreak points, not just a scoreline.
Most Flashscore-based tennis Actors hand you the scoreboard: who played, who won, the set score. That is also the free version of the site. The reason to pay for a tennis data feed is the match report Flashscore publishes alongside it - who served how many aces, how long each set actually took, whether a set went to a tiebreak and by how much, who the referee was and where it was played - and most scrapers in this niche do not fetch it. This one does, as a clean row rather than a page you would have to parse yourself.
✅ What you get / ❌ what this isn't
| ✅ What you get | ❌ What this isn't |
|---|---|
| Full match statistics - aces, double faults, serve speed, winners, unforced errors, net points, service/return points won, by set and for the whole match | Not just a final score with no idea how either player actually played |
| Set-by-set duration and tiebreak points, not just games won | Not "7-6" with the tiebreak score thrown away |
| Referee and venue on every match with statistics | Not left off the row when Flashscore itself prints them |
A derived winner, computed from the actual set scores | Not a status flag that turns out to mean something else on a walkover row |
| Head-to-head history on request, by surface, with a win/loss flag already applied | Not a separate page you would have to fetch and parse yourself |
| One row per match, ready for a spreadsheet or a model | Not nested nested JSON blocks per section that still need flattening |
| Live score and current set, when a match is in progress | Not a scoreboard that only updates once the match is over |
| Pay only for what you asked for: a plain row costs one price, adding statistics costs a second, separate charge | Not one flat per-row price whether or not you got the stats |
🔎 Why use this Actor
- Statistics are the differentiator, not an afterthought. Aces, double faults, first/second serve percentage, serve speed, winners, unforced errors, net points won, and the same numbers broken down set by set - all delivered as a clean list of
{ section, subsection, stat, home, away }rows, not a page of tables to re-parse. - Tiebreaks are captured, not dropped. A set that went to a breaker carries both players' tiebreak points as
homeTiebreak/awayTiebreak, and the human-readablescoreLinerenders it the way a scoresheet does:7-6(7). - The winner is computed from the score, not trusted from a flag. Flashscore's own "match decided" marker turns out to appear on roughly half of finished matches - including at least one walkover with no games played at all - so it never tells you which side won.
winnerhere is derived by actually counting sets won. - Referee and venue are included for free whenever statistics are fetched, because Flashscore's own match-detail feed carries them right next to the set durations.
- The +/-7 day window is used honestly. Flashscore's own API does not serve match data further back or further out than a week either side of today - true of every Actor built on this source - and the input schema clamps to that range with a warning instead of silently returning nothing for a date you asked for outside it.
- A day that genuinely has no data is told apart from a block. An out-of-range day offset and a real block both return quickly; the run only ever reports "blocked" when every single request failed, never when a filter or a quiet day is the real reason for an empty dataset.
- Pay per row delivered. No start fee. A filtered-out match is never written and never charged, and rows stream into the dataset as they're parsed, so an abort still leaves you what you already paid for.
👥 Who it's for
Tennis data journalists, betting and handicapping analysts, fantasy-tennis platforms, and sports researchers who need more than a final score.
- Build a daily results feed with full box-score statistics for a tennis newsletter or site.
- Feed serve speed, break-point conversion and unforced-error rates into a handicapping or prop-betting model.
- Track a player's recent form and head-to-head record before a big match.
- Score a fantasy-tennis league from aces, winners and games won.
- Watch a live match's current set and game score without refreshing Flashscore yourself.
Example tasks
- Get today's ATP and WTA match results with full statistics
- Scrape live tennis scores in progress
- Track ATP tour match statistics
- Track WTA tour match statistics
- Get a Grand Slam tournament's results
- Follow one player's matches and head-to-head record
- Get upcoming tennis matches for the week ahead
- Daily tennis results monitor (schedulable)
⚙️ How to scrape tennis match data
- Leave Which days to scan at
[0]for today, or list any offsets from -7 to 7 (negative for past days, positive for upcoming). - Narrow it with Match status (scheduled, live or finished), Tour, Tournament name or Player name - all plain text matches, so "ATP" or "Djokovic" work as typed.
- Leave Include match statistics and set detail on for the full box score - aces, double faults, serve speed, tiebreak points, set durations, referee and venue. Turn it off for a fast, cheap scoreline-only run.
- Turn on Include head-to-head history if you want each match's recent-form and head-to-head context. It is a much bigger fetch, so it is off by default.
- Click Start. Rows appear in the dataset as each match is parsed. Export from the Output tab as JSON, CSV, Excel, XML or an API feed.
Get a daily results feed
Save a task with Which days to scan set to [0] and Match status set to "Finished", then schedule it daily. Each run delivers that day's completed matches with full statistics - a ready-made box-score feed for a results page or newsletter.
Watch a live match
Set Match status to "Live" and run it every few minutes. Each row carries liveScore with the current set and game points, so you can build a simple live-scores page without polling Flashscore's own site.
📥 Input
{"days": [0],"status": "finished","tour": "ATP","includeStatistics": true,"maxResults": 50}
days- day offsets from today,0= today, negative = past, positive = upcoming. Flashscore only serves -7 to 7; anything outside that is ignored with a warning. Default[0].status-all,scheduled,liveorfinished. Defaultall.tour- optional text match against the competition category, for exampleATP,WTA,ChallengerorITF. Not a fixed list - Flashscore's own category labels are not a small closed set, so this is a substring match rather than a dropdown that could silently exclude a valid value.tournamentName- optional text match against the tournament name, for exampleUS Open.playerName- optional text match against either player's name.matchIds- specific Flashscore match IDs to keep, one per line. Still applied as a filter on top ofdays- a match outside the requested day range will not be found even if listed here.includeStatistics- fetch full match statistics and set detail (duration, tiebreak points, referee, venue). Defaulttrue. This is what triggers the second "statistics" charge - see pricing below.includeHeadToHead- add recent head-to-head history by surface. Defaultfalse, because it is a much larger fetch (roughly 150 KB per match). Billed under the same statistics charge asincludeStatistics, no separate fee.maxResults- stop after this many rows. Default 20,0for unlimited.
📤 Output
One row per match:
| tournamentName | tour | surface | status | homePlayerName | awayPlayerName | scoreLine | winner |
|---|---|---|---|---|---|---|---|
| US Open (USA) | ATP - Singles | hard | finished | Tiafoe F. | Shelton B. | 6-4, 3-6, 3-6, 5-7 | away |
| US Open (USA) | WTA - Singles | hard | live | Kichenok N. | Melichar-Martinez N. | 6-4, 3-6 |
Each row also carries matchId, matchUrl (the public Flashscore page), startTime/finishedTime (ISO), both players' slug, playerId and country, the full sets array (games, and when statistics are on, duration and tiebreak points per set), liveScore (current set and game points, live matches only), and dayOffset. When includeStatistics is on, rows also carry statistics (a list of { section, subsection, stat, home, away } rows), matchDurationMinutes, referee, refereeCountry, venue, city, hasStatistics and hasHeadToHead. When includeHeadToHead is on, rows carry headToHead, a list of the reference player's recent matches by surface group.
💵 How much does it cost?
Two charges, no start fee. Every delivered match costs a match row ($1.00/1K at FREE, down to $0.85/1K at GOLD and above); if includeStatistics (or includeHeadToHead) successfully returned data for that match, it also costs a statistics charge ($2.80/1K at FREE, down to $2.20/1K at GOLD and above). A scoreline-only run (includeStatistics: false) only ever pays the first charge. A typical day across the ATP and WTA tours is 100-250 matches; a single tournament's day is usually 10-40.
🔁 Run it on the Apify platform
Schedule it (daily results, or every few minutes for a live board), call it from the REST API or the JavaScript and Python clients, or wire the dataset into Make, Zapier, n8n, Google Sheets, Slack or a webhook. Request pacing and retries are handled internally and are included in the price - there is nothing to configure, and no proxy is needed for this source.
⚠️ Limits and caveats
- The day window is exactly -7 to +7 days from today, on every run. This is a limit of Flashscore's own feed, not this Actor, and it applies to every Actor built on this source - there is no deeper archive to unlock with a different input. If you need results from further back, you will need a different source or your own historical capture going forward.
- Not every match carries statistics, even with
includeStatisticson. Lower-tier matches (qualifying rounds, some ITF and Challenger matches) sometimes have no statistics published on Flashscore at all.hasStatistics: falsetells you the fetch ran and came back empty - it is a real gap on the source, not a failed request. liveScore.setInProgressis best-effort. It is derived from a single field Flashscore does not document, confirmed against one live sample. Treat it as a strong hint, not a guaranteed set number, until more live matches have confirmed it.- Sets 4 and 5 use the same key pattern as sets 1-3 by extrapolation. Every match sampled during development went to at most 4 sets; the pattern for a 5th set has not been directly observed. If a 5-set match's final set ever comes back empty, please open an issue with the run URL.
tourandtournamentNameare text matches, not a fixed dropdown, because Flashscore's own category labels are not a small closed set we could safely enumerate. A typo or an unusual tour name will simply match nothing rather than error.- This Actor reads Flashscore's tennis feed only. It does not cross-reference ATP/WTA's own sites, so a player's official ranking or a tournament's prize money are not included.
🧩 Related Actors
- UFC Scraper - the same normalized-row approach applied to fighters, fights, events and rankings.
- Polymarket & Kalshi Scraper - prediction-market odds as a forward-looking signal to pair with match statistics.
❓ FAQ
Am I charged for matches a filter removes?
No. Filtered-out matches are never written to the dataset and never charged. You pay only for rows delivered.
Why can't I get last month's results?
Flashscore's own feed only serves a week either side of today - this Actor is not artificially limiting it, that is the actual depth of the source. Day offsets outside -7..7 are dropped with a warning rather than silently returning nothing.
Does every match have statistics?
No. Most ATP, WTA and higher-tier Challenger matches do; some qualifying and lower-tier ITF matches do not have statistics published on Flashscore at all. Check hasStatistics on each row.
What does the statistics charge actually pay for?
Two extra requests per match (the statistics feed and the set-duration/tiebreak feed), which is where the aces, serve speed, tiebreak points, duration, referee and venue come from. It only fires when that data was actually returned - not on a request that came back empty.
Can I track a live match as it happens?
Yes - set status to "live" and run it every few minutes. Each row carries the current set and game score. This is not a websocket feed; each run is a fresh snapshot.
Which tours are covered?
Whatever Flashscore itself carries under tennis on a given day - ATP, WTA, Challenger, ITF and Davis Cup / Billie Jean King Cup ties have all been seen in the feed. Use the tour filter to narrow to one.
🛠️ Support
Open an issue on the Actor's Issues tab with the run URL, the input you used and what you expected. Include the run URL - it is what makes a report actionable.
⭐ Rate this Actor
If this saved you time building your own tennis data pipeline, please leave a review on the Reviews tab. Review count is the main trust signal a new Actor has, and reviews are what decide which fields and sources get built next. If something is broken or missing, please open an issue first - it is usually fixed within a day, and that is faster than a low rating gets it fixed.
Changelog
0.1 - 2026-09-12
- First release. Match results for ATP, WTA, Challenger and ITF, full match statistics, set-by-set duration and tiebreak points, referee and venue, optional head-to-head history, and live scores.
Is it legal to scrape tennis match data?
This Actor reads only Flashscore's own publicly served match-data feed - the same data any visitor's browser loads when they open a match page, with no login and no paywall. Scraping public data is generally lawful, but you are responsible for how you use it: follow Flashscore's terms, applicable law and any data-protection rules that apply to you, and do not republish this data in a way that competes with Flashscore's own service.