Tennis Abstract Players & Elo Ratings Scraper avatar

Tennis Abstract Players & Elo Ratings Scraper

Pricing

from $0.70 / 1,000 results

Go to Apify Store
Tennis Abstract Players & Elo Ratings Scraper

Tennis Abstract Players & Elo Ratings Scraper

Scrape Tennis Abstract (tennisabstract.com) ATP and WTA Elo ratings and player profiles: Elo by surface, rankings, recent results, career and last 52 weeks splits, serve and return stats and head-to-heads. Export JSON, CSV or Excel.

Pricing

from $0.70 / 1,000 results

Rating

0.0

(0)

Developer

ActorFlow

ActorFlow

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

11 hours ago

Last modified

Categories

Security

Limited permissions

Share

Scrape tennis players and Elo ratings from Tennis Abstract (tennisabstract.com): the ATP and WTA Elo leaderboards with Elo per surface, and a full profile for each player with ranks, recent results, season and career splits, serve and return stats and head-to-heads. Export as JSON, CSV or Excel or call it as an API. Paste an Elo page or type a player name and press Start.

Target website: tennisabstract.com

✨ Features of this Tennis Abstract players scraper

  • Elo ratings extraction — ATP and WTA leaderboards with overall, hard, clay and grass Elo, their ranks, peak Elo and the official ranking.
  • Player profiles — country, handedness, backhand, birth date, height, current and peak ranking, and the ATP or WTA tour.
  • Match and season stats — recent results with serve and return stats, tour and challenger seasons, recent finals and year-end rankings.
  • Splits and head-to-heads — career and last 52 weeks splits by surface, round and more, and every head-to-head record.
  • Look up by name — type a player name and get the profile, ATP or WTA.
  • Proxy support — optional; runs work without one.
  • No browser required — plain requests keep runs fast and cheap.

🚀 How to scrape Tennis Abstract players in 5 steps

  1. Sign up for a free Apify account — includes $5 monthly credit.
  2. Open the actor page and click Try for free.
  3. Fill in the Input fields (an Elo ratings page, a player page or player names).
  4. Click Start and wait for the run to complete.
  5. Download results from the Output tab in JSON, CSV, or Excel format.

You can also run this actor via the Apify API or integrate it directly into your workflows using Zapier, Make, or n8n.

💰 Pricing for the Tennis Abstract scraper

This actor uses pay-per-result billing based on the compute units a run consumes.

  • New Apify accounts include $5 of free monthly credit.
  • The actor uses plain HTTP requests instead of a browser, so it costs significantly less to run than browser-based scrapers.
  • The proxy is off by default, which keeps runs cheapest.

🔧 Tennis Abstract scraper input configuration

The input form starts with the Tennis Abstract URLs and player names, then the player limit and the details switch. The proxy settings are last.

FieldTypeRequiredDefaultDescription
Tennis Abstract URLs (startUrls)array—the ATP Elo ratings pageElo ratings pages (ATP or WTA) or player pages.
Player names (playerNames)array——Players to look up by name, for example Coco Gauff. Each one returns the full profile.
Max players per URL (maxItems)integer—5Maximum players saved for each Elo ratings page, taken from the top of the list.
Scrape player details (scrapeDetails)boolean—falseFor players from an Elo page, also open the player page for the profile, results, splits and head-to-heads. Player URLs and names always get the details.
Proxy configuration (proxyConfiguration)object—no proxyTurn on Apify Proxy if your runs get blocked.

Supported URL types:

  • ATP Elo ratings: https://www.tennisabstract.com/reports/atp_elo_ratings.html
  • WTA Elo ratings: https://www.tennisabstract.com/reports/wta_elo_ratings.html
  • A player: https://www.tennisabstract.com/cgi-bin/player.cgi?p=JannikSinner

📦 Tennis Abstract scraper output data

