# Flashscore Scraper — Live Scores, Results, Odds & Stats (`logiover/flashscore-scraper`) Actor

Scrape Flashscore results, fixtures and live scores for football, tennis, basketball, hockey and 25+ sports. Full season history, odds by bookmaker, match stats, lineups, events and tennis point-by-point. No login or API key. Export JSON, CSV, Excel.

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

## Pricing

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

## Flashscore Scraper — Live Scores, Results, Fixtures, Odds & Match Statistics

**Flashscore Scraper** collects football (soccer), tennis, basketball, hockey and 24 more sports from Flashscore.com — live scores, finished results, upcoming fixtures, full season history, betting odds by bookmaker, match statistics (xG, possession, aces, break points…), lineups, goals and cards, and **tennis point-by-point**. It is a fast **Flashscore API alternative**: no login, no API key, no browser, no proxy needed. Export to **JSON, CSV, Excel**, Google Sheets or straight into your database, model or AI agent.

Use it as a **Flashscore results scraper** for whole leagues and seasons (Premier League, LaLiga, Bundesliga, Serie A, Ligue 1, NBA, NHL…), as a **tennis data scraper** for every ATP, WTA, Challenger and ITF match, or as a **live score and odds feed** you schedule every few minutes. One run returns tens of thousands of matches — measured on the Apify platform: **16,456 matches from 50 league seasons in 10 seconds** and **39,204 ITF tennis matches in about two minutes**.

> Independent tool — not affiliated with, endorsed by or sponsored by Flashscore or Livesport s.r.o. All trademarks belong to their owners. The Actor reads the same public data your browser shows on flashscore.com.

***

### What you get

| | What is in each row (one row = one match) |
|---|---|
| **Match** | Flashscore match ID and URL, sport, start time (UTC), status (scheduled / live / finished / postponed / cancelled / walkover / retired …) and the exact Flashscore status text ("After Penalties", "Set 2", "Half Time"…) |
| **Competition** | Country or tennis category (ATP - Singles, ITF Women - Singles…), tournament / league name, season, round, tennis surface, tournament URL and IDs |
| **Teams / players** | Home and away name, Flashscore participant ID and profile URL, logo / photo URL, 3-letter code; for tennis the players' countries and doubles partners |
| **Score** | Final score, regular-time score, extra-time score, penalty shoot-out, half-time score, every period (halves, quarters, periods, sets, innings), tennis tie-breaks, winner, a readable `scoreSummary` ("7-6 (7-1), 6-7 (3-7), 3-6"), red cards |
| **Live (tennis)** | Points in the current game and who is serving |
| **Summary** *(optional)* | Venue, city, attendance, stadium capacity, referee / umpire and nationality, match and set durations |
| **Statistics** *(optional)* | Every stat Flashscore shows, for the whole match and per period — football: xG, xGOT, possession, shots, big chances, corners, passes, fouls, saves…; tennis: aces, double faults, 1st/2nd serve %, break points saved/converted, winners, unforced errors, total points… |
| **Events** *(optional)* | Goals with scorer, assist and score after the goal, yellow/red cards with reason, substitutions (in/out), missed penalties, VAR — with minute and team |
| **Lineups** *(optional)* | Formation, starting XI, substitutes, coach — with shirt number, nationality, captain/goalkeeper flags and player IDs |
| **Point-by-point** *(optional, tennis)* | Every game of every set: server, game winner, breaks of serve and the full point sequence with break points (BP), set points (SP) and match points (MP); every tie-break point |
| **Odds** *(optional)* | Pre-match 1X2 or home/away odds per bookmaker — closing **and opening** — plus averages, best prices and averaged over/under lines (goals, games or sets); also for upcoming matches |

28 duel sports are supported: football, tennis, basketball, hockey, American football, baseball, handball, volleyball, rugby union, rugby league, cricket, darts, snooker, table tennis, badminton, esports, futsal, floorball, bandy, beach volleyball, Aussie rules, water polo, field hockey, beach soccer, boxing, MMA, netball and pesäpallo.

***

### Three ways to use it

#### 1. Daily scores & fixtures (by sport and day)

Every match of the chosen sports for up to **7 days back and 7 days ahead** — results, live scores and fixtures in one dataset. Perfect for a scheduled job that keeps your database or betting model up to date.

```json
{
  "mode": "daily",
  "sports": ["football", "tennis", "basketball", "hockey"],
  "daysBack": 1,
  "daysAhead": 2,
  "matchStatus": "all",
  "maxItems": 10000
}
```

