# Liquipedia Scraper: Esports Teams, Players & Tournaments (`recordsdata/liquipedia-esports-scraper`) Actor

Scrape Liquipedia esports wikis (Dota 2, CS, Valorant, LoL + 14 more): full-text search, category listings and page details with parsed infobox fields for teams, players and tournaments. Export CSV, Excel, JSON, XML. No login or API key. 18 game wikis from one input.

- **URL**: https://apify.com/recordsdata/liquipedia-esports-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** Games, Sports
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3" alt="RecordsData" width="100%" />
</p>

> **Liquipedia Scraper** by RecordsData extracts esports data from Liquipedia across **63 game wikis**: search hits, category listings, full pages with the infobox parsed into columns, and typed rows for **prizes, participating teams, matches, team rosters with join and leave dates, player team history, player transfers and playoff brackets**. An "Only new or changed pages" mode returns just the pages with a new revision. Every row carries `revisionId` and the CC-BY-SA 3.0 license. No login, no API key. Export CSV, Excel, JSON or XML. Page rows cost $17 per 1,000, search and category rows $10 per 1,000, and typed rows $2 per 1,000. Updated 2026-10-11.

Liquipedia is the reference encyclopedia for competitive gaming, but its data sits inside wikitext templates. This Liquipedia scraper calls the official MediaWiki API at the rate Liquipedia asks for (one request per 2 seconds), parses each page's infobox, and reads the prize, match, roster, transfer and bracket templates into flat rows.Typed rows work best on Counter-Strike, Rocket League, Overwatch and StarCraft II, and have limits on Dota 2, Valorant and League of Legends (below).

### 🔎 What does Liquipedia Scraper do?

- **Search by keyword or list a category** such as Tournaments, Players or Teams, one row per page.
- **Scrape pages with parsed infobox data**: exact page titles in, structured fields out plus the full `infobox` object. Redirects are followed.
- **Extract typed rows** (`extractRecords`): prizes, participants, matches, rosters, team history, transfers and brackets.
- **Any of 63 game wikis**, including Dota 2, Counter-Strike, Valorant and League of Legends.
- **Monitor changes**: `onlyNew` returns only new or updated pages, with `changeType` on each row. Skipped pages are free.
- **Filter and follow**: `entityTypes` keeps one kind of page; `includeSubpages` fetches sub-pages.

### 📋 What data can you extract from Liquipedia?

Every row has a `recordType`: `search-result`, `category-member`, `page`, `prize`, `participant`, `match`, `roster`, `team-history`, `transfer` or `bracket`.

| Group | Fields |
|---|---|
| Every row | `recordType`, `wiki`, `title`, `pageId`, `revisionId`, `url`, `license`, `licenseUrl`, `scrapedAt` |
| Search and category rows | `snippet`, `wordCount`, `category`, `sizeBytes`, `lastEdited` |
| Page rows | `entityType`, `infoboxType`, `infobox`, `categories`, `changeType`, `wikitext` (optional), plus infobox columns such as `startDate`, `prizePoolUsd`, `tier`, `organizer`, `country`, `currentTeam` |
| Prize rows | `place`, `participant`, `prizeUsd`, `prizeLocal`, `currency`, `points`, `percentage`, `qualifier` |
| Participant rows | `participant`, `players`, `coaches` |
| Match rows | `matchId`, `matchDate`, `opponent1`, `opponent2`, `opponent1Name`, `opponent2Name`, `score1`, `score2`, `winner`, `bestOf` |
| Roster and team-history rows | `team`, `player`, `position`, `role`, `rosterStatus`, `staff`, `captain`, `joinDate`, `leaveDate` |
| Transfer rows | `transferDate`, `fromTeam`, `fromRole`, `toTeam`, `toRole`, `players`, `references` |
| Bracket rows | `bracketId`, `nodeCount`, `decidedCount`, `nodes` (round, opponents, scores, winner) |

