# Naver Place Reviews Scraper (`maximedupre/naver-place-reviews`) Actor

Collect public visitor reviews from one or more Naver Place listings in a single run. Each review shows its text, dates, visit details, and star rating when Naver provides one. No Naver login is needed.

- **URL**: https://apify.com/maximedupre/naver-place-reviews.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Business, Marketing, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 visitor reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🍽️ See what visitors say about Naver Place listings

Naver Place Reviews collects public visitor reviews from Naver Place listings. It is built for marketers, researchers, and business owners who want to learn what visitors say about local places on Naver. Each review comes with its text, dates, and visit details, plus its star rating and keywords when they are available. Place summaries come back too. Blog and cafe posts are included by default, and you can turn that option off. You can check several places in one run, and no Naver login is needed.

**Use it to:**

- Read what visitors say about a Naver Place, including their star ratings, visit dates, and the keywords they picked.
- See how a place's star ratings are spread, from five stars down to one star, in its place summary row.
- Track new visitor reviews for a place by turning on Only new reviews for repeat runs.
- Find the menu items mentioned in a place's reviews and the keywords visitors voted for.
- Collect the blog and cafe posts on a place's blog tab, with each post's title and link, and its publish date when Naver shows one.

#### 📦 Visitor reviews, place summaries, and posts in one dataset

Each run saves rows to a dataset. The `recordType` field tells you which kind of row you are looking at:

- `review` is one visitor review.
- `placeSummary` is one summary for each place.
- `post` is one blog post or cafe article.

#### 🔎 Start with a place link, business name, or keyword

Pick one way to find places in **Find places by**, fill in the matching section, and start the run. Values in the other sections are ignored. For another search, start a separate run. When the run finishes, open the results table to see the rows.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `findPlacesBy` | string | Picks how places are found: `placeLinks`, `businessNames`, or `searchKeywords`. Required. |
| `placeLinks` | array of objects | Naver Place links, one per row, each as an object with a `url` field. Accepted links start with `https://map.naver.com/p/entry/place/`, `https://m.place.naver.com/`, or `https://pcmap.place.naver.com/`. Each place is collected on its own. Used with Naver Place links. |
| `businessNames` | array of strings | Business names as they appear on Naver. Each name collects its matching Naver Place. Used with Business names. |
| `searchKeywords` | array of strings | Keywords, such as a neighborhood and a category. Each keyword collects the places that Naver's search list shows for it. That can be fewer than the total matches that Naver reports. All keywords in one run use the same settings. Used with Search keywords. |
| `onlyNewReviews` | boolean | When on, only visitor reviews that appeared since the place's previous run are collected. When off, all visitor reviews are collected, up to the review limit. Default: off. |
| `reviewOrder` | string | `newestFirst` or `oldestFirst`. Reviews are listed by visit date, not by the date each review was written. Oldest first reads every review for a place before it returns any, so a place with many reviews takes many pages to read. With Oldest first, the review limit only applies after that full read. Default: `newestFirst`. |
| `maxReviewsPerPlace` | integer | Optional. Stops after this many visitor reviews for each place. Leave empty to return all available visitor reviews for each place, until Naver has no more to show. Minimum 1. The form starts at 20. |
| `includeBlogAndCafePosts` | boolean | Adds blog posts and cafe articles from each place's blog tab that are publicly accessible. Naver lists only a limited number of posts for each place, so a run can collect fewer posts than Naver reports. The review limit does not count them. Each saved post is charged separately. Default: on. |

**Example input**

This example uses the default settings and one sample place link.

```json
{
  "findPlacesBy": "placeLinks",
  "placeLinks": [
    {
      "url": "https://map.naver.com/p/entry/place/2097258400"
    }
  ],
  "onlyNewReviews": false,
  "reviewOrder": "newestFirst",
  "maxReviewsPerPlace": 20,
  "includeBlogAndCafePosts": true
}
```

#### 🧾 Output

Each run saves rows to the default dataset. Rows have different fields, so each row type has its own table. The `recordType` field tells you which table applies.

