# Naver Reviews Scraper (`automation-lab/naver-place-business-reviews-scraper`) Actor

Extract public Naver Place visitor reviews from supplied URLs or IDs for recurring Korean business reputation monitoring.

- **URL**: https://apify.com/automation-lab/naver-place-business-reviews-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.36 / 1,000 item extracteds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Naver Reviews Scraper

Extract public **Naver reviews** from supplied Naver Place URLs or numeric Place IDs. The Actor returns one typed dataset row per visitor review with review text, rating, reviewer context, visit and post dates, visitor-selected keywords, media links, owner replies, and Place-level reputation totals when Naver exposes them.

Use it for recurring Korean business reputation monitoring, customer-feedback analysis, branch comparisons, and spreadsheet or data-pipeline exports. No Naver login is required.

### What does Naver Reviews Scraper do?

The Actor reads Naver's public server-rendered Place review data and converts it into integration-ready JSON records.

It supports:

- one or many Naver Place URLs;
- one or many numeric Naver Place IDs;
- newest-first or Naver-recommended review order;
- an optional visit-date cutoff;
- stable `reviewId` values for downstream deduplication;
- global and per-Place result limits;
- JSON, CSV, Excel, XML, RSS, and API dataset exports provided by Apify.

The current public page exposes up to 10 visitor reviews per Place in one run. Schedule recent-sort runs frequently when you need ongoing monitoring.

### Who is it for?

#### Reputation and customer-experience teams

Track recent public feedback for restaurants, cafés, stores, clinics, attractions, and other Korean business locations.

#### Multi-location operators

Run the same input for several Place IDs and compare ratings, recurring keywords, review text, and visible owner responses.

#### Market researchers

Create a structured sample of public visitor feedback without manually copying Korean review cards.

#### Data and automation teams

Send stable review records to a warehouse, spreadsheet, webhook workflow, sentiment model, or monitoring dashboard.

### What Naver Place fields are extracted?

| Field | Meaning |
| --- | --- |
| `reviewId` | Stable public Naver review identifier |
| `placeId`, `placeName`, `placeUrl` | Place identity and canonical review URL |
| `placeVisitorReviewTotal` | Total for the selected visitor-review collection |
| `placeRatingReviewTotal` | Rating-review total reported in Place statistics |
| `placeAverageRating` | Place average rating when visible |
| `rating` | Rating attached to this review when visible |
| `body` | Public visitor review text |
| `author` | Public nickname, profile URL, image, and visible profile counts |
| `visitDate`, `postedDate` | Naver's localized date labels |
| `representativeVisitDateTime` | ISO timestamp when Naver exposes it |
| `visitCount`, `viewCount` | Visible visit and review-view counts |
| `keywords` | Visitor-voted Place keywords |
| `visitKeywords` | Visit context such as occasion or wait time |
| `media` | Public image thumbnails and video links |
| `ownerReply` | Public owner reply text and metadata when present |
| `itemName` | Ordered or booking item when visible |
| `originType`, `language`, `status` | Review context and status |
| `sort`, `scrapedAt` | Run order and extraction timestamp |

Fields can be absent when Naver does not display them for a review or Place.

### How to scrape Naver reviews

1. Open the Actor in Apify Console.
2. Add at least one Naver Place URL or numeric Place ID.
3. Keep **Newest first** for monitoring, or select **Naver recommended** for a representative sample.
4. Optionally set **Visited after** to an ISO date such as `2026-07-01`.
5. Choose the per-Place and total limits.
6. Click **Start**.
7. Open the Dataset tab and export the results in your preferred format.

A working URL example is:

```text
https://m.place.naver.com/restaurant/36639957/review/visitor
```

The equivalent numeric input is `36639957`.

### Input parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | array | — | Public Naver Place or Naver Map URLs containing numeric Place IDs |
| `placeIds` | string array | `[]` | Numeric Place IDs; duplicates across both inputs are removed |
| `sort` | string | `recent` | `recent` for newest visits or `recommended` for Naver's order |
| `postedAfter` | string | — | Optional ISO date/date-time filter applied to exposed visit timestamps |
| `maxReviewsPerPlace` | integer | `10` | Maximum records per Place, from 1 to 10 |
| `maxItems` | integer | `20` | Maximum records across all supplied Places |

At least one URL or Place ID is required. Unsupported hosts, malformed IDs, and invalid date values fail closed with a clear error.

### Example input

```json
{
  "placeIds": ["36639957", "31806828"],
  "sort": "recent",
  "postedAfter": "2026-07-01",
  "maxReviewsPerPlace": 10,
  "maxItems": 20
}
```

You can combine `placeIds` with `startUrls` in the same run.

