# MyAnimeList Scraper (`solidcode/myanimelist-scraper`) Actor

\[💰 $2.5 / 1K] Extract anime and manga from MyAnimeList — scores, rankings, genres, studios, episodes, synopsis, member counts, and full user reviews. Filter by format, status, genre, score, and age rating, search by keyword, or paste MyAnimeList URLs. Titles and reviews returned as separate rows.

- **URL**: https://apify.com/solidcode/myanimelist-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 titles

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## MyAnimeList Scraper

Pull anime and manga from MyAnimeList at scale — community scores, rankings, member counts, genres, studios, synopses, main cast, and the complete text of every user review. Built for recommendation engineers, streaming and licensing analysts, and fan-community builders who need a clean, structured anime dataset without clicking through MyAnimeList one title page at a time.

### Why This Scraper?

- **38 fields on every title** — score, scored-by count, rank, popularity, members, favorites, synopsis, background, source material, studios, producers, licensors, authors, air dates, season, duration, trailer link, and more.
- **Anime and manga, each mapped correctly** — the two catalogues use conflicting internal codes for the same genre names, so this actor keeps separate, verified code tables. Ask for Suspense manga and you get Suspense manga — not Seinen.
- **Full untruncated review text, including spoiler and preliminary reviews** — MyAnimeList's own default view silently hides both. One Piece's review page shows 897 of its 965 reviews by default; you get all 965. And because every review of an unfinished series counts as preliminary, the site's default returns *zero* reviews for a currently-airing title — this actor returns them all.
- **19 genres with AND matching** — each genre you add narrows the set instead of widening it, so "Action + Comedy" returns only titles tagged with both. Most tools OR them together and hand you noise.
- **Up to 965 reviews on a single title** — reviewer name, 1–10 rating, full body text, spoiler and preliminary flags, reaction count, verdict tags, and date, each as its own row.
- **Main cast with Japanese voice-actor credits** — character name, voice actor, and portrait, matched on the language label rather than list position.
- **Titles and reviews land in separate Console tabs** — parent rows and child rows are split into their own views instead of one mixed table you have to filter yourself.
- **4 verified sort orders** — highest score, most popular, newest release, or A–Z. Leave the search box empty with "Highest score" and you get the Top Anime or Top Manga ranking itself.
- **Deeper pagination than the site's own widget** — MyAnimeList's pager stops early while real results continue; this actor keeps going and de-duplicates, recovering roughly 19% more titles on long lists.

### Use Cases

**Recommendation & Discovery Engines**
- Seed a content-based recommender with genres, themes, demographics, and studios
- Build "if you liked X" lists from score, member count, and shared staff
- Cold-start a catalogue with the top-ranked titles in a genre

**Streaming & Licensing Analysis**
- Track which studios consistently produce highly rated shows
- Spot licensing gaps by comparing licensors across popular titles
- Rank upcoming seasonal releases by pre-air member counts

**Sentiment & Review Research**
- Mine full review text for what audiences praise or criticize
- Compare spoiler versus non-spoiler reviewer sentiment on the same title
- Follow preliminary reviews of an airing series week by week

**Fan Communities & Content Sites**
- Power a seasonal anime chart with scores, air dates, and trailers
- Build genre landing pages backed by real ranking data
- Enrich a watchlist app with synopses, artwork, and cast

**Academic & Market Research**
- Study how source material (manga, light novel, original) correlates with scores
- Analyze demographic tags against member counts across decades
- Chart the growth of a genre by release year and popularity

### Getting Started

#### Search by Title

