Tennis Scraper — Flashscore, SofaScore & TennisExplorer avatar

Tennis Scraper — Flashscore, SofaScore & TennisExplorer

Pricing

from $4.00 / 1,000 results

Go to Apify Store
Tennis Scraper — Flashscore, SofaScore & TennisExplorer

Tennis Scraper — Flashscore, SofaScore & TennisExplorer

Scrape tennis fixtures, results, per-bookmaker odds history, match statistics, player profiles, head-to-head records and ATP/WTA rankings from Flashscore, SofaScore and TennisExplorer.

Pricing

from $4.00 / 1,000 results

Rating

0.0

(0)

Developer

Andrew

Andrew

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Get tennis fixtures, results, per-bookmaker odds history, match statistics, point-by-point data, player profiles, head-to-head records and ATP/WTA rankings as clean JSON, CSV or Excel — from three of the biggest tennis sites in a single run. Pick a source and a mode, or paste TennisExplorer URLs and let the actor route them.

What you get

SourceBest forCost per day of fixtures
TennisExplorerFixtures and results with odds, per-bookmaker odds history (opening price + every timestamped move across Home/Away, Over/Under, Asian Handicap and Correct Score), player profiles, head-to-head, weekly ranking snapshots going back years, player search1 page request
FlashscoreBreadth — every tournament from Grand Slams to ITF and juniors, with surface, set-by-set scores and tiebreaks, today ±7 days1 request
SofaScoreDepth — live matches, 20+ per-match statistics, point-by-point, live and pre-match odds, player bios with prize money, current ATP/WTA rankings1 request (live feed)

Every row carries type, source, sourceUrl and scrapedAt, and the same field names are used across sources so you can merge or compare them without glue code:

  • Match rows (match): matchId, status (scheduled / live / finished), date, time, startTime, tournament, tour (atp / wta), discipline (singles / doubles), level, surface, round, home / away (players with slugs and URLs, seed, sets won, per-set games with tiebreak points split out, match odds, head-to-head wins), winner.
  • Match-detail rows (matchDetail): TennisExplorer adds both players' bios (ranking, birthdate, height, weight, plays), the structured final score, head-to-head record with every mutual match, surface and career win/loss balances, recent form, and the odds block — for each bookmaker and market the current price, trend, opening price and full history. SofaScore adds match statistics (aces, double faults, break points, service and return points…), point-by-point with serving player, and decimal odds with opening prices.
  • Player rows (player): name, country, height, weight, age, birthdate, plays, current and highest singles/doubles rank, career and per-season win/loss by surface, titles per year, injuries and the next scheduled match. SofaScore profiles add residence, birthplace, turned-pro year, prize money, live ranking, UTR and the last ten matches.
  • Head-to-head rows (h2h): official record, bio comparison and every mutual match with year, tournament, surface, round and set scores.
  • Ranking rows (rankingEntry): rank, move, player, country, points and the snapshot date.
  • Search rows (playerSearchResult): player name, slug or id, country and current rank — the identifiers the other modes need.

Use cases

  • Betting models and line-movement archives — capture opening-to-closing odds per bookmaker every morning and join them to results by matchId.
  • Tennis analytics — surface-adjusted win probability, form and head-to-head features from structured set scores, balances and statistics.
  • Sports media and content sites — auto-generate match previews (form, H2H, odds) and recaps (scores, ranking movers).
  • Fantasy and prediction apps — daily fixtures as the slate, results feed for scoring, player bios for profiles.
  • Research datasets — weekly ranking snapshots and results archives exported to JSON, CSV or Excel.

How to use

  1. Choose a Data source — TennisExplorer, Flashscore, SofaScore or all three.
  2. Choose a Mode: fixtures, results, matchDetails, players, h2h, rankings or searchPlayers.
  3. Fill in the field for that mode — a date range, match ids, player slugs, head-to-head pairs, a search query or a ranking table.
  4. Set Maximum results to cap billed rows, then run. Results land in the Dataset tab.

Or skip the mode and paste any tennisexplorer.com URLs into TennisExplorer URLs: day listings, /results/, /match-detail/?id=…, /player/…, /mutual/…/…, /ranking/… and /list-players/… pages are recognised automatically.

Typical chains

  • Fixtures → match details: run fixtures today, feed the matchId values into matchDetails to archive odds history.
  • Search → players / h2h: run searchPlayers for a name, copy the slug, then run players or pair two slugs in h2hPairs (djokovic vs alcaraz-5ab70).
  • Historical rankings: set rankingDate to any Monday (e.g. 2025-06-02) to read that week's table.

Example input

{
"source": "tennisexplorer",
"mode": "matchDetails",
"matchIds": ["3315143", "https://www.tennisexplorer.com/match-detail/?id=3290771"],
"includeOddsHistory": true,
"maxItems": 50
}

Example output

A trimmed match-detail row:

