# Flashscore Scraper: Live Scores, Results & Odds, 24 Sports (`sports-odds-lab/flashscore-scraper`) Actor

Sports data from Flashscore: live scores, results and fixtures of 24 sports — football, basketball, hockey, tennis, volleyball, handball, esports, MMA, darts and more — with opening and closing betting odds from up to 40 bookmakers, no-vig consensus, periods and stats. Recent days or full seasons.

- **URL**: https://apify.com/sports-odds-lab/flashscore-scraper.md
- **Developed by:** [Min Maxxxer](https://apify.com/sports-odds-lab) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 & Odds, 24 Sports

> 🎁 **Free until 11 October 2026.** Press **Start** — the prefilled input returns 30 matches of four sports with odds in under a minute.

![Sample output: yesterday's basketball, hockey, volleyball, handball, NFL and esports results with no-vig win probabilities](https://api.apify.com/v2/key-value-stores/CEtWcytR8Vm5hiMr1/records/preview-flashscore.png?signature=cKWxkFiD9hIY0VKFUGiR)

Get **live scores, results and fixtures of 24 sports** from Flashscore — football, basketball, ice hockey, tennis, volleyball, handball, American football, baseball, rugby, cricket, darts, snooker, esports, MMA, boxing and more — with **opening and closing odds from up to 40 bookmakers**, a **no-vig consensus**, **period scores** and optional **match statistics**. One clean row per match, ready for a spreadsheet, a database, a dashboard or a model.

**Two modes:**

- **Recent and live** — every match of the chosen sports from 7 days back to 7 days ahead, matches in progress included
- **Full seasons** — complete seasons of chosen leagues (NBA, EPL, IPL, AFL, NRL, Champions League handball, PDC darts, snooker World Championship… any league Flashscore archives)

**Running it on a schedule?** Turn on *Only new or changed matches* and each run returns — and charges for — only what is new since the previous one.

### What you get for each match

- **Match**: sport, start time (UTC), country or category, competition and stage, round, home and away team (or players), Flashscore IDs and link
- **Result**: status (finished, live, scheduled, cancelled…), final score, **period scores** (halves, quarters, periods, sets, innings), score after regulation / overtime / shoot-out where they exist, winner; MMA and boxing: the **finish** (KO, TKO, submission, decision) and the round
- **Odds per bookmaker** *(optional, on by default)*: opening and latest price — once a match has started the latest price is the **closing line**
  - **Winner**: 3-way (home / draw / away) in sports where draws happen, 2-way elsewhere (including overtime where it exists)
  - **Handicap** and **total**: each bookmaker's main line, or every line
- **Consensus** (median across bookmaker brands, margin removed): fair odds and win probabilities at the open and at the close, **line movement**, best available price, main handicap and total lines, median margin
- **Statistics** *(optional)*: whatever the sport records — shots and possession, rebounds, aces, power plays, kills…

### Sports and odds coverage

Measured on 745 matches of one day (share of matches with odds · average bookmakers):

| Sport | Winner market | With odds | Books |
|---|---|---|---|
| Football (soccer) | 3-way | 80% | 24 |
| Tennis | 2-way | 100% | 25 |
| Basketball | 2-way incl. OT | 91% | 23 |
| Ice hockey | 3-way (+ 2-way incl. OT) | 88% | 14 |
| Baseball | 2-way | 88% | 28 |
| American football | 2-way incl. OT | 100% | 24 |
| Volleyball | 2-way | 92% | 12 |
| Handball | 3-way | 81% | 16 |
| Darts | 2-way | 100% | 26 |
| Cricket | 2-way | 100% | 18 |
| Esports (CS, LoL, Dota, Valorant…) | 2-way | 100% | 14 |
| Rugby league / union | 3-way | 46–100% | 12–16 |
| Aussie rules, badminton, futsal, water polo, floorball | 2-way / 3-way | partial | 2–20 |
| Snooker, boxing, MMA, beach volleyball, table tennis, field hockey | 2-way / 3-way | results always, odds when bookmakers list them | — |

Results, scores and fixtures are there for every sport; odds depend on whether bookmakers price the match on Flashscore (top leagues almost always, lower divisions less often).

### Use cases

- **Live score apps and widgets** — schedule a run every few minutes with *Only new or changed matches* for a cheap live feed across sports
- **Results databases** — one daily run with `daysBack: 1` keeps every result of every sport you follow, with closing odds
- **Betting and forecasting models** — closing-line probabilities, line movement and the no-vig consensus for dozens of sports, including niches (esports, darts, handball, volleyball) that general odds APIs skip
- **Esports, MMA and darts data** — results, finishes and odds in the same format as the big sports
- **Research and journalism** — how often favourites win, home advantage per sport, market efficiency in smaller leagues

### How to use it

1. Pick the **sports**, the days (up to 7 back and 7 ahead) and the statuses; optionally filter countries or competitions.
2. Choose the **markets** (winner, handicap, total) or turn odds off for pure scores.
3. Click **Start**. Download JSON, CSV or Excel, or read the dataset through the Apify API.

**Live scoreboard tip:** statuses `["live"]`, `daysBack: 0`, *Only new or changed matches* on, and a [Schedule](https://docs.apify.com/platform/schedules) every 5 minutes.

#### Input example — yesterday's results with closing odds in four sports

```json
{
  "sports": ["basketball", "volleyball", "handball", "esports"],
  "statuses": ["finished"],
  "daysBack": 1,
  "markets": ["winner", "total"]
}
```

#### Input example — live scores every few minutes, only changes

```json
{
  "sports": ["soccer", "basketball", "hockey", "tennis"],
  "statuses": ["live", "finished"],
  "daysBack": 0,
  "incremental": true,
  "includeOdds": false
}
```

#### Input example — full seasons

```json
{
  "mode": "seasons",
  "leagues": ["Handball: Europe: Champions League", "Darts: World: PDC World Championship", "IPL"],
  "lastSeasons": 2,
  "markets": ["winner", "handicap", "total"]
}
```

Leagues are written as `Sport: Country: League` as on Flashscore, as a short name (NBA, NHL, EPL, IPL, AFL, NRL) or as the league's Flashscore URL. MMA, boxing and esports are covered in recent mode.

#### Output example (shortened, a real match)

```json
{
  "sport": "handball",
  "startTime": "2026-09-26T03:00:00Z",
  "country": "Asia",
  "competitionFull": "ASIA: Asian Games - Play Offs",
  "homeTeam": "Japan",
  "awayTeam": "Kuwait",
  "status": "finished",
  "score": "37-32",
  "periods": [[23, 12], [14, 20]],
  "winner": "home",
  "consensus": {
    "bookmakerCount": 23,
    "winnerMarket": "3-way",
    "probHomeLast": 0.3849,
    "probDrawLast": 0.1177,
    "probAwayLast": 0.4974,
    "fairHomeOdds": 2.598,
    "fairDrawOdds": 8.498,
    "fairAwayOdds": 2.011,
    "totalLine": 56.5,
    "probOverLast": 0.5135
  },
  "odds": {
    "threeWay": [
      {"bookmaker": "1xBet", "opening1": 2.42, "openingX": 6.79, "opening2": 1.88, "last1": 2.23, "lastX": 8.6, "last2": 1.89, "marginPct": 9.38}
    ]
  }
}
```

An MMA fight looks like `"score": null, "winner": "home", "method": "TKO", "endRound": 3`; a volleyball match carries the sets in `score` (`"3-1"`) and the points of each set in `periods`.

### Pricing

⏱️ **Free until 11 October 2026** — during the launch period you only pay Apify's platform usage, typically well under $0.01 per run.

**From 12 October 2026 you pay per match saved — platform usage included**, nothing else:

| Apify plan | Price per 1,000 matches |
|---|---|
| Free | $3.00 |
| Starter | $2.70 |
| Scale | $2.40 |
| Business and higher | $2.10 |

💡 On Apify's free plan the monthly $5 credit covers about **1,600 matches** with odds. Nothing is charged for matches you filter out; with *Only new or changed matches* repeat runs pay only for new data. Set a spending limit on the run for a hard cap — the Actor stops as soon as it is reached.

### FAQ

**Which "winner" market do I get?** In sports where a draw is a normal result (football, handball, ice hockey, rugby, futsal, field hockey, water polo, floorball, boxing) the 3-way market on regulation time; everywhere else the 2-way winner market, including overtime where the sport has it. Ice hockey also gets the 2-way market including overtime and shoot-out.

**Are live scores real time?** They are as fresh as the Flashscore scoreboard at the moment of the run. Schedule the Actor every few minutes for a live feed; with *Only new or changed matches* each run is quick and cheap.

**What is the "closing line"?** The last price before the match starts. For finished and live matches the `last…` fields are the closing odds; for scheduled matches they are the current prices.

**How is the consensus calculated?** The margin of each bookmaker is removed proportionally, then the median is taken across bookmaker brands (each brand once, however many licences it has).

**Which time zone?** All timestamps are UTC.

**Where does the data come from?** From publicly available match and odds information shown on Flashscore. This Actor is not affiliated with Flashscore or any bookmaker.

### More from Min Maxxxer

- ⚽ [Football Odds Scraper](https://apify.com/sports-odds-lab/football-odds-results) — 1,000+ competitions, 1X2, over/under, BTTS and Asian handicap, xG and goal events, seasons back to 2005
- 🎾 [Tennis Scraper: Live Scores, Results & Odds](https://apify.com/sports-odds-lab/tennis-odds-results) — every ATP, WTA, Challenger and ITF match, rankings, point-by-point, odds back to 2009
- 🏀 [NBA, NFL, MLB & NHL Odds](https://apify.com/sports-odds-lab/nba-nfl-mlb-nhl-odds) — moneyline, spread and total history back to 2009, DraftKings, FanDuel, BetMGM
- 📊 [Polymarket & Kalshi Scraper](https://apify.com/sports-odds-lab/polymarket-kalshi-odds) — prediction market odds, price history and results, full Kalshi archive since 2021

⭐ **Did this Actor save you time?** A short review on this page helps others find it — and tells us what to build next.

### Changelog

- **0.1** — first release: 24 sports, recent and live matches (7 days back to 7 ahead) and full seasons, winner (3-way / 2-way), handicap and total odds from up to 40 bookmakers with a no-vig consensus, period scores, MMA/boxing finishes, statistics, incremental mode for schedules.
- 📋 [ESPN Scraper: Box Scores & Player Stats](https://apify.com/sports-odds-lab/espn-scraper) — every player's box score and every game's score from ESPN for NFL, NBA, MLB, NHL, WNBA, college sports and soccer, whole seasons included

# Actor input Schema

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

Recent: every match of the chosen sports in a window of days, live ones included. Full seasons: complete past or current seasons of chosen leagues.

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

Sports to include in recent mode (full seasons take the sport from the league).

## `statuses` (type: `array`):

Finished includes walkovers and awarded matches. Other = cancelled, postponed or abandoned.

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

How many past days to include (0 = today only). The daily feed reaches 7 days back. Values above 7 are clamped to 7.

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

How many upcoming days to include, with current odds. Values above 7 are clamped to 7.

## `countries` (type: `array`):

Only these countries (or categories, as Flashscore names them for individual sports), e.g. 'Spain', 'Europe', 'World'. Leave empty for all.

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

Only these competitions, as 'Country: Competition' (e.g. 'Spain: ACB', 'Europe: Euroleague') or just the name. Leave empty for all.

## `includeWomen` (type: `boolean`):

Include women's leagues and tournaments.

## `includeYouth` (type: `boolean`):

Include U21/U19/U18, junior, reserve and academy competitions.

## `seasonTypes` (type: `array`):

Regular season and play-offs by default; add pre-season and all-star games if you need them.

## `incremental` (type: `boolean`):

For runs every few minutes: skip finished, live and cancelled matches whose score and status have not changed since an earlier run with the same settings — faster, and you pay only for new data. Upcoming matches are always refreshed because their odds keep moving. The memory lives in a key-value store 'flashscore-scraper-incremental' in your account.

## `incrementalName` (type: `string`):

Optional name for the incremental memory, to keep several schedules apart or start fresh (a new name = a new memory). Empty = one memory per combination of settings.

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

Leagues as 'Sport: Country: League' (e.g. 'Handball: Europe: Champions League', 'Basketball: Spain: ACB', 'Rugby Union: Europe: Six Nations', 'Darts: World: PDC World Championship'), a short name (NBA, NHL, EPL, IPL, AFL, NRL) or the league's Flashscore URL. MMA, boxing and esports are covered in recent mode only.

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

Seasons to download, e.g. '2024-2025' or '2024'. Leave empty to use Last seasons.

## `lastSeasons` (type: `integer`):

When no seasons are listed: the latest N seasons of each league.

## `includeOdds` (type: `boolean`):

Opening and closing odds from every bookmaker that priced the match (up to ~40), with a no-vig consensus.

## `markets` (type: `array`):

Winner = 3-way (home, draw, away) in sports with draws, 2-way elsewhere (including overtime where it exists). Handicap and total come with the market's main line.

## `handicapLines` (type: `string`):

Only each bookmaker's main handicap line, or every line it quotes.

## `totalLines` (type: `string`):

Only each bookmaker's main total line, or every line it quotes.

## `bookmakers` (type: `array`):

Limit odds to these bookmakers (name contains, e.g. 'bet365', 'betano'). Leave empty for all.

## `onlyWithOdds` (type: `boolean`):

Only save matches that at least one bookmaker priced (you pay only for those).

## `oddsFormat` (type: `string`):

Format of the odds in the output.

## `includeStats` (type: `boolean`):

Match statistics of finished and live matches (whatever the sport has: shots, aces, rebounds, kills …). One extra request per match.

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

Stop after this many matches (0 = no limit).

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

How many requests run at once (the code caps it at 32).

## Actor input object example

```json
{
  "mode": "recent",
  "sports": [
    "basketball",
    "volleyball",
    "handball",
    "esports"
  ],
  "statuses": [
    "finished"
  ],
  "daysBack": 1,
  "daysAhead": 0,
  "includeWomen": true,
  "includeYouth": true,
  "seasonTypes": [
    "regular",
    "postseason"
  ],
  "incremental": false,
  "leagues": [
    "Handball: Europe: Champions League"
  ],
  "lastSeasons": 1,
  "includeOdds": true,
  "markets": [
    "winner",
    "total"
  ],
  "handicapLines": "main",
  "totalLines": "main",
  "onlyWithOdds": false,
  "oddsFormat": "decimal",
  "includeStats": false,
  "maxMatches": 30,
  "concurrency": 16
}
```

# Actor output Schema

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

One row per match: sport, competition, teams, score, winner and the no-vig consensus.

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

Full records including periods, every bookmaker's odds and statistics.

# 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": "recent",
    "sports": [
        "basketball",
        "volleyball",
        "handball",
        "esports"
    ],
    "statuses": [
        "finished"
    ],
    "daysBack": 1,
    "leagues": [
        "Handball: Europe: Champions League"
    ],
    "maxMatches": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("sports-odds-lab/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": "recent",
    "sports": [
        "basketball",
        "volleyball",
        "handball",
        "esports",
    ],
    "statuses": ["finished"],
    "daysBack": 1,
    "leagues": ["Handball: Europe: Champions League"],
    "maxMatches": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("sports-odds-lab/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": "recent",
  "sports": [
    "basketball",
    "volleyball",
    "handball",
    "esports"
  ],
  "statuses": [
    "finished"
  ],
  "daysBack": 1,
  "leagues": [
    "Handball: Europe: Champions League"
  ],
  "maxMatches": 30
}' |
apify call sports-odds-lab/flashscore-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sports-odds-lab/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/0FzLaZ0traEs1cJpX/builds/N7N5rpks1271qXYab/openapi.json
