# Mobile Legends Esports Intelligence (`truenorth/mobile-legends-esports-intelligence`) Actor

Search and normalize attributed Mobile Legends: Bang Bang esports tournaments, teams, players, rosters, matches, and prize pools.

- **URL**: https://apify.com/truenorth/mobile-legends-esports-intelligence.md
- **Developed by:** [TrueNorth](https://apify.com/truenorth) (community)
- **Categories:** News, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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/platform/actors/running/actors-in-store#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

## Mobile Legends Esports Intelligence

### Hero

Turn public Mobile Legends: Bang Bang professional-esports wiki pages into attributed, normalized JSON.

Use Mobile Legends esports data from the Liquipedia Mobile Legends Wiki or enrich known tournament, tournament-stage, team, and player pages. Export consistent records for research, monitoring, data pipelines, dashboards, and AI workflows without maintaining MediaWiki parsing code.

This Actor uses Liquipedia's permitted MediaWiki API. It is not affiliated with or endorsed by Moonton, Mobile Legends: Bang Bang, Team Liquid, or Liquipedia.

### Key Features

- Search canonical Mobile Legends: Bang Bang (MLBB) esports wiki pages.
- Normalize tournament, tournament-stage, team, and player entities.
- Extract source-backed tournament overviews, prize pools, participants, placements, match structures, team rosters, and player results when available.
- Return completeness signals, parser warnings, retrieval timestamps, and cache provenance.
- Preserve Liquipedia page attribution and CC BY-SA 3.0 license fields on every dataset record.
- Choose lightweight search, known-page enrichment, or search-and-enrich discovery.
- Reuse durable cached API responses while exposing cache status in output.
- Enforce a single request lane with minimum 2.1-second general and 31-second parse intervals.

Draft picks or bans appear only when source structure proves their meaning. Current v1 omits unproven ban data instead of relabeling veto markup.

### How It Works

1. Choose `search`, `pages`, or `discover` mode.
2. Provide search queries or canonical Liquipedia page titles.
3. For entity modes, choose sections such as overview, prize pool, participants, matches, roster, or results.
4. The Actor validates input, queries only the Liquipedia Mobile Legends MediaWiki API, normalizes supported pages, and writes attributed records to the default dataset.
5. Read `OUTPUT` from the default key-value store for status, scoped errors, entity counts, request counts, cache counts, and observed policy timing.

Cold entity pages can take at least 31 seconds each because source API policy requires serialized parse requests. Warm cached runs can be faster. Missing, unsupported, invalid, or failed pages create summary errors and no entity record.

### Input Example

This input is used with the exact output sample below:

```json
{
  "mode": "search",
  "queries": ["MPL Indonesia Season 17"],
  "maxResultsPerQuery": 5,
  "maxItems": 5
}
```

Other supported workflows:

```json
{
  "mode": "pages",
  "pageTitles": ["MPL/Indonesia/Season 17", "ONIC", "Kairi"],
  "sections": ["overview", "prizePool", "participants", "matches", "drafts", "roster", "results"],
  "maxItems": 3
}
```

```json
{
  "mode": "discover",
  "queries": ["MSC 2026"],
  "entityTypes": ["tournament"],
  "maxCandidatesPerQuery": 5,
  "maxItems": 1,
  "sections": ["overview", "prizePool", "participants", "matches", "drafts"]
}
```

Unknown fields, arbitrary URLs, API bases, proxy settings, cache bypasses, rate controls, raw MediaWiki parameters, and attribution suppression are rejected.

### Output Sample

Exact first dataset item from the real verification run for the input above, captured on July 25, 2026:

```json
{
  "schemaVersion": "1.0.0",
  "recordType": "search_hit",
  "game": {
    "slug": "mobilelegends",
    "name": "Mobile Legends: Bang Bang",
    "scope": "professional_esports"
  },
  "pageId": 17579,
  "title": "MPL/Indonesia/Season 17",
  "entityTypeHint": "tournament",
  "size": 20050,
  "wordCount": 1700,
  "snippet": "Chronology Season 16 Season 18 Mobile Legends Professional League Indonesia (also known as MPL Indonesia or MPL ID) is a Professional League in Indonesia. For",
  "sourceUpdatedAt": "2026-06-24T10:21:10Z",
  "source": {
    "name": "Liquipedia Mobile Legends Wiki",
    "pageTitle": "MPL/Indonesia/Season 17",
    "pageId": 17579,
    "pageUrl": "https://liquipedia.net/mobilelegends/MPL/Indonesia/Season_17",
    "apiUrl": "https://liquipedia.net/mobilelegends/api.php",
    "retrievedAt": "2026-07-25T06:58:34.418Z",
    "cache": {
      "status": "miss",
      "storedAt": "2026-07-25T06:58:34.418Z"
    },
    "license": {
      "name": "CC BY-SA 3.0",
      "url": "https://creativecommons.org/licenses/by-sa/3.0/",
      "attribution": "Data derived from Liquipedia Mobile Legends Wiki contributors."
    }
  }
}
```

Exact fields vary with page type and source completeness. Entity records add classification, normalized `data`, completeness, warnings, and source metadata.

### AI & LLM Integration

Dataset records are structured for retrieval-augmented generation (RAG), agent tools, enrichment pipelines, and prompt context. Useful patterns include:

- build an attributed MLBB esports knowledge base from entity records;
- resolve user queries to canonical pages with `search_hit` records before enrichment;
- generate tournament or roster briefs using normalized fields and source links;
- filter on `entityType`, `completeness`, and `warnings` before sending records to a model;
- retain `source.pageUrl`, `retrievedAt`, cache status, and license attribution in generated answers.

Treat model summaries as derived analysis, not source facts. Prefer entity records over search snippets for factual answers, check missing sections and warnings, and cite the included source page.

### Scope and Limitations

This Actor covers public professional-esports information available on supported Liquipedia Mobile Legends pages. It does not provide:

- official Moonton data;
- player-account ranks, profiles, or account match history;
- live telemetry or live game state;
- hero abilities or heroes/meta rankings;
- guaranteed real-time statistics;
- proven draft bans where source semantics are ambiguous.

Source templates and page completeness vary. Fields can be null or empty. HTML template changes may produce warnings or require parser maintenance. Search hints are heuristic; enriched entity classification uses page categories and infobox evidence.

### Source and License

Data derives from [Liquipedia Mobile Legends Wiki](https://liquipedia.net/mobilelegends/) contributors through `https://liquipedia.net/mobilelegends/api.php`. Source content is identified as [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/). Exports retain attribution fields.

### Local Development

Requires Node.js 22+ and pnpm 10.30.0.

```sh
pnpm install --frozen-lockfile
pnpm test
pnpm test:coverage
pnpm lint
pnpm typecheck
pnpm build
pnpm format:check
apify validate-schema
```

Captured fixtures are test and development evidence only and are never represented as live output. Deterministic offline Actor verification:

```sh
MLBB_FIXTURE_DIR=tests/fixtures apify run --purge --input '{"mode":"pages","pageTitles":["ONIC"],"sections":["overview","roster"],"maxItems":1}'
```

Fixture transport activates only through local environment configuration. It is absent from public input schema and never silently replaces failed live requests.

# Actor input Schema

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

Search returns lightweight discovery hits. Pages enriches known page titles. Discover searches and enriches matching entity types.

## `queries` (type: `array`):

Required in search/discover mode. Search: 1–20 values. Discover: 1–10 values.

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

Required only in pages mode. Use titles, not URLs. Cold pages require at least 31 seconds between source parse requests.

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

Required only in discover mode.

## `sections` (type: `array`):

Used in pages/discover modes. Unavailable source fields remain null or empty; unproven draft semantics are omitted.

## `maxResultsPerQuery` (type: `integer`):

Used only in search mode.

## `maxCandidatesPerQuery` (type: `integer`):

Used only in discover mode.

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

Search allows up to 500; pages up to unique title count and 20; discover up to 10. Runtime validates mode-specific bounds.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "MPL Indonesia Season 17",
    "Kairi"
  ],
  "pageTitles": [
    "MPL/Indonesia/Season 17",
    "ONIC",
    "Kairi"
  ],
  "entityTypes": [
    "tournament"
  ],
  "sections": [
    "overview"
  ],
  "maxResultsPerQuery": 10,
  "maxCandidatesPerQuery": 10,
  "maxItems": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (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 = {
    "mode": "search",
    "queries": [
        "MPL Indonesia Season 17",
        "Kairi"
    ],
    "pageTitles": [
        "MPL/Indonesia/Season 17",
        "ONIC",
        "Kairi"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("truenorth/mobile-legends-esports-intelligence").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": "search",
    "queries": [
        "MPL Indonesia Season 17",
        "Kairi",
    ],
    "pageTitles": [
        "MPL/Indonesia/Season 17",
        "ONIC",
        "Kairi",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("truenorth/mobile-legends-esports-intelligence").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": "search",
  "queries": [
    "MPL Indonesia Season 17",
    "Kairi"
  ],
  "pageTitles": [
    "MPL/Indonesia/Season 17",
    "ONIC",
    "Kairi"
  ]
}' |
apify call truenorth/mobile-legends-esports-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,truenorth/mobile-legends-esports-intelligence"
        }
    }
}

```

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/c8fUeK7yuFYE6RNs7/builds/mHwdik0qXgRqbggjs/openapi.json
