MyAnimeList Scraper icon

MyAnimeList Scraper

Scrape MyAnimeList anime and manga by keyword, ranking chart or URL. Extract titles, scores, ranks, members, genres, studios, authors, synonyms and…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

MyAnimeList Scraper at a glance

MyAnimeList Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes id, type, title, titleenglish and titlejapanese, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Web data
Pricing
$1.80 per 1,000 results (Free plan), from $1.20 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
24 options

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.

What MyAnimeList Scraper can do

  • Deep search. Walks MyAnimeList search results forward through every page, not just page 1.
  • Five charts. Covers all five ranking charts (top, airing, upcoming, most popular, most favourited) for anime and manga.
  • Rich records. Enriches records with related entries, character and staff previews, voice actors, paginated reviews and full stats.
  • Paste links. Reads pasted detail-page links, anime and manga mixed, auto-detected.
  • Built for schedules. Resume from a previous run and incremental monitoring are built in.
  • One row per title. Keeps the main dataset to one row per anime or manga, including nested review and preview lists.

Choose what to collect

These inputs let you configure MyAnimeList Scraper - Anime, Manga, Rankings & Scores. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredSearch MyAnimeList by keyword, walk a ranking chart, or read detail pages you paste.

Choices: search, charts, url

mediaTypestringApplies to search and charts. 'Both' walks anime then manga. URL mode detects anime or manga from each URL.

Choices: anime, manga, both

searchTermsarrayOne or more keywords. Each keyword is its own walk; results are de-duplicated across keywords.
searchTypestringMyAnimeList's own type filter for keyword search. A value that does not apply to the media type (for example TV on manga) is ignored for that media type.

Choices: , tv, ova, movie, special, ona, music, manga, novel, one-shot, doujinshi, manhwa, manhua

searchQueriesarrayAlias of Search keywords; both lists are merged.
chartKindstringWhich ranking chart to walk in Charts mode.

Choices: top, airing, upcoming, bypopularity, favorite

topTypestringShortcut for Charts mode with the Top ranking of this media type. Use Top list limit to set how many ranked titles.

Choices: , anime, manga