**Visitor review rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `review` for a visitor review. |
| `placeId` | string | Naver's ID for the place. |
| `placeName` | string | The place's name on Naver. |
| `placeCategory` | string | The place's category on Naver. Missing when Naver does not show one. |
| `placeAddress` | string | The place's street address on Naver. Missing when Naver does not show one. |
| `reviewId` | string | Naver's ID for this review. Use it to spot the same review again, such as in a later run. |
| `reviewerName` | string | The reviewer's public display name, as Naver shows it. |
| `reviewerReviewCount` | integer | How many reviews the reviewer has written in total, as Naver shows it. Missing when Naver does not show it. |
| `starRating` | number | The star rating from 0.5 to 5. Missing when Naver does not show one. |
| `reviewText` | string | The text the reviewer wrote. |
| `writtenOn` | string (date) | The date the review was written. |
| `visitedOn` | string (date) | The date of the visit that the review is about. |
| `visitCount` | integer | How many times the reviewer has visited this place, as Naver shows it. |
| `visitTags` | array of strings | Visit tags the reviewer picked, such as who came along, why they visited, wait time, and whether they had a reservation. Empty when there are none. |
| `visitVerification` | string | How Naver checked the visit, such as by receipt. Missing when Naver does not show it. |
| `reviewKeywords` | array of strings | Keyword tags the reviewer picked. Empty when there are none. |
| `menuItems` | array of strings | Menu items or services the reviewer named. Empty when none are named. |
| `photoUrls` | array of URLs | Links to the photos attached to the review. The photos are linked, not downloaded. Empty when there are none. |
| `ownerReply` | string | The owner's reply to this review. Missing when the owner has not replied. |
| `viewCount` | integer | How many views the review has received on Naver. |
| `reactionCount` | integer | How many reactions the review has received on Naver. |

**Example review row**

This is a real row from a sample restaurant.

```json
{
  "recordType": "review",
  "placeId": "2081007605",
  "placeName": "홍백당 역삼점",
  "placeCategory": "중식당",
  "placeAddress": "서울 강남구 논현로 514",
  "reviewId": "6aba3549eb73b12222a30e2c",
  "reviewerName": "Youcc",
  "reviewerReviewCount": 7,
  "starRating": 5,
  "reviewText": "지금까지 먹어본 훠궈중에 제일 맛있었어요ㅎㅎㅎ 재료도 신선하고 국물도 고급스러워용ㅎㅎ!! 라즈지도 진짜진짜 넘 맛있어요ㅋㅋ… 그리고 직원분들도 다 친절하셔서 부모님이랑 같이 먹는데 너무 좋았어요!! 다음에 훠궈 먹고 싶을 때 무조건 여기만 방문할 것 같아요💕💕",
  "writtenOn": "2026-09-28",
  "visitedOn": "2026-09-28",
  "visitCount": 1,
  "visitTags": [
    "예약 없이 이용",
    "바로 입장",
    "가족모임",
    "부모님"
  ],
  "visitVerification": "영수증",
  "reviewKeywords": [
    "음식이 맛있어요",
    "재료가 신선해요",
    "양이 많아요",
    "매장이 넓어요",
    "단체모임 하기 좋아요"
  ],
  "menuItems": [],
  "photoUrls": [],
  "ownerReply": "정성스러운 리뷰 정말 감사합니다😊 지금까지 드셔본 훠궈 중 제일 맛있었다니 너무 기분 좋네요! 재료랑 국물은 물론 라즈지까지 맛있게 드셔주셔서 감사합니다ㅎㅎ 부모님과도 편하게 식사하셨다니 더 뿌듯해요💕 다음에도 훠궈 생각나실 때 꼭 들러주세요!",
  "viewCount": 15,
  "reactionCount": 0
}
```

**Place summary rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `placeSummary` for a place summary. |
| `placeId` | string | Naver's ID for the place. |
| `placeName` | string | The place's name on Naver. |
| `placeCategory` | string | The place's category on Naver. Missing when Naver does not show one. |
| `placeAddress` | string | The place's street address on Naver. Missing when Naver does not show one. |
| `averageRating` | number | The place's average star rating on Naver, from 1 to 5. Missing when the place has no star ratings. |
| `totalReviewCount` | integer | The total number of visitor reviews that Naver shows for the place. This is Naver's count, not the number of reviews in this run. |
| `fiveStarCount` | integer | How many reviews the place has with 5 stars, as Naver shows it. Missing when the place has no star ratings. |
| `fourStarCount` | integer | How many reviews the place has with 4 stars, as Naver shows it. Missing when the place has no star ratings. |
| `threeStarCount` | integer | How many reviews the place has with 3 stars, as Naver shows it. Missing when the place has no star ratings. |
| `twoStarCount` | integer | How many reviews the place has with 2 stars, as Naver shows it. Missing when the place has no star ratings. |
| `oneStarCount` | integer | How many reviews the place has with 1 star, as Naver shows it. Missing when the place has no star ratings. |
| `reviewThemes` | array of strings | Review themes that Naver shows for the place. Empty when Naver shows none. |
| `mentionedMenuItems` | array of strings | Menu items mentioned in the place's visitor reviews. Empty when none are mentioned. |
| `placeKeywords` | array of strings | Keyword tags that visitors voted for the place. Empty when there are none. |

