# Flashscore Scraper - Tennis, Football Results and Fixtures (`kamerozkan/flashscore-scraper`) Actor

Flashscore scraper for match results and fixtures of any sport and any season: tennis, football, basketball, hockey and more. Scores per set, half or quarter, tiebreaks, round, players or teams, countries, start time, status (retired, walkover). Past seasons too. No login, no browser.

- **URL**: https://apify.com/kamerozkan/flashscore-scraper.md
- **Developed by:** [Kamer Ozkan](https://apify.com/kamerozkan) (community)
- **Categories:** Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 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?

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 Scraper - Tennis, Football Results and Fixtures

A **Flashscore scraper** for match results and fixtures of any sport, any tournament and **any season**: paste a Flashscore tournament URL (Wimbledon, the US Open, the Premier League, the NBA, LaLiga...) and get every match with players or teams, round, start time, final score, **scores per set, half or quarter with tiebreak points**, winner and status (finished, retired, walkover, after extra time, after penalties, scheduled). Past seasons work too. No login, no API key, no browser.

### What does Flashscore Scraper do?

It reads the public Flashscore tournament pages and the same "Show more matches" data the website loads, so one run returns the whole list, not only the first block: all 239 singles matches of Wimbledon 2024 including qualifying, or the full fixture list of a football league season. Give it the current season (`/tennis/atp-singles/wimbledon/results/`), a past season (`/tennis/atp-singles/wimbledon-2024/results/`) or a plain tournament URL plus a list of **Past seasons** to build a multi-season history in one run.

**Flashscore tennis**: ATP, WTA, Challenger and ITF tournaments with set scores, tiebreak points, round, surface, player country, retired and walkover flags.
**Flashscore football**: every league and cup with full-time score, first-half and second-half score, round, home and away team.
**Flashscore basketball** (tested on the NBA) comes with quarter scores; other Flashscore sports use the same page format with their own periods.

### Who is it for?

- **Bettors, tipsters and betting model builders**: historical results with set, half and quarter scores across seasons to train and backtest models.
- **Sports data analysts and journalists**: tournament draws, rounds and results for any sport and year in one table.
- **Fantasy sports and sports apps**: fixtures with start times for the coming rounds, refreshed on a schedule.
- **Tennis analysts**: tiebreaks, retirements, walkovers and qualifying matches that many other tools leave out.

### What data can you get?

| Field | Example |
|---|---|
| `matchId`, `url` | Sf0bExdB, https://www.flashscore.com/match/Sf0bExdB/ |
| `sport`, `category`, `tournament` | tennis, ATP - SINGLES, Wimbledon (United Kingdom), grass |
| `country`, `surface` | United Kingdom, grass (tennis); England (football) |
| `season`, `stage`, `round` | 2024, Main (or Qualification), Final |
| `startTime` | 2024-07-14T13:10:00Z (UTC) |
| `status`, `statusCode` | finished, retired, walkover, after extra time or overtime, after penalties, scheduled, postponed, cancelled |
| `home`, `away` | {"name": "Alcaraz C.", "id": "UkhgIFEq", "slug": "alcaraz-garfia-carlos", "country": "Spain", "url": "https://www.flashscore.com/player/alcaraz-garfia-carlos/UkhgIFEq/"} |
| `homeScore`, `awayScore` | 3, 0 (sets in tennis, goals in football, points in basketball) |
| `homeScoreFullTime`, `awayScoreFullTime` | regular-time score as Flashscore lists it |
| `winner` | home, away, draw or null (not played yet) |
| `periods` | \[{"period": 1, "home": 6, "away": 2}, {"period": 3, "home": 7, "away": 6, "tiebreakHome": 7, "tiebreakAway": 4}] |
| `listType`, `sourceUrl`, `scrapedAt` | results or fixtures, the page the row came from, the time of the run |

`periods` holds sets in tennis, halves in football (first half, second half) and quarters in basketball (a fifth entry is overtime). Tiebreak points appear on sets that went to a tiebreak.

Match statistics (aces, possession, shots) and betting odds are not part of the tournament lists and are not collected.

### How much does it cost?

You pay per match: **$1.00 per 1,000 matches** ($0.001 per match) on the Free plan, with Store discounts on paid Apify plans: Bronze $0.90, Silver $0.85, Gold and above $0.80 per 1,000 matches. Platform usage is included.

Worked examples:

- All 239 singles matches of Wimbledon 2024 (main draw and qualifying): 239 x $0.001 = **$0.24**.
- A full football league season of 380 matches: 380 x $0.001 = **$0.38**.
- Five seasons of one Grand Slam (about 1,200 matches): **$1.20**.

Matches outside your **Matches from** and **Matches until** dates and pages that cannot be read (listed in the OUTPUT record) are never charged. Set **Max matches in total** or a maximum cost per run to cap spending.

### How to use it

1. Click **Try for free**.
2. Open the tournament on flashscore.com, click **Results** or **Fixtures**, and paste the URL into **Flashscore tournament URLs**. For a past season pick it in the Flashscore season menu, or write the season in **Past seasons** (2024, 2023 for tennis; 2024-2025 for leagues).
3. Optional: set **Matches from** and **Matches until** dates and **Max matches per URL**.
4. Click **Start** and download the table as CSV, Excel, JSON or through the API. The **Scores by set, half or quarter** view shows the period scores.

### Input example

```json
{
  "startUrls": [
    "https://www.flashscore.com/tennis/atp-singles/wimbledon/",
    "https://www.flashscore.com/football/england/premier-league/fixtures/"
  ],
  "include": "results",
  "seasons": ["2025", "2024"],
  "maxMatchesPerUrl": 500,
  "maxItems": 2000
}
```

### Output example

An unedited row from a live run:

```json
{
  "matchId": "M3WOyNpQ",
  "url": "https://www.flashscore.com/match/M3WOyNpQ/",
  "sport": "tennis",
  "category": "WTA - SINGLES",
  "tournament": "US Open (USA), hard",
  "country": "USA",
  "surface": "hard",
  "season": "2025",
  "stage": "Main",
  "round": "Final",
  "startTime": "2025-09-06T20:20:00Z",
  "status": "finished",
  "statusCode": 3,
  "home": {"name": "Sabalenka A.", "id": "vyhksgUB", "slug": "sabalenka-aryna", "country": "World", "url": "https://www.flashscore.com/player/sabalenka-aryna/vyhksgUB/"},
  "away": {"name": "Anisimova A.", "id": "nwkutKbi", "slug": "anisimova-amanda", "country": "USA", "url": "https://www.flashscore.com/player/anisimova-amanda/nwkutKbi/"},
  "homeScore": 2,
  "awayScore": 0,
  "homeScoreFullTime": 2,
  "awayScoreFullTime": 0,
  "winner": "home",
  "periods": [
    {"period": 1, "home": 6, "away": 3},
    {"period": 2, "home": 7, "away": 6, "tiebreakHome": 7, "tiebreakAway": 3}
  ],
  "listType": "results",
  "sourceUrl": "https://www.flashscore.com/tennis/wta-singles/us-open-2025/results/",
  "scrapedAt": "2026-10-21T08:19:25.691056Z"
}
```

A football row from the Premier League:

```json
{
  "sport": "football",
  "category": "ENGLAND",
  "tournament": "Premier League",
  "country": "England",
  "season": "2026/2027",
  "round": "Round 7",
  "startTime": "2026-10-19T19:00:00Z",
  "home": {"name": "Tottenham", "id": "UDg08Ohm", "slug": "tottenham", "country": null, "url": "https://www.flashscore.com/team/tottenham/UDg08Ohm/"},
  "away": {"name": "Coventry", "id": "GOvB22xg", "slug": "coventry", "country": null, "url": "https://www.flashscore.com/team/coventry/GOvB22xg/"},
  "homeScore": 3,
  "awayScore": 1,
  "winner": "home",
  "periods": [{"period": 1, "home": 1, "away": 0}, {"period": 2, "home": 2, "away": 1}]
}
```

### Integrations and API

Run it from your code with the Apify API or the `apify-client` package, schedule it in Apify (for example every morning for yesterday's results with **Matches from**), or connect it to Make, n8n, Zapier, Google Sheets, Slack or a webhook.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kamerozkan/flashscore-scraper").call(run_input={
    "startUrls": ["https://www.flashscore.com/tennis/atp-singles/wimbledon/"],
    "seasons": ["2025", "2024", "2023"],
    "include": "results",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["season"], item["round"], item["home"]["name"], item["away"]["name"], item["homeScore"], item["awayScore"])
```

### FAQ

**Which sports and tournaments work?** Flashscore tournament pages with a Results or Fixtures tab. Tested: ATP and WTA tennis (Grand Slams with qualifying), football leagues (Premier League) and basketball (NBA, regular season and play-offs). Other Flashscore sports use the same page format; if one answers oddly, open an issue. Paste the URL as it appears in your browser on flashscore.com.

**Can I get older seasons?** Yes. Flashscore writes the season into the URL (`wimbledon-2024`, `premier-league-2024-2025`). Paste such a URL, or paste the plain tournament URL and list the seasons in **Past seasons**.

**Does it cover live scores or today's matches across all tournaments?** Not in this version: it works from tournament results and fixtures lists. A match that is live when you run it shows its current score with status `live`.

**Why does a tennis player show the country "World"?** That is how Flashscore lists players who compete under a neutral flag.

**How are football half-time scores calculated?** Flashscore's results list carries the second-half score; the first half is the full-time score minus the second half, which matches the half-time score on the match page.

**How fast is it?** One page returns 100 to 240 matches; a Grand Slam with qualifying takes about 20 seconds, a full league fixture list about 10 seconds.

**Is it legal to collect this data?** It collects publicly visible sports results only, without logins. You are responsible for how you use the data and for following Flashscore's terms where they apply to you.

**Something is not working?** Open an issue on the Issues tab with your run link and we will fix it fast.

### Support

Need match statistics, odds, live scores for a whole day, or a sport that answers oddly? Open an issue on the **Issues** tab of this actor with your run link. Issues are read every working day and fixes ship within a few days; feature requests that other users share get built.

# Actor input Schema

## `startUrls` (type: `array`):

One per line: a Flashscore tournament page for any sport, copied from your browser. Examples: https://www.flashscore.com/tennis/atp-singles/wimbledon/results/ (this season), https://www.flashscore.com/tennis/atp-singles/wimbledon-2024/results/ (a past season), https://www.flashscore.com/football/england/premier-league/fixtures/ (upcoming matches), https://www.flashscore.com/basketball/usa/nba-2024-2025/results/. A URL ending in /results/ or /fixtures/ keeps that list; a plain tournament URL uses 'Results or fixtures' below.

## `include` (type: `string`):

For tournament URLs that do not end in /results/ or /fixtures/: finished matches, upcoming matches, or both.

## `seasons` (type: `array`):

Optional. Adds these seasons for every URL that names no season, for example 2024 and 2023 for tennis, or 2024-2025 and 2023-2024 for football and basketball leagues. Use the season as Flashscore writes it in its URLs.

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

Optional. Only matches that start on or after this day (YYYY-MM-DD, UTC). Matches outside the dates are not charged.

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

Optional. Only matches that start on or before this day (YYYY-MM-DD, UTC).

## `maxMatchesPerUrl` (type: `integer`):

Stop each results or fixtures list after this many matches. A Grand Slam has about 240 singles matches with qualifying, a football league season about 380.

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

Stop the run after this many matches. You are charged per match, so this also caps the cost of the run.

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

Not needed for normal use: Flashscore pages are read with plain requests. Turn on Apify Proxy only if your runs get blocked.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.flashscore.com/tennis/atp-singles/wimbledon-2024/results/",
    "https://www.flashscore.com/football/england/premier-league/results/"
  ],
  "include": "results",
  "maxMatchesPerUrl": 500,
  "maxItems": 300
}
```

# Actor output Schema

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

One row per match in the default dataset.

# 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 = {
    "startUrls": [
        "https://www.flashscore.com/tennis/atp-singles/wimbledon-2024/results/",
        "https://www.flashscore.com/football/england/premier-league/results/"
    ],
    "maxItems": 300
};

// Run the Actor and wait for it to finish
const run = await client.actor("kamerozkan/flashscore-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 = {
    "startUrls": [
        "https://www.flashscore.com/tennis/atp-singles/wimbledon-2024/results/",
        "https://www.flashscore.com/football/england/premier-league/results/",
    ],
    "maxItems": 300,
}

# Run the Actor and wait for it to finish
run = client.actor("kamerozkan/flashscore-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 '{
  "startUrls": [
    "https://www.flashscore.com/tennis/atp-singles/wimbledon-2024/results/",
    "https://www.flashscore.com/football/england/premier-league/results/"
  ],
  "maxItems": 300
}' |
apify call kamerozkan/flashscore-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kamerozkan/flashscore-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/BZI3oXRtgleqD6xkf/builds/4mWWUUjD6fTiYJ2db/openapi.json
