# Tennis Live Scores Scraper: ATP, WTA, Sets & Stats (`getascraper/tennis-live-scores-scraper`) Actor

Scrape live tennis scores, fixtures, rankings and match stats across ATP, WTA, Challenger and ITF. Set-by-set scores, surface, seeds, serve stats and point-by-point server data. Works with Google Sheets, Zapier, or as an MCP tool for AI agents. No login needed. From $0.79 per 1,000 results.

- **URL**: https://apify.com/getascraper/tennis-live-scores-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.59 / 1,000 tennis matches

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Tennis Live Scores Scraper: ATP, WTA, Sets & Stats

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#FCF6F3;border:1px solid #F4DDD3;border-top:4px solid #C2410C;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Every set, every surface, every serve: tennis data ready for your spreadsheet in seconds.</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Live scores, fixtures, rankings and point-by-point detail across ATP, WTA, Challenger and ITF. No login, no API key.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F4DDD3;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#9A3412">🎾 All four tours</span><br>
<span style="font-size:12px;color:#57534E">ATP, WTA, Challenger and ITF match data in one Actor.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F4DDD3;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#9A3412">🏟️ Full match context</span><br>
<span style="font-size:12px;color:#57534E">Surface, tour level, round, rankings and seeds on every row.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F4DDD3;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#9A3412">📊 Deep serve stats</span><br>
<span style="font-size:12px;color:#57534E">Aces, double faults, break points and serve percentages.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F4DDD3;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#9A3412">🎯 Point-by-point detail</span><br>
<span style="font-size:12px;color:#57534E">See who served every point of every game.</span>
</td>
</tr>
</table>

This Actor pulls live tennis scores, fixtures, results, rankings and player search from a single, reliable source, no ATP or WTA login required. Every match row carries the surface, the tour level, the round name, both players' rankings and seeds, and a full set-by-set score with tiebreak sub-scores. Switch on match detail mode and you also get serve statistics and, if you want it, a point-by-point breakdown of who served every single point.

### 🎾 What does it do?

The Actor runs in five modes, picked with a single input field:

- **Live**: every in-play ATP, WTA, Challenger and ITF match right now, refreshed on demand.
- **Schedule**: fixtures and results across a date range, up to 31 days in one run.
- **Match detail**: serve statistics and an optional point-by-point breakdown for specific matches.
- **Rankings**: the current ATP or WTA singles ranking list.
- **Search**: look up a player by name and get their ID, ranking and profile link.

Every match record includes the surface (clay, hard or grass), the tour level, the round name, both players' current rankings and tournament seeds, and set-by-set scores with tiebreak points where they happened. Nothing is guessed or filled in: if a field is not yet known (an unranked qualifier, a set that has not started), it is left out of the record instead of being padded with a placeholder.

### 👤 Who is it for?

- **I am a sports betting analyst** tracking live scores, set-by-set momentum and serve percentages across ATP and WTA matches to feed my in-play odds models.
- **I am building an AI agent** that needs live tennis scores and rankings as a callable tool, through the Apify MCP server, without maintaining my own data pipeline.
- **I am a fantasy tennis app builder** pulling player rankings, seeds and daily match schedules to keep my scoring engine current.
- **I am a tennis coach** scouting an upcoming opponent's serve statistics and point-by-point patterns before a match.
- **I am a sports data journalist** compiling tournament results and rankings across the ATP, WTA, Challenger and ITF tours for a weekly stats column.

### 🚀 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#FCF6F3;border:1px solid #F4DDD3;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C2410C;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Pick a mode</span><br>
<span style="font-size:12px;color:#57534E">Choose live scores, a date-range schedule, match detail, rankings or player search.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FCF6F3;border:1px solid #F4DDD3;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C2410C;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run the Actor</span><br>
<span style="font-size:12px;color:#57534E">No login or API key needed. Results save straight to your dataset as they come in.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FCF6F3;border:1px solid #F4DDD3;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C2410C;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Export your data</span><br>
<span style="font-size:12px;color:#57534E">Download as JSON, CSV or Excel, or connect it to your own pipeline.</span>
</td>
</tr>
</table>

