Naver Place Visitor & Blog Review Finder
Collect Naver Place visitor reviews, linked Naver Blog posts, and aggregated rating statistics by place URL/ID or keyword search, with ratings, voted keywords, photos and owner replies.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
placeUrls | array | optional | Naver Place URLs, naver.me short links, or bare numeric Place IDs. Examples: 'https://map.naver.com/p/entry/place/38239053', 'https://pcmap.place.naver.com/place/38239053/home', '38239053'. |
searchKeywords | array | optional | Keywords to discover places first, then scrape their reviews. Example: ['강남 맛집', '홍대 카페']. Can be combined with placeUrls. |
maxPlacesPerKeyword | integer | optional | Maximum places to scrape per keyword search. Naver's search page returns up to 100 places per keyword. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
placeUrls | array | optional | Naver Place URLs, naver.me short links, or bare numeric Place IDs. Examples: 'https://map.naver.com/p/entry/place/38239053', 'https://pcmap.place.naver.com/place/38239053/home', '38239053'. |
searchKeywords | array | optional | Keywords to discover places first, then scrape their reviews. Example: ['강남 맛집', '홍대 카페']. Can be combined with placeUrls. |
maxPlacesPerKeyword | integer | optional | Maximum places to scrape per keyword search. Naver's search page returns up to 100 places per keyword. |
maxReviews | integer | optional | Maximum visitor reviews to collect per place, across both the text-review stream and the rating-only stream. Naver paginates 50 reviews per request. |
includeVisitorReviews | boolean | optional | Collect visitor reviews. Turn off for a blog-only or stats-only run. |
includeRatingOnlyReviews | boolean | optional | Also collect reviews that have a star rating but no written text. These come from a separate Naver review stream and count toward maxReviews. |
includeBlogReviews | boolean | optional | Collect Naver Blog and cafe posts linked to the place, with exact publish dates. |
maxBlogReviews | integer | optional | Maximum linked blog/cafe posts per place. Naver exposes at most 100 per place. |
includeReviewPhotos | boolean | optional | Include photo and video-thumbnail URLs attached to each visitor review. |
includeReviewStats | boolean | optional | Emit one stats record per place: average rating, rating distribution, themes, top menus, voted keywords, and review counts. |
visitedSince | string | optional | Only keep visitor reviews whose visit date is on or after this date. Reviews without a visit date are skipped when this filter is set. |
excludeReviewIds | array | optional | Visitor review IDs and blog post URLs to skip. Useful for incremental runs that only want new reviews. |
maxConcurrency | integer | optional | How many places to scrape in parallel. Higher is faster but increases rate-limit risk. |
maxItems | integer | optional | Hard cap on total records emitted across all places. |
proxyConfiguration | object | optional | Optional. Leave empty to use direct requests; the actor escalates to an Apify datacenter proxy only after a real block. |
Download the published input schema
View complete JSON
{
"description": "Collect Naver Place visitor reviews, linked Naver Blog posts, and aggregated rating statistics. Provide place URLs/IDs directly, or search by keyword to discover places first.",
"properties": {
"excludeReviewIds": {
"description": "Visitor review IDs and blog post URLs to skip. Useful for incremental runs that only want new reviews.",
"editor": "stringList",
"title": "Exclude review IDs or blog URLs",
"type": "array"
},
"includeBlogReviews": {
"default": true,
"description": "Collect Naver Blog and cafe posts linked to the place, with exact publish dates.",
"prefill": false,
"title": "Include blog reviews",
"type": "boolean"
},
"includeRatingOnlyReviews": {
"default": true,
"description": "Also collect reviews that have a star rating but no written text. These come from a separate Naver review stream and count toward maxReviews.",
"prefill": false,
"title": "Include rating-only reviews",
"type": "boolean"
},
"includeReviewPhotos": {
"default": false,
"description": "Include photo and video-thumbnail URLs attached to each visitor review.",
"prefill": false,
"title": "Include review photos",
"type": "boolean"
},
"includeReviewStats": {
"default": true,
"description": "Emit one stats record per place: average rating, rating distribution, themes, top menus, voted keywords, and review counts.",
"prefill": false,
"title": "Include review statistics",
"type": "boolean"
},
"includeVisitorReviews": {
"default": true,
"description": "Collect visitor reviews. Turn off for a blog-only or stats-only run.",
"prefill": true,
"title": "Include visitor reviews",
"type": "boolean"
},
"maxBlogReviews": {
"default": 100,
"description": "Maximum linked blog/cafe posts per place. Naver exposes at most 100 per place.",
"maximum": 100,
"minimum": 1,
"prefill": 10,
"title": "Max blog reviews per place",
"type": "integer"
},
"maxConcurrency": {
"default": 3,
"description": "How many places to scrape in parallel. Higher is faster but increases rate-limit risk.",
"maximum": 10,
"minimum": 1,
"prefill": 3,
"title": "Max concurrent places",
"type": "integer"
},
"maxItems": {
"default": 100,
"description": "Hard cap on total records emitted across all places.",
"maximum": 5000,
"minimum": 1,
"prefill": 3,
"title": "Max items",
"type": "integer"
},
"maxPlacesPerKeyword": {
"default": 3,
"description": "Maximum places to scrape per keyword search. Naver's search page returns up to 100 places per keyword.",
"maximum": 100,
"minimum": 1,
"prefill": 3,
"title": "Max places per keyword",
"type": "integer"
},
"maxReviews": {
"default": 100,
"description": "Maximum visitor reviews to collect per place, across both the text-review stream and the rating-only stream. Naver paginates 50 reviews per request.",
"maximum": 5000,
"minimum": 1,
"prefill": 3,
"title": "Max visitor reviews per place",
"type": "integer"
},
"placeUrls": {
"description": "Naver Place URLs, naver.me short links, or bare numeric Place IDs. Examples: 'https://map.naver.com/p/entry/place/38239053', 'https://pcmap.place.naver.com/place/38239053/home', '38239053'.",
"editor": "stringList",
"prefill": [
"https://map.naver.com/p/entry/place/38239053"
],
"title": "Place URLs or IDs",
"type": "array"
},
"proxyConfiguration": {
"description": "Optional. Leave empty to use direct requests; the actor escalates to an Apify datacenter proxy only after a real block.",
"editor": "proxy",
"title": "Proxy configuration",
"type": "object"
},
"searchKeywords": {
"description": "Keywords to discover places first, then scrape their reviews. Example: ['강남 맛집', '홍대 카페']. Can be combined with placeUrls.",
"editor": "stringList",
"title": "Search keywords",
"type": "array"
},
"visitedSince": {
"description": "Only keep visitor reviews whose visit date is on or after this date. Reviews without a visit date are skipped when this filter is set.",
"editor": "datepicker",
"title": "Visited since (YYYY-MM-DD)",
"type": "string"
}
},
"schemaVersion": 1,
"title": "Naver Place Reviews + Blog Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
reviews | string | optional | Dataset containing visitor reviews, blog reviews, and place review statistics. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Naver Place visitor reviews, linked blog posts with publish dates, and per-place rating statistics, distinguished by the reviewType field.",
"properties": {
"reviews": {
"description": "Dataset containing visitor reviews, blog reviews, and place review statistics.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Review Records",
"type": "string"
}
},
"title": "Naver Place Visitor & Blog Review Finder Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"fields": {
"properties": {
"authorCount": {
"description": "Number of distinct review authors",
"type": "integer"
},
"averageRating": {
"description": "Average visitor rating from Naver stats",
"type": "number"
},
"blogContents": {
"description": "Blog post excerpt",
"type": "string"
},
"blogContentsLength": {
"description": "Length of the blog excerpt",
"type": "integer"
},
"blogDate": {
"description": "Blog post publish date (YYYY-MM-DD)",
"type": "string"
},
"blogRank": {
"description": "Position in Naver's blog review list for this place",
"type": "integer"
},
"blogReviewCount": {
"description": "Linked blog/cafe review total for the place",
"type": "integer"
},
"blogSource": {
"description": "Source type: blog or cafe",
"type": "string"
},
"blogThumbnailUrl": {
"description": "Blog post thumbnail image URL",
"type": "string"
},
"blogThumbnailUrls": {
"description": "All blog post thumbnail image URLs",
"type": "array"
},
"blogTitle": {
"description": "Blog post title",
"type": "string"
},
"blogTypeName": {
"description": "Localized source label",
"type": "string"
},
"blogUrl": {
"description": "Link to the full blog post",
"type": "string"
},
"bloggerHome": {
"description": "Blogger's blog home URL",
"type": "string"
},
"bloggerName": {
"description": "Blogger name",
"type": "string"
},
"bloggerProfileImageUrl": {
"description": "Blogger profile image URL",
"type": "string"
},
"hasReply": {
"description": "True when the owner replied with text",
"type": "boolean"
},
"imageReviewCount": {
"description": "Number of reviews with images",
"type": "integer"
},
"isRepresentative": {
"description": "Whether Naver marks this blog post as representative",
"type": "boolean"
},
"isSelfPaid": {
"description": "Whether the blog review is marked as self-paid",
"type": "boolean"
},
"language": {
"description": "Review language code",
"type": "string"
},
"mediaCount": {
"description": "Number of photos and videos attached to the review",
"type": "integer"
},
"menuItem": {
"description": "Menu item mentioned in the review",
"type": "string"
},
"originType": {
"description": "Review origin, e.g. 영수증 for receipt-verified reviews",
"type": "string"
},
"placeAddress": {
"description": "Place street address",
"type": "string"
},
"placeBlogReviewCount": {
"description": "Total linked blog/cafe review count on the place",
"type": "integer"
},
"placeBusinessCategory": {
"description": "Naver business category, e.g. restaurant or cafe",
"type": "string"
},
"placeCategory": {
"description": "Place category (Korean)",
"type": "string"
},
"placeId": {
"description": "Naver Place ID",
"type": "string"
},
"placeName": {
"description": "Place name",
"type": "string"
},
"placeRating": {
"description": "Place-level average visitor review score",
"type": "number"
},
"placeRoadAddress": {
"description": "Place road address",
"type": "string"
},
"placeTotalReviews": {
"description": "Total visitor review count on the place",
"type": "integer"
},
"placeUrl": {
"description": "Canonical place URL",
"type": "string"
},
"ratingDistribution": {
"description": "Half-star distribution keyed 0.5 to 5.0",
"type": "object"
},
"ratingReviewCount": {
"description": "Rating-only visitor reviews",
"type": "integer"
},
"replyStatus": {
"description": "replied, no_reply, or unknown",
"type": "string"
},
"reviewCreatedAt": {
"description": "Review creation timestamp in ISO 8601 (KST)",
"type": "string"
},
"reviewDate": {
"description": "Review creation date (YYYY-MM-DD, KST)",
"type": "string"
},
"reviewHasText": {
"description": "False when the review is rating-only",
"type": "boolean"
},
"reviewId": {
"description": "Visitor review ID",
"type": "string"
},
"reviewPhotos": {
"description": "Photo and video-thumbnail URLs, when includeReviewPhotos is enabled",
"type": "array"
},
"reviewRating": {
"description": "Review star rating from 1 to 5, in 0.5 increments, when Naver exposes it; older anonymous reviews often omit it",
"type": "number"
},
"reviewReactionCount": {
"description": "Number of reactions on the review",
"type": "integer"
},
"reviewReplyDate": {
"description": "Owner reply date",
"type": "string"
},
"reviewReplyText": {
"description": "Business owner's reply to the review",
"type": "string"
},
"reviewText": {
"description": "Full review body (Korean), omitted for rating-only reviews",
"type": "string"
},
"reviewThemes": {
"description": "Theme labels with review counts",
"type": "array"
},
"reviewType": {
"description": "Record type: visitor, blog, or stats",
"type": "string"
},
"reviewViewCount": {
"description": "Number of views on the review",
"type": "integer"
},
"reviewerAverageRating": {
"description": "Reviewer's average rating across their reviews",
"type": "number"
},
"reviewerFollowerCount": {
"description": "Reviewer follower count",
"type": "integer"
},
"reviewerImageUrl": {
"description": "Reviewer profile image URL",
"type": "string"
},
"reviewerName": {
"description": "Reviewer nickname (masked by Naver)",
"type": "string"
},
"reviewerProfileUrl": {
"description": "Reviewer profile URL",
"type": "string"
},
"reviewerReviewCount": {
"description": "Total reviews authored by the reviewer",
"type": "integer"
},
"runKeywordDistribution": {
"description": "Voted-keyword counts across visitor reviews emitted for this place",
"type": "array"
},
"runRatingDistribution": {
"description": "Rating distribution across visitor reviews emitted for this place",
"type": "object"
},
"scrapedAt": {
"description": "ISO 8601 scrape timestamp",
"type": "string"
},
"scrapedBlogReviews": {
"description": "Blog reviews emitted for this place in this run",
"type": "integer"
},
"scrapedVisitorReviews": {
"description": "Visitor reviews emitted for this place in this run",
"type": "integer"
},
"searchKeyword": {
"description": "Keyword that discovered this place (keyword-search mode only)",
"type": "string"
},
"searchRank": {
"description": "1-based rank of the place in the keyword search result",
"type": "integer"
},
"starDistribution": {
"description": "Integer star distribution {5: n, 4: n, ...} when Naver supplies integer scores",
"type": "object"
},
"textReviewCount": {
"description": "Visitor reviews with written text",
"type": "integer"
},
"topMenus": {
"description": "Most-mentioned menu items with counts",
"type": "array"
},
"totalReviewCount": {
"description": "Total visitor review count from Naver stats",
"type": "integer"
},
"totalVisitorReviews": {
"description": "Total visitor reviews reported by Naver stats",
"type": "integer"
},
"translatedText": {
"description": "Auto-translated review text, when Naver provides it",
"type": "string"
},
"visitCount": {
"description": "Number of visits reported by the reviewer",
"type": "integer"
},
"visitCountLabel": {
"description": "Korean visit label, e.g. 2번째 방문",
"type": "string"
},
"visitDate": {
"description": "Actual visit date (YYYY-MM-DD)",
"type": "string"
},
"visitTags": {
"description": "Visit-context tags, e.g. 예약 없이 이용 or 혼자",
"type": "array"
},
"votedKeywordStats": {
"description": "Most-voted keyword tags with counts",
"type": "array"
},
"votedKeywords": {
"description": "Naver voted keyword tags, e.g. 음식이 맛있어요",
"type": "array"
}
},
"type": "object"
},
"title": "Naver Place Reviews + Blog",
"views": {
"overview": {
"display": {
"component": "table",
"properties": {
"blogDate": {
"format": "text",
"label": "Blog Date"
},
"blogTitle": {
"format": "text",
"label": "Blog Post"
},
"placeName": {
"format": "text",
"label": "Place"
},
"reviewRating": {
"format": "number",
"label": "Rating"
},
"reviewText": {
"format": "text",
"label": "Review"
},
"reviewType": {
"format": "text",
"label": "Type"
},
"searchKeyword": {
"format": "text",
"label": "Keyword"
}
}
},
"title": "Reviews Overview",
"transformation": {
"fields": [
"reviewType",
"placeName",
"searchKeyword",
"reviewRating",
"reviewText",
"blogTitle",
"blogDate"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Naver Place Visitor & Blog Review Finder
Naver Place is where most South Koreans check reviews before visiting a restaurant, cafe, clinic, or shop. This actor collects visitor reviews, linked Naver Blog posts, and aggregated rating statistics by place URL/ID or keyword search.
What this actor does
- Visitor reviews at scale — text reviews and rating-only reviews from Naver's separate review streams, paginated 50 per request up to your
maxReviewscap (1–5,000 per place) - Exact dates — review creation date and timestamp, visit date, and blog publish date, including reviews older than one year
- Blog and cafe reviews — linked Naver Blog posts with title, excerpt, author, thumbnails, source type, and publish date, up to Naver's 100-per-place cap
- Aggregated statistics — average rating, half-star distribution, review themes, top menus, voted-keyword counts, image/author counts, and text vs rating-only totals
- Two start modes — give place URLs/IDs (including
naver.meshort links), search by keyword, or combine both - Incremental runs — filter by visit date and exclude known review IDs or blog URLs
- Clean records — empty fields are omitted instead of returned as null
Output per record
Every record has a reviewType of visitor, blog, or stats.
Visitor review (reviewType: "visitor")
placeId,placeName,placeCategory,placeBusinessCategory,placeAddress,placeRoadAddress,placeRating,placeTotalReviews,placeBlogReviewCount,placeUrl— place identitysearchKeyword,searchRank— keyword that found the place and its search rankreviewId,reviewText,reviewHasText,reviewRating— the review itself;reviewHasTextis false for rating-only rows, andreviewRatingis omitted when Naver withholds it on older reviewsreviewDate,reviewCreatedAt,visitDate,visitCount,visitCountLabel— when it was posted, when the visit happened, and how many visits the reviewer reportsreviewerName,reviewerProfileUrl,reviewerImageUrl,reviewerFollowerCount,reviewerReviewCount,reviewerAverageRating— reviewer identity and statsvotedKeywords[],visitTags[]— Naver's official review-vote tags and visit-context tagsreviewPhotos[],mediaCount— photo and video-thumbnail URLs (whenincludeReviewPhotosis enabled) and the total media countreviewReplyText,reviewReplyDate,hasReply,replyStatus— the owner's replymenuItem,originType,language,translatedText,reviewReactionCount,reviewViewCount— review contextscrapedAt— ISO 8601 timestamp
Blog review (reviewType: "blog")
- Place identity and
searchKeyword/searchRank, same as above blogTitle,blogContents,blogContentsLength,blogUrl— post title, excerpt, excerpt length, and linkbloggerName,bloggerHome,bloggerProfileImageUrl— blogger identityblogDate,blogSource,blogTypeName— publish date, source type (blogorcafe), and localized labelblogRank,isRepresentative,isSelfPaid— position, representative flag, and self-paid flagblogThumbnailUrl,blogThumbnailUrls[]— primary thumbnail and all thumbnailsscrapedAt— ISO 8601 timestamp
Stats (reviewType: "stats", one per place)
- Place identity and
searchKeyword/searchRank averageRating,totalReviewCount,starDistribution,ratingDistribution— average, total, integer histogram when available, and the exact half-star histogramreviewThemes[],topMenus[],votedKeywordStats[]— theme labels, most-mentioned menu items, and voted-keyword countsimageReviewCount,authorCount,totalVisitorReviews,textReviewCount,ratingReviewCount,blogReviewCount— review countsscrapedVisitorReviews,scrapedBlogReviews,runRatingDistribution,runKeywordDistribution— what this run collected for the placescrapedAt— ISO 8601 timestamp
Input
| Field | Type | Default | Description |
|---|---|---|---|
placeUrls |
array | – | Naver Place URLs, naver.me links, or bare numeric place IDs |
searchKeywords |
array | – | Keywords to discover places first; can be combined with placeUrls |
maxPlacesPerKeyword |
integer | 3 |
Places per keyword (1–100; Naver returns up to 100) |
maxReviews |
integer | 100 |
Visitor reviews per place across both streams (1–5,000) |
includeVisitorReviews |
boolean | true |
Collect visitor reviews |
includeRatingOnlyReviews |
boolean | true |
Also collect rating-only reviews from the separate stream |
includeBlogReviews |
boolean | true |
Collect linked blog and cafe posts |
maxBlogReviews |
integer | 100 |
Blog posts per place (1–100; Naver's hard cap) |
includeReviewPhotos |
boolean | false |
Include review photo and video-thumbnail URLs |
includeReviewStats |
boolean | true |
Emit one stats record per place |
visitedSince |
date | – | Keep only reviews with a visit date on or after this date |
excludeReviewIds |
array | – | Visitor review IDs and blog URLs to skip |
maxConcurrency |
integer | 3 |
Places scraped in parallel (1–10) |
maxItems |
integer | 100 |
Hard cap on total records across all places (1–5,000) |
proxyConfiguration |
object | – | Optional proxy; direct requests are tried first and an Apify datacenter proxy is used only after a real block |
Example: reviews for specific places
{
"placeUrls": [
"https://map.naver.com/p/entry/place/38239053",
"1000750444"
],
"maxReviews": 500,
"includeRatingOnlyReviews": true,
"includeReviewPhotos": true,
"includeReviewStats": true,
"maxItems": 1000
}
Example: discover places by keyword first
{
"searchKeywords": ["강남 맛집", "홍대 카페"],
"maxPlacesPerKeyword": 10,
"maxReviews": 100,
"includeBlogReviews": true,
"maxBlogReviews": 20,
"includeReviewStats": true,
"maxItems": 2000
}
Example: only new reviews since a date
{
"placeUrls": ["38239053"],
"visitedSince": "2026-09-01",
"excludeReviewIds": ["6abf13296171f06ddbf56400"],
"maxReviews": 200
}
Use cases
- Market entry research — read what local customers actually say about a category or area before entering the Korean market
- Restaurant and cafe competitive analysis — compare ratings, rating distributions, voted keywords, and review volume across nearby competitors
- Customer sentiment tracking — build a structured, NLP-ready archive of Korean-language reviews with exact dates and visit context
- Brand reputation monitoring — track voted keywords, owner replies, and review themes for your own listed business
- Academic research — study Korean consumer review behavior at scale, including rating-only reviews and blog coverage
FAQ
Is this affiliated with Naver? No. This is an independent, third-party actor that reads publicly available Naver Place pages and Naver's public review endpoints. It isn't operated by or affiliated with Naver.
Do I need a Naver login, cookie, or API key? No. The actor uses public, cookieless endpoints. No login, cookie, or API key is required.
How many visitor reviews can I get per place?
Up to 5,000 per place with maxReviews. Naver paginates 50 reviews per request, and the actor follows the cursor until your cap or the end of the review stream. maxReviews counts both text reviews and rating-only reviews.
What are rating-only reviews?
Some visitors leave a star rating without writing text. Naver serves those from a separate stream. Enable includeRatingOnlyReviews to include them; reviewHasText is false on those rows.
Why do some visitor reviews have no star rating?
Naver returns individual star ratings only for its newest reviews on anonymous requests; older reviews in the same cursor stream come back with no rating. The actor omits the field rather than guessing. Text, dates, reviewer, tags, photos, and replies still fill normally, and the stats record's ratingDistribution covers every rating Naver reports for the place.
Why is blogDate now filled?
The blog/cafe review endpoint returns an exact publish date (YYYY.MM.DD.). The actor normalizes it to YYYY-MM-DD. Blog posts are still capped at 100 per place by Naver.
Why are some stats fields missing for a place? Naver doesn't track an average rating, star distribution, themes, or menus for every vertical. Cafes and some clinics often have no average or histogram. Unavailable fields are omitted rather than guessed.
How exact are review dates?
Review creation dates come from Naver's review ID timestamp, converted to Korea Standard Time, with the displayed date as a fallback. This fixes the wrong-year dates that short display strings like 21.10.21.목 used to produce. Visit dates come from Naver's exact visit-date field.
Why might reviewPhotos be empty even with includeReviewPhotos enabled?
Not every review has photos or video. mediaCount tells you how many media items the review has; reviewPhotos is only populated when the review actually has media.
Do I need a proxy? No. The actor tries direct requests first and automatically escalates to an Apify datacenter proxy only if Naver blocks the request. You can supply your own proxy configuration if you prefer.
How fresh is the data? Each run reads Naver's current review endpoints, so review counts and content reflect what is published at run time. Naver's totals can drift slightly between requests because new reviews arrive continuously.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build pizAoyiv3kJIJ7ul8. Documentation is regenerated from the default published build; private drafts are not included.