Skip to content

Flashscore Tennis Scraper

Try for free

Extract public ATP, WTA, ITF, and Challenger tennis matches from Flashscore: fixtures, live scores, set-by-set results, players, and surface. Singles and doubles. No login.

🎾 Flashscore Tennis Scraper

Get tennis fixtures, live scores, and results from Flashscore's public day feed: ATP, WTA, ITF, and Challenger, singles and doubles. Each match comes with start time, set scores, players, surface, tournament, and the live game score and server while a match is in progress. No login, no browser, and $0.05 per 1,000 matches.

Pick the days, tours, and statuses you want, then export the matches as JSON, CSV, or Excel.

✨ Why use Flashscore Tennis Scraper?

  • 🔓 No login, no browser — a plain request to the public feed, so runs are light and cheap.
  • 🗓️ Day range — any mix of days from 7 days back to 7 days ahead.
  • 🎚️ Filters — by tour, match status (finished, live, scheduled), and tournament name.
  • 🔴 Live detail — current game score and who is serving while a match is live.
  • 🏟️ Tournament pulls — paste a tournament URL for a Grand Slam or a Masters event.
  • 💸 Tiny price — $0.00005 per match saved.

🎯 Use cases

  • 📅 Daily results and fixtures for ATP and WTA.
  • 🔴 Live match snapshots — schedule runs every few minutes during play.
  • 🏆 Tournament tracking — pull a single event during a Grand Slam or Masters week.
  • 📊 Set-score datasets for research and models.
  • 📰 Sports content — feed scoreboards, newsletters, and bots.

🚀 How to use

  1. Choose Days (offsets from today), for example 0 for today.
  2. Optionally pick Tours, Match statuses, and a Tournament name, or paste tournament or match URLs.
  3. Set Maximum items.
  4. Click Start.
  5. Download the dataset as JSON, CSV, or Excel, or read it through the API.

📥 Input

FieldTypeDescription
dayOffsetsarrayDays relative to today, from -7 to 7. 0 is today.
startUrlsarrayFlashscore tennis tournament or match URLs. The tournament name filter is ignored when set. Other sites are skipped.
maxItemsintegerMaximum matches saved across all days, 1 or more. Default 10.
matchStatusesarrayfinished, live, scheduled, or all.
toursarrayatp, wta, itf, challenger. Empty means every tour.
tournamentsarrayCase-insensitive partial match on the tournament name.
proxyConfigurationobjectProxy for the feed request. Datacenter is the default.
{
  "dayOffsets": ["0"],
  "tours": ["atp"],
  "matchStatuses": ["all"],
  "maxItems": 10
}

Yesterday's finished WTA matches:

{
  "dayOffsets": ["-1"],
  "tours": ["wta"],
  "matchStatuses": ["finished"],
  "maxItems": 20
}

📤 Output

One dataset item per match.

FieldDescription
match_id, match_url, match_dateMatch id, link, and start time in UTC.
match_status, match_type, result_typeSCHEDULED, LIVE, or FINISHED; singles or doubles; NORMAL, RETIREMENT, WALKOVER, DEFAULTED.
home_players, away_players, home_name, away_namePlayers with id, name, nationality, and photo.
sets, sets_won_home, sets_won_away, winnerSet scores and the winner for finished matches.
tournament_name, tournament_id, tournament_url, category_nameTournament and tour label such as ATP - Singles.
surfaceCourt surface: hard, clay, grass, carpet, or indoor hard / indoor clay for indoor events.
current_server, current_game_score_home, current_game_score_awayLive detail: 1 is home, 2 is away.

A trimmed item from a real run (a scheduled ATP match):

{
  "match_id": "KOht3l94",
  "match_url": "https://www.flashscore.com/match/KOht3l94/",
  "match_date": "2026-10-14T04:00:00",
  "match_status": "SCHEDULED",
  "match_type": "singles",
  "home_players": [
    { "name": "Van De Zandschulp B.", "short_name": "VAN", "nationality": "Netherlands", "slug": "van-de-zandschulp-botic" }
  ],
  "away_players": [
    { "name": "Jodar R.", "short_name": "JOD", "nationality": "Spain", "slug": "jodar-rafael" }
  ],
  "home_name": "Van De Zandschulp B.",
  "away_name": "Jodar R.",
  "tournament_name": "Shanghai (China)",
  "tournament_url": "https://www.flashscore.com/tennis/atp-singles/shanghai/",
  "category_name": "ATP - Singles",
  "surface": "hard",
  "sets": null,
  "winner": null,
  "current_server": null
}

Finished matches include sets, sets_won_home, sets_won_away, winner, and result_type. Times are UTC, written without a timezone suffix.

💰 Pricing

You pay $0.00005 per match saved, which is $0.05 per 1,000 matches. Platform usage (compute and proxy) is billed on top at the usual rates; datacenter proxy is the default at $1 per GB.

Worked example: a run that saves 6 matches costs 6 x $0.00005 = $0.0003 in result fees. A billed staging run of 6 matches cost about $0.0039 in total including compute and proxy, so platform usage is the larger part on small runs.

❓ FAQ

Does this need a Flashscore account?

No. The match list, scores, and player names are public. If Flashscore starts requiring a login for the list, this actor cannot return it.

Is it legal?

It reads a public feed. You are responsible for following Flashscore's terms and the laws that apply to your use of the data.

How fresh is live data?

Each run is a snapshot. Schedule it every few minutes during play for updates. current_server and the game score are filled only while a match is live.

Can I target one tournament?

Yes. Paste the tournament URL into startUrls, or put part of the name in tournaments. A match URL returns that match when it falls on one of the selected days.

Which tours are included?

ATP, WTA, ITF, and Challenger, singles and doubles.

Can I schedule it or use the API?

Yes. Schedule runs, start them through the API, and read the dataset in any export format.

⚠️ Limits

  • 🗓️ The feed covers 7 days back and 7 days ahead. Older history is not available.
  • 🧮 round_name and ranking are null, because the day feed does not include them.
  • ⏱️ total_match_duration and per-set duration are null. Tiebreak points are null.
  • 👥 Doubles rows name both players, but short name, slug, nationality, and the second id are filled for the first player of the pair only.
  • 🔢 The whole 15-day window held about 2,700 matches in our tests, so a run saves at most what the feed lists for the chosen days (the status message says when every match was saved).
  • 🐢 A small run takes about 5 to 10 seconds, mostly container startup.
  • 🔄 A day that cannot be fetched is skipped and named in the status message; the other days are still saved.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.