To fetch match detail, first run Live or Schedule mode and copy the numeric `id` from the matches you want, then switch to Match detail mode and paste those IDs in.

### 📥 Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `mode` | enum | No | What to scrape. `live` returns every in-play match right now. `schedule` returns fixtures and results across a date range. `matchDetail` returns deep stats and point-by-point for specific matches. `rankings` returns the current ATP or WTA singles list. `search` looks up a player by name. Defaults to `live`. |
| `tourLevel` | enum | No | Keep only matches from one tour: all tours, ATP, WTA, Challenger or ITF. Applies to Live and Schedule modes. Defaults to all tours. |
| `statusFilter` | enum | No | Keep only matches with a given status: all, live, scheduled or finished. Applies to Live and Schedule modes. Defaults to all. |
| `dateFrom` | string | No | First day to fetch fixtures and results for, in Schedule mode. Leave empty to use today. |
| `dateTo` | string | No | Last day to fetch fixtures and results for, inclusive, in Schedule mode. Leave empty to match `dateFrom`. The range is capped at 31 days. |
| `matches` | array of strings | No | Match IDs or full match URLs to fetch deep detail for in Match detail mode. Copy the numeric `id` field from a Live or Schedule mode result. |
| `includeStatistics` | boolean | No | Attach serve statistics: aces, double faults, first and second serve percentage, break points and winners. Not available for every match. Defaults to true. |
| `includePointByPoint` | boolean | No | Attach a full set, game and point breakdown, including tiebreak points and who served each game. Costs one extra request per match. Defaults to false. |
| `rankingTour` | enum | No | Which singles ranking list to fetch in Rankings mode: ATP or WTA. Defaults to ATP. |
| `query` | string | No | Name of a player to look up in Search mode. |
| `maxItems` | integer | No | Maximum number of records to push to the dataset. Use 0 for no limit. You are billed per record returned. Defaults to 100. |
| `proxyConfiguration` | object | No | Proxy settings. Residential proxy is required and set as the default; switching to datacenter typically returns zero results. |

### 📤 Data table

Output fields vary slightly by mode. A `rowType` field on every record tells you which kind of row it is: `match`, `matchDetail`, `ranking` or `searchResult`. Fields that do not apply to a given row, or are not yet known (an unranked player, a set that has not started), are left out entirely.

| Field | Type | Description |
| --- | --- | --- |
| `rowType` | string | The kind of record: `match`, `matchDetail`, `ranking` or `searchResult`. |
| `id` | integer | Unique match or event ID. Reuse this in `matchDetail` mode to fetch deeper stats. |
| `matchName` | string | The two players' names, e.g. "C. Alcaraz vs N. Djokovic". |
| `tournament` | string | Tournament name. |
| `tourLevel` | string | Tour category: ATP, WTA, Challenger or ITF. |
| `surface` | string | Court surface, e.g. "Red clay" or "Hardcourt outdoor". |
| `country` | string | Country the tournament is held in. |
| `season` | string | Season or tournament year. |
| `round` | integer | Numeric round index. |
| `roundName` | string | Round name, e.g. "Semifinals" or "Round of 32". |
| `statusType` | string | Match status code: notstarted, inprogress or finished. |
| `statusDescription` | string | Human-readable status, e.g. "2nd Set" or "Finished". |
| `startTimestamp` | integer | Match start time as a Unix timestamp. |
| `startTime` | string | Match start time in ISO format. |
| `homeTeam` / `awayTeam` | string | Player or doubles team name. |
| `homeTeamId` / `awayTeamId` | integer | Player ID, reusable in Search mode results. |
| `homeCountry` / `awayCountry` | string | Player's country. |
| `homeRanking` / `awayRanking` | integer | Player's current ranking at match time, when available. |
| `homeSeed` / `awaySeed` | string | Tournament seed, e.g. "3" or "Q" for qualifier. |
| `homeSets` / `awaySets` | integer | Sets won by each player. |
| `sets` | array | Set-by-set score, with tiebreak sub-scores included for any set that went to a tiebreak. |
| `homeGamePoint` / `awayGamePoint` | string | Live point score within the current game (0, 15, 30, 40, A), only present while a game is in progress. |
| `winnerCode` | integer | Which player won: 1 for home, 2 for away. |
| `matchUrl` | string | Direct link back to the match page. |
| `statistics` | array | Serve and rally statistics: aces, double faults, first and second serve percentage, break points, winners and more. Match detail mode only. |
| `pointByPoint` | array | Full set, game and point breakdown, including who served each game and every point score. Match detail mode with point-by-point enabled only. |
| `tour` | string | ATP or WTA, on ranking rows. |
| `rank` / `previousRank` | integer | Current and prior ranking position, on ranking rows. |
| `points` | integer | Ranking points, on ranking rows. |
| `playerName` | string | Player name, on ranking rows. |
| `playerId` | integer | Player ID, on ranking and search rows. |
| `playerUrl` | string | Link to the player's profile page. |
| `entityType` | string | Whether a search result is a player or a team, on search rows. |
| `name` | string | Matched name, on search rows. |
| `ranking` | integer | Current ranking, on search rows. |

