{
  "data": {
    "id": "EaLLw7aAkioCzX4Kt",
    "actId": "JR9iN0YMYQXCfKan9",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-02T08:52:09.191Z",
    "finishedAt": "2026-11-02T08:52:17.670Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 8415,
      "runTimeSecs": 8.415,
      "computeUnits": 0.00935,
      "imageSizeBytes": 320200192
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Naver Blog Scraper Input\",\n  \"description\": \"Search Naver Blog posts by one or more keywords, fetch every post from a blog, or get full post details for a list of URLs.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to fetch.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"blogPosts\",\n        \"postDetails\"\n      ],\n      \"enumTitles\": [\n        \"Search blog posts by keyword\",\n        \"Fetch posts from a specific blog\",\n        \"Get full post details for a list of URLs\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"search\"\n    },\n    \"searchQueries\": {\n      \"title\": \"Search queries\",\n      \"type\": \"array\",\n      \"description\": \"One or more Korean or English keywords to search across Naver Blog (mode=search). Each query is searched up to Naver's 1,000-result limit.\",\n      \"editor\": \"stringList\",\n      \"default\": [\n        \"제주도 여행\"\n      ],\n      \"prefill\": [\n        \"제주도 여행\"\n      ]\n    },\n    \"blogIds\": {\n      \"title\": \"Blog IDs\",\n      \"type\": \"array\",\n      \"description\": \"Naver blog IDs or blog URLs (mode=blogPosts). Accepts `hello_world123`, `@hello_world123`, or `https://blog.naver.com/hello_world123`.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"postUrls\": {\n      \"title\": \"Post URLs\",\n      \"type\": \"array\",\n      \"description\": \"Naver blog post URLs to fetch in detail (mode=postDetails). Accepts desktop, mobile, PostView, and bare `blogId/logNo` forms.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"sortBy\": {\n      \"title\": \"Sort by\",\n      \"type\": \"string\",\n      \"description\": \"Sort order for keyword search (mode=search).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"sim\",\n        \"date\"\n      ],\n      \"enumTitles\": [\n        \"Relevance\",\n        \"Newest first\"\n      ],\n      \"default\": \"sim\",\n      \"prefill\": \"sim\"\n    },\n    \"publishedWithin\": {\n      \"title\": \"Published within\",\n      \"type\": \"string\",\n      \"description\": \"Limit keyword search results by publish period (mode=search). Choose Custom to use dateFrom and dateTo.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"1h\",\n        \"1d\",\n        \"1w\",\n        \"1m\",\n        \"3m\",\n        \"6m\",\n        \"1y\",\n        \"custom\"\n      ],\n      \"enumTitles\": [\n        \"Any time\",\n        \"Last hour\",\n        \"Last 24 hours\",\n        \"Last week\",\n        \"Last month\",\n        \"Last 3 months\",\n        \"Last 6 months\",\n        \"Last year\",\n        \"Custom range\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\"\n    },\n    \"dateFrom\": {\n      \"title\": \"Date from\",\n      \"type\": \"string\",\n      \"description\": \"Start date in YYYY-MM-DD format (KST). Used when publishedWithin=custom (mode=search).\",\n      \"editor\": \"textfield\"\n    },\n    \"dateTo\": {\n      \"title\": \"Date to\",\n      \"type\": \"string\",\n      \"description\": \"End date in YYYY-MM-DD format (KST). Used when publishedWithin=custom (mode=search).\",\n      \"editor\": \"textfield\"\n    },\n    \"categoryNo\": {\n      \"title\": \"Category number\",\n      \"type\": \"integer\",\n      \"description\": \"Naver blog category number to restrict a blog archive; 0 means all categories (mode=blogPosts).\",\n      \"minimum\": 0,\n      \"maximum\": 999999999,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"maxItems\": {\n      \"title\": \"Max items\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on emitted records across all queries, blogs, or URLs.\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 20,\n      \"prefill\": 3\n    },\n    \"includeContent\": {\n      \"title\": \"Include full content\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch each post page for full text, exact publish time, images, tags, category, and places. Turn off for faster list-level records.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"includeComments\": {\n      \"title\": \"Include comments\",\n      \"type\": \"boolean\",\n      \"description\": \"Add the comment count and comment threads up to maxComments (default 100), including replies when Naver returns them. Implies includeContent=true and adds requests per post.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxComments\": {\n      \"title\": \"Max comments per post\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum comments to return per post when includeComments is on. Fetched in pages of 100; commentCount still reports the full total.\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 100,\n      \"prefill\": 100\n    },\n    \"includeHtml\": {\n      \"title\": \"Include content HTML\",\n      \"type\": \"boolean\",\n      \"description\": \"Add the post body as HTML in contentHtml. Implies includeContent=true.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxConcurrency\": {\n      \"title\": \"Max concurrency\",\n      \"type\": \"integer\",\n      \"description\": \"Parallel post-page requests when content enrichment is enabled.\",\n      \"minimum\": 1,\n      \"maximum\": 10,\n      \"default\": 3,\n      \"prefill\": 3\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Naver Blog Post Search & Full Content Extractor\n\nNaver Blog is South Korea's largest blogging platform, and its posts hold first-hand reviews, local guides, recipes, and daily-life writing that rarely appear elsewhere. This actor searches Naver Blog by keyword, walks an entire public blog archive, or fetches a list of post URLs — returning clean post records with exact publish times, full text, images, tags, categories, and places.\n\nNo Naver account, login, API key, or proxy setup is required.\n\n## What this actor does\n\n- **Three modes:** `search` for keyword discovery, `blogPosts` for a blog's public archive, and `postDetails` for exact URLs.\n- **Multiple targets per run:** search up to 50 keywords and read up to 50 blog IDs in one run, with duplicates removed across queries.\n- **Real sorting and date filters:** relevance or newest-first, plus last hour/day/week/month/3 months/6 months/year and custom `YYYY-MM-DD` ranges.\n- **Full posts, not snippets:** optional content enrichment adds the complete body, exact publish time, images, thumbnail, tags, category, and Naver Map places.\n- **Exact publish times:** `publishedAt` is the post's real timestamp in Korea Standard Time (UTC+9), while `publishDateText` preserves what Naver displayed.\n- **Reactions and comments:** like counts, reaction breakdowns, and optional comment counts and paginated comment threads (up to `maxComments` per post).\n- **Empty fields are omitted:** every record is cleaned recursively, so absent data is never returned as `null`, `\"\"`, or `[]`.\n\n## Output per post\n\n| Field | Description |\n|---|---|\n| `title` | Post title, HTML removed |\n| `summary` | Search snippet or the post page's description |\n| `authorName` | Author's display name |\n| `authorUrl` | Author profile link, when Naver exposes one |\n| `blogName` | Name of the blog |\n| `blogId` | Blog identifier, e.g. `travel_lover` |\n| `blogUrl` | Blog home URL |\n| `postUrl` | Canonical post URL |\n| `publishDate` | Publish date in `YYYY-MM-DD` format (KST) |\n| `publishedAt` | Exact publish time as ISO 8601 with `+09:00` (content enrichment only) |\n| `publishDateText` | Date as Naver displayed it, e.g. `2주 전` or `2026. 10. 23. 11:10` |\n| `category` | Blog category name (content enrichment only) |\n| `tags` | Hashtags found on the post (content enrichment only) |\n| `images` | Full-size content image URLs (content enrichment only) |\n| `imageCount` | Number of images in `images` |\n| `thumbnail` | Representative image for the post |\n| `places` | Naver Map places mentioned in the post (content enrichment only) |\n| `hasVideo` | `true` when the post contains a video (only present when true) |\n| `isSelfPurchased` | `true` when Naver shows its structured self-purchased review disclosure (내돈내산) |\n| `content` | Complete post text, never truncated (content enrichment only) |\n| `contentHtml` | Post body HTML, only when `includeHtml` is on |\n| `contentLength` | Character count of `content` |\n| `rank` | 1-based organic position for the query that found the post (`search` only) |\n| `searchQuery` | First query that found the post (`search` only) |\n| `matchedQueries` | Every processed query that found the post (`search` only) |\n| `commentCount` | Total comments including replies; from the blog list or `includeComments` |\n| `comments` | Comment threads up to `maxComments` (default 100), fetched in pages of 100, only when `includeComments` is on |\n| `likeCount` | Main \"like\" (공감) count when Naver publishes it (content enrichment only) |\n| `reactionCounts` | Counts by reaction type (`like`, `impressive`, `thanks`, `wow`, `haha`, `sad`) when Naver publishes them |\n| `recordType` | Always `\"blogPost\"` |\n| `scrapedAt` | UTC timestamp when the record was scraped |\n\nEach place in `places` contains `name`, `address`, `latitude`, `longitude`, `phone`, `placeId`, and `bookingUrl`, with empty values omitted.\n\nWith `includeContent` off, search and blog-archive records contain list-level fields only: title, summary, author, blog, URLs, `publishDateText`, and the date when Naver shows an absolute date. `postDetails` always fetches the post page because that is the mode's purpose.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string (required) | `search` | `search`, `blogPosts`, or `postDetails` |\n| `searchQueries` | array of strings | `[\"제주도 여행\"]` | Keywords to search (mode=search); max 50 |\n| `blogIds` | array of strings | – | Blog IDs or blog URLs (mode=blogPosts); max 50 |\n| `postUrls` | array of strings | – | Post URLs to fetch (mode=postDetails); desktop, mobile, PostView, or `blogId/logNo` |\n| `sortBy` | string | `sim` | `sim` for relevance, `date` for newest first (mode=search) |\n| `publishedWithin` | string | `all` | `all`, `1h`, `1d`, `1w`, `1m`, `3m`, `6m`, `1y`, or `custom` (mode=search) |\n| `dateFrom` | string | – | Start date `YYYY-MM-DD` for a custom range (mode=search) |\n| `dateTo` | string | – | End date `YYYY-MM-DD` for a custom range (mode=search) |\n| `categoryNo` | integer | `0` | Blog category number; `0` means every category (mode=blogPosts) |\n| `maxItems` | integer | `20` | Hard cap on emitted records across all targets (1–10,000) |\n| `includeContent` | boolean | `true` | Fetch each post page for full text and detail fields |\n| `includeHtml` | boolean | `false` | Add `contentHtml`; turns content enrichment on |\n| `includeComments` | boolean | `false` | Add `commentCount` and comment threads up to `maxComments`; turns content enrichment on |\n| `maxComments` | integer | `100` | Maximum comments returned per post with `includeComments` (1–1,000) |\n| `maxConcurrency` | integer | `3` | Parallel post-page requests when enriching content |\n\n### Example: Korean keyword search, newest first\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"제주도 여행\"],\n  \"sortBy\": \"date\",\n  \"publishedWithin\": \"all\",\n  \"maxItems\": 50,\n  \"includeContent\": true\n}\n```\n\n### Example: several queries with a custom date range\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"K-beauty routine\", \"올리브영 추천\"],\n  \"sortBy\": \"sim\",\n  \"publishedWithin\": \"custom\",\n  \"dateFrom\": \"2026-01-01\",\n  \"dateTo\": \"2026-03-31\",\n  \"maxItems\": 200,\n  \"includeContent\": false\n}\n```\n\n### Example: a blog's full archive in one category\n\n```json\n{\n  \"mode\": \"blogPosts\",\n  \"blogIds\": [\"ranto28\"],\n  \"categoryNo\": 17,\n  \"maxItems\": 500,\n  \"includeContent\": true,\n  \"includeHtml\": false\n}\n```\n\n### Example: full details for known posts\n\n```json\n{\n  \"mode\": \"postDetails\",\n  \"postUrls\": [\n    \"https://blog.naver.com/e_s_l/224451062514\",\n    \"https://m.blog.naver.com/ranto28/224461024209\",\n    \"https://blog.naver.com/PostView.naver?blogId=hoyaaaaa-&logNo=224458179821\"\n  ]\n}\n```\n\n## Search limits and blog archives\n\nNaver returns at most **1,000 posts per keyword search**. This is a source-side ceiling, not an actor setting. To collect more:\n\n- split a broad topic into narrower queries;\n- use `publishedWithin` presets or a custom `dateFrom`/`dateTo` window and run several windows;\n- deduplicate with `postUrl` — the actor already removes duplicates inside a run.\n\nBlog archives use a different source and are **not limited to 1,000 posts**: a public blog with 2,700 posts can return all 2,700. Search results are likely to repeat across pages, so deduplication is applied by canonical post URL.\n\nComment counts are included when Naver exposes them: from the blog list in `blogPosts` mode, or from the post page when `includeComments` is on. Likes (`likeCount` and `reactionCounts`) come from Naver's public reaction service and are omitted for posts with no reactions. With `includeComments`, `comments` returns up to `maxComments` per post (default 100, fetched in pages of 100) including replies when Naver returns them; `commentCount` is always the full total, so a post can have more comments than rows in `comments`.\n\n### Limitations\n\n- **Search ceiling:** Naver accepts search start positions up to 1,000, so one query exposes roughly a 1,000-result window; after deduplication a run can return fewer. Split by date or query for more.\n- **Comment cap:** Naver serves comment pages cookielessly; the actor pages through them up to `maxComments` per post (default 100, max 1,000) to keep output and request cost bounded. `commentCount` still reports the full total. Increase the cap if you need more rows. Posts with comments disabled return neither field.\n- **Not shipped (scope decisions, not source limits):** blogger profile totals (neighbors, visitors, post count), cafe/news article search, paid-sponsorship classification, and incremental only-new state. Profile and cafe/news data are reachable on separate Naver surfaces but are outside this post-oriented actor; paid sponsorship has no ground-truth label and remains a text heuristic for users; incremental state is an implementation choice, and date windows plus `postUrl` dedupe cover the same workflow. Self-purchased reviews are labeled by Naver and are exposed as `isSelfPurchased`.\n- **Private, deleted, or members-only posts** are skipped; one bad post does not fail the run.\n- **Search relevance** is Naver's own ranking, including Korean results for English queries; the actor does not re-rank.\n- **Markup changes:** Naver redesigns can require a parser update. The actor ships fixtures and status messages instead of failing silently.\n\n## Use cases\n\n- **Consumer research** — collect how Korean bloggers describe a product, brand, or store before a launch.\n- **Influencer and blog discovery** — find active blogs in K-beauty, food, travel, parenting, or finance.\n- **Brand monitoring** — track mentions across the Korean blogosphere, then filter by exact publish date.\n- **Content and trend analysis** — measure post volume and topic shifts across date windows.\n- **Local travel research** — gather first-hand restaurant, cafe, and itinerary write-ups with mapped places.\n- **Archive and migration** — export a public blog's full post history, including text and image URLs.\n\n## FAQ\n\n**Do I need a Naver account or API key?**\nNo. The actor reads public Naver Blog pages. There is no login, key, or proxy configuration to provide.\n\n**Can I search in Korean and English?**\nYes. Korean, English, and mixed queries all work. Results are mostly Korean-language blogs because that is what Naver Blog contains.\n\n**How do I find a blog ID?**\nUse the segment right after `blog.naver.com/`. For `https://blog.naver.com/travel_lover`, the blog ID is `travel_lover`. The actor also accepts the full blog URL or `@travel_lover`.\n\n**Why do some posts have no `content`, `images`, or `publishedAt`?**\nThose fields come from the post page, so they require `includeContent`. They are also omitted for empty-body posts, private or deleted posts, and text-only posts with no images or places.\n\n**What is the difference between `publishDate` and `publishedAt`?**\n`publishDate` is the date in `YYYY-MM-DD` format. `publishedAt` is the exact timestamp with a `+09:00` offset. `publishDateText` keeps the original wording, which may be relative such as `3일 전`.\n\n**Why did a keyword return fewer posts than expected?**\nNaver caps one keyword at 1,000 results and may return fewer for narrow queries. Add more queries or split the period into smaller date windows.\n\n**Why are there no likes or comments on some posts?**\nNaver's reaction and comment services are public but conditional: posts with no reactions omit `likeCount`/`reactionCounts`, and posts with comments disabled omit `commentCount`/`comments`. Set `includeComments=true` to request comments; `commentCount` is the total and `comments` holds up to `maxComments` rows (default 100, paginated 100 at a time).\n\n**What does `isSelfPurchased` mean?**\nIt is `true` only when Naver itself shows the structured self-purchased review disclosure (내돈내산) on the post. It is not a paid-sponsorship classifier; `협찬`/`광고` wording remains in `content` for your own rules.\n\n**What happens to private, deleted, or blocked posts?**\nThey are skipped with a log message. One missing post does not fail the run. If every target is invalid, the run finishes with a status message explaining what to check.\n\n**Can I fetch more than 10,000 posts?**\n`maxItems` is capped at 10,000 per run. For larger archives, split the work into separate runs and deduplicate by `postUrl`.\n\n**Is this affiliated with Naver?**\nNo. This is an independent third-party actor that reads public Naver Blog pages. It is not affiliated with, endorsed by, or sponsored by Naver Corporation.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "naver-blog-post-search-and-full-content-extractor",
      "title": "Naver Blog Post Search & Full Content Extractor",
      "description": "Search Naver Blog by keyword, fetch every post from a blog, or get full post content, exact publish times, images, tags, categories, and places.",
      "version": "1.0",
      "buildTag": "latest",
      "defaultMemoryMbytes": 1024,
      "dockerfile": "./Dockerfile",
      "readme": "# Naver Blog Post Search & Full Content Extractor\n\nNaver Blog is South Korea's largest blogging platform, and its posts hold first-hand reviews, local guides, recipes, and daily-life writing that rarely appear elsewhere. This actor searches Naver Blog by keyword, walks an entire public blog archive, or fetches a list of post URLs — returning clean post records with exact publish times, full text, images, tags, categories, and places.\n\nNo Naver account, login, API key, or proxy setup is required.\n\n## What this actor does\n\n- **Three modes:** `search` for keyword discovery, `blogPosts` for a blog's public archive, and `postDetails` for exact URLs.\n- **Multiple targets per run:** search up to 50 keywords and read up to 50 blog IDs in one run, with duplicates removed across queries.\n- **Real sorting and date filters:** relevance or newest-first, plus last hour/day/week/month/3 months/6 months/year and custom `YYYY-MM-DD` ranges.\n- **Full posts, not snippets:** optional content enrichment adds the complete body, exact publish time, images, thumbnail, tags, category, and Naver Map places.\n- **Exact publish times:** `publishedAt` is the post's real timestamp in Korea Standard Time (UTC+9), while `publishDateText` preserves what Naver displayed.\n- **Reactions and comments:** like counts, reaction breakdowns, and optional comment counts and paginated comment threads (up to `maxComments` per post).\n- **Empty fields are omitted:** every record is cleaned recursively, so absent data is never returned as `null`, `\"\"`, or `[]`.\n\n## Output per post\n\n| Field | Description |\n|---|---|\n| `title` | Post title, HTML removed |\n| `summary` | Search snippet or the post page's description |\n| `authorName` | Author's display name |\n| `authorUrl` | Author profile link, when Naver exposes one |\n| `blogName` | Name of the blog |\n| `blogId` | Blog identifier, e.g. `travel_lover` |\n| `blogUrl` | Blog home URL |\n| `postUrl` | Canonical post URL |\n| `publishDate` | Publish date in `YYYY-MM-DD` format (KST) |\n| `publishedAt` | Exact publish time as ISO 8601 with `+09:00` (content enrichment only) |\n| `publishDateText` | Date as Naver displayed it, e.g. `2주 전` or `2026. 10. 23. 11:10` |\n| `category` | Blog category name (content enrichment only) |\n| `tags` | Hashtags found on the post (content enrichment only) |\n| `images` | Full-size content image URLs (content enrichment only) |\n| `imageCount` | Number of images in `images` |\n| `thumbnail` | Representative image for the post |\n| `places` | Naver Map places mentioned in the post (content enrichment only) |\n| `hasVideo` | `true` when the post contains a video (only present when true) |\n| `isSelfPurchased` | `true` when Naver shows its structured self-purchased review disclosure (내돈내산) |\n| `content` | Complete post text, never truncated (content enrichment only) |\n| `contentHtml` | Post body HTML, only when `includeHtml` is on |\n| `contentLength` | Character count of `content` |\n| `rank` | 1-based organic position for the query that found the post (`search` only) |\n| `searchQuery` | First query that found the post (`search` only) |\n| `matchedQueries` | Every processed query that found the post (`search` only) |\n| `commentCount` | Total comments including replies; from the blog list or `includeComments` |\n| `comments` | Comment threads up to `maxComments` (default 100), fetched in pages of 100, only when `includeComments` is on |\n| `likeCount` | Main \"like\" (공감) count when Naver publishes it (content enrichment only) |\n| `reactionCounts` | Counts by reaction type (`like`, `impressive`, `thanks`, `wow`, `haha`, `sad`) when Naver publishes them |\n| `recordType` | Always `\"blogPost\"` |\n| `scrapedAt` | UTC timestamp when the record was scraped |\n\nEach place in `places` contains `name`, `address`, `latitude`, `longitude`, `phone`, `placeId`, and `bookingUrl`, with empty values omitted.\n\nWith `includeContent` off, search and blog-archive records contain list-level fields only: title, summary, author, blog, URLs, `publishDateText`, and the date when Naver shows an absolute date. `postDetails` always fetches the post page because that is the mode's purpose.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string (required) | `search` | `search`, `blogPosts`, or `postDetails` |\n| `searchQueries` | array of strings | `[\"제주도 여행\"]` | Keywords to search (mode=search); max 50 |\n| `blogIds` | array of strings | – | Blog IDs or blog URLs (mode=blogPosts); max 50 |\n| `postUrls` | array of strings | – | Post URLs to fetch (mode=postDetails); desktop, mobile, PostView, or `blogId/logNo` |\n| `sortBy` | string | `sim` | `sim` for relevance, `date` for newest first (mode=search) |\n| `publishedWithin` | string | `all` | `all`, `1h`, `1d`, `1w`, `1m`, `3m`, `6m`, `1y`, or `custom` (mode=search) |\n| `dateFrom` | string | – | Start date `YYYY-MM-DD` for a custom range (mode=search) |\n| `dateTo` | string | – | End date `YYYY-MM-DD` for a custom range (mode=search) |\n| `categoryNo` | integer | `0` | Blog category number; `0` means every category (mode=blogPosts) |\n| `maxItems` | integer | `20` | Hard cap on emitted records across all targets (1–10,000) |\n| `includeContent` | boolean | `true` | Fetch each post page for full text and detail fields |\n| `includeHtml` | boolean | `false` | Add `contentHtml`; turns content enrichment on |\n| `includeComments` | boolean | `false` | Add `commentCount` and comment threads up to `maxComments`; turns content enrichment on |\n| `maxComments` | integer | `100` | Maximum comments returned per post with `includeComments` (1–1,000) |\n| `maxConcurrency` | integer | `3` | Parallel post-page requests when enriching content |\n\n### Example: Korean keyword search, newest first\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"제주도 여행\"],\n  \"sortBy\": \"date\",\n  \"publishedWithin\": \"all\",\n  \"maxItems\": 50,\n  \"includeContent\": true\n}\n```\n\n### Example: several queries with a custom date range\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"K-beauty routine\", \"올리브영 추천\"],\n  \"sortBy\": \"sim\",\n  \"publishedWithin\": \"custom\",\n  \"dateFrom\": \"2026-01-01\",\n  \"dateTo\": \"2026-03-31\",\n  \"maxItems\": 200,\n  \"includeContent\": false\n}\n```\n\n### Example: a blog's full archive in one category\n\n```json\n{\n  \"mode\": \"blogPosts\",\n  \"blogIds\": [\"ranto28\"],\n  \"categoryNo\": 17,\n  \"maxItems\": 500,\n  \"includeContent\": true,\n  \"includeHtml\": false\n}\n```\n\n### Example: full details for known posts\n\n```json\n{\n  \"mode\": \"postDetails\",\n  \"postUrls\": [\n    \"https://blog.naver.com/e_s_l/224451062514\",\n    \"https://m.blog.naver.com/ranto28/224461024209\",\n    \"https://blog.naver.com/PostView.naver?blogId=hoyaaaaa-&logNo=224458179821\"\n  ]\n}\n```\n\n## Search limits and blog archives\n\nNaver returns at most **1,000 posts per keyword search**. This is a source-side ceiling, not an actor setting. To collect more:\n\n- split a broad topic into narrower queries;\n- use `publishedWithin` presets or a custom `dateFrom`/`dateTo` window and run several windows;\n- deduplicate with `postUrl` — the actor already removes duplicates inside a run.\n\nBlog archives use a different source and are **not limited to 1,000 posts**: a public blog with 2,700 posts can return all 2,700. Search results are likely to repeat across pages, so deduplication is applied by canonical post URL.\n\nComment counts are included when Naver exposes them: from the blog list in `blogPosts` mode, or from the post page when `includeComments` is on. Likes (`likeCount` and `reactionCounts`) come from Naver's public reaction service and are omitted for posts with no reactions. With `includeComments`, `comments` returns up to `maxComments` per post (default 100, fetched in pages of 100) including replies when Naver returns them; `commentCount` is always the full total, so a post can have more comments than rows in `comments`.\n\n### Limitations\n\n- **Search ceiling:** Naver accepts search start positions up to 1,000, so one query exposes roughly a 1,000-result window; after deduplication a run can return fewer. Split by date or query for more.\n- **Comment cap:** Naver serves comment pages cookielessly; the actor pages through them up to `maxComments` per post (default 100, max 1,000) to keep output and request cost bounded. `commentCount` still reports the full total. Increase the cap if you need more rows. Posts with comments disabled return neither field.\n- **Not shipped (scope decisions, not source limits):** blogger profile totals (neighbors, visitors, post count), cafe/news article search, paid-sponsorship classification, and incremental only-new state. Profile and cafe/news data are reachable on separate Naver surfaces but are outside this post-oriented actor; paid sponsorship has no ground-truth label and remains a text heuristic for users; incremental state is an implementation choice, and date windows plus `postUrl` dedupe cover the same workflow. Self-purchased reviews are labeled by Naver and are exposed as `isSelfPurchased`.\n- **Private, deleted, or members-only posts** are skipped; one bad post does not fail the run.\n- **Search relevance** is Naver's own ranking, including Korean results for English queries; the actor does not re-rank.\n- **Markup changes:** Naver redesigns can require a parser update. The actor ships fixtures and status messages instead of failing silently.\n\n## Use cases\n\n- **Consumer research** — collect how Korean bloggers describe a product, brand, or store before a launch.\n- **Influencer and blog discovery** — find active blogs in K-beauty, food, travel, parenting, or finance.\n- **Brand monitoring** — track mentions across the Korean blogosphere, then filter by exact publish date.\n- **Content and trend analysis** — measure post volume and topic shifts across date windows.\n- **Local travel research** — gather first-hand restaurant, cafe, and itinerary write-ups with mapped places.\n- **Archive and migration** — export a public blog's full post history, including text and image URLs.\n\n## FAQ\n\n**Do I need a Naver account or API key?**\nNo. The actor reads public Naver Blog pages. There is no login, key, or proxy configuration to provide.\n\n**Can I search in Korean and English?**\nYes. Korean, English, and mixed queries all work. Results are mostly Korean-language blogs because that is what Naver Blog contains.\n\n**How do I find a blog ID?**\nUse the segment right after `blog.naver.com/`. For `https://blog.naver.com/travel_lover`, the blog ID is `travel_lover`. The actor also accepts the full blog URL or `@travel_lover`.\n\n**Why do some posts have no `content`, `images`, or `publishedAt`?**\nThose fields come from the post page, so they require `includeContent`. They are also omitted for empty-body posts, private or deleted posts, and text-only posts with no images or places.\n\n**What is the difference between `publishDate` and `publishedAt`?**\n`publishDate` is the date in `YYYY-MM-DD` format. `publishedAt` is the exact timestamp with a `+09:00` offset. `publishDateText` keeps the original wording, which may be relative such as `3일 전`.\n\n**Why did a keyword return fewer posts than expected?**\nNaver caps one keyword at 1,000 results and may return fewer for narrow queries. Add more queries or split the period into smaller date windows.\n\n**Why are there no likes or comments on some posts?**\nNaver's reaction and comment services are public but conditional: posts with no reactions omit `likeCount`/`reactionCounts`, and posts with comments disabled omit `commentCount`/`comments`. Set `includeComments=true` to request comments; `commentCount` is the total and `comments` holds up to `maxComments` rows (default 100, paginated 100 at a time).\n\n**What does `isSelfPurchased` mean?**\nIt is `true` only when Naver itself shows the structured self-purchased review disclosure (내돈내산) on the post. It is not a paid-sponsorship classifier; `협찬`/`광고` wording remains in `content` for your own rules.\n\n**What happens to private, deleted, or blocked posts?**\nThey are skipped with a log message. One missing post does not fail the run. If every target is invalid, the run finishes with a status message explaining what to check.\n\n**Can I fetch more than 10,000 posts?**\n`maxItems` is capped at 10,000 per run. For larger archives, split the work into separate runs and deduplicate by `postUrl`.\n\n**Is this affiliated with Naver?**\nNo. This is an independent third-party actor that reads public Naver Blog pages. It is not affiliated with, endorsed by, or sponsored by Naver Corporation.\n",
      "input": {
        "title": "Naver Blog Scraper Input",
        "description": "Search Naver Blog posts by one or more keywords, fetch every post from a blog, or get full post details for a list of URLs.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to fetch.",
            "editor": "select",
            "enum": [
              "search",
              "blogPosts",
              "postDetails"
            ],
            "enumTitles": [
              "Search blog posts by keyword",
              "Fetch posts from a specific blog",
              "Get full post details for a list of URLs"
            ],
            "default": "search",
            "prefill": "search"
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "One or more Korean or English keywords to search across Naver Blog (mode=search). Each query is searched up to Naver's 1,000-result limit.",
            "editor": "stringList",
            "default": [
              "제주도 여행"
            ],
            "prefill": [
              "제주도 여행"
            ]
          },
          "blogIds": {
            "title": "Blog IDs",
            "type": "array",
            "description": "Naver blog IDs or blog URLs (mode=blogPosts). Accepts `hello_world123`, `@hello_world123`, or `https://blog.naver.com/hello_world123`.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "postUrls": {
            "title": "Post URLs",
            "type": "array",
            "description": "Naver blog post URLs to fetch in detail (mode=postDetails). Accepts desktop, mobile, PostView, and bare `blogId/logNo` forms.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "sortBy": {
            "title": "Sort by",
            "type": "string",
            "description": "Sort order for keyword search (mode=search).",
            "editor": "select",
            "enum": [
              "sim",
              "date"
            ],
            "enumTitles": [
              "Relevance",
              "Newest first"
            ],
            "default": "sim",
            "prefill": "sim"
          },
          "publishedWithin": {
            "title": "Published within",
            "type": "string",
            "description": "Limit keyword search results by publish period (mode=search). Choose Custom to use dateFrom and dateTo.",
            "editor": "select",
            "enum": [
              "all",
              "1h",
              "1d",
              "1w",
              "1m",
              "3m",
              "6m",
              "1y",
              "custom"
            ],
            "enumTitles": [
              "Any time",
              "Last hour",
              "Last 24 hours",
              "Last week",
              "Last month",
              "Last 3 months",
              "Last 6 months",
              "Last year",
              "Custom range"
            ],
            "default": "all",
            "prefill": "all"
          },
          "dateFrom": {
            "title": "Date from",
            "type": "string",
            "description": "Start date in YYYY-MM-DD format (KST). Used when publishedWithin=custom (mode=search).",
            "editor": "textfield"
          },
          "dateTo": {
            "title": "Date to",
            "type": "string",
            "description": "End date in YYYY-MM-DD format (KST). Used when publishedWithin=custom (mode=search).",
            "editor": "textfield"
          },
          "categoryNo": {
            "title": "Category number",
            "type": "integer",
            "description": "Naver blog category number to restrict a blog archive; 0 means all categories (mode=blogPosts).",
            "minimum": 0,
            "maximum": 999999999,
            "default": 0,
            "prefill": 0
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Hard cap on emitted records across all queries, blogs, or URLs.",
            "minimum": 1,
            "maximum": 10000,
            "default": 20,
            "prefill": 3
          },
          "includeContent": {
            "title": "Include full content",
            "type": "boolean",
            "description": "Fetch each post page for full text, exact publish time, images, tags, category, and places. Turn off for faster list-level records.",
            "default": true,
            "prefill": false
          },
          "includeComments": {
            "title": "Include comments",
            "type": "boolean",
            "description": "Add the comment count and comment threads up to maxComments (default 100), including replies when Naver returns them. Implies includeContent=true and adds requests per post.",
            "default": false,
            "prefill": false
          },
          "maxComments": {
            "title": "Max comments per post",
            "type": "integer",
            "description": "Maximum comments to return per post when includeComments is on. Fetched in pages of 100; commentCount still reports the full total.",
            "minimum": 1,
            "maximum": 1000,
            "default": 100,
            "prefill": 100
          },
          "includeHtml": {
            "title": "Include content HTML",
            "type": "boolean",
            "description": "Add the post body as HTML in contentHtml. Implies includeContent=true.",
            "default": false,
            "prefill": false
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "type": "integer",
            "description": "Parallel post-page requests when content enrichment is enabled.",
            "minimum": 1,
            "maximum": 10,
            "default": 3,
            "prefill": 3
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Naver Blog Post Search & Full Content Extractor Output",
        "description": "Naver Blog posts — titles, authors, blog names, exact publish times, full text, images, tags, categories, and places.",
        "properties": {
          "blogPosts": {
            "type": "string",
            "title": "Naver Blog posts",
            "description": "Dataset containing all scraped Naver Blog posts.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Blog Posts",
              "transformation": {
                "fields": [
                  "title",
                  "authorName",
                  "blogName",
                  "publishDate",
                  "contentLength",
                  "commentCount",
                  "likeCount",
                  "isSelfPurchased",
                  "postUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "dfb0a6f94b964761120bf166dc0a660ca0d4ac7b58f61ffe519ad12fbee2249b",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.00935
    }
  }
}