# Tennis Stats Scraper: ATP and WTA Matches, Players and Rankings

> Tennis stats scraper for ATP and WTA: match results, fixtures, set scores, seeds, player career stats and rankings from public ESPN data. No login.

URL: https://cliqtomedia.com/actors/tennis-stats-scraper/

Category: Finance, markets & sports · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/tennis-stats-scraper?fpr=cliqto

Get ATP and WTA match results, upcoming matches, player profiles and rankings. Data comes from public ESPN JSON. Pick one of five modes per run.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `rankings` in Data to get. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Get **ATP and WTA tennis matches, set scores, seeds, player career stats, and rankings** from public ESPN JSON data. Choose one of five modes in one Actor, singles and doubles. No login or API key is needed.





## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.002 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Data row | $0.007 (from $0.0055 on paid Apify plans) | Charged for each saved match, player profile or ranking row. RUN_SUMMARY is free. |

- One row: about $0.009.
- 1,000 rows: about $7.00.
- Every day 100 rows, for 30 days: about $21.06 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/tennis-stats-scraper?fpr=cliqto

## Questions

### Does it include doubles?

Yes. Doubles rows show the team and both partners.

### Can I get old results?

You can pick dates, up to 7 per run. ESPN may not have every old result.

### Are the player IDs the same as on other sites?

No. These are ESPN IDs.

### Do I need an API key?

No. No login or key is needed.

## Data fields

- `type` (string): The data kind.
- `tour` (string): ATP or WTA.
- `matchId` (string): ESPN competition ID in match rows.
- `tournamentId` (string): ESPN tournament ID.
- `tournament` (string): Name of event.
- `matchType` (string): ESPN draw type, such as Men's Singles or Women's Doubles.
- `round` (string): Event round name.
- `startTime` (string): UTC match start ISO timestamp; null while ESPN has no confirmed time.
- `status` (string): ESPN competition status, such as Final.
- `player1Name` (string): First player name, for flat tables.
- `player2Name` (string): Second player name, for flat tables.
- `player1Seed` (number): Tournament seed of player 1 from ESPN draw data or the result note; null for unseeded players.
- `player2Seed` (number): Tournament seed of player 2 from ESPN draw data or the result note; null for unseeded players.
- `scoreText` (string): Set score text, in player1:player2 order.
- `winnerName` (string): Winner of a completed match, if present.
- `resultNote` (string): ESPN result line with seeds and countries, such as (9) Player Two (AUS) bt ... 6-3 6-4.
- `players` (array): Two competitors: ID, name, country, seed, winner flag and members (two athletes for doubles).
- `score` (object): Game scores, tiebreaks and sets.
- `playerId` (string): ESPN athlete ID.
- `name` (string): Player display name.
- `country` (string): Country code in ranking rows.
- `age` (number): Player age, if provided by ESPN.
- `dateOfBirth` (string): Player birthday YYYY-MM-DD.
- `birthPlace` (string): Birthplace text from the ESPN athlete profile.
- `heightCm` (number): Centimeters converted from source inches.
- `weightKg` (number): Kilograms converted from source pounds.
- `plays` (string): Playing hand, such as Right or Left.
- `turnedPro` (number): Year the player turned professional.
- `careerSinglesWon` (number): Career singles match wins (ESPN career statistics).
- `careerSinglesLost` (number): Career singles match losses.
- `singlesTitles` (number): Career singles titles.
- `doublesTitles` (number): Career doubles titles.
- `careerPrizeMoneyUsd` (number): Career prize money in US dollars.
- `rank` (number): Current ranking place.
- `previousRank` (number): Prior ranking position.
- `points` (number): Ranking points.
- `rankingUpdatedAt` (string): Ranking update date.
- `source` (string): Provider: ESPN public data.
- `sourceUrl` (string): Origin endpoint without credentials.
- `fetchedAt` (string): ISO UTC fetch time.

## Input settings

- `mode` (string): results: completed matches; fixtures: upcoming/in-progress matches; match: one competition; player: profiles by ESPN IDs; rankings: current top-100 list.
- `tour` (string): ATP or WTA. Single tour per run.
- `dateFrom` (string): YYYY-MM-DD; blank uses yesterday in UTC. Applies to fixtures, results and match modes.
- `dateTo` (string): YYYY-MM-DD, inclusive. Blank equals start date; maximum 7 days. Applies to fixtures, results and match.
- `tournaments` (array): Case-insensitive tournament name fragment or exact ESPN tournament ID (e.g. Shanghai or 315-2026). IDs may contain a hyphen; matches any listed item.
- `players` (array): In match modes, filter by a player name (part) or ESPN ID. In player mode, enter 1–10 numeric ESPN player IDs found in rankings/matches.
- `matchId` (string): Required for match mode; numeric ESPN competition ID from an earlier result (not SofaScore ID). Use dateFrom/dateTo to select its date.
- `maxItems` (integer): Maximum matches, ranking rows or player profiles returned. Real capacity validation may lower this limit.