#### 2. League / tournament history (whole seasons)

Complete results — and optionally the remaining fixtures — of **entire seasons**, as many seasons back as Flashscore's archive goes (the Premier League archive reaches the 1990s). Paste a league URL, a single-season URL, a **tennis category** (every tournament in it) or a **country** (every competition in it):

```json
{
  "mode": "leagues",
  "leagueUrls": [
    "https://www.flashscore.com/football/england/premier-league/",
    "https://www.flashscore.com/football/spain/laliga/",
    "https://www.flashscore.com/basketball/usa/nba/"
  ],
  "seasons": 10,
  "includeFixtures": true
}
```

All ATP and WTA singles tournaments of the 2025 season, with statistics and point-by-point:

```json
{
  "mode": "leagues",
  "leagueUrls": [
    "https://www.flashscore.com/tennis/atp-singles/",
    "https://www.flashscore.com/tennis/wta-singles/"
  ],
  "seasonNames": ["2025"],
  "details": ["statistics", "pointByPoint"]
}
```

You can also type names — `"leagueNames": ["Premier League", "NBA", "Wimbledon", "Bundesliga"]` — and the Actor finds them with Flashscore's own search.

#### 3. Specific matches

```json
{
  "mode": "matches",
  "matchUrls": [
    "https://www.flashscore.com/match/football/arsenal-hA1Zm19f/everton-KluSTr9s/?mid=jXP8f29S",
    "KOht3l94"
  ],
  "details": ["summary", "statistics", "events", "lineups", "odds"]
}
```

#### Extra details (any mode)

Add `"details": [...]` with any of `summary`, `statistics`, `events`, `lineups`, `pointByPoint`, `odds`. Each one is fetched only for the matches that are actually saved. `oddsCountry` (default `GB`) decides which bookmakers you see — e.g. `DE`, `FR`, `ES`, `IT`, `PL`, `BR`.

***

### Input reference

| Field | Type | Default | Meaning |
|---|---|---|---|
| `mode` | `daily` / `leagues` / `matches` | `daily` | What to scrape. Filling league URLs or match URLs switches mode automatically. |
| `sports` | list | football, tennis, basketball, hockey | Sports for daily mode (URL slugs: `football`, `tennis`, `american-football`, `table-tennis`…). |
| `daysBack` / `daysAhead` | 0–7 | 1 / 0 | Day window for daily mode. |
| `leagueUrls` | list of URLs | – | Leagues, seasons, tennis categories or countries. Short paths like `football/spain/laliga` work too. |
| `leagueNames` | list of text | – | League names resolved with Flashscore search. |
| `seasons` | number | 1 | How many latest seasons per league. |
| `seasonNames` | list | – | Exact seasons, e.g. `2023/2024`, `2019/2020`, `2025`. |
| `includeFixtures` | boolean | false | Also the unplayed matches of the current season. |
| `matchUrls` | list | – | Match URLs or 8-character match IDs. |
| `matchStatus` | `all` / `finished` / `scheduled` / `live` | `all` | Keep only results, only fixtures or only live matches. |
| `details` | list | none | `summary`, `statistics`, `events`, `lineups`, `pointByPoint`, `odds`. |
| `oddsCountry` | 2 letters | `GB` | Bookmaker set for odds. |
| `maxItems` | number | 10,000 | Stop after this many matches (0 = no limit). |
| `concurrency` | 1–50 | 16 | Parallel requests. |
| `proxyConfiguration` | proxy | none | Not needed; the Actor switches to Apify Proxy by itself if Flashscore ever refuses the direct connection. |

***

### Output example

A WTA match from a daily run with all tennis details (shortened — real run, 13 Oct 2026):

