# LoL Esports Scraper: LEC LCK LPL MSI Worlds Results, Standings (`getascraper/lol-esports-scraper`) Actor

Get League of Legends esports schedules, results, and standings for LEC, LCK, LPL, MSI, and Worlds as clean structured rows, not raw HTML. Sourced from Liquipedia, no login, API key, or account needed. Billed per match record retrieved. Monitor mode flags new and changed results as they post.

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

## Pricing

from $0.34 / 1,000 match records

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🎮 LoL Esports Scraper: LEC LCK LPL MSI Worlds Results, Standings

<table width="100%"><tr><td style="padding:24px 28px;background:#EEF5FF;border:1px solid #B8D5FA;border-top:4px solid #1D4ED8;border-radius:12px"><span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Every match, score, and table position, without an API key</span><br><span style="font-size:15px;color:#475569;line-height:1.6">Pull the League of Legends schedule, final results, and league standings for LEC, LCK, LPL, LTA, MSI, and Worlds, straight from the community-maintained Liquipedia wiki. No account, no developer key, no login wall.</span></td></tr></table>

<table width="100%"><tr><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D5FA;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1D4ED8">🔑 No key needed</span><br><span style="font-size:12px;color:#475569">Runs against a fully public data source. Nothing to register for, nothing that can get revoked.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D5FA;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1D4ED8">🏆 Every major league</span><br><span style="font-size:12px;color:#475569">LEC, LCK, LPL, the LCS-successor LTA, MSI, and Worlds, plus any older season you point it at.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D5FA;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1D4ED8">📊 Real fields, not markup</span><br><span style="font-size:12px;color:#475569">Team names, scores, dates, and table position as clean columns, never a raw HTML dump.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D5FA;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#1D4ED8">🔁 Built to track a season</span><br><span style="font-size:12px;color:#475569">Turn on monitor mode and only see the matches or table changes that are actually new.</span></td></tr></table>

