MyAnimeList Scraper - Anime, Manga, Rankings & Scores avatar

MyAnimeList Scraper - Anime, Manga, Rankings & Scores

Pricing

from $1.20 / 1,000 anime or manga records

Go to Apify Store
MyAnimeList Scraper - Anime, Manga, Rankings & Scores

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

Abot API

Maintained by Community

Actor 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).

FieldAlwaysNotes
idyesMyAnimeList's numeric id.
mediaTypeyesanime or manga.
titleyesMain title.
urlyesDetail-page URL.
typemost rowsTV, Movie, Manga, and so on. On chart rows without details the count is included, for example TV (12 eps).
scorewhen scoredWeighted community score.
memberschart rows, detailsMember count; present on ranking-chart listing rows even without details, and on every enriched record.
scoredBydetailsNumber of users behind the weighted score.
reviewCountdetailsTotal review count shown on the entry.
reviewsdetailsReview text, author, date, recommendation, rating and URL; three previews by default or more with maxReviews.
reviewsFetcheddetailsNumber of reviews actually returned.
reviewsCompletedetailsTrue only when the review pages reached their end.
reviewPagesFetcheddetailsDedicated review pages successfully read; zero with the default previews.
reviewCountGapcomplete review pullsReported total minus reviews available in the pages; null for a capped or interrupted pull.
charactersdetailsCharacter previews with role and nested voiceActors where available.
voiceActorsanime detailsFlat list of voice actors from the character previews.
staffanime detailsStaff previews with name and role.
relatedEntriesdetailsRelated anime and manga with relationship, title and URL.
openingThemes / endingThemesanime detailsOpening and ending song names.
genres / themesdetailsGenre and theme lists.
synopsisdetailsFull description text.
changeTypeincrementalNEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED.
firstSeenAtincrementalFirst time this actor saw the record.
lastSeenAtincrementalMost recent time a run saw the record present (on an EXPIRED row, the last time before it disappeared).
changedFieldsincrementalField names that differ from the previous run; populated only when changeType is UPDATED.

How to Use

  1. Pick a Collection mode: keyword search, a ranking chart, or pasted URLs.
  2. Choose anime or manga and enter your keywords, chart or links.
  3. Set Maximum records, and turn Fetch full details off if listing fields are enough.
  4. 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 ApifyClient
client = 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 anything EXPIRED.
  • Incremental mode (incrementalMode) is for scheduled runs over the same scope. Each record is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED or EXPIRED (only after a run that walked every page of every scope to its natural end, and only with emitExpired). stateKey names 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 searchTerms list 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). With incrementalMode and emitExpired on, that early stop can also mark a title that is still on MyAnimeList as EXPIRED: 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 stateKey empty, or use a different stateKey per run). Never reuse one stateKey for runs with different keywords: each complete run would mark the other run's titles EXPIRED. 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

InputWhat it does
modeKeyword search, Ranking charts, or Paste URLs.
mediaTypeAnime or manga (search and charts; URL mode auto-detects).
searchTermsKeywords; each is its own walk, merged and de-duplicated.
chartKindtop, airing, upcoming, bypopularity or favorite.
urlsDetail-page links to read directly.
fetchDetailsRead every record's own page (adds the detail-enrichment surcharge).
maxReviewsReviews per record: 3 previews by default, a larger finite limit, or 0 for all available pages. Requires detail fetching; large histories take longer.
maxItemsThe one finite cap (default 20). 0 means no limit.
maxPagesPages per scope. 0 (default) walks to the natural end.
resumeFromRunIdPrevious run or dataset id; the run returns only new records.
incrementalModeClassify changes across scheduled runs of the same scope.
stateKeyOptional campaign name for the incremental baseline.
emitUnchangedAlso return unchanged records (bills extra rows).
emitExpiredAlso return records no longer found, after a complete scan (bills extra rows).
proxyOptional connection settings.
mcpConnectorsConnector ids to also export results into.
notionParentPageUrlParent page for the Notion export.
maxNotifyListingsMaximum 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.

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.