```json
{
  "searchTerms": ["one piece"],
  "maxResults": 20
}
````

#### Top-Rated Action Anime with Reviews

```json
{
  "contentType": "anime",
  "genres": ["action"],
  "minScore": 8,
  "sortBy": "score",
  "includeReviews": true,
  "maxReviewsPerTitle": 25,
  "maxResults": 50
}
```

#### Specific Titles, Fully Enriched

```json
{
  "startUrls": [
    "https://myanimelist.net/anime/21/One_Piece",
    "https://myanimelist.net/manga/13/One_Piece"
  ],
  "includeReviews": true,
  "maxReviewsPerTitle": 0,
  "includeCharacters": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `contentType` | string | `"anime"` | Which catalogue to pull from: `anime` or `manga`. Pasted URLs decide their own type. |
| `startUrls` | array | `[]` | MyAnimeList title links, e.g. `https://myanimelist.net/anime/21/One_Piece`. |
| `searchTerms` | array | `["one piece"]` | Keywords to look up. Each term is searched separately and results are merged. |

Leave both `startUrls` and `searchTerms` blank to browse the rankings for the catalogue you picked.

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `format` | string | — | `tv`, `movie`, `ova`, `ona`, `special`, `music` for anime; `manga`, `novel`, `lightnovel`, `oneshot`, `doujin`, `manhwa`, `manhua` for manga. |
| `status` | string | — | `airing`, `complete`, `upcoming`; plus `hiatus` and `discontinued` for manga. |
| `genres` | array | `[]` | Any of 19 genres. A title must match **all** of them, so each addition narrows the set. |
| `minScore` | integer | — | Keep titles rated at or above this community score, on the 1–10 scale. |
| `ageRating` | string | — | `g`, `pg`, `pg13`, `r17`, `r`. Anime only — manga carries no audience rating. |
| `sortBy` | string | `"score"` | `score`, `popularity`, `start_date`, or `title`. Governs the ranking and filtered-browse paths; keyword searches always use best-match relevance order. |

#### Output Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includeReviews` | boolean | `false` | Also collect user reviews as their own rows. Each review counts as a separate result. |
| `maxReviewsPerTitle` | integer | `10` | Reviews per title, most helpful first. `0` collects every review available, up to a 2,000-per-title ceiling. |
| `includeCharacters` | boolean | `false` | Add main cast and Japanese voice actors to each title row. Anime only; adds no extra rows. |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `50` | Total titles to collect across every URL, search term, and ranking. Reviews are not counted here. `0` collects every match, up to a ceiling of 60,000 titles per search term or ranking — more than the whole catalogue. |

### Output

Every row carries a `recordType` telling you what it is: `title` or `review`.

#### Title Rows

```json
{
  "recordType": "title",
  "contentType": "anime",
  "malId": 21,
  "title": "One Piece",
  "titleEnglish": "One Piece",
  "titleJapanese": "ONE PIECE",
  "url": "https://myanimelist.net/anime/21/One_Piece",
  "imageUrl": "https://cdn.myanimelist.net/images/anime/6/73245.jpg",
  "format": "TV",
  "status": "Currently Airing",
  "score": 8.73,
  "scoredBy": 1545745,
  "rank": 54,
  "popularity": 21,
  "members": 2707195,
  "favorites": 244612,
  "episodes": null,
  "chapters": null,
  "volumes": null,
  "duration": "24 min.",
  "ageRating": "PG-13 - Teens 13 or older",
  "synopsis": "Barrels of rum, a map to hidden treasure, and a crew of misfits...",
  "background": "One Piece has been serialized in Weekly Shounen Jump since 1997...",
  "source": "Manga",
  "genres": ["Action", "Adventure", "Fantasy"],
  "themes": ["Pirates"],
  "demographics": ["Shounen"],
  "studios": ["Toei Animation"],
  "producers": ["Fuji TV", "TAP", "Shueisha"],
  "licensors": ["Funimation", "4Kids Entertainment"],
  "authors": [],
  "season": "fall",
  "year": 1999,
  "startDate": "1999-10-20",
  "endDate": null,
  "trailerUrl": "https://www.youtube.com/watch?v=S8_YwFLCh4U",
  "mainCharacters": [
    {
      "name": "Monkey D., Luffy",
      "voiceActor": "Tanaka, Mayumi",
      "imageUrl": "https://cdn.myanimelist.net/images/characters/9/310307.jpg"
    }
  ],
  "reviewCount": 965
}
```

##### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `"title"` for these rows |
| `contentType` | string | `"anime"` or `"manga"` |
| `malId` | integer | MyAnimeList's numeric ID for the title |
| `title` | string | Primary title as MyAnimeList lists it |
| `titleEnglish` | string | Official English title, when one exists |
| `titleJapanese` | string | Native Japanese title |
| `url` | string | Canonical link to the title page |
| `imageUrl` | string | Cover artwork |

##### Scores & Ranking

| Field | Type | Description |
|-------|------|-------------|
| `score` | float | Community score on the 1–10 scale |
| `scoredBy` | integer | How many users have scored the title |
| `rank` | integer | Position in the overall ranking |
| `popularity` | integer | Popularity rank, ordered by member count |
| `members` | integer | Users tracking the title |
| `favorites` | integer | Users who marked it a favorite |
| `reviewCount` | integer | Total reviews on the title. Populated only when `includeReviews` is on |

##### Format & Release

| Field | Type | Description |
|-------|------|-------------|
| `format` | string | TV, Movie, OVA, ONA, Manga, Light Novel, and so on |
| `status` | string | Currently Airing, Finished Airing, Not yet aired, and equivalents for manga |
| `episodes` | integer | Episode count. Null while a series is ongoing and the count is unknown |
| `chapters` | integer | Chapter count (manga) |
| `volumes` | integer | Volume count (manga) |
| `duration` | string | Runtime per episode (anime) |
| `ageRating` | string | Audience rating (anime) |
| `season` | string | `winter`, `spring`, `summer`, or `fall` |
| `year` | integer | Premiere year |
| `startDate` | string | First air or publication date, ISO format |
| `endDate` | string | Final date. Null for an open-ended run |

##### Story & Classification

| Field | Type | Description |
|-------|------|-------------|
| `synopsis` | string | Full plot summary |
| `background` | string | Production and release notes, when present |
| `source` | string | Source material: Manga, Light novel, Original, Game, and so on |
| `genres` | array | Genre tags, kept separate from themes and demographics |
| `themes` | array | Theme tags such as Pirates, Military, Survival |
| `demographics` | array | Target demographic such as Shounen, Seinen, Josei |

##### Production & Extras

| Field | Type | Description |
|-------|------|-------------|
| `studios` | array | Animation studios (anime) |
| `producers` | array | Production committee members (anime) |
| `licensors` | array | Regional licensors (anime) |
| `authors` | array | Writers and artists (manga) |
| `trailerUrl` | string | Trailer as a normal watch link |
| `mainCharacters` | array | `name`, `voiceActor`, `imageUrl` per main character. Requires `includeCharacters` |

#### Review Rows

```json
{
  "recordType": "review",
  "titleForReview": "One Piece",
  "titleMalId": 21,
  "titleUrl": "https://myanimelist.net/anime/21/One_Piece",
  "reviewer": "LucasBmS",
  "reviewerUrl": "https://myanimelist.net/profile/LucasBmS",
  "reviewScore": 10,
  "reviewText": "One Piece is a story about dreams, and about the people willing to...",
  "isSpoiler": false,
  "isPreliminary": true,
  "reactionCount": 412,
  "tags": ["Recommended"],
  "reviewDate": "2024-08-14",
  "reviewUrl": "https://myanimelist.net/reviews.php?id=470283"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `"review"` for these rows |
| `titleForReview` | string | Title being reviewed |
| `titleMalId` | integer | ID of the reviewed title — join key back to its title row |
| `titleUrl` | string | Link to the reviewed title |
| `reviewer` | string | Reviewer's username |
| `reviewerUrl` | string | Link to the reviewer's profile |
| `reviewScore` | integer | Reviewer's own 1–10 rating |
| `reviewText` | string | Complete review body, never truncated |
| `isSpoiler` | boolean | Whether the reviewer flagged spoilers |
| `isPreliminary` | boolean | Written before the series finished |
| `reactionCount` | integer | Reactions the review received |
| `tags` | array | Reviewer's verdict: Recommended, Mixed Feelings, or Not Recommended |
| `reviewDate` | string | Publication date, ISO format |
| `reviewUrl` | string | Permalink to the review |

### Tips for Best Results

- **Leave the search box and every filter empty with `sortBy: "score"`** to get the Top Anime or Top Manga ranking exactly as the site presents it — the fastest way to a clean leaderboard.
- **Add genres one at a time.** They combine with AND, so three genres can shrink a list to a handful of titles. Start with one, then narrow.
- **Keyword searches always come back in best-match relevance order**, so `sortBy` has no effect on them. Sort the collected rows yourself afterwards if you need a specific order — and note that rows arrive as each title finishes, not in ranked order.
- **`maxReviewsPerTitle: 0` on a long-running series is the expensive setting.** One Piece alone carries around 965 reviews. Cap it at 10–25 unless you specifically need the full corpus.
- **Set a `maxResults` cap when your search term is broad.** MyAnimeList matches loosely by design — a term like "fullmetal alchemist brotherhood" matches over 2,000 catalogue entries, exactly as it would on the site itself. Left uncapped, that run takes over an hour and can stop at its time limit before finishing; everything collected up to that point is saved, but a cap is the better plan.
- **Sort your own rows by `favorites`.** The site's own filters can't order by favorite count, but every title row carries the number, so a quick sort on the collected data gets you a most-favorited leaderboard the search page won't give you.
- **`ageRating` and `includeCharacters` apply to anime only**, and `chapters`, `volumes`, and `authors` only fill in for manga. Blank values on the other catalogue are correct, not missing data.
- **`reviewCount` needs `includeReviews` turned on** — it lives with the reviews, so a titles-only run leaves it empty.

### Pricing

**From $2.50 per 1,000 titles** — reviews are billed separately at the lower rate of **$0.50 per 1,000 reviews**. You're charged per title plus per review collected.

| Event | No discount | Bronze | Silver | Gold |
|-------|-------------|--------|--------|------|
| Per 1,000 titles | $3.00 | $2.80 | $2.65 | $2.50 |
| Per 1,000 reviews | $0.60 | $0.56 | $0.53 | $0.50 |

Apify's loyalty tiers (Bronze, Silver, Gold) apply automatically in the Console — the more you run, the less you pay. Here's what realistic mixes cost at the Gold tier:

| Example run | Titles | Reviews | Gold total |
|-------------|--------|---------|-----------|
| 500 titles, reviews off | 500 | 0 | $1.25 |
| 100 titles, 25 reviews each | 100 | 2,500 | $1.50 |
| 50 titles, 200 reviews each | 50 | 10,000 | $5.13 |
| 1,000 titles, 10 reviews each | 1,000 | 10,000 | $7.50 |

No compute or time-based charges — you pay per result, plus a small fixed per-run start fee. Platform fees depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor collects publicly available information from MyAnimeList — catalogue entries and user reviews that anyone can view without an account. It does not access private profiles, watchlists, or anything behind a login.

You are responsible for how you use the data you collect. Review MyAnimeList's Terms of Service before running at scale, keep request volumes reasonable, and respect the intellectual property in synopses, artwork, and review text — these belong to their authors and rights holders. Review text and usernames may constitute personal data under GDPR, CCPA, and similar regimes; if you store or publish them, make sure you have a lawful basis for doing so and honor deletion requests. Use the data for research, analysis, and product development — not for republishing others' writing as your own or for harassing individual reviewers.

# Actor input Schema

## `contentType` (type: `string`):

Choose which catalogue to pull from. This applies to searches and rankings — if you paste URLs below, each URL decides its own type automatically.

## `startUrls` (type: `array`):

Paste one or more MyAnimeList page links (for example https://myanimelist.net/anime/21/One\_Piece or https://myanimelist.net/manga/13/One\_Piece). Leave this blank to use the search terms or rankings instead.

## `searchTerms` (type: `array`):

Titles or keywords to look up, for example 'one piece', 'attack on titan', 'ghibli'. Each term is searched separately and the matching titles are collected. Leave blank — and leave URLs blank too — to pull the rankings instead.

## `format` (type: `string`):

Keep only titles of this format. Anime formats apply when you pick Anime above, manga formats when you pick Manga. Leave blank for every format.

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

Keep only titles at this stage of release. Leave blank for any status.

## `genres` (type: `array`):

Keep only titles tagged with these genres. A title must match ALL of the genres you pick, so each extra genre narrows the results further — pick one or two for a broad list. Leave blank for every genre.

## `minScore` (type: `integer`):

Keep only titles rated at or above this community score, on MyAnimeList's 1–10 scale. For reference, 8 and above is very well regarded. Leave blank for any score.

## `ageRating` (type: `string`):

Keep only titles with this audience rating. Applies to anime only — MyAnimeList does not rate manga this way. Leave blank for any rating.

## `sortBy` (type: `string`):

The order titles come back in when browsing or filtering. 'Highest score' with no search term and no filters gives you the MyAnimeList Top Anime or Top Manga ranking. 'Most popular' orders by how many members are tracking the title. Not used when you enter search terms above — keyword searches are always ordered by MyAnimeList's own best-match ranking.

## `includeReviews` (type: `boolean`):

Also collect user reviews for every title, returned as their own rows with the reviewer, score, full review text, spoiler flag, and date. Each review counts as a separate result. Turn this off for a faster, cheaper run that returns titles only.

## `maxReviewsPerTitle` (type: `integer`):

How many reviews to collect for each title, most helpful first. Set to 0 to collect every review available (up to a safety ceiling of 2,000 per title — MyAnimeList's most-reviewed title currently has around 965, so this ceiling is not normally reached). Reviews are read 20 at a time, so a cap of 10 costs one extra page per title while an uncapped long-running series can cost 50. Each title also gets its own collection time budget, which grows with the number of reviews you ask for; on a rare title with many hundreds of reviews it can end that title early, and the run tells you when it does. Spoiler and preliminary reviews are always included. Ignored when 'Include User Reviews' is off.

## `includeCharacters` (type: `boolean`):

Add the main cast to each title's row — character names plus their Japanese voice actors. Only main characters are included, not the full supporting roster. This adds detail to existing rows and does not create extra results, but MyAnimeList serves the entire cast list in one go, so it makes each title noticeably slower to collect on long-running series. Applies to anime only — manga has no cast listing.

## `maxResults` (type: `integer`):

The total number of anime or manga titles to collect across every URL, search term, and ranking. Reviews do not count against this number — they have their own limit above. Set to 0 to collect every match, up to a ceiling of 60,000 titles per search term or ranking (comfortably more than MyAnimeList's whole catalogue). Be aware that MyAnimeList matches search terms loosely: a broad term can match thousands of titles and take over an hour, and the run may stop at its time limit before finishing — everything collected up to that point is still saved. Set a number here if you're unsure.

## Actor input object example

```json
{
  "contentType": "anime",
  "startUrls": [],
  "searchTerms": [
    "one piece"
  ],
  "genres": [],
  "sortBy": "score",
  "maxReviewsPerTitle": 10,
  "maxResults": 50
}
```

# Actor output Schema

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

Every record from the run in one place — titles and reviews — distinguished by `recordType`.

## `titles` (type: `string`):

Anime and manga only, with score, rank, popularity, members, genres, studios, synopsis, episode or chapter counts, and release dates.

## `reviews` (type: `string`):

User reviews only, each linked to its anime or manga. Present only when 'Include User Reviews' is enabled.

# 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 = {
    "contentType": "anime",
    "startUrls": [],
    "searchTerms": [
        "one piece"
    ],
    "genres": [],
    "sortBy": "score",
    "includeReviews": false,
    "maxReviewsPerTitle": 10,
    "includeCharacters": false,
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/myanimelist-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 = {
    "contentType": "anime",
    "startUrls": [],
    "searchTerms": ["one piece"],
    "genres": [],
    "sortBy": "score",
    "includeReviews": False,
    "maxReviewsPerTitle": 10,
    "includeCharacters": False,
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/myanimelist-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "contentType": "anime",
  "startUrls": [],
  "searchTerms": [
    "one piece"
  ],
  "genres": [],
  "sortBy": "score",
  "includeReviews": false,
  "maxReviewsPerTitle": 10,
  "includeCharacters": false,
  "maxResults": 50
}' |
apify call solidcode/myanimelist-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/myanimelist-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "MyAnimeList Scraper",
        "description": "[💰 $2.5 / 1K] Extract anime and manga from MyAnimeList — scores, rankings, genres, studios, episodes, synopsis, member counts, and full user reviews. Filter by format, status, genre, score, and age rating, search by keyword, or paste MyAnimeList URLs. Titles and reviews returned as separate rows.",
        "version": "1.0",
        "x-build-id": "0HvpriSGkqczgnIuC"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~myanimelist-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-myanimelist-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solidcode~myanimelist-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-myanimelist-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solidcode~myanimelist-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-myanimelist-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "contentType": {
                        "title": "Anime or Manga",
                        "enum": [
                            "anime",
                            "manga"
                        ],
                        "type": "string",
                        "description": "Choose which catalogue to pull from. This applies to searches and rankings — if you paste URLs below, each URL decides its own type automatically."
                    },
                    "startUrls": {
                        "title": "MyAnimeList URLs",
                        "type": "array",
                        "description": "Paste one or more MyAnimeList page links (for example https://myanimelist.net/anime/21/One_Piece or https://myanimelist.net/manga/13/One_Piece). Leave this blank to use the search terms or rankings instead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchTerms": {
                        "title": "Search Terms",
                        "type": "array",
                        "description": "Titles or keywords to look up, for example 'one piece', 'attack on titan', 'ghibli'. Each term is searched separately and the matching titles are collected. Leave blank — and leave URLs blank too — to pull the rankings instead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "format": {
                        "title": "Format",
                        "enum": [
                            "tv",
                            "movie",
                            "ova",
                            "ona",
                            "special",
                            "music",
                            "manga",
                            "novel",
                            "lightnovel",
                            "oneshot",
                            "doujin",
                            "manhwa",
                            "manhua"
                        ],
                        "type": "string",
                        "description": "Keep only titles of this format. Anime formats apply when you pick Anime above, manga formats when you pick Manga. Leave blank for every format."
                    },
                    "status": {
                        "title": "Release Status",
                        "enum": [
                            "airing",
                            "complete",
                            "upcoming",
                            "hiatus",
                            "discontinued"
                        ],
                        "type": "string",
                        "description": "Keep only titles at this stage of release. Leave blank for any status."
                    },
                    "genres": {
                        "title": "Genres",
                        "type": "array",
                        "description": "Keep only titles tagged with these genres. A title must match ALL of the genres you pick, so each extra genre narrows the results further — pick one or two for a broad list. Leave blank for every genre.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "action",
                                "adventure",
                                "avant-garde",
                                "award-winning",
                                "boys-love",
                                "comedy",
                                "drama",
                                "ecchi",
                                "fantasy",
                                "girls-love",
                                "gourmet",
                                "horror",
                                "mystery",
                                "romance",
                                "sci-fi",
                                "slice-of-life",
                                "sports",
                                "supernatural",
                                "suspense"
                            ],
                            "enumTitles": [
                                "Action",
                                "Adventure",
                                "Avant Garde",
                                "Award Winning",
                                "Boys Love",
                                "Comedy",
                                "Drama",
                                "Ecchi",
                                "Fantasy",
                                "Girls Love",
                                "Gourmet",
                                "Horror",
                                "Mystery",
                                "Romance",
                                "Sci-Fi",
                                "Slice of Life",
                                "Sports",
                                "Supernatural",
                                "Suspense"
                            ]
                        }
                    },
                    "minScore": {
                        "title": "Minimum Score",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Keep only titles rated at or above this community score, on MyAnimeList's 1–10 scale. For reference, 8 and above is very well regarded. Leave blank for any score."
                    },
                    "ageRating": {
                        "title": "Age Rating",
                        "enum": [
                            "g",
                            "pg",
                            "pg13",
                            "r17",
                            "r"
                        ],
                        "type": "string",
                        "description": "Keep only titles with this audience rating. Applies to anime only — MyAnimeList does not rate manga this way. Leave blank for any rating."
                    },
                    "sortBy": {
                        "title": "Sort By",
                        "enum": [
                            "score",
                            "popularity",
                            "start_date",
                            "title"
                        ],
                        "type": "string",
                        "description": "The order titles come back in when browsing or filtering. 'Highest score' with no search term and no filters gives you the MyAnimeList Top Anime or Top Manga ranking. 'Most popular' orders by how many members are tracking the title. Not used when you enter search terms above — keyword searches are always ordered by MyAnimeList's own best-match ranking."
                    },
                    "includeReviews": {
                        "title": "Include User Reviews",
                        "type": "boolean",
                        "description": "Also collect user reviews for every title, returned as their own rows with the reviewer, score, full review text, spoiler flag, and date. Each review counts as a separate result. Turn this off for a faster, cheaper run that returns titles only."
                    },
                    "maxReviewsPerTitle": {
                        "title": "Max Reviews Per Title",
                        "minimum": 0,
                        "type": "integer",
                        "description": "How many reviews to collect for each title, most helpful first. Set to 0 to collect every review available (up to a safety ceiling of 2,000 per title — MyAnimeList's most-reviewed title currently has around 965, so this ceiling is not normally reached). Reviews are read 20 at a time, so a cap of 10 costs one extra page per title while an uncapped long-running series can cost 50. Each title also gets its own collection time budget, which grows with the number of reviews you ask for; on a rare title with many hundreds of reviews it can end that title early, and the run tells you when it does. Spoiler and preliminary reviews are always included. Ignored when 'Include User Reviews' is off."
                    },
                    "includeCharacters": {
                        "title": "Include Main Characters",
                        "type": "boolean",
                        "description": "Add the main cast to each title's row — character names plus their Japanese voice actors. Only main characters are included, not the full supporting roster. This adds detail to existing rows and does not create extra results, but MyAnimeList serves the entire cast list in one go, so it makes each title noticeably slower to collect on long-running series. Applies to anime only — manga has no cast listing."
                    },
                    "maxResults": {
                        "title": "Max Titles",
                        "minimum": 0,
                        "type": "integer",
                        "description": "The total number of anime or manga titles to collect across every URL, search term, and ranking. Reviews do not count against this number — they have their own limit above. Set to 0 to collect every match, up to a ceiling of 60,000 titles per search term or ranking (comfortably more than MyAnimeList's whole catalogue). Be aware that MyAnimeList matches search terms loosely: a broad term can match thousands of titles and take over an hour, and the run may stop at its time limit before finishing — everything collected up to that point is still saved. Set a number here if you're unsure."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