The dataset schema has 95 columns. Missing fields are left out. Private-person details such as real name and birth date stay inside the `infobox` object only.

#### Limits of the typed rows

Typed rows are read from the page source, not from Liquipedia's database (LPDB), which needs an approved key.

- **Prizes:** work on most wikis. On Dota 2 The International and some League of Legends events only the `percentage` share is on the page.
- **Rosters and team history:** work on Counter-Strike, Dota 2 team rosters and StarCraft II. Valorant and League of Legends rosters and Dota 2 player team history return the page row only.
- **Matches:** partial.  `opponent1Name` and `opponent2Name` are filled on about 80 percent of rows on Counter-Strike, 55 on Valorant and 20 on Dota 2. `winner` is derived when missing: 98 percent on Counter-Strike. League of Legends gives none.
- **Transfers:** read from archive pages of Dota 2, Counter-Strike, Valorant and League of Legends. `fromTeam` is filled on 69 percent of rows and `toTeam` on 57.
- **Brackets:** only those whose teams are in the page source; empty placeholders are skipped and not billed. Counter-Strike usually has them (8 of 9 on the sample), Dota 2 and Valorant rarely, League of Legends none.
- **Not included:** head-to-head records.

### 🧾 Liquipedia scraper sample output

Shape of a prize row from a tournament page. The values below are illustrative, not copied from a logged run:

```json
{
  "recordType": "prize",
  "wiki": "counterstrike",
  "title": "Intel Extreme Masters/2025/Cologne",
  "url": "https://liquipedia.net/counterstrike/Intel_Extreme_Masters/2025/Cologne",
  "place": "1",
  "participant": "Example Team",
  "prizeUsd": 300000,
  "license": "CC-BY-SA 3.0",
  "scrapedAt": "2026-10-10T08:00:00.000Z"
}
```

### 💰 How much does it cost to scrape Liquipedia?

Pay per event, only for rows saved with real content.

| Event | What is billed | Price per 1,000 (Free plan) | Price per row |
|---|---|---|---|
| page-record | One parsed page | $17.00 | $0.017 |
| search-record | One search hit | $10.00 | $0.01 |
| category-record | One category member | $10.00 | $0.01 |
| typed-record | One typed row | $2.00 | $0.002 |

Paid plans get tier discounts on page rows, down to $13 per 1,000 on Gold and above. Search, category and typed prices are flat on every plan.

Worked examples at Free plan prices: one tournament page with 82 typed rows costs $0.017 + 82 x $0.002 = $0.181. 100 team pages with 10 roster rows each cost $3.70.

**You are not charged for** error rows, pages that do not exist, pages skipped by `entityTypes` or `onlyNew`, empty bracket placeholders, invalid input or searches with zero results.

### 🚀 How to scrape Liquipedia in 3 steps

1. Pick a **wiki** (for example `counterstrike`).
2. Fill **Search query**, **Category listing** or **Page titles**, optionally typed records, and set **Max items**.
3. Click **Start**, then download CSV, Excel, JSON or XML.

### ⚙️ Liquipedia Scraper input

| Field | Type | Default | What it does |
|---|---|---|---|
| wiki | select | dota2 | One of 63 wikis |
| searchQuery | string | The International | Full-text search |
| category | string | empty | List pages in a category |
| pageTitles | array | empty | Exact page titles, up to 5,000 |
| includeSubpages, maxSubpages | boolean, integer | false, 25 | Fetch sub-pages (1 to 200 per title) |
| fetchPageDetails | boolean | false | Full page records for hits |
| entityTypes | array | empty | Keep only tournament, team, player or other pages |
| extractRecords | array | empty | prizes, participants, matches, roster, teamHistory, transfers, brackets |
| includeWikitext | boolean | false | Attach raw wikitext |
| maxItems | integer | 10 | Cap on all rows (free users: 10) |
| onlyNew, stateKey, resetSeen | boolean, string, boolean | false, empty, false | Monitor mode, name, forget memory |

