Tennis Explorer Stats Scraper
Pricing
from $5.60 / 1,000 results
Tennis Explorer Stats Scraper
Get ATP and WTA match results, upcoming fixtures with odds, rankings, and player profiles by name, not an internal ID. No login needed. Built for fantasy tennis players, bettors, analysts, and journalists who need clean, accurate tennis data fast.
Pricing
from $5.60 / 1,000 results
Rating
0.0
(0)
Developer
Norm Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share

Tennis Stats Scraper
Get ATP and WTA match results, upcoming fixtures, betting odds, rankings and full player profiles. Search by player name, not an internal ID. No login, no API key.
Who uses it?
| Who | Why |
|---|---|
| Fantasy tennis players | Fresh results and player form to set a lineup. |
| Bettors | Odds alongside results to backtest a model, plus pre-match odds on upcoming fixtures. |
| Analysts | Rankings, head to head records and match detail for building historical datasets. |
| Journalists | Daily results and player bios to write up quickly, without digging through a site by hand. |
What it does
- Match results, by date or date range, filtered by tour (ATP or WTA, singles or doubles). Every row has the score set by set, who won, and the odds that were listed for both players.
- Upcoming fixtures, the same way, for matches that have not been played yet, with pre-match odds where the market is already open.
- Rankings, ATP and WTA, current or from a past year.
- Player profiles, searched by name: country, height, weight, age, plays which hand, and current plus career-best rank in both singles and doubles.
- An optional match detail add-on for Match results and Upcoming fixtures: the court surface, the round, the head to head record between the two players, and average plus best odds across every bookmaker tracked. This is the one thing none of the other tennis scrapers on Apify pull together in a single run.
Why this scraper
- Search by player name. Every other tennis scraper on Apify makes you already know the site's internal player ID. This one resolves the name for you.
- Rankings and player profiles, not just results. Current and historical ATP / WTA rankings, and full bio pages, in the same actor.
- Odds pulled together in one run. Score-line odds on the listing, plus average and best odds across every bookmaker on the match-detail add-on.
- A real dataset schema and a free-plan preview, so the output is clean in the Apify Console and anyone can try it before paying.
- No login, no API key, no proxy.
How it compares
| Capability | This actor | Other tennis scrapers on Apify |
|---|---|---|
| Match results by date / range, ATP + WTA, singles + doubles | yes | yes |
| Upcoming fixtures with pre-match odds | yes | some |
| Search by player name (no internal ID) | yes | no |
| Rankings mode (current + past years) | yes | rare |
| Player profile mode (bio, ranks, photo) | yes | rare |
| Surface, round, head-to-head on demand | yes | rare |
| Odds aggregated across every bookmaker | yes | no |
| Declared dataset schema + free-plan preview | yes | no |
What data you get
| Mode | Row shape |
|---|---|
| Match results | Tournament, date, time, both players, score, winner, odds. With match detail: surface, round, head to head, aggregated odds. |
| Upcoming fixtures | Same shape as Match results, before the match is played: no score or winner yet. |
| Rankings | Rank, move since last update, player, country, points, tour, year. |
| Player profiles | Name, country, height, weight, age, plays, current and career-best rank in singles and doubles, photo. |
Use cases
A daily results feed.
{ "mode": "results", "date": "yesterday", "tour": "atp-single" }
Betting research with odds aggregated across every bookmaker tracked.
{ "mode": "results", "date": "2026-08-09", "tour": "atp-single", "includeMatchDetail": true }
Every row also carries best_odds_player1 / best_odds_player2 (the best price found across every bookmaker tracked) and avg_odds_player1 / avg_odds_player2 (the average across all of them), not just one bookmaker's number.
Tomorrow's card with pre-match odds.
{ "mode": "upcoming", "date": "today", "tour": "wta-single" }
A player's current form.
{ "mode": "players", "playerNames": ["Carlos Alcaraz", "Iga Swiatek"] }
Where a player stood at a specific point in history.
{ "mode": "rankings", "rankingTour": "atp-men", "rankingYear": 2020 }
How the input is organised
| Section | Applies to | Key fields |
|---|---|---|
| Mode | Every run | mode: results, upcoming, rankings, or players. |
| Match results and Upcoming fixtures | results and upcoming | date (or dateFrom/dateTo), tour, includeMatchDetail. |
| Rankings | rankings | rankingTour, rankingYear (optional, leave empty for the current table). |
| Player profiles | players | playerNames (searched by name) or playerIds (a known ID from a previous run). |
maxItems applies to every mode and caps how many rows the run writes.
Limits and responsible use
- Match statistics like aces or double faults are not tracked by this Actor. The source does not consistently publish them for every match, especially lower-tier events, so a field that is empty most of the time was left out rather than shipped half-working.
- Match detail's odds are a summary (best price and average across tracked bookmakers), not a full line-movement history for every bookmaker. That level of detail is a lot of nested data for a use case almost nobody needs; if you do need it, say so and it can be added.
- Odds are whatever was listed at scrape time. Pre-match odds move right up until a match starts, and this Actor does not guarantee it caught the final price.
- This Actor reads only public pages. It respects reasonable request rates and does not require or store any login.
Local development
bun installbun test # unit tests against saved sample pagesbun run src/main.ts # local run, reads storage/key_value_stores/default/INPUT.json