Tennis Scraper: ATP & WTA Rankings, Matches, Stats, H2H avatar

Tennis Scraper: ATP & WTA Rankings, Matches, Stats, H2H

Pricing

$2.50 / 1,000 result saveds

Go to Apify Store
Tennis Scraper: ATP & WTA Rankings, Matches, Stats, H2H

Tennis Scraper: ATP & WTA Rankings, Matches, Stats, H2H

Tennis scraper and ATP WTA rankings API: official rankings with Elo, live scores and results, tournaments, player profiles, match-by-match serve/return stats and head-to-head. Search by player name.

Pricing

$2.50 / 1,000 result saveds

Rating

0.0

(0)

Developer

Siftwright Data

Siftwright Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Tennis Scraper: ATP & WTA rankings API, live scores, match stats and head-to-head

Get ATP and WTA tennis data in one Actor: official rankings with Elo ratings, live scores and match results, the tournament calendar, player profiles, match-by-match serve and return statistics and head-to-head records. Type player names; you don't need to look up IDs first.

The data comes from public ESPN tennis feeds (rankings, scores, tournaments) and Tennis Abstract (Elo ratings, player bios, per-match statistics). The Actor uses no browser and needs no login or API key, so a typical run finishes in a few seconds.

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by the ATP, the WTA, ESPN or Tennis Abstract. Their names are used only to describe where the public data comes from.

What this tennis scraper gives you

ModeWhat you getRows
RankingsCurrent ATP and WTA top 150: rank, previous rank, movement, points, country, age, plus overall, hard, clay and grass Elo. Or switch to the full Elo rating list.1 per player
Matches & live scoresLive, finished and scheduled matches for any day or date range: tournament, round, court, players, set-by-set score with tie-breaks, winner, retirements and walkovers. Singles and doubles.1 per match
TournamentsATP and WTA calendar for a date range: dates, location, Grand Slam flag, match count, live matches, champions and previous winners.1 per tournament
Player profiles & statsCountry, age, height, plays, backhand, current and peak rank, Elo and surface Elo, last-52-weeks and season record, win % by surface, ace %, first-serve %, serve and return points won, break points saved, recent form, last match.1 per player
Player match statsEach match with opponent, rank, surface, level, round, score, duration and full tennis match stats for both players: aces, double faults, first serve in/won, second serve won, break points saved/faced. Filter by season, surface or last N matches.1 per match
Head-to-head (H2H)Win-loss record, leader, record by surface, last meeting, plus every meeting with full match stats.1 summary + 1 per meeting

Why use it

  • One tennis API instead of six tools: rankings, scores, tournaments, players, match stats and H2H share one dataset format.
  • Names, not IDs: enter Sinner, Aryna Sabalenka or Sinner vs Alcaraz. Other tools make you find a numeric ID first.
  • Elo ratings built in: every official ranking row can carry overall and surface Elo, which is useful for betting models and predictions.
  • Deep match statistics: serve and return numbers for both players in every tour-level match the source covers. ATP player files cover the whole career.
  • Low cost and fast: plain HTTP, no browser, 512 MB of memory is enough.

Use cases

  • Tennis betting and prediction models (Elo, serve/return form, surface splits, H2H)
  • Fantasy tennis, tipping and pick'em apps
  • Live score widgets, bots and newsletters
  • Sports journalism and data analysis
  • Training data for AI agents and dashboards

Input examples

ATP and WTA rankings with Elo:

{ "mode": "rankings", "tours": ["atp", "wta"] }

Today's live tennis scores only:

{ "mode": "matches", "date": "today", "matchStatus": ["live"] }

All WTA results from a date range, singles and doubles:

{ "mode": "matches", "tours": ["wta"], "date": "2026-09-01", "endDate": "2026-09-07", "matchTypes": ["singles", "doubles"] }

Player profiles:

{ "mode": "players", "players": ["Jannik Sinner", "Carlos Alcaraz", "Aryna Sabalenka"] }