Setting `entityTypes` or `extractRecords` switches on full page records for search and category hits. Example:

```json
{
  "wiki": "counterstrike",
  "searchQuery": "",
  "pageTitles": ["Intel Extreme Masters/2025/Cologne"],
  "extractRecords": ["prizes", "participants", "matches"],
  "maxItems": 200
}
```

With none of search, category or page titles set, the run ends with one free error row.

### 🔔 Monitor Liquipedia for new or changed pages

Turn on `onlyNew` and give the run a `stateKey` such as `daily-ti`. Delivered pages are remembered by id and revision. On the next run with the same input, unchanged pages are skipped and not charged; a new revision comes back as `updated`, a never-seen page as `new`.

### 📤 Liquipedia Scraper output

A search with no results finishes as SUCCEEDED with the message "No results for this query or category. Nothing was charged." If every requested page is missing, the run ends as FAILED.

### ⚖️ Liquipedia scraper vs alternatives

Read on 2026-10-10 from public Store pages:

| | This actor | clintsa/liquipedia-scraper | automation-lab/liquipedia-esports-wiki-scraper |
|---|---|---|---|
| Wikis | 63 | 80+ | 13 named, rest not listed |
| Typed data | prizes, teams, matches, rosters, transfers, brackets | transfers, brackets, matches, head-to-head | event, match, team, player, roster, prize |
| Change tracking | `onlyNew`, new or updated | new, updated, unchanged, removed | none, compare `revisionId` yourself |
| Revision id | on every row | not listed | on every record |
| Price | $17 page, $2 typed per 1,000 | $2 per record + $0.001 per run | $7.60 per record + $0.005 per run |

We are not the cheapest per page: clintsa charges $2 per 1,000 records and also lists head-to-head data, which this actor does not return. Our typed rows cost the same but each page row costs $17. This actor adds revision ids and a license on every row and never bills error or empty rows. parseforge/liquipedia-esports-wiki-scraper lists 24 wikis and $0.016 per result, with no typed rows.

### 💡 Use cases

Tournament prize tables, team rosters over time, transfer tracking, bracket analysis and cross-game analytics.

### 🔌 Run Liquipedia Scraper via API, schedule and integrations

```bash
curl -X POST "https://api.apify.com/v2/acts/RecordsData~liquipedia-esports-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"wiki":"valorant","searchQuery":"","category":"Teams","maxItems":50}'
```

Use the Apify API client, schedule runs, and connect results to Zapier, Make, n8n, Google Sheets or Airbyte.

### 🤖 Liquipedia Scraper MCP server for AI agents (Claude, Cursor, VS Code)

This URL exposes only this actor as a tool in any MCP client:

`https://mcp.apify.com?tools=RecordsData/liquipedia-esports-scraper`