### Example Naver review output

This shortened example reflects the current typed output shape:

```json
{
  "reviewId": "6a7eddb8e781abd6ab8651ad",
  "placeId": "36639957",
  "placeName": "스타벅스 명동중앙로점",
  "placeUrl": "https://m.place.naver.com/place/36639957/review/visitor",
  "placeVisitorReviewTotal": 2617,
  "placeAverageRating": 4.45,
  "rating": 5,
  "body": "금요일 저녁 6시쯤 방문했어요\n직원분들 너무 친절하세요",
  "author": {
    "nickname": "Sample Reviewer",
    "totalReviewCount": 63
  },
  "representativeVisitDateTime": "2026-08-14T09:11:53.000Z",
  "keywords": ["커피가 맛있어요", "친절해요"],
  "sort": "recent",
  "scrapedAt": "2026-08-19T20:40:00.000Z"
}
```

Reviewer names in this documentation are anonymized. Dataset rows contain only the public values Naver returned at run time.

### How much does it cost to extract Naver reviews?

The Actor uses pay-per-event pricing:

- a one-time **Start** event currently costs **$0.00005 per run**;
- each saved review uses the `item` event;
- the BRONZE item rate is currently **$0.0006 per review**;
- higher-volume subscription tiers receive lower item rates automatically.

Example BRONZE Actor charges:

| Useful output | Estimated Actor charge |
| --- | ---: |
| 10 reviews from one Place | $0.00605 |
| 50 reviews from five Places | $0.03005 |
| 100 reviews from ten Places | $0.06005 |

These examples describe Actor event charges. Your Apify plan can also account for platform compute, storage, and transfer according to Apify's terms. Check the live pricing panel before a large run because rates can change.

### Monitor new Naver reviews on a schedule

For recurring reputation monitoring:

1. Use `sort: "recent"`.
2. Supply all tracked Place IDs.
3. Schedule the Actor hourly, daily, or weekly in Apify Console.
4. Store the stable `reviewId` in your destination.
5. Ignore IDs already processed by the previous run.
6. Alert on new low ratings, selected keywords, or review text patterns.

Because Naver exposes ten server-rendered reviews per Place, choose a schedule frequent enough for each location's review volume.

### Export Naver reviews to spreadsheets

After a run, open the default Dataset and select CSV or Excel. Useful spreadsheet columns include:

- Place name and ID;
- review ID;
- rating;
- body;
- representative visit timestamp;
- reviewer nickname;
- keywords;
- owner reply body;
- Place totals;
- scrape timestamp.

For repeated exports, use the dataset API rather than manually downloading each run.

### Send results to data pipelines

Common integrations include:

- Google Sheets through an Apify integration or automation platform;
- webhooks that trigger after successful runs;
- Make, Zapier, or n8n workflows;
- BigQuery, Snowflake, PostgreSQL, or object storage;
- Korean-language sentiment and topic models;
- branch-level customer-experience dashboards.

Use `reviewId` plus `placeId` as a durable downstream deduplication key.

### Run through the Apify API with cURL

Replace `YOUR_TOKEN` with an Apify API token:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~naver-place-business-reviews-scraper/runs?token=YOUR_TOKEN&waitForFinish=120" \
  -H "Content-Type: application/json" \
  -d '{
    "placeIds": ["36639957"],
    "sort": "recent",
    "maxReviewsPerPlace": 10,
    "maxItems": 10
  }'
```

Fetch dataset items from the `defaultDatasetId` returned by the run.

### Run with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/naver-place-business-reviews-scraper').call({
  placeIds: ['36639957'],
  sort: 'recent',
  maxReviewsPerPlace: 10,
  maxItems: 10,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/naver-place-business-reviews-scraper').call(
    run_input={
        'placeIds': ['36639957'],
        'sort': 'recent',
        'maxReviewsPerPlace': 10,
        'maxItems': 10,
    }
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use Naver Reviews Scraper with MCP

Add this Actor to Claude Code through Apify MCP:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/naver-place-business-reviews-scraper"
```

#### Claude Desktop