```json
{
  "matchId": "27tGDU8l",
  "matchUrl": "https://www.flashscore.com/match/27tGDU8l/",
  "sport": "Tennis",
  "category": "WTA - Singles",
  "tournament": "Wuhan (China)",
  "tournamentFullName": "WTA - SINGLES: Wuhan (China), hard",
  "surface": "hard",
  "startTime": "2026-10-13T03:10:00.000Z",
  "status": "finished",
  "statusDetail": "Finished",
  "homeName": "Birrell K.",
  "awayName": "Volynets K.",
  "homeScore": 1,
  "awayScore": 2,
  "winner": "away",
  "winnerName": "Volynets K.",
  "scoreSummary": "1-2: 7-6 (7-1), 6-7 (3-7), 3-6",
  "periods": [{ "home": 7, "away": 6 }, { "home": 6, "away": 7 }, { "home": 3, "away": 6 }],
  "tiebreaks": ["7-1", "3-7", null, null, null],
  "homeCountry": "Australia",
  "awayCountry": "USA",
  "homeUrl": "https://www.flashscore.com/player/birrell-kimberly/S4ljFw3g/",
  "referee": "Svarova N.",
  "matchDuration": "3:01",
  "periodDurations": ["1:07", "1:11", "0:43"],
  "statistics": {
    "Match": {
      "Aces": { "home": 5, "away": 1 },
      "Double Faults": { "home": 8, "away": 4 },
      "1st serve percentage": { "home": "64%", "away": "70%" },
      "Break Points Saved": { "home": "14/22", "away": "3/9" }
    },
    "Set 1": { "…": "…" }
  },
  "pointByPoint": [
    { "set": 1, "kind": "game", "homeScore": 0, "awayScore": 1, "server": "home", "winner": "away", "serviceLost": true,
      "points": "15:0, 15:15, 30:15, 30:30, 30:40 BP, 40:40, 40:A BP, 40:40, 40:A BP, 40:40, 40:A BP" }
  ],
  "odds": {
    "market": "Home/Away",
    "bookmakerCount": 20,
    "homeAverage": 2.5,
    "awayAverage": 1.5,
    "homeOpeningAverage": 2.32,
    "awayOpeningAverage": 1.56,
    "bookmakers": [{ "bookmaker": "bet365", "home": 2.5, "away": 1.53, "homeOpening": 2.38, "awayOpening": 1.57 }],
    "overUnder": [{ "line": 22.5, "unit": "games", "over": 1.86, "under": 1.84, "bookmakers": 16 }]
  }
}
```

A Premier League match with summary, statistics, events, lineups and odds (shortened — EPL 2024/2025 run):

```json
{
  "matchId": "4Q2eCnZ0",
  "sport": "Football",
  "country": "England",
  "tournament": "Premier League",
  "season": "2024/2025",
  "round": "Round 38",
  "startTime": "2025-05-25T15:00:00.000Z",
  "homeName": "Newcastle",
  "awayName": "Everton",
  "homeScore": 0,
  "awayScore": 1,
  "halfTimeHome": 0,
  "halfTimeAway": 0,
  "scoreSummary": "0-1 (HT 0-0)",
  "winner": "away",
  "homeRedCards": 0,
  "awayRedCards": 0,
  "venue": "St. James' Park",
  "city": "Newcastle",
  "attendance": 52221,
  "venueCapacity": 52305,
  "referee": "Harrington T.",
  "statistics": { "Match": { "Expected goals (xG)": { "home": 1.27, "away": 0.9 }, "Ball possession": { "home": "66%", "away": "34%" }, "Total shots": { "home": 17, "away": 14 }, "Corner kicks": { "home": 12, "away": 3 } } },
  "events": [{ "period": "1st Half", "minute": "24'", "team": "away", "type": "Yellow Card", "player": "Gueye I.", "detail": "Roughing" }],
  "lineups": { "home": { "formation": "1-3-4-3", "coach": "Howe E.", "starting": [{ "name": "Barnes H.", "number": 11, "nationality": "England" }] } },
  "odds": { "market": "1X2", "bookmakerCount": 16, "homeAverage": 1.25, "drawAverage": 6.19, "awayAverage": 10.91, "homeOpeningAverage": 1.37 }
}
```

***

### Data dictionary

**Identity & competition**

| Field | Description |
|---|---|
| `matchId` | Flashscore's 8-character match ID — stable, use it to de-duplicate and to join runs. |
| `matchUrl` | Link to the match on flashscore.com. |
| `sport`, `sportId` | Sport name and Flashscore's numeric sport ID (1 football, 2 tennis, 3 basketball, 4 hockey…). |
| `country` | Country of the competition for team sports (`England`, `Spain`, `World`, `Europe`…). |
| `category` | Flashscore's category: the country for team sports, the tour for tennis (`ATP - Singles`, `Challenger Women - Singles`, `ITF Men - Doubles`…). |
| `tournament` | Tournament or league name (`Premier League`, `Wuhan (China)`, `Shanghai (China) - Qualification`). |
| `tournamentFullName` | Exactly as Flashscore prints the header (`ENGLAND: Premier League`, `WTA - SINGLES: Wuhan (China), hard`). |
| `season` | Season (`2024/2025`, `2025`) in league mode. |
| `round` | Round in league mode (`Round 38`, `1/8-finals`, `Semi-finals`, `Final`). |
| `surface` | Tennis surface: `hard`, `clay`, `grass`, `hard (indoor)`, `clay (indoor)`, `carpet`. |
| `tournamentUrl`, `tournamentId`, `tournamentStageId`, `tournamentTemplateId` | Links and Flashscore IDs of the competition, season and stage. |

