# Soccer League Results and Standings Scraper (`parselab/soccer-league-results-standings-scraper`) Actor

Get soccer results, league tables at any matchday, team form, head to head records, scorers, cards and referee stats for 40+ leagues since 2010-11. Premier League, La Liga, Bundesliga, Serie A and more with derived stats. Export to CSV or Excel.

- **URL**: https://apify.com/parselab/soccer-league-results-standings-scraper.md
- **Developed by:** [ParseLab](https://apify.com/parselab) (community)
- **Categories:** Sports, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.38 / 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

## Soccer League Results and Standings Scraper

Get soccer results, league tables, team form, head to head records, goal scorers, cards and referee statistics for more than 40 leagues, from the Premier League and La Liga to the Bundesliga, Serie A, Ligue 1, the Brazilian Serie A and MLS. Every season since 2010-11 is available, and the current season is updated as results come in. Export the data to CSV or Excel, or feed it straight into your own model.

The raw results are free and open, but they are scattered across hundreds of files with different team names, no table, no form and no statistics. This Actor reads them, cleans the team names, and adds the numbers analysts normally calculate by hand: the table before every match, the last five results of both teams, goals per game, both teams to score rates, comebacks, streaks and more.

### What can you do with this soccer data scraper?

- Download all Premier League results for the 2025-26 season with scores, half-time scores, scorers and attendance.
- Build the league table as it stood on any date or after any matchday, for the full table, the home table or the away table.
- Find every Bundesliga match with four or more goals since 2010.
- See how a team does at home against away, how often it wins after leading at half-time, and how often it scores in the second half.
- Compare two teams over all their meetings: wins, draws, goals, last five results and the biggest win of each side.
- Rank players by goals, minutes played, goals per 90 minutes, penalties, braces, hat-tricks and cards.
- Compare referees by cards per match, red card rate, penalty goals and home win rate.
- Get one summary row per league and season: goals per match, home win rate, draw rate, champion, best attack and best defence.
- Collect upcoming fixtures with the form and table position of both teams before kick-off.

### Which leagues and seasons are covered?

England (Premier League, Championship, League One, League Two), Spain (La Liga, La Liga 2), Germany (Bundesliga, 2. Bundesliga, 3. Liga, DFB-Pokal), Italy (Serie A, Serie B), France (Ligue 1, Ligue 2), Netherlands, Portugal, Belgium, Scotland, Turkey, Greece, Austria, Switzerland, Czech Republic, Hungary, Russia, Mexico, Australia, Argentina, Brazil (Serie A and B), Colombia, China, Japan, MLS, the UEFA Champions League and the Copa Libertadores. Some older seasons have fewer leagues than recent ones, and the Actor tells you when a combination has no data.

### Seven ways to collect data

| Mode | One row is | Best for |
|---|---|---|
| Matches and results | one match | datasets, betting models, fixtures, scorers |
| League table (standings) | one team in one table | tables at any date, home and away tables |
| Team statistics | one team, or one team per season | form, goal rates, home and away splits |
| Head to head | one pair of teams | rivalries, previews, trend articles |
| Player statistics | one player | scorers, minutes, cards (detailed leagues) |
| Referee statistics | one referee | card and penalty tendencies (detailed leagues) |
| League season summaries | one league and season | comparing leagues and eras |

### What data do you get for every match?

- League, country, division, season, round and matchday number.
- Date, weekday, kick-off time, time zone and kick-off in UTC when the time zone is known.
- Home and away team with a clean name and a stable team ID.
- Full-time score, half-time score, second-half goals, result (H, D or A), winner and points won.
- Total goals, goal difference, both teams to score, over 1.5, 2.5 and 3.5 goals, clean sheets.
- Comeback flag: none, draw from behind or turned around.
- Table position of both teams before the match, points before the match and last five results of each side.
- Goals per game scored and conceded by both teams so far in the season.
- Venue, attendance, referee and assistants, scorers with minutes, penalties and own goals, yellow and red cards, captains and substitution counts. These come from the detailed files, which exist for the Premier League, the Bundesliga and the Austrian Bundesliga 2025-26.

### Example input

```
{
  "mode": "matches",
  "leagues": ["en.1"],
  "seasons": ["2025-26"],
  "teams": ["Liverpool"],
  "maxItems": 3
}
```

### Example output

```
{
  "matchId": "en.1|2025-26|2026-05-24|liverpool|brentford",
  "leagueCode": "en.1",
  "league": "Premier League",
  "season": "2025-26",
  "date": "2026-05-24",
  "homeTeam": "Liverpool",
  "awayTeam": "Brentford",
  "scoreline": "1-1",
  "result": "D",
  "totalGoals": 2,
  "bothTeamsScored": true,
  "homePositionBefore": 5,
  "awayPositionBefore": 9,
  "homeFormBefore": "WWLDL",
  "awayFormBefore": "DLWLD",
  "scorersText": "Curtis Jones 58', Kevin Schade 64'",
  "referee": "Darren England",
  "attendance": 60325
}
```

A standings row from the same season looks like this: Arsenal, position 1, 36 played, 83 points, goal difference 44, last five results WWWWW, a current streak of W5 and a home points per game of 2.56.

### How do I build a league table at a past date?

Choose the standings mode, pick the league and season, and fill in either a date or a matchday. The table uses only matches played up to that point. Ties are broken by goal difference, then goals scored, then team name. Each row also shows points behind the leader, the gap to the next team, the last five results and the longest winning, unbeaten and losing runs.

### How do the player and referee modes work?

They read the detailed match files, which list scorers, cards, line-ups and referees. At the moment those files exist for the Premier League, the Bundesliga and the Austrian Bundesliga in 2025-26. Minutes played are calculated from starting line-ups, substitution minutes and red cards. Stoppage time is not counted, so a full match is 90 minutes. A player who scored twice in a match counts as a brace, three goals as a hat-trick.

### Frequently asked questions

**Where does the data come from?**
The openfootball project, a public domain collection of match results maintained by volunteers. It is free to use for any purpose.

**Does it include betting odds or expected goals?**
No. This Actor covers results, tables, scorers, cards and the statistics derived from them. If you need bookmaker odds or expected goals, use a dedicated odds scraper next to it.

**How current is the data?**
The files are updated by volunteers, usually within days of a matchday. A match with status scheduled has no result in the source yet, even when its date has passed.

**Are team names the same across seasons?**
Names are cleaned (FC, AFC and CF are removed) and turned into a team ID, so Liverpool FC and Liverpool are the same team. A few clubs were renamed by the source over the years and may appear under two names.

**How many results can I get for free?**
A free account returns up to 10 rows per run. Paid accounts can return up to one million rows.

### Limits

- Player, card and referee data exist only for the leagues named above, and only for 2025-26.
- Tables are computed from match results. Points deductions and special tie-break rules, such as head to head in Spain and Italy, are not applied.
- Leagues with split seasons or conferences (Liga MX, Argentina, Colombia, MLS) and cups have no single table, so the standings mode skips them.

# Actor input Schema

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000.

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

Matches gives one row per match with scores, scorers, cards and pre-match table position. Standings builds the league table at any date or matchday. Team stats gives one row per team with form, home and away splits, goal and card rates. Head to head compares two teams across all their meetings. Players and referees need the detailed match files (Premier League, Bundesliga and Austrian Bundesliga 2025-26). League seasons gives one summary row per league and season.

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

League codes to read. Leave empty to use the default for the chosen mode (the Premier League for most modes). You can mix countries and divisions.

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

Seasons to read, for example 2025-26 or just 2025. Use all for every season available (2010-11 onward), or leave empty for the current season. Calendar year leagues such as Brazil, Japan and MLS use the year, for example 2025.

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

Keep only these teams. Part of a name is enough, for example Arsenal, Bayern or Real Madrid. Club suffixes such as FC are ignored.

## `teamSide` (type: `string`):

When teams are given, keep matches where the team plays at home, away or either.

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

Finished matches only, upcoming fixtures only, or both. Used in the matches mode.

## `result` (type: `string`):

Keep only home wins, draws or away wins. Used in the matches mode.

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

Keep matches on or after this date, format YYYY-MM-DD.

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

Keep matches on or before this date, format YYYY-MM-DD.

## `matchdayFrom` (type: `integer`):

First matchday to keep (league matches only).

## `matchdayTo` (type: `integer`):

Last matchday to keep (league matches only).

## `minTotalGoals` (type: `integer`):

Keep finished matches with at least this many goals, for example 4.

## `maxTotalGoals` (type: `integer`):

Keep finished matches with at most this many goals, for example 1.

## `includeLineups` (type: `boolean`):

Add starters, bench and substitutions to every match row when the detailed file exists. Makes rows much larger.

## `sortOrder` (type: `string`):

Newest matches first or oldest first.

## `table` (type: `string`):

Standings mode: full table, home matches only or away matches only.

## `asOfDate` (type: `string`):

Standings mode: build the table using only matches played on or before this date, format YYYY-MM-DD.

## `asOfMatchday` (type: `integer`):

Standings mode: build the table after this matchday.

## `groupBy` (type: `string`):

Team statistics: team over all selected seasons or team per season. Players: player over all seasons or player per team and season. Referees: referee over all seasons or per season. Leave empty for the default of the mode.

## `matchPairs` (type: `array`):

Pairs written as Team A vs Team B, for example Arsenal vs Chelsea. One row per pair is returned. Without seasons or leagues the pair is searched in the big European leagues and the Champions League since 2010-11.

## `playerNames` (type: `array`):

Players mode: keep only these players. Part of a name is enough, for example Haaland or Kane.

## `minMinutes` (type: `integer`):

Players mode: skip players with fewer minutes.

## `minGoals` (type: `integer`):

Players mode: skip players with fewer goals.

## `minMatches` (type: `integer`):

Team statistics and referees: skip rows with fewer matches.

## Actor input object example

```json
{
  "maxItems": 10,
  "mode": "matches",
  "leagues": [
    "en.1"
  ],
  "seasons": [
    "2025-26"
  ],
  "teamSide": "any",
  "status": "finished",
  "result": "any",
  "includeLineups": false,
  "sortOrder": "newestFirst",
  "table": "all",
  "groupBy": "",
  "matchPairs": [
    "Arsenal vs Chelsea"
  ]
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "leagues": [
        "en.1"
    ],
    "seasons": [
        "2025-26"
    ],
    "matchPairs": [
        "Arsenal vs Chelsea"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("parselab/soccer-league-results-standings-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 = {
    "maxItems": 10,
    "leagues": ["en.1"],
    "seasons": ["2025-26"],
    "matchPairs": ["Arsenal vs Chelsea"],
}

# Run the Actor and wait for it to finish
run = client.actor("parselab/soccer-league-results-standings-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 '{
  "maxItems": 10,
  "leagues": [
    "en.1"
  ],
  "seasons": [
    "2025-26"
  ],
  "matchPairs": [
    "Arsenal vs Chelsea"
  ]
}' |
apify call parselab/soccer-league-results-standings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parselab/soccer-league-results-standings-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/Pk3pLtZa81Ow5PA3g/builds/pvwvc3tFaehJEqylI/openapi.json