Add this server to the Claude Desktop MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/naver-place-business-reviews-scraper"
    }
  }
}
```

#### Cursor

Use the same Apify MCP URL in Cursor's MCP server settings and name the server `apify`.

#### VS Code

Add the same HTTP server URL to your VS Code MCP configuration, then enable the `automation-lab/naver-place-business-reviews-scraper` tool.

Example prompts:

- "Extract the newest public reviews for Naver Place 36639957."
- "Compare the latest review keywords across these five Naver Place IDs."
- "Collect reviews visited after 2026-07-01 and return low-rating records."

### Limits and expected behavior

- The Actor extracts public visitor reviews, not Naver Blog or Café posts.
- Naver's server-rendered page currently exposes at most 10 reviews per Place per run.
- Ratings, text, dates, reviewer details, keywords, media, and replies are nullable.
- `postedAfter` is applied only when a representative ISO visit timestamp is exposed.
- Naver can change its public page shape or temporarily throttle requests.
- A failed Place is logged while other valid Places continue. The run fails when no supplied Place can be processed.
- No proxy mode is exposed because direct structured HTTP is the measured implementation route.

### Reliability tips

- Prefer numeric Place IDs when storing long-lived task inputs.
- Keep batches moderate and schedule them instead of repeatedly launching identical runs.
- Use newest-first order for monitoring.
- Deduplicate with `placeId` and `reviewId`.
- Treat missing fields as normal source behavior rather than empty strings.
- Retry temporary upstream 429 or 5xx failures after a delay.

### Responsible use and legality

This Actor accesses information publicly displayed by Naver Place. You are responsible for ensuring that your use complies with applicable laws, Naver's terms, privacy obligations, and your organization's policies.

Do not use the data to harass reviewers, infer sensitive traits, build invasive profiles, or make solely automated decisions about people. Collect only what you need, protect exported datasets, respect deletion and retention requirements, and avoid republishing personal profile details without a lawful purpose.

This documentation is not legal advice.

### FAQ

#### Does the Actor require a Naver account?

No. It reads the public Place review surface without login credentials.

#### Can I enter a normal Naver Map URL?

Yes, if the URL contains a numeric Place ID. Mobile Place, PC Place, and Naver Map hosts are accepted.

#### Why are there only ten reviews per Place?

Naver's current public server-rendered review page exposes ten records. The Actor uses that stable, low-cost surface and states the limit explicitly rather than relying on a challenged private pagination call.

#### Why is review text or rating missing?

Some visitor reviews contain only keywords, media, or visit verification. Naver also hides ratings for some review types. The corresponding fields remain absent.

#### How do I detect only new reviews?

Run newest-first on a schedule and deduplicate with the stable `reviewId`. Use `postedAfter` as an additional filter when Naver exposes an ISO visit timestamp.

#### What happens when one Place ID is invalid?

The Actor logs that Place failure and continues with the remaining inputs. It returns a failed run only when none of the supplied Places can be processed.

#### Does this extract Naver Blog reviews?

No. The output is intentionally limited to public Naver Place visitor reviews.

### Related automation-lab Actors

- [Naver Map Local Business Scraper](https://apify.com/automation-lab/naver-map-local-business-scraper) — discover Naver Place IDs and export public business listing details.
- [Naver Blog Search Scraper](https://apify.com/automation-lab/naver-blog-search-scraper) — collect public Naver Blog search results for a separate content-research workflow.
- [Naver DataLab Search Trends Scraper](https://apify.com/automation-lab/naver-datalab-search-trends-scraper) — analyze Naver search interest over time.

Use the local-business scraper to discover IDs, then pass those IDs to this Actor for review monitoring.

# Actor input Schema

## `startUrls` (type: `array`):

Public m.place.naver.com, pcmap.place.naver.com, or map.naver.com Place URLs containing a numeric Place ID.

## `placeIds` (type: `array`):

Numeric Place IDs. You can combine these with Place URLs; duplicates are removed.

## `sort` (type: `string`):

Newest visits first for monitoring, or Naver's recommended order for a representative sample.

## `postedAfter` (type: `string`):

Optional ISO date or date-time. Reviews with an exposed representative visit timestamp before this value are excluded.

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

Maximum records saved for each Place. Naver's public server-rendered page exposes at most 10 per run.

## `maxItems` (type: `integer`):

Maximum review records saved across all supplied Places.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://m.place.naver.com/restaurant/36639957/review/visitor"
    }
  ],
  "placeIds": [],
  "sort": "recent",
  "maxReviewsPerPlace": 10,
  "maxItems": 20
}
```

# Actor output Schema

## `dataset` (type: `string`):

Default dataset containing one record per public visitor review.

# 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 = {
    "startUrls": [
        {
            "url": "https://m.place.naver.com/restaurant/36639957/review/visitor"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/naver-place-business-reviews-scraper").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 = { "startUrls": [{ "url": "https://m.place.naver.com/restaurant/36639957/review/visitor" }] }

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/naver-place-business-reviews-scraper").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 '{
  "startUrls": [
    {
      "url": "https://m.place.naver.com/restaurant/36639957/review/visitor"
    }
  ]
}' |
apify call automation-lab/naver-place-business-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/stfOUdLZUkv2JPIrQ/builds/fBVuBCDpbhln2E6xS/openapi.json