LoL Esports Scraper reads live schedule, results, and standings pages from [Liquipedia's League of Legends wiki](https://liquipedia.net/leagueoflegends/). Run it once for a full snapshot before you build a bracket or a fantasy lineup, or put it on a schedule to catch new results and standings changes as a split plays out.

### 🎯 What this Actor does

Fantasy esports players and betting researchers use it to pull a league's current table and upcoming fixtures without refreshing a wiki page by hand every morning. Esports news sites and fan community bots use it to publish a schedule or results widget that updates itself on a schedule instead of someone copying scores into a spreadsheet. Analytics hobbyists use it as a clean, structured feed for their own stats or Discord bot, without registering for a developer program or juggling a key that can expire or get revoked.

**Every match comes back with both teams, the final score and winner once it's played, the stage or week it belongs to, and the match date.** The league table comes back separately, with each team's rank, match record, game record, and game differential. Turn on monitor mode to only get the matches or standings rows that are new or changed since your last run.

### 🚀 How to use it

<table width="100%"><tr><td style="padding:16px 14px;width:33%;background:#EEF5FF;border:1px solid #B8D5FA;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1D4ED8;letter-spacing:1px">STEP 1</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Pick a league or season</span><br><span style="font-size:12px;color:#475569">Choose a current league from the list, or paste any other Liquipedia page path for an older season or a region not listed.</span></td><td style="padding:16px 14px;width:33%;background:#EEF5FF;border:1px solid #B8D5FA;border-left:none;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1D4ED8;letter-spacing:1px">STEP 2</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Run it once, or schedule it</span><br><span style="font-size:12px;color:#475569">Turn on monitor mode and add an Apify schedule to track a league across a whole split or season.</span></td><td style="padding:16px 14px;width:33%;background:#EEF5FF;border:1px solid #B8D5FA;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1D4ED8;letter-spacing:1px">STEP 3</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Get matches and standings</span><br><span style="font-size:12px;color:#475569">Two clean tables land in your run: schedule and results, and the league standings, ready to export or connect to your app.</span></td></tr></table>

### 🧩 Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| League / Tournament | enum | No | A current League of Legends league or tournament to pull, picked from a starting list of real 2026 leagues. |
| Custom Page Path | string | No | Override with any exact Liquipedia League of Legends page path: an older season, a region not listed above, or a specific stage. Takes priority over the league picker when filled in. |
| Max Matches | integer | No | The most schedule and results rows to return in one run. |
| Max Standings Rows | integer | No | The most standings rows to return in one run. |
| Monitor Mode | boolean | No | Only output matches and standings rows that are new or changed since the last run, instead of the full table every time. |
| Monitor State Name | string | No | A label for this monitor's saved progress. Use a different name per league if you schedule more than one. |
| Proxy Configuration | object | No | Standard Apify proxy settings. The default works fine for this Actor. |

### 📤 Output

This Actor returns two tables. Schedule and results share one shape:

```json
{
  "stage": "Week 1",
  "team1": "GIANTX",
  "team2": "Fnatic",
  "score1": 2,
  "score2": 1,
  "winner": "GIANTX",
  "completed": true,
  "date": "2026-03-28T13:00:00.000Z"
}
```

Standings are a separate table, one row per team:

```json
{
  "stage": "Regular Season",
  "rank": 1,
  "team": "Natus Vincere",
  "matchWins": 8,
  "matchLosses": 1,
  "gameWins": 17,
  "gameLosses": 7,
  "gameDiff": 10
}
```

You can download either table in JSON, CSV, Excel, or other formats from the run's Output tab.

### 📋 Data table

**Schedule & Results**

| Field | Type | Description |
| --- | --- | --- |
| stage | string | The week, round, or stage the match belongs to. |
| team1 | string | The first team's name. |
| team2 | string | The second team's name. |
| score1 | integer | Games won by team1, once the match has been played. |
| score2 | integer | Games won by team2, once the match has been played. |
| winner | string | The winning team's name, once the match has been played. |
| completed | boolean | Whether the match has been played yet. |
| date | string | The match date and time, in ISO format. |
| changeType | string | `NEW` or `UPDATED`, only present when monitor mode is on. |

**Standings**

| Field | Type | Description |
| --- | --- | --- |
| stage | string | The stage or group this standings row belongs to. |
| rank | integer | The team's current table position. |
| team | string | The team's name. |
| matchWins | integer | Match wins in the current stage. |
| matchLosses | integer | Match losses in the current stage. |
| gameWins | integer | Individual games won. |
| gameLosses | integer | Individual games lost. |
| gameDiff | integer | Game wins minus game losses. |
| changeType | string | `NEW` or `UPDATED`, only present when monitor mode is on. |

### 💰 Pricing

This Actor uses Apify's pay-per-event pricing, billed per match schedule/result row retrieved. There's no run-start fee. An empty run, or a league with nothing new to report in monitor mode, costs nothing, and there are no subscriptions. Standings rows are currently included alongside your match rows at no extra charge. Exact per-event pricing is shown on this Store listing before you run it.

### ⭐ Enjoying LoL Esports Scraper?

<table width="100%" style="display:table;width:100%"><tr><td style="padding:20px 24px 14px;background:#EEF5FF;border:1px solid #B8D5FA;border-left:5px solid #1D4ED8;border-radius:10px 10px 0 0"><span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br><span style="font-size:17px;font-weight:800;color:#1C1917">If this saved you from copying scores off a wiki page by hand, that's worth a rating.</span><br><span style="font-size:14px;color:#475569">Your feedback tells us which leagues and views to add next.</span></td></tr><tr><td style="padding:0;background:#1D4ED8;border:1px solid #B8D5FA;border-top:none;border-radius:0 0 10px 10px;text-align:center"><a href="https://apify.com/getascraper/lol-esports-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a></td></tr></table>

### ❓ FAQ

#### Which League of Legends leagues does this cover?

LEC (Europe), LCK (Korea), LPL (China), the LCS-successor LTA (Americas), MSI, and Worlds, along with any older season or region you can find on Liquipedia's League of Legends wiki.

#### Do I need a Riot Games or LoL Esports API key?

No. This Actor never uses lolesports.com's official API or any other API key, account, or login. It reads Liquipedia's public wiki pages, which are freely available to anyone.

#### Can I track a season without pulling the whole schedule every time?

Yes. Turn on monitor mode and put this Actor on an Apify schedule. Each run only returns matches whose result just got posted, or standings rows whose position or record changed, since the previous run with the same monitor state name.

#### Where does this data come from, and can I trust it?

From [Liquipedia](https://liquipedia.net/leagueoflegends/), a community-maintained esports wiki used across the League of Legends scene for schedules, results, and statistics. Content is licensed under CC-BY-SA; this Actor credits Liquipedia as the source of every row it returns.

### 🔗 Other actors

- [SofaScore Scraper: Live scores, stats and fixtures](https://apify.com/getascraper/sofascore-live-events-scraper) ↗ - Live scores, fixtures, and match statistics across 13 sports.
- [Tennis Live Scores Scraper: ATP, WTA, Sets & Stats](https://apify.com/getascraper/tennis-live-scores-scraper) ↗ - Live and completed tennis match scores by set.
- [VegasInsider Odds Scraper: NFL, NBA, MLB & More Betting Lines](https://apify.com/getascraper/vegasinsider-odds-scraper) ↗ - Spread, total, and moneyline odds across major US sportsbooks.
- [Betano Odds Scraper: Full Match Odds & Price-Move Monitor](https://apify.com/getascraper/betano-odds-scraper) ↗ - Full match odds boards with line-move monitoring.
- [ESPN News Monitor: Keyword Alerts](https://apify.com/getascraper/espn-news-monitor) ↗ - Track public ESPN articles about teams, athletes, and leagues.

# Actor input Schema

## `league` (type: `string`):

Pick a current 2026 League of Legends league or tournament page to pull. This list is a helpful starting point, not the full catalog, so you can also type any other page name you find on liquipedia.net/leagueoflegends. Riot renames and restructures regional leagues from time to time (LCS became LTA in 2025), so if a league you follow is missing or looks outdated, search for its current Liquipedia page and paste the exact path into the Custom Page Path override below instead.

## `customPagePath` (type: `string`):

Override the League / Tournament selection above with any exact Liquipedia League of Legends page path, for example an older season, a region not listed above, or a specific stage subpage such as "LEC/2026/Spring/Regular Season". When this is filled in, it is used instead of the League / Tournament selector.

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

The most schedule and results rows (combined) to return in one run. A single league stage typically has 20-60 matches, so this mainly protects against unusually large pages.

## `maxStandingsRows` (type: `integer`):

The most standings rows to return in one run. A league table is usually 8-12 teams, so this comfortably covers a full table with headroom.

## `onlyNewOrChanged` (type: `boolean`):

When on, this run only outputs matches and standings rows that are new or changed since the last run (for example, a final score just got posted, or a team's standings position moved), instead of the full schedule and table every time. Turn this on when you schedule this Actor to track a league across a season.

## `stateName` (type: `string`):

A label for this monitor's saved progress. Only matters when Monitor Mode is on. Use a different name for each league or task you schedule, so their tracked progress does not overwrite each other.

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

Liquipedia's public data API does not require or benefit from residential IPs, so the default Apify datacenter proxy is the right choice here.

## Actor input object example

```json
{
  "league": "LEC/2026/Spring",
  "customPagePath": "",
  "maxMatches": 25,
  "maxStandingsRows": 25,
  "onlyNewOrChanged": false,
  "stateName": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `matches` (type: `string`):

Upcoming and completed matches for the selected league/tournament.

## `standings` (type: `string`):

Current standings for the selected league/tournament.

# 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 = {
    "league": "LEC/2026/Spring",
    "customPagePath": "",
    "maxMatches": 25,
    "maxStandingsRows": 25,
    "onlyNewOrChanged": false,
    "stateName": "default",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/lol-esports-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 = {
    "league": "LEC/2026/Spring",
    "customPagePath": "",
    "maxMatches": 25,
    "maxStandingsRows": 25,
    "onlyNewOrChanged": False,
    "stateName": "default",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/lol-esports-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 '{
  "league": "LEC/2026/Spring",
  "customPagePath": "",
  "maxMatches": 25,
  "maxStandingsRows": 25,
  "onlyNewOrChanged": false,
  "stateName": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/lol-esports-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/lol-esports-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/LwjxrfVgaqf9fQEwD/builds/tCIByYltGMmZPcyaq/openapi.json