Every player is one flat record with the keys type, id, url, name, tour, country, hand, backhand, dateOfBirth, age, heightCm, currentRank, peakRank, peakRankDate, officialRank, eloRank, elo, hEloRank, hElo, cEloRank, cElo, gEloRank, gElo, peakElo, peakEloMonth, eloVsRankDiff, twitter, atpId, recentResults, tourSeasons, challengerSeasons, recentFinals, yearEndRankings, careerSplits, last52Splits, headToHeads, source, scrapedAt. Every record has all keys; a value the page does not carry is null, for example the profile and the tables are null for a player taken from an Elo page without Scrape player details. The tables (recentResults, tourSeasons, challengerSeasons, recentFinals, yearEndRankings, careerSplits, last52Splits, headToHeads) are arrays of rows keyed by Tennis Abstract's own column names. The dataset has 1 view:

  • Players — a compact table of Elo rank, player, tour, country, age, Elo by surface, official rank and the player page.

Output at a glance:

Elo rankPlayerTourCountryAgeEloHardClayGrass
1Jannik SinneratpITA2522972234.32186.82100.5
2Carlos AlcarazatpESP2321502086.22088.12015.7
3Alexander ZverevatpGER2921072047.72054.51953.4
4Novak DjokovicatpSRB3920632015.219611939.9
5Rafael JodaratpESP2020191948.11964.91738.6

Sample output (raw JSON):

