WEBTOON Scraper at a glance
WEBTOON Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes kind, recordid, titleno, title and url, 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.00 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.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 22 options
Scrape the WEBTOON catalog into structured data. Extract series, genres, rankings and complete episode lists, including titles, authors, descriptions, thumbnails and other available series and episode details.
What WEBTOON Scraper can do
- Five ways to find data. Search by keyword, browse a genre, a weekday schedule, a ranking chart or a canvas tab, or paste WEBTOON links directly. No need to build URLs by hand.
- Detail enrichment on demand. Turn on series detail reads to pull authors, summary, schedule text and view/subscribe counters that no catalog card carries.
- Episode expansion is opt-in. Switch it on to walk every discovered series' episode list and emit one row per episode, or leave it off for lean, series-only runs.
- One shared cap. A single maxItems limit spans every series and episode row together, so cost stays predictable, and the series row is always emitted before its episodes for readable grouping.
- Resume and incremental modes. Continue an interrupted crawl, or track a scope across scheduled runs and return only new, updated and reappeared series.
- Loud failures, not silent empties. A refused run fails with a clear message instead of returning a dataset that looks like an empty search.
Choose what to collect
These inputs let you configure WEBTOON Scraper - Series, Episodes, Genres & Rankings. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to start the scrape. 'search' queries the catalog (keyword, genre, schedule or canvas index). 'url' processes the WEBTOON URLs you paste: genre, schedule, ranking, search and canvas pages are walked like a search, and a series list page emits the series (plus one row per episode when Include episodes is on). The output and resume sections below apply to both modes. |
keywordstring | Title keyword to search for (for example tower of god). Leave empty to browse the genre or schedule instead. |
searchTypestring | Which catalog index the keyword searches (all, originals, canvas). |
languagestring | Catalog language edition (en, es, fr, de, id, th, zh-hant). |
sourcestring | Catalog to browse when no keyword is set: originals or canvas. |
genrestring | Catalog genre to browse when no keyword is set. Type it as you read it on the site (Drama, Slice of life, Romance); case and spacing are ignored. In search mode an unknown genre fails the run with the valid list; URL mode ignores this field. |
sortOrderstring | Genre page ordering: MANA (popularity), LIKEIT (likes), UPDATE (recency). |
Show 15 more inputs
| Input | What it controls |
|---|---|
weekdaystring | Weekday schedule to browse (Monday to Sunday, abbreviations such as mon accepted). Leave empty to browse the genre instead. |
urlsarray | One or more webtoons.com URLs: genre (any sort order, any language), originals weekday schedule (path or ?weekday=), legacy dailySchedule, ranking, keyword search, canvas list (tab and sort order), series list pages (incl. &page=N), legacy episodeList?titleNo=, the mobile host (m.) and episode viewer links (mapped to their series). Each shipped example points at a different series or list, so every example returns its own rows. Left untouched in URL mode, one example of each shape is scraped. |
fetchDetailsboolean | Read each series page for authors, summary and counters. Adds a per-series surcharge. |
includeEpisodesboolean | Open every discovered series page in search or URL mode and emit one row per episode. The series row and episode rows share the maxItems total cap. |
maxItemsinteger | Maximum total rows to return across all series and episode records (values above 1000000 are treated as 1000000). In search mode, series rows are emitted first and episode rows consume the remaining cap. This is the only default cap. |
maxPagesinteger | Maximum episode-list pages per series (0 means the built-in hard cap of 1000 pages per series; larger values are clamped to 1000; maxItems still applies). |
resumeFromRunIdstring | Continue an interrupted crawl from a previous run ID or dataset ID. See incrementalMode. |
incrementalModeboolean | Track this scope across runs and stamp NEW, UPDATED, UNCHANGED, REAPPEARED. A series or episode is compared on its content fields (title, author, genre, summary, schedule, urls, completed and mature flags, latest episode number and date). These fields are excluded from change detection and still returned: likeCount, likeCountRaw, likeCountText, viewCount, subscribeCount, rank, badge, isRecentlyUpdated, imageUrl, referer, sourcePage, trendingDirection, trendingChange, thumbnailAlt and scrapedAt. A counter moving alone never reads UPDATED. See resumeFromRunId. |
stateKeystring | Custom incremental state key. Leave empty to derive one from the full scope. |
emitUnchangedboolean | Also return UNCHANGED rows (suppressed by default). Billed like any row. |
emitExpiredboolean | Also return EXPIRED rows for tracked series gone from the scope. Billed like any row. |
ignoreFieldsForChangesarray | Optional. Extra field names that must NOT count as a change in incremental mode, on top of the built-in list (likeCount, likeCountRaw, likeCountText, viewCount, subscribeCount, rank, badge, isRecentlyUpdated, imageUrl, referer, sourcePage, trendingDirection, trendingChange, thumbnailAlt and scrapedAt). isCompleted, isMature and isUnsuitableForChildren are compared unless you add them here. A row whose only differences are in these fields is UNCHANGED, so it is not returned as UPDATED. Names match at any nesting depth. The fields still appear on rows that are returned. |
mcpConnectorsarray | Connector IDs to forward results to (optional). |
notionParentPageUrlstring | Parent page for the Notion connector (only used when a Notion connector is selected). |
maxNotifyListingsinteger | Maximum rows forwarded to each selected connector. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
kindkindrecordIdrecordIdtitleNotitleNotitletitleurlurllanguagelanguagegenregenrewebtoonTypewebtoonTypesourcePagesourcePageauthorauthorauthorsauthorssummarysummaryShow 29 more fields
scheduleTextscheduleTextpageSchedulepageSchedulerankrankbadgebadgelikeCountlikeCountlikeCountRawlikeCountRawviewCountviewCountsubscribeCountsubscribeCountlatestEpisodelatestEpisodeseriesRecordIdseriesRecordIdseriesTitleNoseriesTitleNoseriesTitleseriesTitleepisodeNoepisodeNodatedatelikeCountTextlikeCountTextisRecentlyUpdatedisRecentlyUpdatedimageUrlimageUrlrefererrefererisCompletedisCompletedisMatureisMaturetrendingDirectiontrendingDirectiontrendingChangetrendingChangeisUnsuitableForChildrenisUnsuitableForChildrenthumbnailAltthumbnailAltscrapedAtscrapedAtchangeTypechangeTypechangedFieldschangedFieldsfirstSeenAtfirstSeenAtlastSeenAtlastSeenAtExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"kind": "webtoon",
"recordId": "en-title-500001",
"titleNo": 500001,
"title": "Sample Series Title",
"url": "https://www.webtoons.com/en/fantasy/sample-series-title/list?title_no=500001",
"language": "en",
"genre": "Fantasy",
"webtoonType": "originals",
"sourcePage": "ranking",
"rank": 12,
"badge": "NEW",
"likeCountRaw": "245K",
"likeCount": 245000,
"author": "Sample Author",
"authors": [
"Sample Writer",
"Sample Artist"
],
"summary": "A short sample summary of the series premise.",
"scheduleText": "Every Monday",
"pageSchedule": null,
"viewCount": 12000000,
"subscribeCount": 340000,
"latestEpisode": {
"episodeNo": 42,
"title": "Episode 42",
"date": "Sep 20, 2026"
},
"imageUrl": "https://webtoon-phinf.pstatic.net/sample_thumb.jpg",
"referer": "https://www.webtoons.com/"
}Ways to use this data
- Webtoon and manhwa aggregators: mirror new releases, genre rankings and episode drops across languages into your own catalog or app.
- Content and licensing scouts: track rising titles by rank, likes and subscriber counts before they trend, using the ranking and genre modes.
- Reading-list and notification tools: monitor a shortlist of series URLs on a schedule and alert on new episodes with incremental mode.
- Localization and translation teams: compare titles, genres and publication schedules across the seven catalog language editions.
- Market and fandom research: build historical datasets of view counts, subscribe counts and genre popularity for analysis.
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 WEBTOON Scraper return?
The documented output for WEBTOON Scraper includes kind, recordid, titleno, title, url, language, genre and webtoontype. Availability of each field depends on the source page and the selected mode.
How much does WEBTOON Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 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 changed series on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared records; unchanged ones are suppressed and not billed unless Emit UNCHANGED rows is on.
Why did Include episodes return fewer rows than I expected?
Series rows and episode rows share one Max items cap, and the series row is emitted first, so a low cap can be used up before every episode is read. Raise Max items, or use Max pages per series to bound how many episode-list pages each series walks instead.
Why did my run fail instead of returning an empty dataset?
If every scope is refused, the run stops with a clear message so "no matches" is never confused with "nothing could be read". Run it again in a few minutes. If only some scopes could be read, you still get what was found and the run succeeds; the run log names each scope that was refused or errored.
Why does my keyword search also return genre rows?
With the originals source, search mode reads the genre page (default drama) after the keyword results, and fills the rest of Max items from it. Filter the dataset on sourcePage "search" to keep only keyword hits, or lower Max items.