#### Example output (Live mode)

```json
{
  "rowType": "match",
  "id": 12836554,
  "matchName": "C. Alcaraz vs N. Djokovic",
  "tournament": "Wimbledon",
  "tourLevel": "ATP",
  "surface": "Grass",
  "country": "United Kingdom",
  "season": "2026",
  "round": 7,
  "roundName": "Final",
  "statusType": "inprogress",
  "statusDescription": "3rd Set",
  "startTimestamp": 1721030400,
  "startTime": "2026-07-15T14:00:00Z",
  "homeTeam": "C. Alcaraz",
  "homeTeamId": 231205,
  "homeCountry": "Spain",
  "homeRanking": 2,
  "homeSeed": "2",
  "awayTeam": "N. Djokovic",
  "awayTeamId": 39289,
  "awayCountry": "Serbia",
  "awayRanking": 5,
  "awaySeed": "5",
  "homeSets": 1,
  "awaySets": 1,
  "sets": [
    { "set": 1, "homeGames": 6, "awayGames": 4 },
    { "set": 2, "homeGames": 6, "awayGames": 7, "homeTiebreak": 5, "awayTiebreak": 7 }
  ],
  "homeGamePoint": "40",
  "awayGamePoint": "30",
  "matchUrl": "https://www.sofascore.com/tennis/match/alcaraz-djokovic/12836554"
}
```

### 💰 Pricing

Pricing is pay per result and billed per row saved to your dataset. Empty runs cost nothing, and there are no subscriptions or fixed monthly fees. Turning on point-by-point detail adds one extra request per match, since it is a separate, deeper lookup.

### ⭐ Enjoying Tennis Live Scores Scraper?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#FCF6F3;border:1px solid #F4DDD3;border-left:5px solid #C2410C;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">This Actor turns hours of manual score tracking into a single scheduled run.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other tennis data buyers find this Actor. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#C2410C;border:1px solid #F4DDD3;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/tennis-live-scores-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### 💡 Tips

- Use Schedule mode with a wide date range to build a historical results archive, then keep it current with a short daily Live mode run.
- Point-by-point detail is the most granular data this Actor offers. Turn it on only for the specific matches you need, since it costs one extra request per match.
- Combine Rankings mode with Search mode to resolve a player's name to their ID before pulling their match history.

### ❓ FAQ

##### Does it get blocked?

No. The Actor routes requests through premium residential proxy, which keeps live and schedule data flowing reliably even during busy tournament days.

##### Does it need a login or API key?

No. Every mode, from live scores to rankings and player search, runs without an account, password or API key of any kind.

##### How fresh is the live data?

Live mode reflects match state at the moment the Actor runs, including the current game score while a match is in progress. Run it on a schedule for a near real-time feed.