**Time & status**

| Field | Description |
|---|---|
| `startTime`, `date` | Kick-off / first serve in UTC (ISO 8601) and its date. |
| `status` | `scheduled`, `live`, `finished`, `postponed`, `cancelled`, `interrupted`, `abandoned`, `delayed`, `awarded`. Walkovers and retirements are `finished` with a flag. |
| `statusDetail`, `statusCode` | Flashscore's own stage text and code: `Finished`, `After Extra Time`, `After Penalties`, `Walkover`, `Finished / retired`, `2nd Half`, `Set 3 - Tiebreak`, `Half Time`… |
| `retired`, `walkover` | Tennis/individual sports: the match ended by retirement / was a walkover. |

**Participants**

| Field | Description |
|---|---|
| `homeName`, `awayName` | Team or player names as on Flashscore; doubles as `Player A/Player B`. |
| `homeId`, `awayId` | Flashscore participant IDs (team or player). |
| `homeUrl`, `awayUrl` | Team or player profile page. |
| `homeCountry`, `awayCountry` | Players' countries (tennis and other individual sports); doubles as `Country A / Country B`. |
| `homeShortName`, `awayShortName` | 3-letter codes (`ARS`, `NEW`, `SIN`). |
| `homeLogo`, `awayLogo` | Team logo or player photo URL when Flashscore has one. |

**Score**

| Field | Description |
|---|---|
| `homeScore`, `awayScore` | Result after regular time plus extra time / overtime, without the shoot-out (sets won in tennis, goals in football, points in basketball). |
| `homeScoreRegularTime`, `awayScoreRegularTime` | Score after regular time (90 minutes, 60 minutes of hockey, four quarters…). |
| `homeScoreExtraTime`, `awayScoreExtraTime` | Score after extra time / overtime, when played. |
| `homePenalties`, `awayPenalties` | Penalty or overtime shoot-out score. |
| `halfTimeHome`, `halfTimeAway` | Half-time score (football, futsal, handball, beach soccer). |
| `periods` | Score of every period in order: halves, quarters, hockey periods, tennis/volleyball sets (games or points), innings. |
| `tiebreaks` | Tennis tie-break score per set (`"7-4"`), `null` for sets without one. |
| `winner`, `winnerName` | `home`, `away` or `draw` (shoot-outs decide the winner). |
| `scoreSummary` | Readable line: `2-1 (HT 1-1)`, `1-1 (HT 0-1), AET 2-1`, `0-0 (HT 0-0), pens 4-3`, `1-2: 7-6 (7-1), 6-7 (3-7), 3-6`. |
| `homeRedCards`, `awayRedCards` | Red cards (football; `0` when the match has full coverage and no red card). |
| `currentGame`, `serving` | Tennis live: points in the current game (`30-15`) and `home`/`away` serving. |
| `infoNotice` | Flashscore's note on the match: aggregate score, neutral venue, withdrawals, closed roof… |

**Optional details**

| Field | Description |
|---|---|
| `referee`, `refereeCountry` | Referee (football…) or chair umpire (tennis) and nationality code. |
| `venue`, `city`, `attendance`, `venueCapacity` | Stadium, city, spectators and capacity. |
| `matchDuration`, `periodDurations` | Tennis match and set durations (`"3:01"`, `["1:07","1:11","0:43"]`). |
| `statistics` | `{ "Match": { "<stat>": { "home", "away" } }, "1st Half": {…}, "Set 1": {…} }` — numbers as numbers, percentages and ratios as shown (`"64%"`, `"60% (49/82)"`). |
| `events` | Goals, cards, substitutions, VAR, missed penalties: `period`, `minute`, `team`, `type`, `player`, `playerId`, `assist`, `playerOut`, `detail` (card reason), `score` after a goal, commentary `text`. |
| `lineups` | `{ home: { formation, starting[], substitutes[], coach }, away: {…} }`; players with `name`, `number`, `nationality`, `role` (Captain / Goalkeeper), `playerId`, `url`. |
| `pointByPoint` | Tennis games: `set`, `kind` (`game` / `tiebreak` / `set`), `homeScore`/`awayScore` after the game, `server`, `winner`, `serviceLost`, `points` (with `BP`/`SP`/`MP` marks). |
| `odds` | `market` (`1X2` or `Home/Away`), `bookmakerCount`, closing and opening averages, best prices, `bookmakers[]` with each bookmaker's closing and opening odds, `overUnder[]` (`line`, `unit` games/sets, average over/under, bookmakers), `marketsAvailable`. |
| `scrapedAt` | When the row was collected (UTC). |