## Step by step on Apify

1. Open the Input tab. The form starts with `mode=rankings`, `tour=ATP`, `maxItems=20`. Click Start to get the top 20 of the current ATP ranking.
2. For match results, choose Finished match results. Leave both date fields empty to get yesterday's UTC date. This is also the API default when `mode` is not sent.
3. Open the run's Dataset. Use the matches, players or rankings view for a flat table.
4. For full set scores and doubles team members, export the original JSON.

## Use cases

| Goal | Recommended input | Main output |
|---|---|---|
| Daily ATP match roundup | `results` + chosen date | Tournament, players, winners, set scores |
| Upcoming WTA matches | `fixtures` + chosen date | Start times and source match status |
| Enrich a sports article | `match` + `matchId` | One match with sets and player IDs |
| Profile a player | `player` + ID in `players` | Bio, career win-loss, titles, prize money |
| Weekly ranking change | `rankings` | Current/previous rank and points |

## Tips

- Leave the dates empty to get yesterday's results in UTC.
- Copy player IDs from a ranking run to look up profiles.
- Run twice for both tours. One run reads ATP or WTA.

## Limits

The status is `complete` when rows were delivered normally, including a run that stopped at `maxItems` (raise it to get more rows), `not_found` for a valid input with no matching records, and `partial` / `CHARGE_LIMIT` when a paid limit stops new rows. A source failure can also leave previously saved rows; in that case the run fails, and its `RUN_SUMMARY` shows `partial` / `SOURCE_ERROR`. Invalid input fails before contacting ESPN.

- ESPN may have incomplete or delayed fixtures and scores. Historical coverage is not guaranteed.
- ESPN does not publish per-match serve statistics (aces, double faults) or court surface, so this Actor does not return them. Seeds come from ESPN's draw data for scheduled matches and from the result line for finished ones. `startTime` is null while ESPN has not confirmed the order of play. A not-yet-known opponent is named `TBD` with a null ID.
- Scores and standings can be updated by ESPN after your run. `rankingUpdatedAt` is the date ESPN last updated the ranking list (usually weekly), not the time of your run.
- Ranking rows give `country` as a three-letter code (`ITA`). In match rows, `players[].country` is the country name from ESPN's flag (`Italy`, sometimes `USA`).
- An ESPN player ID is different from a SofaScore or ATP site ID. IDs from a different source may give zero matches.
- Data is provided without a license from ESPN. ESPN/Disney terms restrict automated collection and commercial reuse. Confirm you have the right to use and distribute the data for your purpose.
- The Actor has no betting tips, odds, point-by-point live updates, or guarantee of complete coverage.

## Sample result

```json
{
  "type": "match",
  "tour": "ATP",
  "matchId": "184950",
  "tournament": "Rolex Shanghai Masters",
  "matchType": "Men's Singles",
  "round": "Round 4",
  "player1Name": "Player One",
  "player2Name": "Player Two",
  "player1Seed": 26,
  "player2Seed": 9,
  "scoreText": "3:6 4:6",
  "winnerName": "Player Two",
  "resultNote": "(9) Player Two (AUS) bt (26) Player One (RUS) 6-3 6-4",
  "source": "ESPN public JSON",
  "sourceUrl": "https://site.api.espn.com/apis/site/v2/sports/tennis/atp/scoreboard?dates=20261013"
}
```

## Use it from code

Actor ID: `cliqtomedia/tennis-stats-scraper`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/tennis-stats-scraper").call(run_input={
    "mode": "rankings",
    "tour": "ATP"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~tennis-stats-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode": "rankings", "tour": "ATP"}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/tennis-stats-scraper")
result = tool.invoke({"run_input": {"mode": "rankings", "tour": "ATP"}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Similar tools

- [SEC Form D Filing Monitor](https://cliqtomedia.com/actors/sec-edgar-form-d-funding-monitor/)
- [Crypto Prices & OHLC History Export - No Login](https://cliqtomedia.com/actors/crypto-market-data/)
- [Historical Exchange Rates & Currency Converter](https://cliqtomedia.com/actors/historical-fx-rates-converter/)
- [Polymarket & Kalshi Prediction Market Data, No Login](https://cliqtomedia.com/actors/prediction-markets-data/)
