# Tennis Data Scraper 2026 (`devcake/tennis-data-scraper`) Actor

Collect live tennis scores and odds, schedules, point-by-point match stats, tournament history, and player performance as structured datasets.

- **URL**: https://apify.com/devcake/tennis-data-scraper.md
- **Developed by:** [devcake](https://apify.com/devcake) (community)
- **Categories:** Sports, Developer tools, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 match or list results

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Tennis Data Scraper

**Collect live tennis scores, odds, tournament schedules, match statistics, tournament history, and player performance in one place.** Review, download, schedule, and reuse the results without gathering the information page by page.

This Actor collects data for your own analysis. It does not generate match predictions, written analysis, or recommendations.

For the quickest first run, keep **Live matches and odds** selected, limit the run to 10 matches, and click **Start**. Your tennis data will appear in the **Output** tab.

### 🎾 What tennis data can you collect?

Choose one data type for each run:

| Data type | What you receive | What you provide |
|---|---|---|
| Live matches and odds | Players or teams, score, match status, tournament, surface, serve and winner state, plus available home and away odds | Nothing; optionally choose a match limit |
| Tournaments by date | Tournaments scheduled for a selected day, including category, surface, and number of scheduled matches | A calendar date |
| Match points and statistics | Point-by-point progression, sets, games, and available match statistics such as aces, serve performance, and break points | A SofaScore match page |
| Tournament seasons | Available seasons and year labels for a tournament | A SofaScore tournament page |
| Tournament details and matches | Tournament information and chronological matches for the selected season | A tournament page; season is optional |
| Player history and performance | Player profile, ranking, Elo rating, recent results, season and surface splits, event performance, and frequent head-to-head records | A SofaScore player page |

Live odds and individual statistic groups are included when they are available from the source.

### 🚀 How to use the Tennis Data Scraper

1. **Choose what to collect.** Select live matches, a daily tournament schedule, match details, tournament history, or player performance.
2. **Add the requested information.** Live matches need no link. Schedules use a date. For other choices, paste the matching SofaScore page.
3. **Choose a season when needed.** For tournament details, leave the season empty to use the newest one, or enter the season number shown by a previous Tournament seasons run.
4. **Click Start.** The results are saved in the Output tab as they become available.
5. **Review or download your data.** Use the table for a quick overview or download the complete results in your preferred format.

Only settings related to your chosen data type affect the run, so you can leave the other fields unchanged.

### 👥 Who is this Actor for?

- **Tennis analysts** studying match progression, serving, break points, surfaces, recent form, and Elo ratings
- **Sports media teams** preparing scoreboards, tournament schedules, match recaps, and player profiles
- **Researchers and students** studying historical results and tennis statistics
- **Betting-data teams** following current scores alongside available live odds
- **Product teams** creating tennis dashboards, alerts, trackers, and scheduled reports

### 💡 Popular use cases

- Monitor live tennis scores and available match odds
- Create a daily tennis tournament schedule
- Build a historical tennis match collection by tournament and season
- Replay a tennis match point by point
- Compare tennis player stats by surface, season, or event level
- Review serve statistics, aces, break points, and recent match form
- Track tennis Elo ratings and frequent head-to-head records
- Refresh a tennis dashboard automatically with scheduled runs on Apify

### 📦 What do the results look like?

The Output tab presents a clean overview with the most useful information for the selected data type. Depending on your choice, you may see player names, scores, match status, tournament, date, surface, ranking, Elo rating, scheduled match counts, and source links.

Detailed information stays grouped naturally. A match result keeps its points and statistics together, a tournament result keeps its season matches together, and a player result keeps recent results and performance splits together.

### 💰 Pricing

**From $1 per 1,000 saved results.** The price depends on the selected data type.

| Data type | Price per result (Free tier) | Price per 1,000 |
|---|---:|---:|
| Live match with available odds | $0.001 | $1.00 |
| Tournament in a daily schedule | $0.001 | $1.00 |
| Available tournament season | $0.001 | $1.00 |
| Match points and statistics | $0.001 | $1.00 |
| Player profile with available history and performance tables | $0.0064 | $6.40 |
| Tournament history for one season, including its matches | $0.0064 | $6.40 |

A complete tournament history for one season costs **$0.0064** at list price, regardless of how many matches it includes. A daily schedule with 100 tournaments costs **$0.10**. Ten live matches cost **$0.01**.

| Apify plan tier | Match or list result | Player or tournament history |
|---|---:|---:|
| Free | $0.001000 | $0.006400 |
| Bronze | $0.000920 | $0.005888 |
| Silver | $0.000830 | $0.005312 |
| Gold, Platinum, Diamond | $0.000750 | $0.004800 |

There is no start fee. You pay only for saved results, and a run that saves nothing has no result charge.

You can set a maximum charge for each run, starting at $0.02. This is a spending ceiling, not a minimum bill. At list price, a $0.02 budget permits up to 20 match/list results or three history results ($0.0192), subject to the selected data type and available data. If the limit prevents another result, the Actor keeps the results already saved and stops.

### ✨ Why run it on Apify?

Apify gives you more than a one-time download. You can schedule recurring runs, monitor progress, keep past results, set spending limits, and connect them to your existing tools and workflows. Everything is managed from one workspace, with no manual copying from match and player pages.

### ⚠️ Good to know

- Live scores and odds change throughout a match, so each run captures the latest information available at that moment.
- Odds are optional and may not be available for every match.
- Match statistics vary by event and may not include every category.
- A tournament schedule shows tournaments active on the selected date, not every individual match as a separate result.
- Tournament history covers one season per run and uses the newest available season when none is selected. Run each season separately for a multi-year history.
- Some player performance tables may be empty when the source has no coverage.
- Player history combines the selected SofaScore player with available Tennis Abstract performance records. Unusual or ambiguous player names may occasionally fail to match.
- Source pages can change, which may temporarily affect availability until the Actor is updated.

### 🛟 Tips for a successful run

- If Live matches returns no results, there may be no tennis matches in progress at that moment. Try again later.
- Make sure the page you provide matches your selection: a match link for match statistics, a tournament link for tournament data, or a player link for player performance.
- Start with a small live-match limit when trying the Actor for the first time.
- Run Tournament seasons first when you want a specific historical season.
- Increase your maximum charge if a large run stops after saving only part of the available results.

### ⚖️ Responsible use

Use this Actor only where your use complies with source terms, data rights, applicable laws, and local rules concerning sports and betting data. This Actor is not affiliated with SofaScore, Tennis Abstract, ATP, or WTA.

# Actor input Schema

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

Select the tennis data to collect. Each run processes one data type.

## `maxMatches` (type: `integer`):

Choose how many live matches to collect. Enter 0 to collect all matches currently in progress.

## `date` (type: `string`):

Choose the day whose tournaments you want to collect. This is used only for Tournaments by date.

## `target` (type: `string`):

Paste a match page for points and statistics, a tournament page for seasons or tournament details, or a player page for player history.

## `seasonId` (type: `integer`):

For Tournament details, enter the season number shown in a Tournament seasons result. Leave this empty to use the newest season.

## Actor input object example

```json
{
  "mode": "liveMatches",
  "maxMatches": 10,
  "target": "https://www.sofascore.com/tennis/tournament/atp/wimbledon/2361",
  "seasonId": 85943
}
```

# Actor output Schema

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

Live matches, tournament summaries, seasons, detailed match history, point-by-point data, or player performance records.

## `summary` (type: `string`):

Run status, selected mode, billing event, charge-limit state, timing, saved records, request metrics, and sanitized errors.

# 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 = {
    "maxMatches": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("devcake/tennis-data-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 = { "maxMatches": 10 }

# Run the Actor and wait for it to finish
run = client.actor("devcake/tennis-data-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 '{
  "maxMatches": 10
}' |
apify call devcake/tennis-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devcake/tennis-data-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/85ny6ei8gOYLP8Bfu/builds/HgBwBeZrY0pfPk3Jf/openapi.json