***

### How much data can I get?

Flashscore keeps an enormous archive, and the Actor reads it through the same data feeds the website uses — so volume is limited by what you ask for, not by the scraper. Measured on the Apify platform on **15 October 2026**:

| Run | Matches | Time |
|---|---|---|
| Prefill (tennis, yesterday + today, 200 matches) | 200 | 1.9 s |
| Daily default — football, tennis, basketball, hockey, 1,000 matches | 1,000 | 2.5 s |
| Premier League, LaLiga, Bundesliga, Serie A, Ligue 1 × 10 seasons | **16,456** (all 50 seasons complete, 0 duplicates) | 10 s |
| ITF Men + ITF Women singles, every 2025 tournament (1,264 editions) | **39,204** (0 duplicates) | 129 s |
| ATP singles — latest edition of all 104 listed tournaments | 5,609 | ~15 s |
| 1,000 tennis matches **with** summary + statistics + point-by-point + odds | 1,000 | 71 s |
| Premier League 2024/2025, all 380 matches **with** summary, statistics, events, lineups and odds | 380 | 75 s |

How big the archive is, per source (tournaments listed by Flashscore): ITF Women Singles 1,766 · ITF Men Singles 1,357 · ITF Men Doubles 1,355 · Challenger Men Singles 622 · Challenger Men Doubles 565 · WTA Singles 232 · ATP Singles 203 · WTA Doubles 228 · ATP Doubles 199. A football country like England lists 29 competitions; the Premier League archive goes back to 1995/1996 (380 matches that season too).

Detail coverage depends on the level of the competition, exactly as on the website. Measured on 1,000 tennis matches: ATP/WTA/Challenger singles have statistics (17–21 stats per period), point-by-point and odds for 99–100 % of matches; ITF matches have odds for ~99 % and point-by-point for ~40 %, but Flashscore publishes only a minimal stat line for them. Premier League: venue, attendance, referee, 35 statistics, events, lineups and odds for 100 % of 380 matches (12.6 bookmakers per match on average).

***

### What you pay

You pay a fixed price per match row — **$1.50 per 1,000 matches** on the free plan, less on paid Apify plans (down to $1.00 per 1,000). Everything is included: the extra details (statistics, events, lineups, point-by-point, odds) do **not** cost extra, and there are no separate compute or proxy charges for you.

**Maximum cost per run.** Apify lets you cap what a run may spend ("Maximum cost per run" in the run options, or `maxTotalChargeUsd` in the API). The Actor reads that cap at the start, collects exactly as many matches as it covers and finishes cleanly with a message such as *"Saved 37 matches — this run's maximum cost ($0.05) covers 37 results"* — it never runs over the cap and never ends as an aborted run. To collect more, raise the cap or `maxItems`.

***

### Use cases

- **Sports betting models & value betting** — years of results with half-time, extra-time and penalty scores, plus closing and opening odds from up to 20 bookmakers per match, to train and back-test models.
- **Tennis analytics** — every ATP, WTA, Challenger and ITF match with surface, round, set and tie-break scores, retirements, serve and return statistics, and point-by-point game flow (breaks, BP/SP/MP).
- **Live score apps, bots and dashboards** — schedule the daily mode every few minutes; live status, current game and server for tennis.
- **Fantasy sports and tipping** — fixtures, lineups, events and form data in one place.
- **Sports journalism & content** — results, attendances, referees and statistics for articles, previews and newsletters.
- **Academic research** — home advantage, referee bias, momentum in tennis, attendance studies across thousands of seasons.
- **Data products** — feed a database, data warehouse or Google Sheet with clean, typed match data.
- **AI agents** — give an LLM agent reliable sports data through the Apify MCP server or API.

***

### Integrations & API