{
"type": "matchDetail",
"source": "tennisexplorer",
"matchId": "3315143",
"title": "Tiafoe - Medvedev",
"date": "2026-09-06",
"time": "21:40",
"tournament": "US Open",
"round": "round of 16",
"surface": "hard",
"tour": "atp",
"home": { "name": "Tiafoe Frances", "slug": "tiafoe", "ranking": 12, "birthdate": "1998-01-20", "heightCm": 188, "weightKg": 86, "plays": "right" },
"away": { "name": "Medvedev Daniil", "slug": "medvedev-e0d2d", "ranking": 8, "birthdate": "1996-02-11", "heightCm": 198, "weightKg": 83, "plays": "right" },
"result": { "raw": "3 : 0(7-61, 6-4, 7-66)", "setsHome": 3, "setsAway": 0, "sets": [{ "home": 7, "away": 6, "awayTiebreak": 1 }, { "home": 6, "away": 4 }, { "home": 7, "away": 6, "awayTiebreak": 6 }] },
"headToHead": { "record": "3 - 6", "matches": [{ "year": 2026, "tournament": "US Open", "surface": "Hard", "round": "R16", "winner": "Tiafoe", "loser": "Medvedev", "winnerSets": 3, "loserSets": 0 }] },
"surfaceComparison": { "hard": { "home": { "wins": 24, "losses": 10 }, "away": { "wins": 24, "losses": 8 } } },
"odds": {
"homeAway": [{ "bookmaker": "10Bet", "line": null, "side1": { "odds": 2.35, "trend": "up", "opening": 2.05, "history": [{ "at": "06.09. 19:31", "odds": 2.35, "delta": 0.05 }, { "at": "05.09. 04:38", "odds": 2.05, "delta": null }] }, "side2": { "odds": 1.55, "trend": "down", "opening": 1.73 } }],
"overUnder": [{ "bookmaker": "10Bet", "line": "2.5", "side1": { "odds": 2.2 }, "side2": { "odds": 1.6 } }],
"asianHandicap": [],
"correctScore": []
},
"sourceUrl": "https://www.tennisexplorer.com/match-detail/?id=3315143",
"scrapedAt": "2026-09-07T03:10:31.866Z"
}

A Flashscore match row:

{
"type": "match",
"source": "flashscore",
"matchId": "thCAmNM0",
"status": "finished",
"startTime": "2026-09-06T02:10:00.000Z",
"tournament": "US Open",
"tour": "atp",
"discipline": "singles",
"level": "ATP",
"surface": "hard",
"home": { "players": [{ "name": "Mensik J.", "slug": "mensik-jakub", "country": "Czech Republic" }], "setsWon": 2, "setScores": [{ "games": 3 }, { "games": 6 }, { "games": 7, "tiebreak": 7 }, { "games": 3 }, { "games": 4 }] },
"away": { "players": [{ "name": "Tien L.", "slug": "tien-learner", "country": "USA" }], "setsWon": 3, "setScores": [{ "games": 6 }, { "games": 1 }, { "games": 6, "tiebreak": 2 }, { "games": 6 }, { "games": 6 }] },
"winner": "away"
}

Pricing

Pay per row. Every row costs the base result price; the heavier row types add a surcharge on top because they cost several page fetches each:

Row typeCharged
match, rankingEntry, playerSearchResultresult
matchDetailresult + match-detail-record
playerresult + player-profile
h2hresult + h2h-record
any of the three above from SofaScore+ sofascore-detail (SofaScore only answers through residential proxy, which costs bandwidth per page)

Failed pages never produce placeholder rows, so you only pay for data you receive. Use Maximum results as your spend guard.

Notes and limits

  • Proxies. TennisExplorer and Flashscore are read over a direct connection. SofaScore blocks datacenter IPs, so the actor routes it through a residential proxy automatically (or the proxy you configure); its API is occasionally flaky and every request is retried across fresh sessions.
  • SofaScore modes. fixtures returns the live (in-play) feed rather than a date schedule, results and h2h are not available from SofaScore — use TennisExplorer or Flashscore for those. matchDetails takes SofaScore event ids and players takes SofaScore ids, slugs (alcaraz-carlos) or names.
  • Flashscore covers today ±7 days; matches finishing after midnight appear in the next day's feed and are de-duplicated within a run.
  • Date ranges are capped at 62 days per run. Fixtures for past dates are served from the results pages.
  • Live status on TennisExplorer day listings is inferred from the score (a side with the winning number of sets is finished); Flashscore and SofaScore report status explicitly.
  • Doubles teams appear as two players entries per side.
  • Each run is a snapshot — schedule the actor for live-score style updates.

Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Flashscore, SofaScore, TennisExplorer, the ATP, WTA, ITF, any tournament or any bookmaker whose odds appear in the data. It reads only publicly available pages and feeds. Odds data is informational and nothing here constitutes betting advice. You are responsible for complying with each site's terms of service and the laws that apply to you.