[
{
"type": "player",
"id": "JannikSinner",
"url": "https://www.tennisabstract.com/cgi-bin/player.cgi?p=JannikSinner",
"name": "Jannik Sinner",
"tour": "atp",
"country": "ITA",
"hand": "right",
"backhand": "two-handed",
"dateOfBirth": "2001-08-16",
"age": 25,
"heightCm": 191,
"currentRank": 1,
"peakRank": 1,
"peakRankDate": "2024-06-10",
"officialRank": 1,
"eloRank": 1,
"elo": 2297,
"hEloRank": 1,
"hElo": 2234.3,
"cEloRank": 1,
"cElo": 2186.8,
"gEloRank": 1,
"gElo": 2100.5,
"peakElo": 2339.8,
"peakEloMonth": "2026-05",
"eloVsRankDiff": 0,
"twitter": "janniksin",
"atpId": "S0AG",
"recentResults": [
{
"date": "29-Jun-2026",
"tournament": "Wimbledon",
"surface": "Grass",
"rd": "F",
"rk": "1",
"vrk": "3",
"column7": "(1)Sinner d. (2)Alexander Zverev [GER]",
"score": "6-7(7) 7-6(2) 6-3 6-4",
"dr": "1.24",
"a": "11.0%",
"df": "1.5%",
"1stin": "64.0%",
"1st": "80.5%",
"2nd": "65.3%",
"bpsvd": "1/1",
"time": "3:46"
}
],
"tourSeasons": [
{
"year": "2026",
"m": "47",
"w": "44",
"l": "3",
"win": "93.6%",
"setWL": "105-15",
"set": "87.5%",
"gameWL": "712-439",
"game": "61.9%",
"tbWL": "14-5",
"tb": "73.7%",
"ms": "45",
"hld": "94.4%",
"brk": "29.1%",
"a": "14.2%",
"df": "2.1%",
"1stin": "64.8%",
"1st": "81.4%",
"2nd": "59.1%",
"spw": "73.6%",
"rpw": "40.7%",
"tpw": "56.2%",
"dr": "1.54",
"best": "W (6x)"
}
],
"challengerSeasons": [
{
"year": "2020",
"m": "3",
"w": "1",
"l": "2",
"win": "33.3%",
"setWL": "3-4",
"set": "42.9%",
"gameWL": "31-31",
"game": "50.0%",
"tbWL": "1-0",
"tb": "100.0%",
"ms": "3",
"hld": "74.2%",
"brk": "23.3%",
"a": "7.7%",
"df": "2.2%",
"1stin": "57.5%",
"1st": "75.0%",
"2nd": "50.6%",
"spw": "64.6%",
"rpw": "40.1%",
"tpw": "51.5%",
"dr": "1.13",
"best": "R16 (Indian Wells)"
}
],
"recentFinals": [
{
"date": "29-Jun-2026",
"tournament": "Wimbledon",
"surface": "Grass",
"rd": "F",
"rk": "1",
"vrk": "3",
"column7": "(1)Sinner d. (2)Alexander Zverev [GER]",
"score": "6-7(7) 7-6(2) 6-3 6-4",
"dr": "1.24",
"a": "11.0%",
"df": "1.5%",
"1stin": "64.0%",
"1st": "80.5%",
"2nd": "65.3%",
"bpsvd": "1/1",
"time": "3:46"
}
],
"yearEndRankings": [
{
"year": "Current (2026-10-26)",
"atpRank": "1",
"points": "10450",
"eloRank": "1",
"elo": "2332",
"heloRank": "1",
"helo": "2269",
"celoRank": "1",
"celo": "2222",
"geloRank": "1",
"gelo": "2135",
"doublesATPRank": null,
"points2": null,
"dLoRank": null,
"dLo": null
}
],
"careerSplits": [
{
"split": "Hard",
"m": "308",
"w": "251",
"l": "57",
"win": "81.5%",
"setWL": "564-177",
"set": "76.1%",
"gameWL": "4168-2986",
"game": "58.3%",
"tbWL": "84-31",
"tb": "73.0%",
"ms": "297",
"hld": "87.8%",
"brk": "27.8%",
"a": "8.9%",
"df": "2.5%",
"1stin": "60.8%",
"1st": "76.6%",
"2nd": "55.6%",
"spw": "68.4%",
"rpw": "40.4%",
"tpw": "54.0%",
"dr": "1.28"
}
],
"last52Splits": [
{
"split": "Hard",
"m": "56",
"w": "51",
"l": "5",
"win": "91.1%",
"setWL": "117-15",
"set": "88.6%",
"gameWL": "781-450",
"game": "63.4%",
"tbWL": "15-1",
"tb": "93.8%",
"ms": "56",
"hld": "93.1%",
"brk": "31.5%",
"a": "12.5%",
"df": "2.1%",
"1stin": "64.3%",
"1st": "81.3%",
"2nd": "57.4%",
"spw": "72.8%",
"rpw": "41.7%",
"tpw": "56.5%",
"dr": "1.53"
}
],
"headToHeads": [
{
"mtgs": "18",
"opponent": "Carlos Alcaraz [ESP]",
"w": "7",
"l": "11",
"win": "38.9%",
"tb": "16",
"w2": "7",
"l2": "9",
"tb2": "43.8%",
"first": "2019",
"last": "2026",
"ms": "18",
"dr": "0.99",
"a": "4.3%",
"df": "3.6%",
"1stin": "56.3%",
"1st": "69.4%",
"2nd": "51.5%",
"spw": "61.6%",
"rpw": "37.8%",
"bpsvd": "64.5%",
"bpcnv": "47.3%"
}
],
"source": "https://www.tennisabstract.com/reports/atp_elo_ratings.html",
"scrapedAt": "2026-10-29T17:37:28.006Z"
}
]