Run it from the Apify Console, on a schedule, or through the API.

**cURL** — run and get the results in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~flashscore-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"daily","sports":["tennis"],"daysBack":1,"matchStatus":"finished"}'
```

**Node.js** (`npm i apify-client`):

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('logiover/flashscore-scraper').call({
    mode: 'leagues',
    leagueUrls: ['https://www.flashscore.com/football/england/premier-league/'],
    seasons: 5,
    details: ['statistics', 'odds'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0].scoreSummary);
```

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("logiover/flashscore-scraper").call(run_input={
    "mode": "leagues",
    "leagueUrls": ["https://www.flashscore.com/tennis/atp-singles/"],
    "seasonNames": ["2025"],
    "details": ["statistics", "pointByPoint"],
})
for match in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(match["date"], match["homeName"], match["awayName"], match["scoreSummary"])
```

**No-code:** use the Apify integrations for **Make**, **Zapier**, **n8n**, **Google Sheets**, **Airbyte**, **Keboola** or a **webhook** that fires when a run finishes. Exports: JSON, CSV, Excel, XML, HTML table, RSS. **AI agents:** add the Actor to the **Apify MCP server** to let Claude, ChatGPT or any MCP client pull live scores and odds on demand.

**Tip for scheduled jobs:** use `matchId` as the key — re-running the daily mode updates the same matches as they go from scheduled to live to finished.

***

### Why this Flashscore scraper

| | This Actor | Typical alternatives |
|---|---|---|
| Sports | 28 duel sports in one Actor | often one sport (football only or tennis only) |
| History | any season in Flashscore's archive, whole categories and countries at once | today ± a few days |
| Tennis | ATP, WTA, Challenger, ITF, singles and doubles, surface, tie-breaks, point-by-point | match list only |
| Odds | closing **and opening** odds per bookmaker, over/under lines, also for fixtures | none, or charged extra |
| Details pricing | included in the per-match price | extra event per detail |
| Speed | ~1,600 matches per second from feeds; tens of thousands per run | page-by-page browsers |
| Run outcome | clear success / empty / failure, never a silent empty "success" | varies |

***

### Limits & good to know

- **Daily mode covers 7 days back and 7 days ahead** — that is what Flashscore's daily feeds offer. For anything older use league / tournament history mode.
- **Non-duel sports** (golf, motorsport, cycling, horse racing, winter sports) use a different format and are not included.
- **Coverage follows Flashscore.** Lower leagues and ITF tennis often have no lineups, fewer statistics or no point-by-point; those fields are then `null`.
- **Odds** are the pre-match odds Flashscore displays for the bookmakers available in `oddsCountry`; markets vary by match.
- **Times are UTC.** `date` is the UTC date of the start time.
- **Live data is a snapshot** taken when the row is saved. Schedule frequent runs for live tracking.
- `round` is filled in league mode (the daily feeds do not carry it).

***

### FAQ

#### How do I scrape Flashscore results for a whole season?

Choose **League / tournament history**, paste the league URL (e.g. `https://www.flashscore.com/football/germany/bundesliga/`) and set `seasons` to how many seasons you want, or list exact ones in `seasonNames`. Every match of each season is returned — the Actor checks each season against Flashscore's own event count.

#### Can I get historical football results from previous seasons?

Yes. Flashscore's archive goes back decades for major leagues — the Premier League to 1995/1996. Set `seasons: 30` or name the seasons you need.

#### How do I scrape all ATP, WTA, Challenger or ITF tennis matches?

Paste a tennis category URL such as `https://www.flashscore.com/tennis/itf-men-singles/` — the Actor expands it to every tournament in the category (1,357 for ITF Men Singles) — and choose the season, e.g. `seasonNames: ["2025"]`. One run measured 39,204 ITF matches.

#### Does it give live scores?

Yes. Daily mode includes matches in progress with `status: "live"`, the current period (`statusDetail`, e.g. `Set 2` or `2nd Half`), the current score and, for tennis, the points in the current game and who is serving. Use `matchStatus: "live"` to get only live matches and schedule the Actor as often as you need.

#### How do I get betting odds from Flashscore?

Add `"odds"` to `details`. You get the main market (1X2 for football, home/away for tennis and other sports) for every bookmaker Flashscore lists in `oddsCountry`, with closing and opening odds, averages and best prices, plus over/under lines with their unit (goals, games or sets). Odds are available for upcoming matches too.

#### Does it include statistics like xG, possession, aces or break points?

