Naver Map Reviews Scraper (Naver Place Reviews)
Pricing
from $0.50 / 1,000 reviews
Naver Map Reviews Scraper (Naver Place Reviews)
Give Naver Map (Naver Place) place IDs or URLs and get visitor reviews of Korean restaurants, cafes, clinics and shops: rating, text, visit date, keywords, menu, photos, owner reply, plus a rating summary per place. Reviewer identity is never collected.
Pricing
from $0.50 / 1,000 reviews
Rating
0.0
(0)
Developer
SUNGHWAN CHO
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Share
Naver Place Reviews Scraper
Enter Naver Place IDs or Naver Map URLs and get visitor reviews as flat JSON rows: rating, review text, visit date and written date, keyword tags (Korean + English codes), ordered menu item, photos and the owner's reply, plus a status and summary row per place that tells you what was collected and why it stopped. Naver Map (Naver Place) is where people in South Korea review restaurants, cafes, hair salons, clinics and shops, and most reviews are verified by receipt, payment or booking. Reviewer identity is never collected.
What you get
One row per review, in Naver's "recent" order (newest visit first) ("type": "review"):
- Star rating and full review text
- Visit date as an ISO timestamp (
visitedAt), the date the review was written (createdAt, see Notes), plus Naver's original date labels - Keyword tags chosen by the reviewer, in Korean and as English codes (
coffee_good,kind,store_clean, …) - Visit context (reservation, waiting time, companions, …) and the menu item or service ordered
- Verification type:
receipt,paymentorbooking - Which visit this was for the customer (
visitCount), view count and reaction count - Review photo URLs
- Owner reply text and
hasOwnerReply - Place ID, place name, place average rating and review count on every row
One status and summary row per place ("type": "placeSummary", free, optional, on by default):
status(completed,partial,budgetLimited,notStarted,failed) andstopReason(endOfList,maxReviewsReached,reachedVisitDateCutoff,reachedPreviouslySavedReviews,costLimitReached,placeNotFound,requestFailed)reviewsSaved(rows actually stored),newReviewCount(withonlyNewSinceLastRun),ownerRepliesInSavedReviews(owner replies among the reviews saved in this run — not a reply rate for the whole place)placeCheckCharged(truewhen this place was charged one place check, incremental mode only)- Average rating, total review count, star distribution
- Mentioned themes (taste, service, mood, price, …) with counts
- Most mentioned menu items and keyword vote counts
One runSummary row per run (free) with totals, and the same report with a per-place list in the run's key-value store under RUN_SUMMARY, so code can check the result without reading the log.
Every row has source: "naver" and schemaVersion: 2. Missing values are null; keys are never left out.
No login, no API key and no browser needed.
Not collected: reviewer nicknames, profile pictures, profile links, user IDs and receipt links are never requested from Naver.
Use cases
- Reputation monitoring — schedule a weekly run with
onlyNewSinceLastRunand get only reviews the Actor has not delivered to you before (see the limits below) - Sentiment and topic analysis — feed review text,
keywordCodesand place themes into your own model or an LLM - Market research — learn what Korean customers praise or complain about in a category before entering the market
- Franchise and agency reporting — compare ratings, keyword votes and owner reply activity across many locations
- AI agents — one place ID in, flat review rows out
Search → reviews
Don't have place IDs yet? Run Naver Place Search Scraper with a keyword such as 성수 카페 (Seongsu cafes), then pass its id field straight into places here.
Managing many stores? Naver Place Multi-Location Review Monitor reports only what changed across your locations (new reviews, owner replies added or edited) plus a free per-location summary of unanswered reviews and reply rate. Use this Actor when you want the raw review rows; use the monitor for a change and backlog report.
Input
| Field | Description |
|---|---|
places | Required. Naver Place IDs or Naver Map place URLs, one per line. Accepts 1922651675, https://map.naver.com/p/entry/place/1922651675, https://pcmap.place.naver.com/restaurant/1922651675/home or https://m.place.naver.com/hairshop/2005275293/review. |
maxReviewsPerPlace | Maximum reviews saved per place, newest visit first. Default 100. |
reviewsNewerThan | Optional date (YYYY-MM-DD). Visit-date filter, read as 00:00 Korea time (KST). Only reviews whose visit date is on or after it are returned. It does not mean "written after": a review written today about a visit last month is skipped. API alias: visitedAfter. |
onlyNewSinceLastRun | Default false. Return only reviews this Actor has not saved for you before (details below). In this mode each place checked is also charged one place check (see the Pricing tab), even when it has no new reviews. |
newReviewLookbackDays | With onlyNewSinceLastRun: how far back by visit date to re-check before the previous completed run. Default 30. |
historyStoreName | With onlyNewSinceLastRun: name of the key-value store holding saved review IDs. Default naver-place-reviews-history. Use one name per independent schedule. |
includePlaceSummary | Add the free placeSummary rows and the runSummary row. Default true. |
proxyConfiguration | Proxy settings. Keep the default Apify Proxy. |
{"places": ["https://pcmap.place.naver.com/restaurant/1922651675/home","2057596866"],"maxReviewsPerPlace": 300,"onlyNewSinceLastRun": true,"includePlaceSummary": true}
Only new reviews since last run — how it works and its limits
Naver's "recent" list is ordered by visit date, not by the date a review was written, and people often write a review days after the visit. So a date cut-off alone can miss new reviews. With onlyNewSinceLastRun:
- For each place, the Actor keeps the IDs of reviews it actually saved (in the key-value store
historyStoreNamein your Apify account). Reviews that were cut off by your max cost per run or by an error are not recorded, so they are offered again next run. - The first run for a place saves the newest reviews up to
maxReviewsPerPlaceand becomes the starting point (newReviewCountisnullon that run). - Later runs read pages from the newest visit downward, skip IDs already saved, and stop only after 20 already-known reviews in a row and visit dates older than the previous completed run minus
newReviewLookbackDays. Unknown reviews whosecreatedAtis before the previous completed run (they existed then but were outside its scope, for example below itsmaxReviewsPerPlace) are skipped, not reported as new; reviews without a verifiedcreatedAtare treated as new. newReviewCounton theplaceSummaryrow andpreviousCompletedAttell you how many new reviews were found and since when.- Pricing in this mode: you pay per review row saved plus one place check per place checked (prices on the Pricing tab). A place counts as checked once Naver returns its first review page; places that are not found, fail on the first page or are not started because of your max cost per run are not charged. A weekly run over 10 places with no new reviews costs 10 place checks and no review charges.
Late reviews are common: in a live check on 2026-10-01, a hair salon had reviews written on 2026-09-25 and 2026-09-26 for visits on 2026-08-30 and 2026-09-04.
Limits: a review written after the last run about a visit older than the lookback window is not found (raise newReviewLookbackDays if this matters). Running two schedules on the same places with the same historyStoreName makes them share one history. Hidden or deleted reviews are not reported. In our tests (fixtures and live runs), late-written reviews within the window were found and already-delivered reviews were not repeated; this is not a guarantee against every change Naver might make to its list.
Output
Every row has a type field. A review row from a real run:
{"type": "review","source": "naver","schemaVersion": 2,"placeId": "1922651675","placeName": "노틀던","placeRating": 4.97,"placeReviewCount": 1157,"reviewId": "6aafbfe99d2a23a1d03dd6dd","rating": 5,"text": "너므너므 와보고 싶었던 노틀던!!!! 어쩜 이렇게 정교할까요 너무너무 예쁘고 맛잇습니다 서울숲디저트맛집 최고!!","visitedAt": "2026-09-20T11:00:53.000Z","createdAt": "2026-09-20T11:13:45.000Z","visitedLabel": "9.20.일","createdLabel": "9.20.일","visitCount": 1,"viewCount": 268,"keywords": ["커피가 맛있어요", "디저트가 맛있어요", "특별한 메뉴가 있어요", "친절해요", "매장이 청결해요"],"keywordCodes": ["coffee_good", "dessert_good", "special_menu", "kind", "store_clean"],"visitContext": ["예약 없이 이용", "바로 입장", "데이트", "친목", "나들이", "일상", "연인・배우자", "친구", "지인・동료"],"menuItem": "Ice 아메리카노","verificationType": "receipt","photoCount": 2,"photoUrls": ["https://pup-review-phinf.pstatic.net/MjAyNjA5MjBfMTc5/MDAxNzg5OTAyODI0NTUz.pTzlm4A5O90SmpuahTwdtOG0fQlUH2tkXa2pWdVyl9Ug.P6-ycfaUuMAHU3WaANPSWZTSqsg4XcFkEmRMxm8KD6cg.JPEG/5E4323EF-203E-441C-AEE3-65FB0398B78B.jpeg?type=w1500_60_sharpen","https://pup-review-phinf.pstatic.net/MjAyNjA5MjBfNCAg/MDAxNzg5OTAyODIxNTcw.OJ1Q8Yw9Gf4agzu8rDrioLzDyR_4VH63A12hxJdERdMg.CdmNkVgFgvRNYdt2dE2PmSM0AvM0cFZ4xq_FZrNDkvcg.JPEG/D08AEC9A-DDAC-4FB7-88CA-40B6802D5913.jpeg?type=w1500_60_sharpen"],"hasOwnerReply": false,"ownerReply": null,"ownerReplyDateLabel": null,"reactionCount": 0,"language": "ko","url": "https://map.naver.com/p/entry/place/1922651675?placePath=/review","scrapedAt": "2026-10-01T09:04:51.939Z"}
A place summary row from a run with "reviewsNewerThan": "2026-09-25" (the themes, menuMentions and keywordVotes arrays are shortened here to the first 3 items):
{"type": "placeSummary","source": "naver","schemaVersion": 2,"placeId": "1922651675","placeName": "노틀던","status": "completed","stopReason": "reachedVisitDateCutoff","errorMessage": null,"reviewsSaved": 14,"newReviewCount": null,"ownerRepliesInSavedReviews": 0,"pagesFetched": 1,"previousCompletedAt": null,"avgRating": 4.97,"totalReviewCount": 1157,"listedReviewCount": 1089,"imageReviewCount": 943,"ratedReviewCount": 150,"starDistribution": { "0.5": 0, "1.0": 0, "1.5": 0, "2.0": 0, "2.5": 0, "3.0": 0, "3.5": 0, "4.0": 4, "4.5": 1, "5.0": 145 },"themes": [{ "code": "taste", "label": "맛", "count": 812 },{ "code": "total", "label": "만족도", "count": 608 },{ "code": "service", "label": "서비스", "count": 152 }],"menuMentions": [{ "menu": "커피", "count": 172 },{ "menu": "케이크", "count": 170 },{ "menu": "밀푀유", "count": 66 }],"keywordVotes": [{ "code": "dessert_good", "keyword": "디저트가 맛있어요", "count": 1079 },{ "code": "coffee_good", "keyword": "커피가 맛있어요", "count": 598 },{ "code": "special_menu", "keyword": "특별한 메뉴가 있어요", "count": 590 }],"keywordVoteCount": 4449,"url": "https://map.naver.com/p/entry/place/1922651675?placePath=/review","scrapedAt": "2026-10-01T09:05:03.631Z"}
Export the dataset as JSON, CSV or Excel, or read it through the Apify API. To get reviews only, filter rows where type is review or set includePlaceSummary to false (the run report stays available in RUN_SUMMARY).
Status and cost limit
Charged: each review row, and — only with onlyNewSinceLastRun: true — one place-check event per place checked (see the Pricing tab for prices). placeSummary and runSummary rows are free, and the default mode has no place-check charge. If the run reaches your max cost per run, the Actor stops cleanly: the place being scraped gets status: "budgetLimited", the remaining places get "notStarted" (they are not requested and not charged), and reviewsSaved counts exactly the review rows stored. placeCheckCharged on each placeSummary row and placeChecksCharged on the runSummary row show the place checks charged. The run's status message says the same.
Tips
- Weekly monitoring: schedule the Actor with
onlyNewSinceLastRun: true. Checkstatus/stopReasonon theplaceSummaryrows (orRUN_SUMMARY) to see whether each place was fully checked. - Large places: in our tests the Actor paged through 3,100 reviews of a single place with no duplicates and no cap. Set
maxReviewsPerPlaceas high as you need. - Many businesses work: tested on restaurants, cafes, hair salons, dermatology clinics and hospitals. For hair salons,
menuItemusually holds the service or designer booked. - Text values (review text, keywords, menu names) are in Korean, as shown on Naver. Use
keywordCodesand themecodefor English, language-independent analysis. - Missing values are
null, numbers are numbers, andvisitCountis a number (not "2번째 방문"). - Invalid lines in
placesare skipped with a warning in the log; the other places are still scraped.
Notes
- Newest visit first only. Naver's "recent" order is by visit date (with small out-of-order spots within a day); Naver's "recommended" order is not supported.
- Time zones:
visitedAt,createdAtandscrapedAtare UTC ISO timestamps (Z). Naver's labels (visitedLabel,createdLabel,ownerReplyDateLabel) are Korea time (KST, UTC+9). Date inputs are read as 00:00 KST. createdAtis derived from the timestamp inside Naver's review ID and is returned only when its Korea-time date matches Naver's own "written" label (createdLabel); otherwise it isnull. In our checks it matched on every sampled review. For booking reviews,visitedAtis the booked time slot, socreatedAtcan be a little earlier thanvisitedAt.- Hospitals and clinics: Naver hides star ratings for medical businesses, so
rating,placeRating,avgRatingandstarDistributionarenullthere. Review text and keywords are still returned. - About 15% of restaurant and cafe reviews have no star rating (
rating: null), and photo-only reviews havetext: null. - Owner reply dates have no year on Naver (e.g.
9.30.수), so they are kept as the original label inownerReplyDateLabel. totalReviewCount(Naver's headline count) can be higher thanlistedReviewCount(reviews Naver actually lists); the scraper can only return listed reviews.- This Actor collects only publicly visible review content. It does not log in, and it never requests reviewer nicknames, profile images, profile links, user IDs or receipt links. Review text is written by users and may still contain personal details they chose to share; handle it accordingly.