# Flashscore Scraper: Results & Fixtures API for 20+ Sports (`localwire/flashscore-sports`) Actor

Flashscore scraper: match results and upcoming fixtures for any league or tournament in 20+ sports: football, tennis, basketball, ice hockey, NFL, baseball, cricket and rugby. Scores, winners, set and period scores, rounds, teams and logos, with monitor mode for new results. $1 per 1,000 matches.

- **URL**: https://apify.com/localwire/flashscore-sports.md
- **Developed by:** [Local Wire](https://apify.com/localwire) (community)
- **Categories:** Sports
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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.

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 Results & Fixtures Scraper: Football, Tennis, NBA, NHL, Cricket & More

Flashscore scraper for match results and upcoming fixtures from any league or tournament page on flashscore.com: football (soccer), tennis, basketball, ice hockey, American football, baseball, cricket, rugby and more, with scores, winners, set and period scores, rounds, team names and logos. **$1 per 1,000 matches** ($0.001 each) plus $0.0001 per run.

One run can cover up to 100 leagues. For each league you get the season's results and the upcoming fixtures in one request, as JSON, CSV or Excel. A **monitor mode** returns each finished match once, so an hourly schedule becomes a results feed.

### What you get

One record per match. The dataset has **Matches** and **Period and set scores** views.

```json
{
  "type": "match",
  "sport": "hockey",
  "league": "nhl",
  "country": "USA",
  "tournament": "NHL",
  "tournamentUrl": "https://www.flashscore.com/hockey/usa/nhl/",
  "round": null,
  "matchId": "hW7AXZxJ",
  "matchUrl": "https://www.flashscore.com/match/hW7AXZxJ/",
  "startTime": "2026-11-07T01:00:00.000Z",
  "status": "finished",
  "statusText": "Finished",
  "statusCode": 3,
  "home": { "id": "EZekktRt", "name": "Calgary Flames", "shortName": "Calgary Flames", "code": "CGY", "slug": "calgary-flames", "country": null, "logo": "https://static.flashscore.com/res/image/data/0UdKwb6k-zBmwri9p.png", "score": 3 },
  "away": { "id": "4CM4ojpD", "name": "Anaheim Ducks", "code": "ANA", "score": 5 },
  "homeScore": 3,
  "awayScore": 5,
  "winner": "away",
  "periods": [
    { "period": 1, "home": 3, "away": 1, "homeTiebreak": null, "awayTiebreak": null },
    { "period": 2, "home": 0, "away": 1, "homeTiebreak": null, "awayTiebreak": null },
    { "period": 3, "home": 0, "away": 3, "homeTiebreak": null, "awayTiebreak": null }
  ],
  "resultNote": null,
  "scrapedAt": "2026-11-07T09:00:00.000Z"
}
```

| Field | Meaning |
|---|---|
| `sport`, `league`, `country`, `tournament`, `tournamentUrl` | Where the match belongs. `league` is the built-in key or the path of the URL you gave. |
| `round` | The round as Flashscore labels it (for example "Round 10"), when there is one. |
| `matchId`, `matchUrl` | Flashscore's match id and the match page. |
| `startTime` | Start time in UTC (ISO 8601). |
| `status` | `scheduled`, `live`, `finished`, `postponed`, `cancelled`, `abandoned`, `interrupted`, `awarded`, `walkover` or `retired`. |
| `statusText`, `statusCode` | Flashscore's stage in words, such as "Finished", "After extra time", "After overtime", "After penalties" or "After shootout", and its numeric code. |
| `home`, `away` | `id`, `name`, `shortName`, `code` (e.g. `EVE`), `slug`, `country` (tennis players), `logo` and `score`. |
| `homeScore`, `awayScore` | The final or current score. Sets won in tennis. |
| `winner` | `home`, `away`, `draw`, or null while the match is not decided. |
| `periods[]` | Quarter, period or set scores, with tiebreak points where they apply. |
| `resultNote` | The result in words where Flashscore gives one (cricket). |

The run's `OUTPUT` record lists, per league, how many results and fixtures the page held, the totals Flashscore reports for the season, how many were delivered or skipped as already seen, and any problems.

### Quick start

The form opens with the Premier League and a cap of 50 matches. Press **Start** for 50 records at $0.05:

```json
{
  "leagues": ["premier-league"],
  "maxResults": 50
}
```

This weekend's Premier League and LaLiga matches:

```json
{ "leagues": ["premier-league", "laliga"], "daysBack": 1, "daysAhead": 2 }
```

A tennis tournament, results only:

```json
{ "leagueUrls": ["https://www.flashscore.com/tennis/atp-singles/paris/"], "include": "results" }
```

Every Lakers and Celtics result this season:

```json
{ "leagues": ["nba"], "include": "results", "teams": ["Lakers", "Celtics"] }
```

A multi-sport results feed (schedule it hourly):

```json
{ "leagues": ["premier-league", "nba", "nhl", "nfl"], "monitorMode": true }
```

### How to choose leagues

- **Built in (`leagues`):** `premier-league`, `championship`, `laliga`, `serie-a`, `bundesliga`, `ligue-1`, `eredivisie`, `liga-portugal`, `scottish-premiership`, `mls`, `champions-league`, `europa-league`, `nba`, `euroleague`, `nhl`, `nfl`, `mlb`, `ipl`, `big-bash-league`, `six-nations`, `premiership-rugby`.
- **Anything else (`leagueUrls`):** paste the league or tournament page from flashscore.com or flashscore.co.uk, for example `https://www.flashscore.com/football/italy/serie-b/` or `https://www.flashscore.com/tennis/atp-singles/paris/`. Sub-pages such as `/results/` and `/fixtures/` are accepted.

Supported sports: football, tennis, basketball, ice hockey, American football, baseball, cricket, rugby union, rugby league, handball, volleyball, beach volleyball, futsal, Aussie rules, darts, snooker, floorball, bandy, water polo, badminton and table tennis.

### What each sport returns

#### Football (soccer)

Results and fixtures for any league or cup: Premier League, LaLiga, Serie A, Bundesliga, Ligue 1, Champions League, MLS and every other football competition with a Flashscore page. Each match has the round ("Round 10"), final score, winner or draw, kick-off time in UTC, and team names, three-letter codes and logos. Matches decided after extra time or penalties say so in `statusText` ("After extra time", "After penalties"). Football records carry the final score only: `periods` is empty, so there are no half-time scores.

#### Tennis

Every match of an ATP, WTA, Challenger or ITF tournament: paste the tournament URL. `homeScore` and `awayScore` are sets won, `periods` holds each set's games with tiebreak points in `homeTiebreak` and `awayTiebreak`, and `home.country` and `away.country` give the players' countries. Retirements and walkovers have their own `status` values.

#### Basketball

NBA, Euroleague and any other league. `periods` holds the four quarters, plus a fifth entry for overtime, and `statusText` reads "After overtime" when a game went past regulation.

#### Ice hockey

NHL and other leagues. `periods` holds the three periods plus overtime where played, and `statusText` distinguishes "After overtime" from "After shootout".

#### American football

NFL and other competitions, with quarter scores in `periods` and overtime flagged in `statusText`.

#### Baseball

MLB and other leagues: final score, winner and start time. Inning-by-inning scores are not included.

#### Cricket

IPL, Big Bash League and other competitions. `resultNote` gives the result in words, for example "Royal Challengers Bengaluru won by 5 wickets". `periods` is empty.

#### Rugby, handball, volleyball and other sports

Rugby union and rugby league and handball have half scores in `periods`; volleyball, beach volleyball, badminton and table tennis have set scores; futsal and water polo have their period scores. Darts, snooker, Aussie rules, floorball and bandy return the final score, winner and status.

### Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `leagues` | string\[] | `premier-league` when no league is given | Built-in league keys (see above). |
| `leagueUrls` | string\[] | | Any Flashscore league or tournament URL. Up to 100 leagues per run in total. |
| `include` | string | `both` | `both`, `results` (finished and live matches of the season so far) or `fixtures`. |
| `teams` | string\[] | | Keep matches where either side's name contains any of these: `Arsenal`, `Lakers`, `Sinner`. |
| `daysBack` | integer | no limit | Keep matches starting on or after this many days ago (UTC). Ignored when `dateFrom` is set. |
| `daysAhead` | integer | no limit | Keep matches starting up to this many days from now. Ignored when `dateTo` is set. |
| `dateFrom` / `dateTo` | string | | Keep matches starting inside this range (`2026-11-01`). |
| `monitorMode` | boolean | false | Return only finished matches not returned before for that league. Forces `include` to `results`. |
| `monitorStoreName` | string | `flashscore-sports-monitor` | The key-value store that remembers returned matches. Use one name per feed. |
| `maxResults` | integer | 1000 | Stop after this many matches. |

### Use cases

- **Results feeds.** An hourly run in monitor mode delivers each match once, as soon as it finishes.
- **Fixture lists.** The next matches of every league you follow, with start times in UTC, for apps, newsletters and calendars.
- **Sports analytics and models.** Season results across leagues and sports in one schema.
- **Tennis tournaments.** Whole draws with set scores and tiebreaks from a single URL.
- **Lower leagues and niche sports.** Anything with a Flashscore page works, not just the big leagues.
- **AI agents.** Small, predictable records that answer "what are this weekend's Premier League fixtures?".

### Monitor mode

Turn on `monitorMode` and schedule the Actor. Each run returns only finished matches it has not returned before for that league, so you get a feed with no duplicates. A match cut off by your spending limit comes through on the next run. Use a different `monitorStoreName` for each separate feed.

### Pricing

Pay per result: **$0.001 per match ($1 per 1,000)** plus **$0.0001 per run**.

| Run | Matches | Cost |
|---|---|---|
| The quick-start run | 50 | **$0.05** |
| A weekend of Premier League and LaLiga | about 20 | about **$0.02** |
| A Premier League season's results so far plus upcoming fixtures | about 200 | about **$0.20** |
| An hourly four-league results monitor, about 30 finished matches a day | 24 runs, 30 matches | $0.0024 + $0.03 = about **$0.03 a day** |

To cap spending, set `maxResults` or a maximum cost per run in the run options (`maxTotalChargeUsd` in the API). The Actor stops cleanly at the limit.

### Use it from the API

```bash
curl -X POST "https://api.apify.com/v2/acts/localwire~flashscore-sports/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "content-type: application/json" \
  -d '{"leagues": ["premier-league"], "daysBack": 0, "daysAhead": 3}'
```

With the official clients:

```js
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("localwire/flashscore-sports").call({ leagues: ["nba"], include: "results", daysBack: 2 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("localwire/flashscore-sports").call(run_input={"leagueUrls": ["https://www.flashscore.com/tennis/atp-singles/paris/"], "include": "results"})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

### Use it from an AI agent (MCP)

Apify hosts an MCP server at `https://mcp.apify.com`. Add it to an MCP client (Claude, ChatGPT, Cursor, VS Code and others) and sign in with your Apify account, or send your API token as an `Authorization: Bearer` header. To expose just this Actor as a tool:

```
https://mcp.apify.com?tools=localwire/flashscore-sports
```

Then ask "what are this weekend's Premier League fixtures?". Notes for agents: with no input the Actor returns the Premier League's season results and fixtures, up to 1,000 records, so pass `daysBack`, `daysAhead` or a small `maxResults` to keep the answer short. Use `leagueUrls` for a competition that is not in the built-in list.

### Integrations

Apify connects runs to Make, n8n, Zapier, LangChain, webhooks and other tools, and datasets export as JSON, CSV, Excel, XML or RSS. Typical setups: monitor-mode results posted to Discord, Slack or Telegram through a webhook; fixtures appended to Google Sheets each morning; season results loaded into a database for modelling.

### FAQ

#### Does Flashscore have an API?

Flashscore does not publish a public API for its results and fixtures. This Actor reads the public league and tournament pages and returns their results and fixtures as structured records.

#### How do I scrape Flashscore results for a league that is not in the list?

Open the league or tournament on flashscore.com, copy the address and paste it into `leagueUrls`. Any page of the form `/sport/country-or-tour/league/` works for the supported sports.

#### How do I get tennis results with set scores?

Paste the tournament URL (for example `https://www.flashscore.com/tennis/atp-singles/paris/`) into `leagueUrls` and set `include` to `results`. Each match has sets won, each set's games and tiebreak points.

#### Can I get live scores?

Matches in progress appear with `status: "live"` and the score at the moment of the run. The Actor takes a snapshot each time it runs; it is not a streaming feed and has no minute-by-minute events.

#### Does it include odds, lineups, match statistics or standings?

No. The Actor returns results and fixtures only: no betting odds, lineups, match statistics, standings tables or minute-by-minute events.

#### How far back do results go?

The league page lists the current season's results; for leagues with very long seasons (NBA, NHL, MLB) it holds roughly the latest 100. Earlier seasons are not read. To keep a full history, schedule runs or use monitor mode and store the results.

#### How do I get only one team's or one player's matches?

Put part of the name in `teams`, for example `["Arsenal"]` or `["Sinner"]`. A match is kept when either side's name contains it.

#### How do I export Flashscore data to CSV or Excel?

Open the run's dataset and choose CSV or Excel, or request `https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv`.

#### What time zone are the start times in?

UTC, in ISO 8601 (`2026-11-07T01:00:00.000Z`).

### Limitations

- **One page per league.** The Actor reads each league's public results page, which lists the season's results so far and roughly the next 100 fixtures. For very long seasons (NBA, NHL, MLB) that means about the latest 100 results and the next 100 fixtures; the `OUTPUT` record gives the season totals.
- **Not included:** minute-by-minute events, lineups, match statistics, standings tables, betting odds, past seasons, football half-time scores and baseball innings.
- **Monitor mode returns matches with status `finished` only.** Matches that end by retirement, walkover or award are not returned in monitor mode; a normal run includes them.
- **Sports.** Only the sports listed above; a URL for another sport is rejected with a clear message.
- **Polite by design.** One request every 2 seconds, no proxies. If Flashscore refuses a request (a challenge page, access denied, or rate limiting that persists after one wait), the run stops with a clear message and keeps what it already has. It never tries to get round protection.
- **Layout changes.** The data comes from the page Flashscore serves; if Flashscore changes it, runs report "no match data found" until the Actor is updated.

### Disclaimer

This Actor is not affiliated with, endorsed by or sponsored by Flashscore or Livesport. Flashscore is a trademark of its owner. Results and fixtures are facts; check Flashscore's terms of use for how you may reuse the data, especially commercially.

### More from this developer

- [ESPN scores and standings](https://apify.com/localwire/espn-sports)
- [UK & EU public tenders](https://apify.com/localwire/uk-public-tenders)
- [Google Trends Trending Now](https://apify.com/localwire/google-trends-trending-now)
- [Hacker News](https://apify.com/localwire/hacker-news)
- [Career Site Jobs API](https://apify.com/localwire/ats-jobs)
- [Workday Jobs](https://apify.com/localwire/workday-jobs)
- [Reed Jobs](https://apify.com/localwire/reed-jobs)
- [Wellfound Jobs](https://apify.com/localwire/wellfound-jobs)
- [App Store Reviews, Details & Top Charts](https://apify.com/localwire/app-store-reviews)
- [Eventbrite Events](https://apify.com/localwire/eventbrite-events)
- [Meetup Events & Groups](https://apify.com/localwire/meetup-events)
- [Gumtree Listings](https://apify.com/localwire/gumtree-listings)
- [Telegram Channels](https://apify.com/localwire/telegram-channels)

# Actor input Schema

## `leagues` (type: `array`):

Popular leagues, built in, by key: premier-league, laliga, serie-a, bundesliga, champions-league, nba, nhl, nfl, mlb, ipl and others. For anything else, paste its Flashscore URL in leagueUrls. If no league is given in either field, premier-league is used.

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

Any league or tournament page on flashscore.com or flashscore.co.uk, e.g. https://www.flashscore.com/football/italy/serie-b/ or a tennis tournament like https://www.flashscore.com/tennis/atp-singles/paris/. Sub-pages (/results/, /fixtures/) are fine too.

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

results (finished and live matches of the season so far), fixtures (upcoming matches), or both. both if left out.

## `teams` (type: `array`):

Keep only matches where either side's name contains ANY of these, e.g. Arsenal, Lakers, Sinner.

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

Keep matches starting on or after this many days ago (UTC). No limit if left out, so the whole season's results are returned. Ignored when 'From date' is set.

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

Keep matches starting up to this many days from now (UTC). No limit if left out, so all listed fixtures are returned. Ignored when 'To date' is set.

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

Keep matches starting on or after this date, e.g. 2026-11-01.

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

Keep matches starting on or before this date (inclusive).

## `monitorMode` (type: `boolean`):

Remember which finished matches were returned for each league and return only matches that finished since the last run. Schedule the Actor (e.g. every hour) for a results feed.

## `monitorStoreName` (type: `string`):

Name of the key-value store that remembers returned matches. Use a different name for each separate monitor.

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

Stop after this many matches (1,000 if left out). Each match costs $0.001, and one league can hold 200 or more results and fixtures, so pass a small number or a date filter for a short answer.

## Actor input object example

```json
{
  "leagues": [
    "premier-league"
  ],
  "leagueUrls": [
    "https://www.flashscore.com/football/italy/serie-b/",
    "https://www.flashscore.com/tennis/atp-singles/paris/"
  ],
  "include": "both",
  "monitorMode": false,
  "monitorStoreName": "flashscore-sports-monitor",
  "maxResults": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

Results and fixtures.

## `periods` (type: `string`):

Quarters, periods or sets (with tiebreaks) where the sport has them.

## `allResults` (type: `string`):

Every record in the run's default dataset, all fields.

# 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 = {
    "leagues": [
        "premier-league"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("localwire/flashscore-sports").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 = {
    "leagues": ["premier-league"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("localwire/flashscore-sports").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 '{
  "leagues": [
    "premier-league"
  ],
  "maxResults": 50
}' |
apify call localwire/flashscore-sports --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,localwire/flashscore-sports"
        }
    }
}
```

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/4nrcSSuIAuD2OYJSB/builds/5D1NgGvolEcN0pQan/openapi.json