Yes — add `"statistics"`. You get every statistic Flashscore shows, for the whole match and for each half, period or set: xG, xGOT, possession, shots, big chances, corners, passes and saves for football; aces, double faults, serve percentages, break points, winners and unforced errors for tennis.

#### Is tennis point-by-point data available?

Yes — add `"pointByPoint"`. Each game comes with the server, the winner, whether serve was broken and the full point sequence with break-, set- and match-point marks; tie-breaks point by point. Coverage: ~100 % of ATP, WTA and Challenger singles matches, ~40 % of ITF matches.

#### Which sports are supported?

Football, tennis, basketball, hockey, American football, baseball, handball, volleyball, rugby union and league, cricket, darts, snooker, table tennis, badminton, esports, futsal, floorball, bandy, beach volleyball, Aussie rules, water polo, field hockey, beach soccer, boxing, MMA, netball and pesäpallo.

#### Do I need a Flashscore account, an API key or proxies?

No. The Actor reads the public data feeds Flashscore's website uses, over a direct connection. If Flashscore ever refused the direct connection, it would switch to Apify Proxy by itself.

#### How fast is it?

Results come from data feeds, not from rendering pages: 1,000 matches in about 2–3 seconds, 16,456 matches from 50 league seasons in 10 seconds. Details add one small request per match and type — 1,000 tennis matches with four detail types took 71 seconds.

#### How much does it cost to scrape 10,000 matches?

$15 on the free Apify plan at $1.50 per 1,000 matches, $10 on plans with the lowest tier. Details are included. You can cap any run with "Maximum cost per run".

#### Why do some matches have no statistics or lineups?

Because Flashscore does not have them for that match — typically lower leagues, youth football or ITF tennis. The fields are then `null` rather than guessed.

#### How do I avoid duplicates when I run it every day?

Use `matchId` as the key. Within one run every match appears once (a match crossing midnight is listed under two days on Flashscore — the Actor de-duplicates it). Across runs, update rows by `matchId`.

#### How are penalty shoot-outs and extra time represented?

`homeScoreRegularTime` is the 90-minute (or regulation) score, `homeScoreExtraTime` the score after extra time / overtime, `homePenalties` the shoot-out, and `homeScore` the result without the shoot-out. `winner` tells who won, including shoot-outs, and `scoreSummary` shows it all, e.g. `1-1 (HT 0-1), AET 2-1`.

#### What time zone are the dates in?

UTC, in ISO 8601 (`2025-05-25T15:00:00.000Z`).

#### Can I use it with Python, n8n, Make, Zapier or Google Sheets?

Yes — see "Integrations & API" above. Every run's dataset can be exported or pushed to those tools, and the Actor can be called from any language through the Apify API.

#### Is it legal to scrape Flashscore?

The Actor collects publicly available sports data (fixtures, results, statistics, odds) at a moderate rate, without logging in. Sports results are facts; still, check Flashscore's terms and the laws that apply to you, and do not republish their content in a way that infringes their rights. This Actor is an independent tool and is not affiliated with Flashscore.

***

### Support

Questions, a sport or field you need, or something that looks wrong? Open an issue on the Actor's **Issues** tab — we reply within 24 hours and fix data problems quickly. Custom versions (extra markets, other bookmakers, scheduled exports) are possible on request.

***

### Changelog

- **1.0 (2026-10-15)** — First release: daily scores & fixtures for 28 duel sports (7 days back / 7 ahead), full league and tournament season history from Flashscore's archive (league, season, tennis-category and country URLs, league names), specific matches, and optional summary, statistics, events, lineups, tennis point-by-point and bookmaker odds (closing + opening). Pay-per-result with a clean stop at the run's maximum cost.

***

*Flashscore is a trademark of Livesport s.r.o. This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Flashscore or Livesport. All trademarks mentioned are the property of their respective owners.*

# Changelog

This Actor's version history is a separate document: https://apify.com/logiover/flashscore-scraper/changelog.md

# Actor input Schema

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

<b>Daily scores & fixtures</b>: every match of the selected sports for up to 7 days back and 7 days ahead. <b>League / tournament history</b>: complete results (and optionally fixtures) of whole seasons — current and past — for the league URLs or names below; a tennis category URL (e.g. ATP - Singles) or a country URL (e.g. England) expands to all of its tournaments. <b>Specific matches</b>: the match URLs or ids below. If you fill in league URLs or match URLs, the matching mode is used automatically.

