{
  "openapi": "3.0.1",
  "info": {
    "title": "WEBTOON Scraper - Series, Episodes, Genres & Rankings",
    "description": "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.",
    "version": "0.1",
    "x-build-id": "XioRDOO6PcQbum4WV"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~webtoons-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-webtoons-com-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/abotapi~webtoons-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-webtoons-com-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/abotapi~webtoons-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-webtoons-com-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "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.",
            "default": "search"
          },
          "keyword": {
            "title": "Keyword",
            "type": "string",
            "description": "Title keyword to search for (for example tower of god). Leave empty to browse the genre or schedule instead."
          },
          "searchType": {
            "title": "Search type",
            "enum": [
              "all",
              "canvas",
              "originals"
            ],
            "type": "string",
            "description": "Which catalog index the keyword searches (all, originals, canvas).",
            "default": "all"
          },
          "language": {
            "title": "Language",
            "enum": [
              "de",
              "en",
              "es",
              "fr",
              "id",
              "th",
              "zh-hant"
            ],
            "type": "string",
            "description": "Catalog language edition (en, es, fr, de, id, th, zh-hant).",
            "default": "en"
          },
          "source": {
            "title": "Source",
            "enum": [
              "canvas",
              "originals"
            ],
            "type": "string",
            "description": "Catalog to browse when no keyword is set: originals or canvas.",
            "default": "originals"
          },
          "genre": {
            "title": "Genre",
            "type": "string",
            "description": "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."
          },
          "sortOrder": {
            "title": "Sort order",
            "enum": [
              "LIKEIT",
              "MANA",
              "UPDATE"
            ],
            "type": "string",
            "description": "Genre page ordering: MANA (popularity), LIKEIT (likes), UPDATE (recency).",
            "default": "MANA"
          },
          "weekday": {
            "title": "Weekday",
            "type": "string",
            "description": "Weekday schedule to browse (Monday to Sunday, abbreviations such as mon accepted). Leave empty to browse the genre instead."
          },
          "urls": {
            "title": "Page URLs",
            "type": "array",
            "description": "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.",
            "default": [
              "https://www.webtoons.com/en/genres/drama?sortOrder=MANA",
              "https://www.webtoons.com/en/genres/fantasy?sortOrder=UPDATE",
              "https://www.webtoons.com/es/genres/drama",
              "https://www.webtoons.com/en/originals/monday",
              "https://www.webtoons.com/en/originals?weekday=tuesday",
              "https://www.webtoons.com/en/dailySchedule?weekday=WEDNESDAY",
              "https://www.webtoons.com/en/ranking/trending",
              "https://www.webtoons.com/en/search?keyword=tower%20of%20god",
              "https://www.webtoons.com/en/canvas/list?genreTab=ALL",
              "https://www.webtoons.com/en/canvas/list?genreTab=ROMANCE",
              "https://www.webtoons.com/en/canvas/list?genreTab=ALL&sortOrder=LIKEIT",
              "https://www.webtoons.com/en/fantasy/tower-of-god/list?title_no=95",
              "https://www.webtoons.com/en/super-hero/unordinary/list?title_no=679&page=2",
              "https://www.webtoons.com/en/canvas/talks-of-life/list?title_no=1134428",
              "https://www.webtoons.com/episodeList?titleNo=1320",
              "https://m.webtoons.com/en/romance/truebeauty/list?title_no=1436"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch series details",
            "type": "boolean",
            "description": "Read each series page for authors, summary and counters. Adds a per-series surcharge.",
            "default": false
          },
          "includeEpisodes": {
            "title": "Include episodes",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "maxItems": {
            "title": "Max items",
            "maximum": 1000000,
            "type": "integer",
            "description": "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.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per series",
            "minimum": 0,
            "type": "integer",
            "description": "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).",
            "default": 0
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy connection. Defaults to Apify datacenter proxies, which the catalog serves fine; if they are refused, the run falls back to other connections automatically. Choose a group here only to override."
          },
          "resumeFromRunId": {
            "title": "Resume from run ID",
            "type": "string",
            "description": "Continue an interrupted crawl from a previous run ID or dataset ID. See incrementalMode."
          },
          "incrementalMode": {
            "title": "Incremental mode",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Custom incremental state key. Leave empty to derive one from the full scope."
          },
          "emitUnchanged": {
            "title": "Emit UNCHANGED rows",
            "type": "boolean",
            "description": "Also return UNCHANGED rows (suppressed by default). Billed like any row.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit EXPIRED rows",
            "type": "boolean",
            "description": "Also return EXPIRED rows for tracked series gone from the scope. Billed like any row.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "MCP connectors",
            "type": "array",
            "description": "Connector IDs to forward results to (optional).",
            "items": {
              "type": "string"
            }
          },
          "notionParentPageUrl": {
            "title": "Notion parent page",
            "type": "string",
            "description": "Parent page for the Notion connector (only used when a Notion connector is selected)."
          },
          "maxNotifyListings": {
            "title": "Max rows per export",
            "type": "integer",
            "description": "Maximum rows forwarded to each selected connector.",
            "default": 50
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}