Last 20 matches with full stats:

{ "mode": "playerMatches", "players": ["Alcaraz"], "lastNMatches": 20 }

Head-to-head:

{ "mode": "headToHead", "players": ["Sinner vs Alcaraz", "Sabalenka vs Swiatek"] }

Input fields

FieldUsed inDescription
modeallrankings, matches, tournaments, players, playerMatches or headToHead
toursallatp, wta or both (default both)
playersplayers, playerMatches, headToHead, matchesNames, or A vs B pairs for head-to-head. In matches mode, filters to these players.
rankingTyperankingsofficial (default) or elo
includeElorankingsAdd Elo columns to official rankings (default true)
date, endDatematches, tournamentsYYYY-MM-DD, today, yesterday or tomorrow
matchStatusmatchesAny of live, finished, scheduled
matchTypesmatchessingles (default) and/or doubles
wholeTournamentmatchesReturn all matches of the tournaments running on the date
year, surface, lastNMatchesplayerMatches, headToHeadFilters for match lists
maxResultsallStop after this many rows (default 1000)

Output examples

Ranking row:

{ "type": "ranking", "tour": "atp", "rankingDate": "2026-10-15", "rank": 1, "previousRank": 1, "movement": 0, "points": 10950,
"player": "Jannik Sinner", "country": "Italy", "countryCode": "ITA", "age": 25, "elo": 2296.9, "eloRank": 1, "hardElo": 2234.3, "clayElo": 2186.8, "grassElo": 2100.5 }

Match row:

{ "type": "match", "tour": "atp", "tournamentName": "BNP Paribas Fortis European Open", "category": "mens-singles", "round": "Qualifying 1st Round",
"status": "finished", "player1": "Joel Josef Schwaerzler", "player2": "Federico Cina", "winner": "Federico Cina", "score": "6-3 7-6(4)",
"sets": [{ "player1": 3, "player2": 6 }, { "player1": 6, "player2": 7, "tiebreak": { "player1": 4, "player2": 7 } }] }

Player match stats row (shortened):

{ "type": "playerMatch", "player": "Carlos Alcaraz", "date": "2026-10-07", "tournament": "Shanghai Masters", "surface": "Hard", "level": "Masters 1000",
"round": "R32", "result": "L", "opponent": "Zizou Bergs", "opponentRank": 39, "score": "7-5 7-6(4)", "durationMinutes": 122,
"stats": { "aces": 5, "doubleFaults": 2, "firstServeInPct": 67.1, "firstServeWonPct": 66, "secondServeWonPct": 53.8, "breakPointsSaved": 1, "breakPointsFaced": 4 } }

Every row has a type field (ranking, eloRating, match, tournament, player, playerMatch, headToHead, h2hMatch) and a scrapedAt timestamp. Download as JSON, CSV, Excel or HTML, or read it through the Apify API.

Coverage and limits

  • Rankings and matches cover the ATP and WTA tours, including Grand Slams. Challenger and ITF matches are not in the scores feed.
  • Official rankings return the top 150 per tour. The Elo list covers a few hundred active players per tour.
  • Detailed serve/return statistics exist for tour-level matches where the source has them. Some rows (qualifying, walkovers, team events) have stats: null.
  • ATP player match files cover the whole career. WTA head-to-heads and match logs also load the career file when the source has one; player profiles use recent seasons.
  • Live scores show the state at the moment of the run. Schedule the Actor (for example every 5 minutes) to keep a feed up to date.

Pricing

You pay per result row saved to the dataset. Set maxResults or a maximum charge per run to control cost.

FAQ

Do I need player IDs? No. Full names, last names and names without accents all work.

Can I get historical results? Yes. Use Matches with a past date range (up to 31 days per run), or Player match stats for career match logs.

Is it legal to scrape tennis data? The Actor only reads publicly available pages and feeds, without logging in. Check the source sites' terms and your local laws for how you use the data.