## `sports` (type: `array`):

Sports to collect in daily mode. Every duel sport on Flashscore is supported.

## `daysBack` (type: `integer`):

How many past days to include: 0 = today only, 1 = yesterday and today, … up to 7 (Flashscore's daily feeds cover 7 days back). For older matches use the league / tournament history mode.

## `daysAhead` (type: `integer`):

How many future days of fixtures to include (0–7).

## `leagueUrls` (type: `array`):

Flashscore URLs. A league or tournament (https://www.flashscore.com/football/england/premier-league/, https://www.flashscore.com/tennis/atp-singles/wimbledon/), a specific season (…/premier-league-2019-2020/), a tennis category (https://www.flashscore.com/tennis/atp-singles/ = every ATP singles tournament) or a country (https://www.flashscore.com/football/spain/ = every Spanish competition). Short paths like football/spain/laliga also work.

## `leagueNames` (type: `array`):

Optional: league names to look up with Flashscore's own search, e.g. "Premier League", "LaLiga", "NBA", "Wimbledon". The best match is used; URLs above are more precise.

## `seasons` (type: `integer`):

How many of the most recent seasons to collect for each league, from Flashscore's archive (1 = current season only). The Premier League archive goes back to the 1990s; tennis tournaments list one season per year.

## `seasonNames` (type: `array`):

Optional: pick exact seasons instead of "the last N", e.g. 2023/2024, 2019/2020 or 2024 (tennis, calendar-year leagues).

## `includeFixtures` (type: `boolean`):

Also collect the not-yet-played matches of the current season.

## `matchUrls` (type: `array`):

Flashscore match URLs (https://www.flashscore.com/match/football/arsenal-hA1Zm19f/everton-KluSTr9s/?mid=jXP8f29S) or 8-character match ids (jXP8f29S).

## `matchStatus` (type: `string`):

Keep only finished matches (results), only scheduled ones (fixtures), only live ones — or everything.

## `details` (type: `array`):

Each selected detail adds one request per match. <b>Summary</b>: venue, city, attendance, referee/umpire, match and set durations, exact half-time score. <b>Statistics</b>: every stat Flashscore shows, per period (aces, double faults, break points, serve %, xG, possession, shots, …). <b>Events</b>: goals with scorer, assist and score, cards, substitutions, VAR. <b>Lineups</b>: formations, starting XI, substitutes, coaches. <b>Point-by-point</b> (tennis): every game and point with server, breaks, BP/SP/MP. <b>Odds</b>: pre-match 1X2 / home-away closing and opening odds per bookmaker plus over/under lines (also for upcoming matches).

## `oddsCountry` (type: `string`):

Two-letter country code that decides which bookmakers Flashscore shows (GB = bet365, William Hill, Betfair, Unibet, …).

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

Stop after this many matches (0 = no limit). One match = one result.

## `concurrency` (type: `integer`):

How many requests run at once. The default is fast and polite; there is rarely a reason to change it.

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

Not needed: Flashscore answers the direct connection, and the Actor switches to Apify Proxy by itself if it is ever refused. Set a proxy only if you have a specific reason.

## Actor input object example

```json
{
  "mode": "daily",
  "sports": [
    "tennis"
  ],
  "daysBack": 1,
  "daysAhead": 0,
  "leagueUrls": [],
  "leagueNames": [],
  "seasons": 1,
  "includeFixtures": false,
  "matchStatus": "all",
  "details": [],
  "oddsCountry": "GB",
  "maxItems": 200,
  "concurrency": 16,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All matches collected in this run.

# 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 = {
    "mode": "daily",
    "sports": [
        "tennis"
    ],
    "daysBack": 1,
    "daysAhead": 0,
    "leagueUrls": [],
    "leagueNames": [],
    "seasons": 1,
    "maxItems": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/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 = {
    "mode": "daily",
    "sports": ["tennis"],
    "daysBack": 1,
    "daysAhead": 0,
    "leagueUrls": [],
    "leagueNames": [],
    "seasons": 1,
    "maxItems": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/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 '{
  "mode": "daily",
  "sports": [
    "tennis"
  ],
  "daysBack": 1,
  "daysAhead": 0,
  "leagueUrls": [],
  "leagueNames": [],
  "seasons": 1,
  "maxItems": 200
}' |
apify call logiover/flashscore-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/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/1DoiQcisIITb76hLv/builds/78C89fQEGhJrko9wn/openapi.json
