Flashscore Tennis Scraper — Matches, Stats, Points & H2H
Pricing
from $1.00 / 1,000 matches
Flashscore Tennis Scraper — Matches, Stats, Points & H2H
Every tennis match of a day from Flashscore — ATP, WTA, Challenger, ITF, doubles, Davis Cup — with scores, players, rankings and tournament. Add match statistics, point-by-point and head-to-head for the whole day in the same run. Filter by player, tournament, tour or status. No browser, no login.
Pricing
from $1.00 / 1,000 matches
Rating
0.0
(0)
Developer
Steady Scrape
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Share
Flashscore Tennis Scraper — matches, odds, statistics, point by point and head-to-head
Get every tennis match of a day from Flashscore as clean JSON, CSV or Excel: ATP, WTA, Challenger, ITF, doubles and team ties (Davis Cup, Billie Jean King Cup), with scores, players, countries, tournament, surface and status. Turn on the detail sections and the same run adds, for every match, its betting odds from every bookmaker with their opening prices, its statistics, its point-by-point history, its head-to-head with recent form, and the players' full names and ATP/WTA rankings.
No browser, no login, no proxy to pay for. A whole day of tennis is one request; a day with every detail is a few seconds per dozen matches.
What makes it different
- A day with details is one run. You do not list matches in one run and then start another run per match to get its points: tick Point by point and every match of the day comes back with them.
- Filter the day by player.
players: ["Alcaraz"]— case and accents do not matter, sogarciafinds García. - Relative days for schedules.
dateFrom: "yesterday"means yesterday every day the schedule fires. Dates and offsets (-3,+2) work too, up to a week either side of today, andutcOffsetHourscuts the day at your clock. - Numbers you can use. Flashscore writes
80% (44/55); you getvalue: 80,won: 44,total: 55next to the text. - Points that mean something. Every game carries its server, its winner, whether serve was broken, and each point flagged as a break point, set point or match point. Tiebreaks come point by point.
- Odds from the bookmakers of the country you choose.
oddsCountry: "GB"gives about twenty UK bookmakers,"US"withoddsRegion: "USNY"gives FanDuel, DraftKings, BetMGM and Fanatics. Every price comes with its opening price, so line movement is in the row; markets: winner of the match and of each set, over/under, Asian handicap, correct score, odd/even. - Head-to-head before the match starts, which is when a model needs it: previous meetings and each side's last matches with surface, score and winner.
- You pay for what you get. A match without details is one price, a match that delivers details another. Rows that say "no match", "not found" or "blocked" are free, and a section Flashscore does not have for a match is not charged.
- It fails loudly when it should. If Flashscore changes its feed the run fails with a clear message instead of handing you an empty day that looks like a quiet one.
Use cases
- Betting and trading models: today's scheduled matches with every bookmaker's price and opening price, head-to-head and recent form; yesterday's results with serve and return statistics every morning.
- Odds comparison and line-movement tracking: schedule it and compare
oddswithopeningOddsacross bookmakers. - Live dashboards: run every few minutes with
matchStatus: ["live"]for the set in play, who serves and the points of the game in play. - Player and tournament tracking: follow a player, a tournament or a tour with the filters.
- Research and content: point-by-point histories for momentum studies, break-point analysis, match reports.
Input
| field | what it does |
|---|---|
dateFrom, dateTo | today, yesterday, tomorrow, -3, +2 or 2026-09-19. dateTo defaults to dateFrom. Within 7 days of today. |
utcOffsetHours | Where a day starts and ends (0 = UTC, -5 = New York). Times in the output are always UTC. |
matches | Match links or ids instead of days. |
matchStatus | scheduled, live, finished (includes retirements and walkovers), cancelled (includes postponed). |
tours | atp, wta, challenger_men, challenger_women, itf_men, itf_women, teams, juniors, exhibition, other. |
matchTypes | singles, doubles, teams. |
tournaments, players | Part of a name; case and accents do not matter. |
includeStatistics, includePointByPoint, includeHeadToHead, includeOdds | The detail sections. Any of them also adds full names and rankings. |
oddsCountry, oddsRegion, oddsMarkets | Whose bookmakers (GB by default, US + USNY…) and which markets: winner by default, over_under, asian_handicap, correct_score, odd_even; empty for all. |
recentMatchesPerPlayer | How many last matches per side in the head-to-head (default 10, up to 50). |
maxMatches | Stop after this many matches, earliest first. |
Yesterday's finished ATP and WTA singles with statistics:
{ "dateFrom": "yesterday", "matchStatus": ["finished"], "tours": ["atp", "wta"], "matchTypes": ["singles"], "includeStatistics": true }
Today's scheduled ATP and WTA matches with the UK bookmakers' winner prices:
{ "dateFrom": "today", "matchStatus": ["scheduled"], "tours": ["atp", "wta"], "includeOdds": true }
Today's matches of two players, with head-to-head, before they start:
{ "dateFrom": "today", "players": ["Sinner", "Swiatek"], "includeHeadToHead": true }
Everything live right now:
{ "dateFrom": "today", "matchStatus": ["live"] }
One match, with everything:
{ "matches": ["https://www.flashscore.com/match/bXhRwVq3/"], "includeStatistics": true, "includePointByPoint": true, "includeHeadToHead": true }
Output
One row per match (shortened here):
{"status": "ok","matchId": "bXhRwVq3","url": "https://www.flashscore.com/match/bXhRwVq3/","startTime": "2026-09-18T12:20:00.000Z","updatedAt": "2026-09-18T14:32:44.000Z","matchStatus": "finished","matchStatusText": "Finished","tournament": { "name": "Davis Cup - World Group I", "category": "ATP - Singles", "tour": "atp", "matchType": "singles", "country": "World", "surface": null, "indoor": false, "qualification": false, "url": "https://www.flashscore.com/tennis/atp-singles/davis-cup-world-group-i/" },"home": {"name": "Van De Zandschulp B.","players": [{ "name": "Van De Zandschulp B.", "fullName": "Botic Van De Zandschulp", "country": "Netherlands", "id": "YwiLpILD", "url": "https://www.flashscore.com/player/van-de-zandschulp-botic/YwiLpILD/", "ranking": { "list": "ATP", "position": 40 } }],"setsWon": 2, "isWinner": true, "currentGamePoints": null},"away": { "name": "Rodriguez J. A.", "players": [{ "fullName": "Johan Alexander Rodriguez", "country": "Colombia", "ranking": { "list": "ATP", "position": 829 } }], "setsWon": 1, "isWinner": false },"winner": "home","sets": [{ "set": 1, "home": 4, "away": 6, "homeTiebreak": null, "awayTiebreak": null, "durationMinutes": 49 },{ "set": 2, "home": 6, "away": 1, "homeTiebreak": null, "awayTiebreak": null, "durationMinutes": 37 },{ "set": 3, "home": 7, "away": 5, "homeTiebreak": null, "awayTiebreak": null, "durationMinutes": 48 }],"durationMinutes": 134,"statistics": [{ "period": "match", "group": "Service", "name": "1st serve points won", "home": { "text": "80% (44/55)", "value": 80, "won": 44, "total": 55 }, "away": { "text": "62% (40/65)", "value": 62, "won": 40, "total": 65 } }],"pointByPoint": [{ "set": 1, "game": 3, "tiebreak": false, "server": "away", "winner": "home", "serviceBreak": true, "homeScore": 2, "awayScore": 1,"points": [{ "home": "30", "away": "30", "breakPoint": false, "setPoint": false, "matchPoint": false }, { "home": "40", "away": "30", "breakPoint": true, "setPoint": false, "matchPoint": false }] }],"headToHead": {"meetings": [{ "matchId": "bXhRwVq3", "startTime": "2026-09-18T12:20:00.000Z", "tournament": "Davis Cup - World Group I", "surface": null, "home": "Van De Zandschulp B.", "away": "Rodriguez J. A.", "score": "2:1", "winner": "home", "url": "https://www.flashscore.com/match/bXhRwVq3/" }],"homeRecent": [{ "matchId": "pIjwuyeL", "tournament": "US Open", "surface": "hard", "home": "Zverev A.", "away": "Van De Zandschulp B.", "score": "3:0", "winner": "home" }],"awayRecent": []},"odds": [{ "bookmakerId": 263, "bookmaker": "BetUK", "market": "winner", "scope": "match","selections": [{ "side": "home", "selection": null, "line": null, "lineUnit": null, "score": null, "odds": 1.01, "openingOdds": 1.01, "active": true },{ "side": "away", "selection": null, "line": null, "lineUnit": null, "score": null, "odds": 11, "openingOdds": 10.5, "active": true }] }],"scrapedAt": "2026-09-20T12:00:00.000Z"}
| field | meaning |
|---|---|
status, reason | ok for a match. no_matches, not_found and blocked rows are free and say why in reason. On an ok row, reason names a section that could not be fetched. |
matchStatus | scheduled, delayed, live, interrupted, awaiting_updates, to_finish, between_days, finished, retired, walkover, awarded, postponed, cancelled, abandoned. matchStatusText is Flashscore's wording ("Set 3", "Finished / retired"). |
liveSet, serving, currentGamePoints | For a match in play: the set on, who serves, and the points of the game (0, 15, 30, 40, A). |
sets | Games per set, tiebreak points when there was one, and the set's length in minutes (with details). |
home, away | The side's name, its players (two for doubles) with country, Flashscore id and page; full name and ranking with details. |
statistics | Per period (match, set_1…), group and name, each side with text, value, won, total. null when not asked for, [] when Flashscore has none for the match. |
pointByPoint | Every game in order; a tiebreak is one game whose points are the tiebreak's running score. |
headToHead | meetings, homeRecent, awayRecent. |
odds | One entry per bookmaker, market (winner, over_under, asian_handicap, correct_score, odd_even) and scope (match, set_1…). Each selection has decimal odds and openingOdds, and what it is for: side (winner, handicap), selection + line + lineUnit (over/under: over 22.5 games; odd/even: odd), score (correct score, home first). active: false is a suspended price. |
A run summary (rows per status, rows with details, requests made) is saved as SUMMARY in the key-value store.
Pricing
Pay per event, nothing else: platform usage is included.
match— a match row: US$0.001 (US$1 per 1,000 matches).match-with-details— a match row that delivers odds, statistics, point by point or head-to-head: US$0.004, whatever the number of sections.
A full day of tennis (about 250 matches) costs about US$0.25 as a list. Rows with any status other than ok are free,
and so is a detail section Flashscore does not have for a match.
Limits
- Flashscore publishes days from 7 days ago to 7 days ahead. For an older match, give its link in
matches. - Statistics and point by point exist where Flashscore covers a match at that level. Measured on a full day (2026-09-19, 187 finished matches): statistics for every WTA and Challenger match and for the ATP-level matches of the day except the lowest Davis Cup group, none for ITF matches; point by point for nearly every tour and Challenger match and about half of the ITF ones; head-to-head for all but one. A section Flashscore does not have comes back empty and uncharged.
- Odds are pre-match prices as Flashscore's odds comparison shows them; bookmakers take them down some time after a match ends. Odds are decimal.
- A run reads what Flashscore shows at that moment; it is not a stream. Schedule it as often as you need.
Is it legal?
The Actor reads pages and feeds that Flashscore serves publicly, without logging in, and collects sports results and statistics, not personal data beyond the names of professional players as they appear in public results. You are responsible for how you use the data; check the terms that apply to you and your jurisdiction.