MyAnimeList Scraper - Anime, Manga, Rankings & Scores
Pricing
from $1.20 / 1,000 anime or manga records
MyAnimeList Scraper - Anime, Manga, Rankings & Scores
Scrape MyAnimeList anime and manga by keyword, ranking chart or URL. Extract titles, scores, ranks, members, genres, studios, authors, synonyms and full synopses. Supports top, airing, upcoming, popular and favorite rankings, plus resume and incremental monitoring.
Pricing
from $1.20 / 1,000 anime or manga records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
MyAnimeList Scraper: Anime & Manga Scores, Reviews, Characters & Charts
MyAnimeList Scraper turns MyAnimeList into a clean anime and manga data feed. Search by keyword, walk any of the five ranking charts, or paste detail-page links, and get titles, scores, member counts, synopses, genres, studios, reviews, characters, voice actors, staff and related entries for every anime or manga. Resume an interrupted run or schedule incremental runs that report only what changed, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- Walks MyAnimeList search results forward through every page, not just page 1.
- Covers all five ranking charts (top, airing, upcoming, most popular, most favourited) for anime and manga.
- Enriches records with related entries, character and staff previews, voice actors, paginated reviews and full stats.
- Reads pasted detail-page links, anime and manga mixed, auto-detected.
- Resume from a previous run and incremental monitoring are built in.
- Keeps the main dataset to one row per anime or manga, including nested review and preview lists.
- Pushes each record the moment it is ready, so a stopped run keeps its data.
Use Cases
- Anime and manga database or wiki sites: build a structured catalogue from search or ranking-chart walks, complete with synopsis, genres, related entries and staff.
- Fan communities, bots and newsletters: watch a favourite chart or a saved list of titles with incremental mode, and post only what is NEW, UPDATED or REAPPEARED since the last run.
- Review and sentiment research: collect review text, ratings and recommendation tags across many titles for analysis.
- Discovery and recommendation tools: follow related-entry links plus character and voice-actor previews to map franchises and adaptations.
- Market and studio tracking: monitor the airing, upcoming and most-popular charts to see which studios and producers are trending.
Data You Get
One record per anime or manga. With fetchDetails on (the default), the
record also contains the entry's three review previews by default, plus the
characters and voice actors shown there, staff, and related entries. Set
maxReviews above 3 to read paginated review pages, or 0 to follow every
available review page. reviewsComplete tells you whether the collection
reached the end of the visible pages. Some titles report more reviews than
their pages expose; reviewCountGap records that difference. The character
and staff lists remain previews.
Other detail fields include Japanese, French and English titles, manga
volumes and chapters, synonyms, episodes, ranked and popularity positions,
favorites, licensors, producers, studios, authors, demographics,
serialization, premiere, broadcast, source, duration, rating and review
sentiment counts (reviewBreakdown).
| Field | Always | Notes |
|---|---|---|
id | yes | MyAnimeList's numeric id. |
mediaType | yes | anime or manga. |
title | yes | Main title. |
url | yes | Detail-page URL. |
type | most rows | TV, Movie, Manga, and so on. On chart rows without details the count is included, for example TV (12 eps). |
score | when scored | Weighted community score. |
members | chart rows, details | Member count; present on ranking-chart listing rows even without details, and on every enriched record. |
scoredBy | details | Number of users behind the weighted score. |
reviewCount | details | Total review count shown on the entry. |
reviews | details | Review text, author, date, recommendation, rating and URL; three previews by default or more with maxReviews. |
reviewsFetched | details | Number of reviews actually returned. |
reviewsComplete | details | True only when the review pages reached their end. |
reviewPagesFetched | details | Dedicated review pages successfully read; zero with the default previews. |
reviewCountGap | complete review pulls | Reported total minus reviews available in the pages; null for a capped or interrupted pull. |
characters | details | Character previews with role and nested voiceActors where available. |
voiceActors | anime details | Flat list of voice actors from the character previews. |
staff | anime details | Staff previews with name and role. |
relatedEntries | details | Related anime and manga with relationship, title and URL. |
openingThemes / endingThemes | anime details | Opening and ending song names. |
genres / themes | details | Genre and theme lists. |
synopsis | details | Full description text. |
changeType | incremental | NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED. |
firstSeenAt | incremental | First time this actor saw the record. |
lastSeenAt | incremental | Most recent time a run saw the record present (on an EXPIRED row, the last time before it disappeared). |
changedFields | incremental | Field names that differ from the previous run; populated only when changeType is UPDATED. |
How to Use
- Pick a Collection mode: keyword search, a ranking chart, or pasted URLs.
- Choose anime or manga and enter your keywords, chart or links.
- Set Maximum records, and turn Fetch full details off if listing fields are enough.
- Run it and download the dataset, or read it through the API.
Search walks every result page forward; charts walk the ranking; URL mode reads the links you paste. Example 1, anime search with details:
{"mode": "search","mediaType": "anime","searchTerms": ["space opera"],"maxItems": 50,"fetchDetails": true}
Example 2, the currently-airing chart, listing fields only:
{"mode": "charts","mediaType": "anime","chartKind": "airing","maxItems": 100,"fetchDetails": false}
Example 3, pasted links of both kinds in one run:
{"mode": "url","urls": ["https://myanimelist.net/anime/5114/Fullmetal_Alchemist__Brotherhood","https://myanimelist.net/manga/2/Berserk"],"maxReviews": 0}
Example 4, recurring incremental monitoring of one chart:
{"mode": "charts","mediaType": "manga","chartKind": "top","maxItems": 100,"incrementalMode": true}
A capped chart walk like this one reports NEW, UPDATED and REAPPEARED
titles, but never EXPIRED ones: emitExpired only fires after a run that
walked every page to the natural end, with no Maximum records or
Maximum pages cap stopping it first.
A genuinely empty search is reported honestly as an empty result, never as a failure. Profile pages (user lists) are not scraped: they are account-scoped.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/myanimelist-scraper").call(run_input={"mode": "search", "searchTerms": ["Frieren"]})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item.get("score"))
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/myanimelist-scraper').call({ mode: 'search', searchTerms: ['Frieren'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset id and the actor skips every record id it already collected, so you do not pay twice. A resumed run never marks anythingEXPIRED. - Incremental mode (
incrementalMode) is for scheduled runs over the same scope. Each record is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only after a run that walked every page of every scope to its natural end, and only withemitExpired).stateKeynames or shares the stored state. With incremental mode off, output is exactly as before. - One run shares one "already returned" list across all its keywords. A keyword's walk treats a page made up only of titles this run already returned as the end of its results, once that keyword has returned at least one new title on an earlier page. So when keywords in the same
searchTermslist overlap, a later keyword can stop early and skip its own later pages, even though those pages still hold titles no keyword has returned yet. This is rare for unrelated keywords, but likely for near-duplicate ones (for example"Attack on Titan"and"Attack on Titan Season 2"in the same run). WithincrementalModeandemitExpiredon, that early stop can also mark a title that is still on MyAnimeList asEXPIRED: if it sat only on a skipped page, the run counts it as gone. The same rule applies to a resumed run: if the ranking shifted since the interrupted run (common on the airing and most-popular charts), a page of already-collected titles can end the resumed walk before the pages it still needed. - Workaround for a guaranteed-complete scan: put each near-duplicate keyword in its own run, and give each run its own incremental state (leave
stateKeyempty, or use a differentstateKeyper run). Never reuse onestateKeyfor runs with different keywords: each complete run would mark the other run's titlesEXPIRED. If a resumed run looks short, start a fresh run instead.
Send results into your apps (MCP connectors)
After a run, results can also be piped into your apps: mcpConnectors names
the connector ids, notionParentPageUrl sets the Notion parent page, and
maxNotifyListings caps items per connector (default 50, dataset unchanged).
Connector export needs the connector authorized in Apify; the dataset is
written regardless.
Input Parameters
| Input | What it does |
|---|---|
mode | Keyword search, Ranking charts, or Paste URLs. |
mediaType | Anime or manga (search and charts; URL mode auto-detects). |
searchTerms | Keywords; each is its own walk, merged and de-duplicated. |
chartKind | top, airing, upcoming, bypopularity or favorite. |
urls | Detail-page links to read directly. |
fetchDetails | Read every record's own page (adds the detail-enrichment surcharge). |
maxReviews | Reviews per record: 3 previews by default, a larger finite limit, or 0 for all available pages. Requires detail fetching; large histories take longer. |
maxItems | The one finite cap (default 20). 0 means no limit. |
maxPages | Pages per scope. 0 (default) walks to the natural end. |
resumeFromRunId | Previous run or dataset id; the run returns only new records. |
incrementalMode | Classify changes across scheduled runs of the same scope. |
stateKey | Optional campaign name for the incremental baseline. |
emitUnchanged | Also return unchanged records (bills extra rows). |
emitExpired | Also return records no longer found, after a complete scan (bills extra rows). |
proxy | Optional connection settings. |
mcpConnectors | Connector ids to also export results into. |
notionParentPageUrl | Parent page for the Notion export. |
maxNotifyListings | Maximum items per connector export. |
Output Example
The dataset holds one record per row; the overview view shows the headline columns. Fictional sample:
{"id": 123456,"mediaType": "anime","title": "Sample Anime: Legend of the Test Fields","type": "TV","episodes": 12,"score": 8.61,"scoredBy": 4200,"ranked": 114,"members": 1234567,"reviewCount": 12,"reviews": [{"author": "sample_user", "date": "Jan 1, 2026", "recommendation": "Recommended", "rating": 9, "text": "An illustrative review preview."}],"reviewsFetched": 1,"reviewsComplete": false,"reviewPagesFetched": 0,"reviewCountGap": null,"characters": [{"id": 100001, "name": "Sample Character", "role": "Main", "voiceActors": [{"id": 200001, "name": "Sample Performer", "language": "Japanese"}]}],"voiceActors": [{"id": 200001, "name": "Sample Performer", "language": "Japanese", "characterId": 100001}],"relatedEntries": [{"id": 100002, "mediaType": "manga", "title": "Sample Source Manga", "relation": "Adaptation"}],"staff": [{"id": 200002, "name": "Sample Director", "role": "Director"}],"openingThemes": ["Sample Opening"],"endingThemes": ["Sample Ending"],"genres": ["Action", "Adventure"],"studios": ["Sample Studio"],"synopsis": "A sample synopsis body.","url": "https://myanimelist.net/anime/123456/Sample_Anime","changeType": "NEW","changedFields": [],"firstSeenAt": "2026-01-01T00:00:00Z","lastSeenAt": "2026-01-01T00:00:00Z"}
Plan Requirement
An Apify account is required to run this actor. Detail enrichment adds a per-record charge only when an enriched record is returned. Each review in a returned record adds one review-enrichment event, including the three default previews. The review event is priced per review item.
FAQ
How much does it cost?
You pay for each record returned, plus the detail-enrichment and review-enrichment events only when they actually fire (a record you did not enrich, or one suppressed as UNCHANGED, is never charged for either). The Pricing tab on the actor page shows the current rates. Use Maximum records to cap the cost of any run.
Is it legal to scrape MyAnimeList?
This actor collects only publicly available anime and manga data. You are responsible for how you use it: follow MyAnimeList's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Titles, scores and rankings are largely factual catalogue data, but review text is authored by MyAnimeList users, and character or key art images may carry separate rights.
Can I get only new or updated titles on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental
mode. Each run then classifies every record against the last run's
baseline for the same scope, and unchanged records are not billed unless you
turn on Emit unchanged records. See "Resume and recurring updates" above
for the one caveat: overlapping keywords in one run can end a keyword's walk
early and, with Emit expired records on, mark a still-listed title
EXPIRED. Put near-duplicate keywords in separate runs, each with its own
state, and never reuse one stateKey across runs with different keywords.
Why did a search or chart return fewer titles than I expected?
Three separate reasons produce a short result, and only one of them is a
cap: Maximum records or Maximum pages per keyword or chart stopped
the walk on purpose; the search genuinely has no more matches (MyAnimeList
answers a search with no more rows the same way it answers a search with no
rows at all); or, for a run with more than one keyword in searchTerms or a
resumed run, the shared "already returned" caveat above cut a walk short.
Raise the caps, broaden the keyword, or split near-duplicate keywords into
separate runs.
Why did my run fail instead of returning an empty dataset?
A run with no results fails, with a clear connection-problem message, only
when not a single page could be read, so "no titles matched" is never
confused with "nothing could be read". Run it again in a few minutes. A run
also stops at the start, before anything is collected or charged, when the
input cannot work: an unreadable resumeFromRunId, or resumeFromRunId
combined with incremental mode on a scope that already has saved state. If only some
keywords, charts or URLs could not be read, you still get what was found,
with a status message naming how many.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
๐ More scrapers you might like
Pair this actor with these related scrapers from the same team:
| ๐งฉ AniList Anime & Manga Scraper Scrape AniList anime and manga: titles (romaji/English/native), scores, popularity... | ๐งฉ WEBTOON Scraper Scrape the WEBTOON catalog into structured data. Extract series, genres, rankings and... |
| ๐งฉ GoodShort Scraper Scrape the GoodShort short-drama catalog: titles with exact views, follows, genres and... | ๐งฉ Deezer Scraper Scrape Deezer by keyword or URL. Extract tracks, albums, artists, playlists, lyrics... |
| ๐งฉ Letterboxd Scraper Scrape Letterboxd films and reviews by search phrase, popular or genre lists, or film... | ๐งฉ Yandex Search Scraper Scrape Yandex web, image and video search results with URLs, snippets and organic... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.