# Naver Place Business & Reviews Scraper (Korea) (`oswaldocarabano/naver-place-scraper`) Actor

Korean local business data from Naver Place: businesses, visitor reviews, reputation aggregates, menus and photos. Filters out the out-of-area results Naver silently pads its responses with, and tells you how many it dropped. No login, no browser.

- **URL**: https://apify.com/oswaldocarabano/naver-place-scraper.md
- **Developed by:** [Oswaldo Carabano](https://apify.com/oswaldocarabano) (community)
- **Categories:** Lead generation, Travel
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Place Business & Reviews Scraper (Korea)

Korean local business data from **Naver Place** — the directory Koreans actually
use, where Google Maps coverage is thin. Businesses, visitor reviews, reputation
aggregates, menus and photos.

No login. No session cookies. No browser. Just the pages Naver serves publicly to
any visitor.

***

### What makes this one different

**Naver pads its search results with businesses from outside the area you asked
for** — silently, with HTTP 200, and with no marker in the response. Measured across
10 queries: for `역삼동 치과` Naver reports 638 matches, serves 300, and only **162**
are actually in 역삼동. For `율현동 치과` it reports 52, serves 52, and **2** are in
the area.

This actor **filters them out and tells you how many it dropped**:

```
"역삼동": 162 of 300 results are actually located in this area.
138 were padding from neighbouring areas and were dropped.
Naver reports 638 matches for this query, but that count includes
out-of-area padding and is not an inventory figure.
```

It also tells you the real ceiling: **Naver serves at most 300 results per query.**
Wide coverage needs more regions or narrower terms, and the run log says so instead
of letting you assume you got everything.

### What you get

**Businesses** — name, category (translated, with the Korean original kept), phone,
road and jibun addresses, coordinates, opening status and hours, facilities, photos,
menu count, booking and chat links.

**Reputation aggregates**, computed by Naver itself: average rating, star
distribution across 10 bands, review and reviewer counts, image-review count, and
Naver's own theme analysis with counts (taste, price, atmosphere…).

**Reviews** — full text, visit date, photos and videos, and whether the review is
receipt-verified. **Star ratings depend on the vertical:** restaurants and cafés
carry them, clinics and pharmacies do not — Naver simply does not compute a rating
there, and the field comes back `null` rather than a made-up zero.

**Menus** — item name, price in KRW, description and photos.

#### One entity type per run

Pick what you want with **`entityType`**: businesses, reviews, menu items or photos.
Each run writes a single clean shape to the dataset, so the CSV or JSON you download
has one set of columns instead of a mix. Run it once per type if you need more than
one. Failed requests go to the key-value store under `ERRORS` and are never
charged.

### Reviewer identities are never returned

Every review on Naver carries the reviewer's nickname, a stable account id, and a
link to their entire public review history. **None of it is returned here.** Not
behind a flag, not on request. An automated test fails the build if a reviewer
identifier appears in any delivered row, at any depth.

You get *what was said and how it was rated* — which is what competitor analysis
needs — not *who said it*.

### Fill rates, measured on 3,295 businesses across 8 verticals and 8 regions

Present for **at least 90 % of businesses in every vertical measured**: name,
category, all three address forms, coordinates, image count, blog review count.

**Phone: 88 % on average, but 37 % in the worst vertical measured (pharmacies).**
Between 37 % and 87 % of businesses only publish the `0507-…` relay number Naver
puts in front of the real one — `phone_is_virtual` tells you which you got.

**Some fields depend heavily on the vertical.** `visitor_review_score` is absent for
clinics, academies and pharmacies. `micro_review` and `save_count` only appear for
restaurants and cafés. The dataset always includes the key with an explicit `null`,
never a missing field.

### Coverage tips

- **Query in Korean.** Naver's search is Korean-first: `치과` returns far more than
  `dentist`.
- **Add regions** to go past the 300-per-query ceiling. `["서울 강남구", "서울 마포구"]`
  covers two districts properly instead of one query overflowing.
- **Reviews cost more than businesses to collect**, because each business needs its
  own paginated sweep. Start with a small `maxResults` to see the shape before
  running wide.

### Data policy and removal requests

[naver.actorstack.dev](https://naver.actorstack.dev/) · `privacy@actorstack.dev`

Every row is fetched fresh from Naver and says so: `from_cache` is `false`,
`fetched_at` and `data_age_hours` are `null`. Shared caching is designed but not
switched on yet — when it is, those three fields will carry the age of the data, so a
cached result can never be presented as fresh.

Failed requests go to the key-value store under `ERRORS` and are **never charged**.

*Not affiliated with, endorsed by, or connected to Naver Corporation.*

# Actor input Schema

## `queries` (type: `array`):

Category or business terms, in Korean or English. Korean gives far better coverage: Naver's search is Korean-first. Example: \["치과", "카페"].

## `regions` (type: `array`):

Korean administrative regions to cover, e.g. \["서울 강남구", "부산 해운대구"]. Leave empty to sweep all 17 first-level regions. Results are filtered so only businesses actually located in the region are returned.

## `entityType` (type: `string`):

One entity type per run, so the dataset you download has one clean shape. Businesses, reviews, menu items and photos have genuinely different fields; run the Actor once per type if you need more than one.

## `businessType` (type: `string`):

Which Naver vertical to read detail pages from. Note: this does not filter search results — Naver ignores it. The search term is what selects the category.

## `maxResults` (type: `integer`):

Hard cap on rows of the selected entity type. Naver serves at most 300 results per query, so wide coverage needs more regions or narrower terms.

## `includeReputation` (type: `boolean`):

Average rating, star distribution across 10 bands, reviewer count, and Naver's own theme analysis with counts. Costs one detail request per business.

## `maxReviewsPerBusiness` (type: `integer`):

Cap on reviews fetched per business. Naver paginates reviews by cursor, so the full corpus is reachable — 1,120 reviews cost 24 requests. Keep this low unless you need depth.

## `proxyConfiguration` (type: `object`):

Optional. Not needed today: Naver Place answers plain HTTP requests from datacenter IPs.

## Actor input object example

```json
{
  "queries": [
    "치과"
  ],
  "regions": [],
  "entityType": "businesses",
  "businessType": "restaurant",
  "maxResults": 100,
  "includeReputation": true,
  "maxReviewsPerBusiness": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Everything this run collected: businesses, reviews, menu items or photos, depending on what you asked for.

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

The same rows, trimmed to the columns most people want.

## `errors` (type: `string`):

Anything that could not be fetched. Failed requests are never charged.

## `runSummary` (type: `string`):

What was delivered, what was charged, and how many out-of-area results were dropped. Use it to reconcile your invoice against the rows you received.

# 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 = {
    "queries": [
        "치과"
    ],
    "regions": [],
    "entityType": "businesses",
    "businessType": "restaurant",
    "maxResults": 100,
    "includeReputation": true,
    "maxReviewsPerBusiness": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("oswaldocarabano/naver-place-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 = {
    "queries": ["치과"],
    "regions": [],
    "entityType": "businesses",
    "businessType": "restaurant",
    "maxResults": 100,
    "includeReputation": True,
    "maxReviewsPerBusiness": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("oswaldocarabano/naver-place-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 '{
  "queries": [
    "치과"
  ],
  "regions": [],
  "entityType": "businesses",
  "businessType": "restaurant",
  "maxResults": 100,
  "includeReputation": true,
  "maxReviewsPerBusiness": 50
}' |
apify call oswaldocarabano/naver-place-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,oswaldocarabano/naver-place-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/tyrT7G62UzwHakHt8/builds/zQQLNkfveBY9M8Ysu/openapi.json