🐍 How to scrape Tennis Abstract with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace <YOUR_API_TOKEN> with the token from your Apify Console.

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("confidential_gnat/tennis-abstract-players-scraper").call(run_input={
"startUrls": [{"url": "https://www.tennisabstract.com/reports/atp_elo_ratings.html"}],
"playerNames": ["Coco Gauff"],
"maxItems": 20,
"scrapeDetails": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('confidential_gnat/tennis-abstract-players-scraper').call({
startUrls: [{ url: 'https://www.tennisabstract.com/reports/atp_elo_ratings.html' }],
playerNames: ['Coco Gauff'],
maxItems: 20,
scrapeDetails: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

cURL — start a run and wait for the dataset:

curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~tennis-abstract-players-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"startUrls": [{"url": "https://www.tennisabstract.com/reports/atp_elo_ratings.html"}], "playerNames": ["Coco Gauff"], "maxItems": 20, "scrapeDetails": true}'

💡 What you can use Tennis Abstract player data for

  • Building tennis rating models and match predictions from Elo by surface.
  • Comparing player form with the last 52 weeks splits against career numbers.
  • Scouting opponents with head-to-head records and serve and return stats.
  • Tracking Elo versus official ranking to find under- and overrated players.
  • Feeding tennis media, newsletters and betting research with up-to-date ratings.

The data is typically used by sports analysts, data scientists, betting researchers, fantasy platforms and sports publishers.

⚠️ Limitations of the Tennis Abstract scraper

  • Slow by design — Tennis Abstract slows down fast clients, so the actor waits between requests and a run with details for many players takes a while.
  • Top of the list only — an Elo page lists the players with enough recent matches, and Max players per URL takes them from the top.
  • No live scores or odds — the actor returns ratings, profiles and historical stats, not live matches.
  • Column names — the tables keep Tennis Abstract's own column names, for example 1stin and setWL.

❓ Tennis Abstract scraper FAQ

Can I scrape Tennis Abstract legally?

The actor only collects data that is already publicly visible on Tennis Abstract, with no login, paywall or private content. Scraping publicly available data is generally considered lawful (see hiQ Labs v. LinkedIn), but you are responsible for complying with the site's Terms of Service and applicable laws.

What data does the Tennis Abstract scraper return?

Each player has Elo and Elo rank overall and for hard, clay and grass, peak Elo and the official rank. With details switched on you also get the profile (country, hand, backhand, birth date, height, current and peak rank) and the tables of recent results, seasons, finals, year-end rankings, career and last 52 weeks splits and head-to-heads.

How many players can I scrape from one Elo page?

Max players per URL limits the saved players for each Elo ratings page, taken from the top of the Elo list. Each player URL or name returns one player.

Do I need a proxy to scrape tennisabstract.com?

No. The input defaults to no proxy and runs worked without one in testing. The site answers fast clients with a temporary "too many requests" error, which the actor handles by waiting and retrying. Turn on Apify Proxy only if your runs get blocked.

How do I scrape Tennis Abstract with Python?

Use the Python example above: it starts the actor with your input and iterates over the dataset items.

Can I run this Tennis Abstract scraper on a schedule?

Yes. Create an Apify Schedule for the actor, for example weekly, because Tennis Abstract updates the Elo ratings about once a week.

What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the Output tab or through the Apify API.

Why are some profile fields empty?

Tennis Abstract does not know every player's handedness or height, and young players may have no results in some tables. Missing values are null.

🔗 Relevant actors for tennis and sports data

ScraperDescription
📊 StatMuse Sports Stats ScraperStatMuse answers to natural-language sports questions plus player stats.
📈 Covers.com Odds, Line History & Betting Trends ScraperCovers.com odds, line history and betting trends for NFL, NBA, MLB and NHL.
🎯 Action Network Odds & Public Betting ScraperSportsbook odds, public betting splits and line movement.
🏈 FantasyPros Player News & Expert Rankings ScraperFantasyPros player news, expert rankings and projections.
🏀 FanDuel Odds, Player Props & Same Game Parlay ScraperFanDuel odds, player props and same game parlays.

🔗 Other actors you may find useful

ScraperDescription
🥾 AllTrails Scraper — Hiking, Biking & Running TrailsHiking, biking and running trails by park, city or state.
📌 Pinterest Pins, Boards & Profiles ScraperPins, videos, boards and profiles from Pinterest searches and URLs.
💼 Dice Jobs ScraperTech job listings from Dice by keyword or URL.
🔮 Kalshi Markets ScraperPrediction market prices, implied probability and volume from Kalshi.
🍷 Vivino Wine ScraperWine data from Vivino: name, winery, vintage and ratings.

💬 Support & contact

If you encounter any issues or have questions, please open an issue.

You can also find more of our actors on the Actor Flow page.