# 🚀 Flashscore Tennis Scraper · 5,000 Free Matches/Month (`omkar-cloud/flashscore-tennis-scraper`) Actor

Flashscore Tennis Scraper gets you tennis matches ⚡ fast, 🎯 100% accurate and 🔍 ridiculously detailed — ATP, WTA, Challenger & ITF scores set by set, serve stats, point by point and the rankings. 💰 $1 per 1,000 matches, no start fee. Scrape your first 5,000 matches free every month 🚀

- **URL**: https://apify.com/omkar-cloud/flashscore-tennis-scraper.md
- **Developed by:** [Chetan Jain](https://apify.com/omkar-cloud) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 row scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Flashscore Tennis Scraper

Flashscore Tennis Scraper by Omkar Cloud gets you 🎯 accurate, 🔍 detailed Flashscore tennis data.

Flashscore follows every ATP, WTA, Challenger and ITF match, and every run reads it live — so you get today's order of play, live scores and results set by set, the serve stats and every point, plus the official rankings, one row per match or player, and can successfully complete your project.

**$1 per 1,000 matches.** And with Apify's free plan you get $5 of credit every month, so your first **5,000 matches each month are free**.

This is an excellent Actor made by Omkar Cloud, which is Rated Excellent — [4.7 based on 30 reviews on Trustpilot](https://www.trustpilot.com/review/omkar.cloud).

👉 [**Try Flashscore Tennis Scraper free**](https://apify.com/omkar-cloud/flashscore-tennis-scraper) — your first 5,000 matches are Free.

### What can I get

- 🎾 **Every tennis match of the day** — ATP, WTA, Challenger, ITF, Davis Cup and Billie Jean King Cup, singles and doubles, from a week ago to a week ahead, or only what is live
- 🔢 **The score set by set** — status, start and end time, both players with country, photo and link, sets won, the winner and the games of every set
- 📊 **Serve and return statistics** — aces, double faults, first-serve percentage, break points, service and return points won, for the match and every set
- 🧮 **Point by point** — every game of every set with the server, the winner, whether it was a break, and each point flagged as break, set or match point
- 🏆 **The rankings** — ATP, WTA and the Race, with rank, movement, country, points and tournaments played, as deep as you want
- 🔗 **Any match by URL** — paste flashscore.com match links or ids, old or new

### Why Flashscore Tennis Scraper

Most other tennis scrapers fail you in one of four ways:

- 🧩 **Low-detail data** — a score line, not the serve stats and the points
- 🎯 **Tournament-only input** — no day view, no live view, no rankings
- 💸 **Pay more to get the same data** — up to $15 per 1,000 rows with details
- 🪦 **Works today, breaks next month** — nobody maintains it

Flashscore Tennis Scraper is read live on every run, priced honestly with no start fee, and actively maintained.

### Input

| Field | What it does |
|---|---|
| **Days** | `today`, `yesterday`, `tomorrow`, an offset from `-7` to `7`, or a date like `2026-09-19` |
| **Live Matches Only** | Only what is playing right now, instead of the days |
| **Match Status** | Keep only scheduled, live or finished matches |
| **Tournaments** | Keep only tournaments whose name contains one of these — `ATP - Singles`, `WTA`, `Challenger`, `US Open` |
| **Matches** | Specific matches by id (`MXGwW6pA`) or flashscore.com match URL |
| **Timezone** | Timezone for start times and for what counts as "today" |
| **Include Statistics & Point by Point** | Adds serve/return statistics and every point (add-on, $2 per 1,000 in total) |
| **Rankings** | `ATP`, `WTA`, `ATP Race` or a flashscore.com ranking URL — one row per player |
| **Ranking Depth** | How many players per ranking — `100` for the top 100, up to `5000` |
| **Max Results** | Cost control for the whole run — 1,000 rows = $1 |

### Example: A Full Tennis Match

```json
{
  "source_input": "tennis -1",
  "source_kind": "day",
  "row_type": "match",
  "id": "bXhRwVq3",
  "link": "https://www.flashscore.com/match/bXhRwVq3/",
  "competition": {
    "name": "Davis Cup - World Group I (World)",
    "display_name": "ATP - SINGLES: Davis Cup - World Group I (World)",
    "category": "ATP - Singles",
    "link": "https://www.flashscore.com/tennis/atp-singles/davis-cup-world-group-i/"
  },
  "status": "finished",
  "stage": "Finished",
  "start_time": "2026-09-18T12:20:00Z",
  "end_time": "2026-09-18T14:32:44Z",
  "home": {
    "id": "YwiLpILD",
    "name": "Van De Zandschulp B.",
    "link": "https://www.flashscore.com/team/van-de-zandschulp-botic/YwiLpILD/",
    "country": { "id": 139, "name": "Netherlands" }
  },
  "away": {
    "id": "UBW76qu8",
    "name": "Rodriguez J. A.",
    "link": "https://www.flashscore.com/team/rodriguez-johan-alexander/UBW76qu8/",
    "country": { "id": 53, "name": "Colombia" }
  },
  "home_score": 2,
  "away_score": 1,
  "winner": "home",
  "periods": [
    { "name": "Set 1", "home": 4, "away": 6 },
    { "name": "Set 2", "home": 6, "away": 1 },
    { "name": "Set 3", "home": 7, "away": 5 }
  ],

  "statistics": [
    {
      "period": "Match",
      "groups": [
        {
          "category": "Service",
          "statistics": [
            { "name": "Aces", "home": "12", "away": "3", "home_value": 12, "away_value": 3 },
            { "name": "Double Faults", "home": "8", "away": "4", "home_value": 8, "away_value": 4 }
          ]
        }
      ]
    }
  ],
  "point_by_point": {
    "sets": [
      {
        "name": "Set 1",
        "games": [
          {
            "home_games": 0,
            "away_games": 1,
            "server": "away",
            "winner": "away",
            "is_break": false,
            "points": [
              { "score": "0:15", "is_break_point": false, "is_set_point": false, "is_match_point": false },
              { "score": "15:40", "is_break_point": false, "is_set_point": false, "is_match_point": false }
            ]
          }
        ]
      }
    ],
    "current_game": null
  }
}
```

*Trimmed for readability — `statistics` covers the match and every set, and `point_by_point` every game, when **Include Statistics & Point by Point** is on.*

### Example: A Ranking Row

```json
{
  "source_input": "WTA",
  "source_kind": "ranking",
  "row_type": "ranking",
  "ranking": { "id": "hfDiar3L", "name": "WTA Singles Rankings", "updated_on": "2026-09-14" },
  "rank": 1,
  "player": { "name": "Rybakina Elena" },
  "points": 9901
}
```

### Get Started with 5,000 Free Matches

1. [Open Flashscore Tennis Scraper](https://apify.com/omkar-cloud/flashscore-tennis-scraper) — the form comes pre-filled with today's matches.
2. Pick your days, tournaments or rankings and click **Start**.
3. Download the results as JSON, CSV or Excel 😎.

### Pricing

**$1 per 1,000 matches. No start fee.** You pay for the rows you get, nothing else.

| What you scrape | Price |
|---|---|
| Match row — players, tournament, status, set scores | **$0.001** each — $1 per 1,000 |
| Same row with statistics and point by point | **$0.002** each — $2 per 1,000 |
| Ranking row — one ranked player | **$0.001** each — $1 per 1,000 |
| Actor start | **$0** — no start fee |

Apify's free plan gives you $5 of credit every month, so **5,000 matches are free every month** (2,500 with statistics and point by point). A match reached twice in one run is scraped and billed only once, and a match that has not started is never charged the add-on.

### Run It from Code

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('omkar-cloud/flashscore-tennis-scraper').call({
    days: ['yesterday'],
    competitions: ['ATP - Singles', 'WTA - Singles'],
    includeDetails: true,              // serve stats + point by point
    maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("omkar-cloud/flashscore-tennis-scraper").call(run_input={
    "rankings": ["ATP", "WTA"],
    "rankingDepth": 500,               # top 500 of each
    "maxResults": 1000,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["ranking"]["name"], item["rank"], item["player"]["name"], item["points"])
```

### FAQ

**Which matches can I scrape?**
Every match Flashscore lists — ATP, WTA, Challenger, ITF, Davis Cup and Billie Jean King Cup, singles and doubles.

**How far back can I go?**
Days cover a week back to a week ahead. For any older match, paste its flashscore.com URL or id into **Matches**.

**What does a run cost?**
$1 per 1,000 matches or ranked players, $2 per 1,000 matches with statistics and point by point, and no start fee. Set **Max Results** to cap any run.

**How fresh is the data?**
It is read live from Flashscore on every run, so live scores are exactly what the site shows at that moment.

**Do I need proxies or a Flashscore account?**
No. The Actor handles everything.

### Popular Actors by Omkar Cloud

- [**Flashscore Scraper**](https://apify.com/omkar-cloud/flashscore-scraper) — live scores, results & match stats for 37 sports
- [**Flashscore Odds Scraper**](https://apify.com/omkar-cloud/flashscore-odds-scraper) — opening & current odds from 20+ bookmakers
- [**Sofascore Scraper**](https://apify.com/omkar-cloud/sofascore-scraper) — live scores, fixtures & results for 26 sports
- [**Sofascore Players Scraper**](https://apify.com/omkar-cloud/sofascore-players-scraper) — player profiles with 114 season statistics
- [**IMDb Scraper**](https://apify.com/omkar-cloud/imdb-scraper) — titles, ratings, cast & box office

### 💬 Have Questions? We Have Answers.

You're a developer — we know how hard completing a project can be. So we offer full support: just message us and we'll reply ✅ with a solution within 1 working day.

[![Message Us on WhatsApp](https://raw.githubusercontent.com/omkarcloud/assets/master/images/whatsapp-us.png)](https://api.whatsapp.com/send?phone=918178804274\&text=I%20need%20help%20with%20using%20the%20Flashscore%20Tennis%20Scraper%20Actor.)

[![Ask Us on Email](https://raw.githubusercontent.com/omkarcloud/assets/master/images/ask-on-email.png)](mailto:happy.to.help@omkar.cloud?subject=Help%20with%20Flashscore%20Tennis%20Scraper%20Actor\&body=I%20need%20help%20with%20using%20the%20Flashscore%20Tennis%20Scraper%20Actor.)

You are important to us — just message us and we will solve your problem ✅ within 1 working day. 🩷 Pinky Promise 🤙!

# Actor input Schema

## `days` (type: `array`):

Days to scrape: `today`, `yesterday`, `tomorrow`, an offset from today between `-7` and `7`, or a date like `2026-09-19` inside that window.

## `liveOnly` (type: `boolean`):

Scrape only the matches playing right now, with the live set and game score, instead of the days above.

## `status` (type: `string`):

Keep only matches in one state. Empty = every match of the day.

## `competitions` (type: `array`):

Keep only tournaments whose name contains one of these, like `ATP - Singles`, `WTA`, `Challenger`, `US Open` or `Davis Cup` — or paste the flashscore.com tournament URL. Empty = every tournament.

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

Specific matches, by Flashscore match id like `MXGwW6pA` or a pasted flashscore.com match URL. Works for any match, old or new.

## `timezone` (type: `string`):

Timezone for start times and for what counts as "today" — an IANA name like `America/New_York` or an hour offset like `-4`. Empty = UTC.

## `includeDetails` (type: `boolean`):

Adds `statistics` (aces, double faults, serve percentages, break points, return and total points won — for the match and every set) and `point_by_point` (every game of every set with the server, the winner, whether it was a break and each point with break, set and match point flags). A match that has not started is not charged the add-on.

## `rankings` (type: `array`):

Ranking tables to scrape: `ATP`, `WTA`, `ATP Race`, or a pasted flashscore.com ranking URL.

## `rankingDepth` (type: `integer`):

How many players to read from each ranking — `100` for the top 100, up to `5000`.

## `maxResults` (type: `integer`):

Maximum number of rows for the whole run — matches and ranked players together. Use this to control your cost (1,000 rows = $1, or $2 per 1,000 matches with statistics & point by point).

## Actor input object example

```json
{
  "days": [
    "today"
  ],
  "liveOnly": false,
  "status": "",
  "competitions": [],
  "matches": [],
  "includeDetails": false,
  "rankings": [],
  "rankingDepth": 100,
  "maxResults": 100
}
```

# 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 = {
    "days": [
        "today"
    ],
    "competitions": [],
    "matches": [],
    "rankings": [],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("omkar-cloud/flashscore-tennis-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 = {
    "days": ["today"],
    "competitions": [],
    "matches": [],
    "rankings": [],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("omkar-cloud/flashscore-tennis-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 '{
  "days": [
    "today"
  ],
  "competitions": [],
  "matches": [],
  "rankings": [],
  "maxResults": 100
}' |
apify call omkar-cloud/flashscore-tennis-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,omkar-cloud/flashscore-tennis-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/ORI9NHmyYC0j8e5jw/builds/h3ldVYbNpYpAgf1Dv/openapi.json