Config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=RecordsData/liquipedia-esports-scraper"
    }
  }
}
```

Example agent prompt: "Use the Liquipedia Scraper on the counterstrike wiki for the page Intel Extreme Masters/2025/Cologne with prizes and participants, then list the top four placements with their prize in USD."

Tool description: Fetches structured esports data from Liquipedia (63 game wikis): search hits, category members, parsed pages and typed prize, match, roster, transfer and bracket rows. Choose it for tournament prizes, rosters with join dates, team infobox fields, or pages changed since the last run. Keep `maxItems` low so agent runs stay cheap.

### 🛡️ Is it legal to scrape Liquipedia?

The actor reads public wiki content through Liquipedia's official MediaWiki API with a descriptive user agent, within the published rate limit. Liquipedia text is CC BY-SA 3.0, so credit Liquipedia when you republish it. It collects no private data and bypasses no login.

### ❓ Frequently asked questions

#### Which page titles work for Liquipedia page records?

Use the exact page titles as they appear on the selected wiki, such as "Team Spirit" or "The International/2025". Redirects are followed, so "PSG.LGD" resolves to the current team page. If you are unsure of the exact titles, run a search or a category listing first.

#### Why does Liquipedia Scraper return 0 results?

The search had no hits, the category name is wrong, the page title does not exist on the selected wiki, or with `onlyNew` every page was already delivered. Check that the wiki matches the game. Empty runs finish successfully and bill nothing at all.

#### What is infoboxType in the Liquipedia data?

It is the template type of the infobox, for example team, player or league. The `entityType` column turns it into tournament, team, player or other, and the `entityTypes` input filters on it before anything is billed, so you never pay for pages of a kind you did not ask for.

#### Why is the Liquipedia Scraper not instant?

Liquipedia's API terms allow one request every 2 seconds, and the actor waits 2.1 seconds between requests. Search returns up to 50 hits and category listings up to 100 members per request, and page titles are fetched ten per request.

#### Can I scrape player, match or standings data from Liquipedia?

Yes, partly. Player and tournament pages work as page rows, and `extractRecords` adds prizes, participants, matches, rosters, team history, transfers and brackets as separate rows. Coverage depends on the wiki, because the data must be in the page source. Head-to-head records are not returned.

#### How many Liquipedia rows can I get on the free plan?

Free plan users get 10 rows per run, shared across all row types. Paid plans allow up to 1,000,000 rows per run. At Free plan prices, a 10-row preview of parsed team pages costs $0.17, which is enough to check the fields and the output format.

#### Will the Liquipedia Scraper stop at my budget?

Yes. When the Max total charge you set on the run is reached, the actor stops cleanly with the message "Stopped at your max charge limit" and keeps every row already saved. The cap translates directly into a maximum row count, since every page, hit and member is its own event.

#### Are error rows billed in Liquipedia Scraper?

No. Error rows, missing pages and pages without an infobox carry no charge. A page title that does not exist returns one free row with `error: "Page not found on this wiki"`. You pay only for rows saved with real content, nothing else.

#### What happens if I send an empty or invalid input to Liquipedia Scraper?

An unknown wiki value is rejected by the platform with a 400 error before any run starts. If you clear `searchQuery`, `category` and `pageTitles` together, the run ends as SUCCEEDED with one free error row (`errorType: invalid-input`). Sending `{}` searches "The International" on the Dota 2 wiki, capped at 10 rows.

#### Which Liquipedia wikis does the scraper support?

It supports 63 wikis, including Dota 2, Counter-Strike, Valorant, League of Legends, Rocket League, Overwatch, StarCraft II, Call of Duty, Hearthstone, Chess and Fortnite. Slugs people guess, such as csgo, cs2 or lol, do not exist on Liquipedia: use `counterstrike` and `leagueoflegends`.

#### How do I get only new or changed Liquipedia pages?

Switch on `onlyNew` and set a `stateKey`. The first run returns every page with `changeType` new. Later runs with the same input skip unchanged pages at no charge and return edited pages as `updated`. Use `resetSeen` to forget the memory. Pages removed from the wiki are not reported.

#### What are the typed prize, match and roster rows, and what are their limits?

They are extra rows read from the page source with `extractRecords`, at $0.002 each. They only exist where Liquipedia puts the data in the page itself, so Dota 2 The International pool amounts and Valorant and League of Legends rosters return less or nothing.

#### Can I reuse Liquipedia data, and what attribution is needed?

Liquipedia content is CC-BY-SA 3.0. Credit Liquipedia, link to the source page and share derived text under the same license. Each row carries `license`, `licenseUrl`, `url` and `revisionId` for the exact page revision, so you can show where each value came from. This is general information, not legal advice.

#### What is the Liquipedia rate limit?

Liquipedia's API terms allow one request per 2 seconds with a custom user agent, and this actor waits 2.1 seconds between requests. The slower parse endpoint (one request per 30 seconds) is never used. On a 429 answer the actor retries after the delay Liquipedia asks for.

### 🧰 Want more gaming data? Other RecordsData scrapers

- [Steam Charts Scraper](https://apify.com/RecordsData/steam-charts-scraper).
- [Steam Reviews Scraper](https://apify.com/RecordsData/steam-reviews-scraper).
- [Wikipedia Articles Scraper](https://apify.com/RecordsData/wikipedia-articles-scraper).

### 💬 Support

Found a bug? Open the Issues tab or write to contact.punkrecordsdata@gmail.com. Custom solutions on request.

Last updated: 2026-10-11

# Actor input Schema

## `wiki` (type: `string`):

Which Liquipedia wiki to read. Example: Dota 2, Counter-Strike, Valorant or League of Legends. 63 wikis are listed.

## `searchQuery` (type: `string`):

Full-text search on the wiki. Example: The International 2025. Returns one row per matching page (title, snippet, size, last edit). Clear it to skip search.

## `category` (type: `string`):

List every page in a category. Example: Tournaments, Players or Teams (the Category: prefix is optional). Leave empty to skip.

## `pageTitles` (type: `array`):

Pages to fetch in full with parsed infobox. Example: Team Spirit or The International/2025. One row per title; up to 5,000 titles. Leave empty to skip.

## `fetchPageDetails` (type: `boolean`):

Off: search and category return one light row per hit. On: each hit is opened and returned with parsed infobox and typed fields.

## `entityTypes` (type: `array`):

Keep only tournaments, teams, players or other pages, decided by each page infobox. Skipped pages are never charged. Empty means all types.

## `extractRecords` (type: `array`):

Prizes, participants, matches, rosters, team history, transfers or brackets, read from the page source. Pick the ones that fit your page type (shown in each option). Empty means page rows only.

## `includeWikitext` (type: `boolean`):

Adds the raw wikitext source, up to 30,000 characters, to each page row. Makes rows much bigger.

## `includeSubpages` (type: `boolean`):

For every exact page title, also fetch its sub-pages. Each sub-page row counts toward Max rows.

## `maxSubpages` (type: `integer`):

Upper limit when sub-pages are included. Between 1 and 200.

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

Total rows across search hits, category members, pages and typed records. Example: 10 for a test, 5000 for a full tournament. Free users are capped at 10 rows per run; paid users can go up to 1,000,000.

## `onlyNew` (type: `boolean`):

Remember what earlier runs with the same input delivered and return only new pages or new revisions. Skipped pages are not charged. Each row gets changeType new or updated.

## `stateKey` (type: `string`):

Label that keeps this monitor apart from another one with the same input. Example: daily-ti. Only used with Only new or changed pages.

## `resetSeen` (type: `boolean`):

Reset the monitor memory so the next run returns every page as new. Only used with Only new or changed pages.

## Actor input object example

```json
{
  "wiki": "dota2",
  "searchQuery": "The International",
  "category": "",
  "pageTitles": [],
  "fetchPageDetails": false,
  "entityTypes": [],
  "extractRecords": [],
  "includeWikitext": false,
  "includeSubpages": false,
  "maxSubpages": 25,
  "maxItems": 10,
  "onlyNew": false,
  "stateKey": "",
  "resetSeen": false
}
```

# Actor output Schema

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

Key fields per row

## `fullData` (type: `string`):

Complete dataset with 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 = {
    "wiki": "dota2",
    "searchQuery": "The International",
    "category": "",
    "pageTitles": [],
    "maxSubpages": 25,
    "maxItems": 10,
    "stateKey": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/liquipedia-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 = {
    "wiki": "dota2",
    "searchQuery": "The International",
    "category": "",
    "pageTitles": [],
    "maxSubpages": 25,
    "maxItems": 10,
    "stateKey": "",
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/liquipedia-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 '{
  "wiki": "dota2",
  "searchQuery": "The International",
  "category": "",
  "pageTitles": [],
  "maxSubpages": 25,
  "maxItems": 10,
  "stateKey": ""
}' |
apify call recordsdata/liquipedia-esports-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/liquipedia-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/TjmnucZTkem7pMjdL/builds/PXYBeoFfIhNN5WkST/openapi.json