**Example place summary row**

This is a real row from the same sample restaurant.

```json
{
  "recordType": "placeSummary",
  "placeId": "2081007605",
  "placeName": "홍백당 역삼점",
  "placeCategory": "중식당",
  "placeAddress": "서울 강남구 논현로 514",
  "averageRating": 4.97,
  "totalReviewCount": 92,
  "fiveStarCount": 88,
  "fourStarCount": 2,
  "threeStarCount": 0,
  "twoStarCount": 0,
  "oneStarCount": 0,
  "reviewThemes": [
    "맛",
    "만족도",
    "서비스",
    "목적",
    "분위기",
    "음식량",
    "위치",
    "메뉴",
    "청결도",
    "주차",
    "예약",
    "가격"
  ],
  "mentionedMenuItems": [
    "훠궈",
    "고기",
    "소고기",
    "새우",
    "양고기",
    "볶음밥",
    "계란볶음밥",
    "맥주",
    "새우볶음밥",
    "아이스티",
    "안심",
    "어묵"
  ],
  "placeKeywords": [
    "음식이 맛있어요",
    "재료가 신선해요",
    "매장이 넓어요",
    "인테리어가 멋져요",
    "친절해요",
    "양이 많아요",
    "단체모임 하기 좋아요",
    "특별한 메뉴가 있어요",
    "매장이 청결해요",
    "가성비가 좋아요",
    "현지 맛에 가까워요",
    "혼밥하기 좋아요",
    "고기 질이 좋아요",
    "메뉴 구성이 알차요",
    "주차하기 편해요",
    "화장실이 깨끗해요",
    "아늑해요",
    "좌석이 편해요",
    "디저트가 맛있어요",
    "비싼 만큼 가치있어요",
    "반찬이 잘 나와요",
    "대화하기 좋아요",
    "뷰가 좋아요"
  ]
}
```

**Blog and cafe post rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `post` for a blog post or cafe article. |
| `placeId` | string | Naver's ID for the place the post is about. |
| `placeName` | string | The place's name on Naver. |
| `postTitle` | string | The title of the blog post or cafe article. |
| `postUrl` | URL | The link to the post on Naver. |
| `publishedOn` | string (date) | The date the post was published, as Naver shows it. Missing when Naver does not show it. |

**Example post row**

This is a real row from a sample place's blog tab.

```json
{
  "recordType": "post",
  "placeId": "2097258400",
  "placeName": "오몬자",
  "postTitle": "강남역맛집 오몬자",
  "postUrl": "https://m.blog.naver.com/jjoy0103/224407990190",
  "publishedOn": "2026-09-18"
}
```

#### 💳 Pricing

You pay for each visitor review and each blog post or cafe article that is saved to the dataset. Place summary rows are not charged.

- **Visitor review**: one visitor review saved to the dataset.
- **Blog post**: one blog post or cafe article saved to the dataset.

Prices can differ by your Apify plan. To collect visitor reviews only, turn off **Include blog and cafe posts**.

#### 🔌 Integrations

Results are saved to an Apify dataset. You can open them in the Apify Console or read them through the Apify API.

Watch this video on YouTube:

https://www.youtube.com/watch?v=bNACk1_S_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Does the blog option search all Naver blog posts?

No. For each place, it reads only that place's own blog tab. It does not search general Naver Blog or Naver Cafe posts.

##### Are the photos downloaded?

No. Each review lists links to its photos. The photos are linked, not downloaded.

##### Does it collect deleted or hidden reviews?

No. It does not report reviews that were deleted, hidden, or removed.

##### Does it translate reviews or score their sentiment?

No. It does not translate review text, summarize it, or score its sentiment.

##### Will it send me an alert when a place gets new reviews?

No. It does not send alerts or messages. To collect only new reviews, turn on Only new reviews. A run then collects only the reviews that appeared since the place's previous run.

##### What happens if a place cannot be read?

The run reports the reason for that place, and the other places in the same run still finish. A place that cannot be read never produces review rows, and it is never reported as having no new reviews.

##### Why can a keyword search return fewer places than Naver reports?