Show 17 more inputs
More input fields
InputWhat it controls
topLimitintegerWith Top list: number of ranked titles. It sets the item cap whenever Maximum items is left at its default of 20; a Maximum items value other than 20 wins. 0 = use Maximum items.
urlsarrayLinks to read: anime/manga detail pages (with or without slug), their reviews pages, keyword-search pages, top charts, genre, season and studio listings. The mobile host m.myanimelist.net is mapped to www. Unsupported links are skipped with a warning in the log. Left untouched, this holds one example of every supported shape (Maximum items still caps the total). That untouched default list is not run when Anime ids, Manga ids, Search queries or Top list are set.
animeIdsarrayMyAnimeList anime ids (for example 5114). Read as detail pages, in addition to the selected mode (or alone when no mode is set). Anime and manga ids are separate numbering: anime 21 and manga 21 are different titles.
mangaIdsarrayMyAnimeList manga ids (for example 2). Read as detail pages, in addition to the selected mode.
fetchDetailsbooleanAdds synopsis, full stats, related entries, character and staff previews, voice actors, and three review previews from each record's page. Use Maximum reviews to collect more. Adds a per-record detail-enrichment surcharge (see Output).
maxReviewsinteger3 (default) uses title-page previews with no extra review-page requests. Set a larger number (up to 5000) to collect that many reviews, or 0 for the most available review pages up to the same 5000-review ceiling. Applies only when details are fetched; each returned review, including a preview, adds one review-enrichment event.
maxItemsintegerStop after this many records across all keywords or links. 0 means no limit: the run ends at the natural end of results.
maxPagesintegerPages to walk per keyword or chart. 0 (default) keeps walking until the item cap or the natural end of results; Max records remains the only cap that stops a run early.
resumeFromRunIdstringPaste a previous run id (or dataset id) to skip the records it already collected and return only new ones.
incrementalModebooleanFor scheduled runs of the same scope: classify each record as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED against the previous run's baseline. Compared: every output field of the record except the incremental bookkeeping keys (changeType, changedFields, firstSeenAt, lastSeenAt), the fields that are always left out (reviews.reactionCount, reviews.reactions, malId, titleSynonyms, airedFrom, airedTo, season, year, trailerUrl and scrapedAt; rank is compared: it is the chart position on chart rows and mirrors the overall score rank only on rows without a chart position) and any field listed in Ignore fields; whole-number values compare equal whether written 25 or 25.0. Excluded fields stay in the output. Records whose content did not change are suppressed unless Emit unchanged is on.
stateKeystringStable name for a monitoring campaign. Leave empty to key the baseline automatically on the mode, media type and scope.
emitUnchangedbooleanWith incremental mode on, also return records whose content did not change, marked UNCHANGED. These are extra rows: they are returned AND billed.
emitExpiredbooleanWith incremental mode on, also return records no longer found, marked EXPIRED. Only after a complete uncapped scan of the scope; these are extra rows: they are returned AND billed.
ignoreFieldsForChangesarrayIncremental mode only: field names that must not count as a change, for example a fast-moving counter. Use dotted paths for nested fields (reviews.rating); lists are searched element by element. These fields are always left out already: reviews.reactionCount, reviews.reactions, malId, titleSynonyms, airedFrom, airedTo, season, year, trailerUrl and scrapedAt. rank is not among them: it is the chart position on chart rows and mirrors the overall score rank (ranked) only on rows without a chart position. The fields stay in the output, they are just left out of change detection and changedFields.
mcpConnectorsarrayConnector ids to also export results into after the run. Dataset output is unchanged.
notionParentPageUrlstringParent page for the Notion connector export.
maxNotifyListingsintegerMaximum items sent to each connector. Does not change the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idid
mediaTypeType
titleTitle (link)
titleEnglishtitleEnglish
titleJapanesetitleJapanese
titleFrenchtitleFrench
urlurl
typetype
episodesepisodes
volumesvolumes
chapterschapters
statusstatus
Show 55 more fields
scoreScore
scoredByscoredBy
rankedranked
popularitypopularity
membersMembers
favoritesfavorites
reviewCountreviewCount
reviewBreakdownreviewBreakdown
airedaired
premieredpremiered
broadcastbroadcast
sourcesource
durationduration
ratingrating
genresgenres
themesthemes
demographicsdemographics
producersproducers
licensorslicensors
studiosstudios
authorsauthors
serializationserialization
relatedEntriesrelatedEntries
characterscharacters
voiceActorsvoiceActors
staffstaff
reviewsreviews
reviewsFetchedreviewsFetched
reviewsCompletereviewsComplete
reviewPagesFetchedreviewPagesFetched
reviewCountGapreviewCountGap
openingThemesopeningThemes
endingThemesendingThemes
synonymssynonyms
synopsissynopsis
synopsisSnippetsynopsisSnippet
imageUrlimageUrl
changeTypeChange
changedFieldschangedFields
firstSeenAtfirstSeenAt
lastSeenAtlastSeenAt
malIdmalId
rankrank
titleSynonymstitleSynonyms
airedFromairedFrom
airedToairedTo
seasonseason
yearyear
trailerUrltrailerUrl
scrapedAtscrapedAt
authorReviewer
textReview
dateDate
recommendationVerdict
reactionCountreactionCount

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "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"
}

Ways to use this data

  • 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.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does MyAnimeList Scraper return?

The documented output for MyAnimeList Scraper includes id, type, title, titleenglish, titlejapanese, titlefrench, url and type. Availability of each field depends on the source page and the selected mode.

How much does MyAnimeList Scraper cost?

It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

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.

Ready to collect with MyAnimeList Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.