##### Which tours and tournaments are covered?

ATP, WTA, Challenger and ITF tournaments worldwide, from Grand Slams down to lower-tier events. Filter by tour level in Live and Schedule modes to keep only what you need.

##### Can an AI agent call this directly?

Yes. This Actor is callable as a tool through the Apify MCP server, so an AI agent can pull live tennis scores or rankings mid-conversation without you building a custom integration.

### 🔗 Other actors

- [SofaScore Scraper: Live scores, stats and fixtures](https://apify.com/getascraper/sofascore-live-events-scraper) ↗ - the same live-score engine covering 13 sports, tennis included, in one generalist Actor.
- [Cricket Data API: ESPNcricinfo StatsGuru Export](https://apify.com/getascraper/espncricinfo-statsguru-scraper) ↗ - exports cricket statistics queries from ESPNcricinfo StatsGuru.
- [Baseball Savant Scraper: Scheduled Statcast Data](https://apify.com/getascraper/baseball-savant-scraper) ↗ - pulls Statcast pitch and player data from Baseball Savant on a schedule.
- [College Football Recruiting Rankings Scraper: Cross-Source Ratings & NIL](https://apify.com/getascraper/college-recruiting-rankings-scraper) ↗ - combines recruiting ratings and NIL data across multiple sources.
- [ESPN News Monitor: Keyword Alerts](https://apify.com/getascraper/espn-news-monitor) ↗ - watches ESPN for keyword matches and sends alerts on new articles.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. 'Live' returns all in-play matches right now. 'Schedule' returns fixtures and results across a date range. 'Match detail' returns deep stats and an optional point-by-point breakdown for specific matches. 'Rankings' returns the current ATP or WTA singles ranking list. 'Search' looks up a player by name.

## `tourLevel` (type: `string`):

Only keep matches from this tour. Applies to Live and Schedule modes.

## `statusFilter` (type: `string`):

Only keep matches with this status. Applies to Live and Schedule modes.

## `dateFrom` (type: `string`):

First day to fetch fixtures and results for. Leave empty to use today (UTC). Only used in Schedule mode.

## `dateTo` (type: `string`):

Last day to fetch fixtures and results for (inclusive). Leave empty to use the same day as 'Date from'. Only used in Schedule mode.

## `matches` (type: `array`):

SofaScore match IDs (e.g. 12836554) or full match URLs to fetch deep detail for. Copy the numeric 'id' from a Live or Schedule mode run. Only used in Match detail mode.

## `includeStatistics` (type: `boolean`):

Attach serve stats: aces, double faults, first/second serve percentage, break points, winners and more. Not available for every match.

## `includePointByPoint` (type: `boolean`):

Attach a full set/game/point breakdown, including tiebreak points and who served each game. Costs one extra request per match.

## `rankingTour` (type: `string`):

Which singles ranking list to fetch. Only used in Rankings mode.

## `query` (type: `string`):

Name of a player to look up. Only used in Search mode.

## `maxItems` (type: `integer`):

Maximum number of records to push to the dataset. Use 0 for no limit. You are billed per record returned.

## `proxyConfiguration` (type: `object`):

SofaScore blocks datacenter IPs at its edge, so Residential proxy is required and set as the default. Switching to datacenter typically returns zero results.

## Actor input object example

```json
{
  "mode": "live",
  "tourLevel": "all",
  "statusFilter": "all",
  "dateFrom": "2026-08-25",
  "dateTo": "2026-08-31",
  "matches": [
    "12836554"
  ],
  "includeStatistics": true,
  "includePointByPoint": false,
  "rankingTour": "atp",
  "query": "Carlos Alcaraz",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/tennis-live-scores-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    } }

# Run the Actor and wait for it to finish
run = client.actor("getascraper/tennis-live-scores-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call getascraper/tennis-live-scores-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/tennis-live-scores-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/IyJVsCHMe4dscd70W/builds/iXKwo7CEcZy3lJXzD/openapi.json
