WTA Tennis Rankings Scraper
Pricing
$4.00 / 1,000 ranked player returneds
WTA Tennis Rankings Scraper
WTA Tennis Rankings Scraper reads the WTA's own published ranking tables and returns one row per player: rank, week-on-week movement, points, country, age and tournaments played. Singles, doubles and both Race tables. onlyChangedSinceLastRun defaults ON, so a daily run bills only movers.
Pricing
$4.00 / 1,000 ranked player returneds
Rating
0.0
(0)
Developer
angel nguyen
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 hours ago
Last modified
Share
WTA Tennis Rankings Scraper extracts the Women's Tennis Association's own published ranking tables and returns one flat, typed row per ranked player — rank, week-on-week movement, points, country, age, tournaments played, and the WTA's own player ID. You pick the tables; you get back a spreadsheet of the rankings.
The source is wtatennis.com/rankings, the WTA's own website. It is public, it needs no API key and no login, and it is the same page a fan reads. The WTA publishes four ranking tables — singles, doubles, and the two Race to the Finals tables — and this Actor reads them exactly as published.
Key features
| Feature | Detail |
|---|---|
| Input | any of the four WTA ranking tables, in one run |
| Fields | rank, movement, points, country, age, tournaments played, player ID, profile URL |
| Movement | parsed as a signed number, with the WTA's own text kept alongside it |
| Ties | preserved, not flattened — the doubles table really does publish two players at the same rank |
| Incremental runs | onlyChangedSinceLastRun is on by default — a repeat run bills only for players who moved |
| Pre-charge filters | rank and country filters run before billing, so filtering lowers your cost |
| Honest failures | a table name the WTA does not publish is unavailable; a table published but empty is empty, and neither is charged |
| Output | one row per player, flat and typed — JSON, CSV, Excel, XML |
WTA tennis rankings scraper: how it works
- Resolve the table.
singles,doubles,race-singles,race-doubles, plus the obvious aliases. Anything else is reported as unavailable, naming the four tables that do exist, and is not charged. - Read the published table. One request per table. The rankings are rendered into the page itself, so there is no hidden API and nothing is reconstructed or inferred.
- Parse each row. Rank, movement, player ID and name, country, age, tournaments played and points come out of the row's own cells.
- Filter, then charge, then deliver. Filters run first so you are never billed for rows a filter discards. Charges are applied before records are handed over and delivery is truncated to whatever your budget allowed, so the rows you receive equal the rows you paid for.
Tutorial
- Open the Actor and choose your tables in WTA ranking tables. The prefilled example reads
singlesanddoubles. - Leave Only players whose ranking changed since your last run switched on. It is on by default and it is what makes a daily schedule cheap.
- Optionally set Only players ranked this high or better to
10for just the top ten, or list Only these countries as three-letter codes such asUSA,POL,BLR. - Click Start. Two tables finish in a few seconds.
- Open the Storage tab and export to CSV or Excel, or read the same rows from the dataset API.
- To follow the rankings over time, open Schedules and run it daily. WTA rankings update weekly, so with the incremental setting on most days will cost you very little and the rows you do get are exactly the week's movers.
Input
The minimum input is a list of tables. Everything else has a working default.
{"rankingTypes": ["singles", "doubles"],"maxPlayersPerTable": 50,"onlyChangedSinceLastRun": true,"maxRank": 50,"countryCodes": []}
| Field | Type | Default | Meaning |
|---|---|---|---|
rankingTypes | array of string | — | Any of singles, doubles, race-singles, race-doubles. Required. |
maxPlayersPerTable | integer | 50 | Cap per table. 50 is also the ceiling — see the limits section. |
onlyChangedSinceLastRun | boolean | true | Return only players whose rank or points moved since your last run. On by default. |
maxRank | integer | 50 | Keep only players at this rank or better. Filters before charging. |
countryCodes | array of string | (empty) | Three-letter country codes as the WTA publishes them. Filters before charging. |
Output
One row per ranked player. This is a real row from a real run against the live singles table, not an illustration.
{"rankingType": "singles","rankingTable": "WTA singles rankings","rank": 1,"movement": 0,"movementText": "-","playerId": "320760","playerName": "Aryna Sabalenka","countryCode": "BLR","age": 28,"tournamentsPlayed": 18,"points": 8575,"profileUrl": "https://www.wtatennis.com/players/320760","sourceUrl": "https://www.wtatennis.com/rankings/singles","scrapedAt": "2026-09-02T17:36:07.641Z"}
Two details worth knowing, because they are the ones that quietly corrupt a rankings dataset:
- A dash in the movement column means "did not move", which is
0— not missing. The Actor returnsmovement: 0and keeps the WTA's own"-"inmovementText. Reading the dash as null would throw away the only field that tells you a ranking is stable. - Ties are real and are preserved. The Actor returns the rank the WTA prints and never renumbers, so when the source ties two players it emits the same rank twice and the following rank skips. Any code you write against this dataset should expect ranks to be non-decreasing rather than a clean 1..N sequence.
Pricing
This Actor is priced per event, so you pay for what it delivers rather than for how long it runs.
| Event | Price | Charged when |
|---|---|---|
player-returned | $0.004 | Once per player row written to the dataset |
There is no per-run start fee and no monthly minimum. A run that returns nothing costs nothing at all — including a Race table that the WTA publishes but has not populated.
What a repeat run actually costs, worked through
This is why onlyChangedSinceLastRun defaults to on. Take both the singles and doubles tables — 100 players — polled daily for a month. WTA rankings update once a week, so on most days nothing moves at all, and on an update day perhaps 30 of the 100 players shift:
| Setting | Players billed per day | Monthly cost |
|---|---|---|
onlyChangedSinceLastRun: true (the default) | 100 on day one, then ~30 on each of ~4 update days | $0.40 + $0.48 = $0.88 |
onlyChangedSinceLastRun: false | 100 every day | $12.00 |
A 13x difference, and all of it would have been spent re-buying rankings you already had. Turn it off when you deliberately want the full table again — to rebuild a lost dataset, or for a one-off snapshot — and not by accident.
The other filters work the same way. maxRank: 10 bills for ten players, not fifty. countryCodes: ["USA"] bills only for the American players. Both filter before charging, so narrowing your question always lowers your bill.
Frequently asked questions
Where does the data come from?
wtatennis.com/rankings, the WTA's own published ranking tables. Nothing is inferred, computed or sourced from a third party.
How deep do the rankings go?
Fifty players per table. The WTA's page publishes its top 50 and its "Load More" control is client-side — no deeper page is served to an ordinary request. maxPlayersPerTable is therefore capped at 50 rather than accepting a larger number and quietly returning 50 anyway.
What are the Race tables?
The Race to the Finals standings — points accumulated in the current season, as opposed to the rolling 52-week ranking. The WTA leaves them empty outside the season, and an empty table is reported as empty and charged nothing.
What happens if I ask for a table that does not exist?
You get unavailable with a message naming the four tables that do, and no charge. An unresolvable input must never bill.
Does it cover the ATP or men's tennis? No. This Actor reads the WTA's tables only, and the listing does not claim otherwise.
Does it return match results or head-to-head data? No. It returns rankings. Match-level data is a different product and is not implied here.
How often should I run it? Daily is sensible and cheap with the incremental default on — you will get rows on the days the WTA actually republishes and near-nothing in between. Weekly also works if you only want the update day.
What if my budget cap is reached mid-run? Delivery is truncated to the number of records actually charged and the run says so in the log. You are never billed for rows you did not receive.
Limits and troubleshooting
- Fifty per table is the source's limit, not a setting. If you need players ranked 51 and below, this Actor cannot get them, because the WTA does not serve them to an ordinary page request.
- An empty Race table is not a bug. Out of season the WTA publishes the page with no players in it. The Actor reports
empty, distinguishes it from a page it failed to read, and charges nothing. - Rankings are weekly. A daily run on a non-update day is expected to return nothing with the incremental default on. That is the setting working, not a failure.
- Site markup changes. If the WTA restructures the page, the Actor reports the table as unavailable with "the page loaded but carried no rankings table" rather than returning zero players, because zero players would be a claim about tennis rather than about the page.
Integrations and API
The Actor is callable from anywhere the Apify API reaches.
curl -X POST "https://api.apify.com/v2/acts/praise-most-high~wta-tennis-rankings-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"rankingTypes":["singles"],"maxRank":10}'
- Scheduling — run it daily from the Apify scheduler; with the incremental default on, each run is a movers feed.
- Webhooks — fire on
ACTOR.RUN.SUCCEEDEDto push new rows into your own store. - Python and JavaScript SDKs — both call it the same way; see the Apify client docs.
- MCP — reachable as a tool from any MCP-speaking agent through Apify's own MCP server.
Related Actors
Other Actors on this account that pair with this one:
- X (Twitter) Tweet Scraper - Bulk by URL - player news and match reaction alongside the ranking movement
- YouTube Channel Upload Monitor - match highlight channels publishing against the same calendar
- Telegram Channel Message Scraper - sports and betting signal channels discussing these tables
- Apple Podcasts New-Episode Monitor - tennis podcasts covering the ranking weeks this Actor returns
Legal and data handling
Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by the Women's Tennis Association. "WTA", "Women's Tennis Association" and "Race to the Finals" are trademarks of their respective owner and are used here only to identify the source being read.
This Actor reads a public, unauthenticated page that the WTA publishes for general readership, and returns the professional competitive record it contains: rank, points, movement, nationality, age and tournaments played. These are published sporting statistics about professional athletes in their professional capacity. The Actor collects no contact details, no private information and nothing behind an authentication boundary.
The rankings themselves are the WTA's own compilation. This Actor retrieves them; it does not license them to you. Whether your intended use of that output is permitted is a question about your jurisdiction, your purpose and the WTA's own terms, and it is yours to answer — this Actor makes no representation about it.
Support and feedback
Open an issue on the Actor's Issues tab. Bug reports that include the run ID and the input that produced the problem are answered fastest. Feature requests are read and are the main source of what gets built next.