Naver's search list can show fewer places than the total matches that Naver reports. Each keyword collects the places that the search list shows.

##### Does the review limit count blog posts?

No. The review limit counts only visitor reviews. Blog posts and cafe articles are not counted toward it.

##### Do I pay for place summary rows?

No. Place summary rows are not charged. Visitor reviews and blog or cafe posts are charged when they are saved to the dataset.

##### Do I need a Naver login?

No. The Actor reads public pages only, and no login or account is needed.

### 📝 Changelog

**v0.0** (15-10-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~naver-place-reviews/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Naver Blog Review Scraper](https://apify.com/maximedupre/naver-blog-review-scraper): Find public Naver Blog review posts by keyword or post URL, for research beyond one place's blog tab.
- [2GIS Reviews Scraper](https://apify.com/maximedupre/2gis-reviews-scraper): Collect public 2GIS reviews, with ratings, dates, and business replies, for local places you choose.
- [Yelp Business Review Scraper](https://apify.com/maximedupre/yelp-business-reviews): Collect full-text Yelp reviews for local businesses, with ratings, dates, and photo links.
- [Yelp Scraper: Review Reputation Monitor](https://apify.com/maximedupre/yelp-reputation-monitor): Track public Yelp businesses over repeat runs, with review evidence and changes between runs.
- [Zomato Reviews Scraper](https://apify.com/maximedupre/zomato-reviews): Collect public Zomato restaurant reviews, with ratings, reviewer details, and management replies.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `findPlacesBy` (type: `string`):

Each run uses one way to find places. Naver Place links: use the accepted links you paste. Business names: find the Naver Place that matches each name. Search keywords: collect the places that Naver's search list shows for each keyword. For another search, start a separate run.

## `placeLinks` (type: `array`):

Paste one Naver Place link on each row. These links are accepted: https://map.naver.com/p/entry/place/..., https://m.place.naver.com/..., and https://pcmap.place.naver.com/... Each place is collected on its own.

## `businessNames` (type: `array`):

Type the name of each business as it appears on Naver. Each name collects its matching Naver Place.

## `searchKeywords` (type: `array`):

Type a keyword, such as a neighborhood and a category. Each keyword collects the places that Naver's search list shows for it. That can be fewer than the total number of matches that Naver reports. All keywords in one run use the same settings.

## `onlyNewReviews` (type: `boolean`):

When on, only visitor reviews that appeared since the place's previous run are collected. When off, all visitor reviews are collected, up to the review limit.

## `reviewOrder` (type: `string`):

Reviews are listed by visit date, not by the date each review was written. Newest first lists the latest visits first. Oldest first reads every review for a place before it returns any. A place with many reviews takes many pages to read. With Oldest first, the review limit only applies after that full read.

## `maxReviewsPerPlace` (type: `integer`):

Optional. Stops after this many visitor reviews for each place. Leave empty to return all available visitor reviews for each place, until Naver has no more to show.

## `includeBlogAndCafePosts` (type: `boolean`):

Adds blog posts and cafe articles from each place's blog tab that are publicly accessible. Naver lists only a limited number of posts for each place. A run can collect fewer posts than the number Naver reports for that place. The review limit does not count them. Each saved post is charged separately. Turn off to collect visitor reviews only.

## Actor input object example

```json
{
  "findPlacesBy": "placeLinks",
  "placeLinks": [
    {
      "url": "https://map.naver.com/p/entry/place/2097258400"
    }
  ],
  "onlyNewReviews": false,
  "reviewOrder": "newestFirst",
  "maxReviewsPerPlace": 20,
  "includeBlogAndCafePosts": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Open the results table. It lists visitor reviews, place summaries, and blog or cafe posts.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "findPlacesBy": "placeLinks",
    "placeLinks": [
        {
            "url": "https://map.naver.com/p/entry/place/2097258400"
        }
    ],
    "maxReviewsPerPlace": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/naver-place-reviews").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "findPlacesBy": "placeLinks",
    "placeLinks": [{ "url": "https://map.naver.com/p/entry/place/2097258400" }],
    "maxReviewsPerPlace": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/naver-place-reviews").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "findPlacesBy": "placeLinks",
  "placeLinks": [
    {
      "url": "https://map.naver.com/p/entry/place/2097258400"
    }
  ],
  "maxReviewsPerPlace": 20
}' |
apify call maximedupre/naver-place-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/naver-place-reviews"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CezTkPVjqfi8fyaEQ/builds/CfA0BosJOoOayRqsy/openapi.json
