# MyAnimeList Reviews & Ratings Scraper (`ryyos/mal-reviews-scraper`) Actor

\[$1.5/1000] Scrape every user review for any MyAnimeList anime or manga title - review text, reviewer rating, date, recommendation tag and reaction counts.

- **URL**: https://apify.com/ryyos/mal-reviews-scraper.md
- **Developed by:** [Rio Dwi Saputra](https://apify.com/ryyos) (community)
- **Categories:** Automation, Developer tools, Other
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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

## MyAnimeList Reviews & Ratings Scraper - Full Review Text, Scores & Reactions

Pull **every user review** for any anime or manga on [MyAnimeList](https://myanimelist.net) - full review text, the reviewer's own 0-10 rating, recommendation tag, post date, and reaction counts - in one fast run. Point it at a title URL and get structured, ready-to-analyze review data with no manual scrolling or copy-pasting. \[$2.5/1000]

### Features

- Scrapes complete, full-length review text (not just the truncated preview shown on page load)
- Captures the reviewer's numeric rating, recommendation tag (Recommended / Mixed Feelings / Not Recommended), watch/read progress, post date, and total reader reactions for every review
- Handles pagination automatically up to your configured cap per title
- Accepts multiple anime/manga URLs in one run - batch-scrape reviews across an entire franchise
- Pairs naturally with the MyAnimeList Search & Detail Scraper Actor: search for titles there, feed the result URLs straight into this Actor

### How to use MyAnimeList Reviews & Ratings Scraper

1. Open the Input tab and paste one or more **Anime / manga URLs**, e.g. `https://myanimelist.net/anime/21/One_Piece`.
2. Optionally adjust **Max reviews per title** (default 50).
3. Click **Start**. Reviews stream into the dataset as they're scraped.
4. Export the dataset in JSON, CSV, Excel, HTML, or other formats from the Output tab.

### Input

| Field | Type | Description |
|---|---|---|
| `titleUrls` | array of strings | One or more MyAnimeList anime/manga URLs, required. |
| `maxReviewsPerTitle` | integer | Max reviews to collect per title (default 50). |
| `proxyConfiguration` | object | Apify Proxy configuration (Apify Proxy recommended by default). |

See `.actor/input_schema.json` for the full field definitions.

### Output

Example dataset item:

```json
{
  "title_id": "21",
  "title_type": "anime",
  "title_name": "One Piece",
  "title_url": "https://myanimelist.net/anime/21/One_Piece",
  "review_id": "2772",
  "permalink_url": "https://myanimelist.net/reviews.php?id=2772",
  "reviewer_username": "Maxine",
  "reviewer_url": "https://myanimelist.net/profile/Maxine",
  "date_posted": "Feb 28, 2008",
  "tags": ["Recommended", "Preliminary (344/? eps)"],
  "rating": "10",
  "text": "There are two responses I get, without fail, every time I try to get someone new to watch this show...",
  "reactions_total": 6046
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data table

| Field | Description |
|---|---|
| `title_id` / `title_type` / `title_name` / `title_url` | The anime/manga the review belongs to |
| `review_id` / `permalink_url` | Review's unique ID and direct link |
| `reviewer_username` / `reviewer_url` / `reviewer_avatar_url` | Who wrote the review |
| `date_posted` | When the review was posted |
| `tags` | Recommendation tag and watch/read progress status |
| `rating` | Reviewer's own 0-10 score, when shown |
| `text` | Full review text |
| `reactions_total` | Total reader reactions (nice, love it, funny, etc) |

### Cost estimation

Pricing is pay-per-result at **$2.5 per 1,000 results** (results = reviews), below comparable anime data scrapers on Apify Store ($3-$10 per 1,000). A run collecting 50 reviews each for 5 titles (250 reviews) costs well under $1.

### Tips

- Lower `maxReviewsPerTitle` for a quick sample of the most recent/suggested reviews instead of a full pull.
- Feed this Actor with URLs collected from the MyAnimeList Search & Detail Scraper Actor to go from keyword search straight to review analysis.
- Enable Apify Proxy for larger multi-title runs to reduce the chance of temporary rate limiting from MyAnimeList.

### FAQ, disclaimers, and support

This Actor scrapes publicly available review pages from MyAnimeList.net. Use it in accordance with MyAnimeList's Terms of Service, and avoid excessive request volumes. Not every review has a visible numeric `rating` - MyAnimeList only shows one when the reviewer provided it, and this reflects the source site, not a scraping error. Found an issue or need a custom variant of this Actor? Open an issue on the Actor's Issues tab in Apify Console.

# Actor input Schema

## `titleUrls` (type: `array`):

One or more MyAnimeList anime or manga page URLs to scrape reviews from, e.g. https://myanimelist.net/anime/21/One\_Piece. Tip: pair this with the MyAnimeList Search & Detail Scraper Actor to feed in URLs automatically.

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

Maximum number of reviews to collect for each title.

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

Recommended: use Apify Proxy to avoid IP-based rate limiting from MyAnimeList on larger runs.

## Actor input object example

```json
{
  "titleUrls": [
    "https://myanimelist.net/anime/21/One_Piece"
  ],
  "maxReviewsPerTitle": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `dataset` (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 = {
    "titleUrls": [
        "https://myanimelist.net/anime/21/One_Piece"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ryyos/mal-reviews-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 = { "titleUrls": ["https://myanimelist.net/anime/21/One_Piece"] }

# Run the Actor and wait for it to finish
run = client.actor("ryyos/mal-reviews-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 '{
  "titleUrls": [
    "https://myanimelist.net/anime/21/One_Piece"
  ]
}' |
apify call ryyos/mal-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/DX6IAZwSh0zIemPtD/builds/JZehuLHFSXL0elzj8/openapi.json
