# Naver Place Scraper - Korea Local Business & Map Data (`haketa/naver-place-scraper`) Actor

Naver Place & Naver Map scraper (Korea): search local businesses by area + keyword and export name, category, address, phone, rating, visitor & blog review counts, hours and GPS coordinates. Korea local-business lead generation and market data — fast, no login.

- **URL**: https://apify.com/haketa/naver-place-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 30 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

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

## Naver Place Scraper 🇰🇷 — Korea Local Business, Reviews & Map Data

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-00B5AD?style=for-the-badge\&logo=apify\&logoColor=white)](https://apify.com/haketa/naver-place-scraper)
[![Target](https://img.shields.io/badge/Target-Naver%20Place%20%2F%20Map-03C75A?style=for-the-badge)](https://map.naver.com)
[![Market](https://img.shields.io/badge/Market-South%20Korea%20%F0%9F%87%B0%F0%9F%87%B7-0047A0?style=for-the-badge)]()
[![Data](https://img.shields.io/badge/Data-Phones%20%7C%20Addresses%20%7C%20Reviews%20%7C%20GPS-F57C00?style=for-the-badge)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel%20%7C%20API-4A148C?style=for-the-badge)]()

**Extract local business data from [Naver Place / Naver Map](https://map.naver.com/) — South Korea's #1 local business directory and mapping platform — as clean, structured records.** This **Naver Place scraper** lets you **scrape Naver Place** by **area + keyword** (e.g., `강남 맛집` / "Gangnam restaurants", `홍대 카페` / "Hongdae cafes", `제주 호텔` / "Jeju hotels") and exports **business name, category, road-name & jibun (lot) addresses, contact phone numbers, visitor rating score, visitor & blog/cafe review counts, operating hours, GPS coordinates, amenities, Naver Booking & Naver Pay flags, and high-resolution photo URLs** — with **no login and no coding**.

Export your South Korean business dataset to **JSON, CSV, Excel, XML, HTML, or via the Apify API** for B2B lead generation, retail site selection, F\&B market intelligence, and travel/hospitality applications.

***

### ⚡ At a glance

| Feature | Details |
|---|---|
| **Target platform** | [Naver Place / Naver Map](https://map.naver.com/) — South Korea's primary local search directory |
| **Supported verticals** | Restaurants & cafes (`restaurant`), All places (`place`), Hair & beauty salons (`hairshop`), Hospitals & clinics (`hospital`), Attractions (`attraction`) |
| **Search format** | Korean area + keyword queries (e.g., `강남 맛집`, `성수 카페`, `부산 호텔`, `서울 피부과`) — multiple queries per run |
| **Contact & location data** | Usable `phone`, `virtualPhone` (Naver 0507 safe number), `landlinePhone`, 4 Korean address formats (`roadAddress`, `address`, `commonAddress`, `fullAddress`), and exact WGS84 `latitude` / `longitude` |
| **Reputation metrics** | `visitorReviewScore` (5-point rating), `visitorReviewCount`, `blogCafeReviewCount`, `bookingReviewCount`, `totalReviewCount`, and `michelinGuide` |
| **Pagination & scale** | ~50 places per page; automatic multi-page traversal (`maxPagesPerQuery: 0` auto/unlimited) with 100% `placeId` de-duplication |
| **Proxy setup** | Pre-configured with **South Korea (`KR`) Residential** proxy and automatic session/IP rotation |
| **Output formats** | JSON, CSV, Excel (XLSX), XML, HTML, and Apify REST API |

***

### 📋 Table of contents

- [Why scrape Naver Place instead of Google Maps?](#-why-scrape-naver-place-instead-of-google-maps)
- [What this Naver Place scraper does](#-what-this-naver-place-scraper-does)
- [Use cases](#-use-cases)
- [Input configuration](#-input-configuration)
- [Output & field reference](#-output--field-reference)
- [Pagination & 1,000+ scale](#-pagination--1000-scale)
- [How to use](#-how-to-use)
- [Pro tips for Korean local business scraping](#-pro-tips-for-korean-local-business-scraping)
- [FAQ](#-faq)
- [Related scrapers](#-related-scrapers)
- [Changelog](#-changelog)

***

### 🔎 Why scrape Naver Place instead of Google Maps?

In South Korea, **Google Maps has restricted domestic coverage** due to Korean geospatial data regulations. As a result, Korean consumers and businesses rely overwhelmingly on **Naver Map** and **Naver Place** to discover restaurants, cafes, retail stores, beauty salons, medical clinics, and tourist attractions. Every active Korean merchant maintains a detailed Naver Place profile with verified addresses, safe call routing numbers, Naver Pay / Naver Booking integration, receipt-verified visitor reviews, and Naver Blog/Cafe review links.

Global map scrapers miss the vast majority of South Korean merchants, review counts, and Korean road-name (`도로명`) vs. lot (`지번`) address structures. Meanwhile, collecting Naver Place listings manually is impractical across hundreds of neighborhoods (`동` / `구`) and business categories.

This **Naver Place data extractor** automates the entire pipeline. Pass a list of Korean search queries and receive a clean, de-duplicated dataset ready for CRM import, geospatial mapping, or competitive intelligence.

#### Key business outcomes

- 📇 **South Korea B2B lead generation** — build targeted outreach lists of Korean restaurants, cafes, salons, clinics, and shops with phone numbers (`phone`) and four normalized address formats.
- 📊 **F\&B & retail competitive intelligence** — benchmark competitor density, average visitor ratings (`visitorReviewScore`), receipt-verified review volume (`visitorReviewCount`), and blog buzz (`blogCafeReviewCount`) by district.
- 🗺️ **GIS, site selection & territory planning** — plot exact `latitude` and `longitude` coordinates alongside review volume to spot high-footfall commercial zones and underserved neighborhoods.
- 🍽️ **Travel, dining & K-culture directories** — power multilingual travel apps, concierge bots, and K-food guides with live Korean venue data, Michelin indicators, amenities (`options`), and photo galleries.
- 💳 **POS, payment & booking SaaS prospecting** — filter merchants by `hasBooking` and `hasNPay` to identify businesses that have or have not adopted digital booking and Naver Pay.

***

### ✨ What this Naver Place scraper does

- ✅ **Multi-query area + keyword search** — run dozens of Korean search queries (e.g., `강남 맛집`, `홍대 카페`, `이태원 바`, `명동 화장품`, `해운대 호텔`) in a single job.
- ✅ **Five dedicated Naver Place verticals** — target **Restaurants & cafes** (`restaurant`), **All places (general)** (`place`), **Hair & beauty salons** (`hairshop`), **Hospitals & clinics** (`hospital`), or **Attractions & things to do** (`attraction`).
- ✅ **Unlocked 1,000+ pagination & smart early-stop** — pages through each query (~50 businesses per page) until `maxItems` is reached, `maxPagesPerQuery` is hit, or Naver stops returning new unique businesses for that query.
- ✅ **Cross-query de-duplication** — every business is de-duplicated by its canonical Naver `placeId`, guaranteeing **0 duplicate records** even when adjacent neighborhood searches overlap.
- ✅ **Complete Korean address & GPS coverage** — captures road-name address (`roadAddress`), lot/jibun address (`address`), district/dong summary (`commonAddress`), full administrative address (`fullAddress`), and WGS84 `latitude` / `longitude`.
- ✅ **Multi-channel review & reputation metrics** — extracts `visitorReviewScore`, `visitorReviewCount` (receipt-verified reviews), `blogCafeReviewCount` (Naver Blog & Cafe posts), `bookingReviewCount`, and computed `totalReviewCount`.
- ✅ **Built-in Korean IP & session management** — pre-configured for **KR Residential** proxies with automatic cookie warm-up and IP rotation on rate limits.

***

### 🎯 Use cases

| Audience | How they use Naver Place data |
|---|---|
| **📇 B2B Sales & Lead-Gen Agencies** | Build segmented prospect lists of Korean SMBs (restaurants, clinics, salons, retail) with phone numbers, addresses, and digital adoption signals (`hasBooking`, `hasNPay`). |
| **🍽️ F\&B Brands & Delivery Platforms** | Map restaurant categories, review velocity, and neighborhood saturation across Seoul, Busan, Incheon, Daegu, and Jeju. |
| **🧳 Travel, OTA & K-Tourism Apps** | Enrich travel guides with accurate Korean venue names, GPS pins, operating hours (`newBusinessHours`), amenities (`options`), and photo galleries (`imageUrls`). |
| **🏢 Franchise & Real Estate Analysts** | Combine `latitude`/`longitude` coordinates and `totalReviewCount` to evaluate commercial foot traffic before opening new store locations. |
| **🏥 Healthcare & Beauty Marketplaces** | Extract dermatology clinics, dental practices, plastic surgery centers (`hospital`), and hair/nail studios (`hairshop`) with ratings and review counts. |
| **🤖 AI & Dataset Engineering Teams** | Feed structured, up-to-date Korean POI (Point of Interest) data into LLMs, RAG pipelines, and recommendation engines. |

***

### 📥 Input configuration

Configure the **Naver Place scraper** via the Apify Console form or JSON input. **All fields are optional** — leaving `queries` empty runs a built-in sample of 8 popular South Korean search queries so you can inspect the output structure immediately.

| Field | Type | Default | Description |
|---|---|---|---|
| `queries` | `array` | 3 prefilled queries | Korean search terms combining an **area + keyword** (e.g., `"강남 맛집"`, `"홍대 카페"`, `"제주 호텔"`). Each entry is searched and paginated independently. Leave empty for an 8-query Korean sample. |
| `searchType` | `string` | `"restaurant"` | Naver Place section to query: `"restaurant"` (Restaurants & cafes), `"place"` (All places / general businesses), `"hairshop"` (Hair & beauty salons), `"hospital"` (Hospitals & clinics), or `"attraction"` (Attractions & things to do). |
| `maxItems` | `integer` | `0` (prefill `100`) | Maximum total places to collect across all queries (`0` = unlimited). |
| `maxPagesPerQuery` | `integer` | `0` | Maximum result pages to crawl per query (~50 places per page). Set `0` for automatic / unlimited pagination governed by `maxItems`. |
| `maxConcurrency` | `integer` | `2` | Number of queries/pages processed in parallel (`1`–`6`). Keep at `2` for optimal stability against Naver's per-IP rate limiter. |
| `proxyConfiguration` | `object` | `KR` Residential | Proxy configuration. **South Korean (`KR`) Residential proxy is required** so Naver serves complete domestic business listings. |

#### Example 1 — Multi-district Seoul restaurant & cafe sweep (1,000+ places)

```json
{
  "queries": [
    "강남 맛집",
    "홍대 맛집",
    "성수 카페",
    "이태원 맛집",
    "명동 맛집",
    "연남동 카페",
    "여의도 맛집",
    "잠실 맛집"
  ],
  "searchType": "restaurant",
  "maxItems": 1000,
  "maxPagesPerQuery": 0,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "KR"
  }
}
```

#### Example 2 — Seoul beauty & hair salons (`hairshop` vertical)

```json
{
  "queries": ["강남 미용실", "홍대 미용실", "청담동 미용실", "건대 미용실"],
  "searchType": "hairshop",
  "maxItems": 500,
  "maxPagesPerQuery": 0
}
```

#### Example 3 — Medical clinics & dental practices (`hospital` vertical)

```json
{
  "queries": ["강남 피부과", "강남 치과", "서초 안과", "부산 성형외과"],
  "searchType": "hospital",
  "maxItems": 400
}
```

***

### 📤 Output & field reference

Each business is emitted as a normalized JSON object. Below is a real record captured from a live run for `강남 맛집` (Gangnam restaurants):

```json
{
  "placeId": "2083987873",
  "name": "이자카야 고코 선릉점",
  "category": "이자카야",
  "businessCategory": "bar",
  "description": null,
  "roadAddress": "선릉로86길 37 2층 이자카야 고코 선릉점",
  "address": "대치동 890-45",
  "commonAddress": "서울 강남구 대치동",
  "fullAddress": "서울특별시 강남구 대치동 890-45 2층 이자카야 고코 선릉점",
  "phone": "0507-1377-5658",
  "landlinePhone": null,
  "virtualPhone": "0507-1377-5658",
  "latitude": 37.5041178,
  "longitude": 127.0526968,
  "visitorReviewScore": 4.97,
  "visitorReviewCount": 99,
  "blogCafeReviewCount": 120,
  "bookingReviewCount": 0,
  "totalReviewCount": 219,
  "businessHours": null,
  "newBusinessHours": {
    "status": "영업 전",
    "description": "11:00에 영업 시작"
  },
  "options": "단체 이용 가능,포장,예약,무선 인터넷,남/녀 화장실 구분,대기공간",
  "hasBooking": true,
  "bookingUrl": null,
  "hasNPay": false,
  "michelinGuide": null,
  "imageUrl": "https://ldb-phinf.pstatic.net/20260918_105/.../KakaoTalk_20250709_233928108.jpg",
  "imageCount": 62,
  "imageUrls": [
    "https://ldb-phinf.pstatic.net/20260918_105/.../KakaoTalk_20250709_233928108.jpg",
    "https://ldb-phinf.pstatic.net/20261018_249/.../KakaoTalk_20261018_150849860.jpg"
  ],
  "placeUrl": "https://map.naver.com/p/entry/place/2083987873",
  "mobileUrl": "https://m.place.naver.com/restaurant/2083987873/home",
  "searchQuery": "강남 맛집",
  "scrapedAt": "2026-11-01T23:48:42.739Z"
}
```

#### Field reference by category

##### 🏷️ Identity & categorization

| Field | Type | Coverage | Description |
|---|---|---|---|
| `placeId` | `string` | 🟢 High (100%) | Unique Naver Place numeric ID (used as the primary key for de-duplication). |
| `name` | `string` | 🟢 High (100%) | Official business display name on Naver Place. |
| `category` | `string` | 🟢 High (100%) | Granular Korean business category (e.g., `일식당`, `카페,디저트`, `미용실`, `피부과`). |
| `businessCategory` | `string` | 🟢 High (100%) | Internal Naver vertical classification (e.g., `restaurant`, `bar`, `hospital`). |
| `description` | `string \| null` | 🟡 Conditional | Short merchant promotional tagline or intro when published on the listing card. |
| `searchQuery` | `string` | 🟢 High (100%) | The exact input search query that surfaced this business. |
| `scrapedAt` | `string` | 🟢 High (100%) | ISO 8601 UTC timestamp indicating when the record was scraped. |

##### 📍 Korean addresses & GPS coordinates

| Field | Type | Coverage | Description |
|---|---|---|---|
| `roadAddress` | `string \| null` | 🟢 High (~100%) | Korean street/road-name address (`도로명주소`), e.g., `"선릉로86길 37 2층"`. |
| `address` | `string \| null` | 🟢 High (~100%) | Traditional lot/jibun address (`지번주소`), e.g., `"대치동 890-45"`. |
| `commonAddress` | `string \| null` | 🟢 High (100%) | Province/city + district (`구`/`시`) + neighborhood (`동`), e.g., `"서울 강남구 대치동"`. |
| `fullAddress` | `string \| null` | 🟢 High (~100%) | Complete administrative address string. |
| `latitude` | `number \| null` | 🟢 High (100%) | WGS84 GPS latitude (`y` coordinate). |
| `longitude` | `number \| null` | 🟢 High (100%) | WGS84 GPS longitude (`x` coordinate). |

##### 📞 Contact numbers & links

| Field | Type | Coverage | Description |
|---|---|---|---|
| `phone` | `string \| null` | 🟢 High (~92%) | Primary callable phone number (prefers `landlinePhone`, falls back to `virtualPhone`). |
| `virtualPhone` | `string \| null` | 🟡 Conditional (~68%) | Naver `0507-xxxx-xxxx` safe call-forwarding number assigned to the merchant. |
| `landlinePhone` | `string \| null` | 🟡 Conditional (~24%) | Direct landline or mobile number when publicly exposed alongside or instead of a virtual number. |
| `placeUrl` | `string` | 🟢 High (100%) | Desktop Naver Map URL (`https://map.naver.com/p/entry/place/{placeId}`). |
| `mobileUrl` | `string` | 🟢 High (100%) | Mobile Naver Place URL (`https://m.place.naver.com/{searchType}/{placeId}/home`). |

##### ⭐ Ratings & review counts

| Field | Type | Coverage | Description |
|---|---|---|---|
| `visitorReviewScore` | `number \| null` | 🟡 Conditional (~57%) | Average receipt-verified visitor star rating (out of 5.0). Populated whenever Naver displays a public rating score. |
| `visitorReviewCount` | `number \| null` | 🟢 High (~99.5%) | Count of receipt/payment-verified visitor reviews (`방문자 리뷰`). |
| `blogCafeReviewCount` | `number \| null` | 🟢 High (100%) | Count of Naver Blog and Naver Cafe review articles (`블로그 리뷰`) mentioning the place. |
| `bookingReviewCount` | `number \| null` | 🟢 High (100%) | Count of reviews left via Naver Booking (`예약자 리뷰`). |
| `totalReviewCount` | `number \| null` | 🟢 High (~99.8%) | Combined total review count across visitor, blog/cafe, and booking reviews. |
| `michelinGuide` | `object \| null` | 🟡 Conditional | Michelin Guide badge metadata when the restaurant is listed in the Michelin Guide Seoul/Busan. |

##### 🕒 Operating hours, booking, payments & media

| Field | Type | Coverage | Description |
|---|---|---|---|
| `newBusinessHours` | `object \| null` | 🟢 High (~100%) | Structured real-time operating status (e.g., `status: "영업 중"`, `description: "22:00에 영업 종료"`). |
| `businessHours` | `string \| null` | 🟡 Conditional | Legacy raw hours string when provided. |
| `options` | `string \| null` | 🟢 High (~96%) | Comma-separated Korean amenities (e.g., `주차`, `포장`, `예약`, `무선 인터넷`, `배달`, `단체 이용 가능`). |
| `hasBooking` | `boolean \| null` | 🟡 Conditional (~52%) | Whether the merchant accepts online reservations via **Naver Booking**. |
| `bookingUrl` | `string \| null` | 🟡 Conditional | External or Naver Booking URL when exposed. |
| `hasNPay` | `boolean` | 🟢 High (100%) | Whether the merchant supports **Naver Pay** (`네이버페이`). |
| `imageUrl` | `string \| null` | 🟢 High (~99.8%) | Primary storefront or dish thumbnail image URL. |
| `imageCount` | `number \| null` | 🟢 High (100%) | Total number of photos available on the place profile. |
| `imageUrls` | `array \| null` | 🟢 High (~99.8%) | Array of high-resolution photo URLs from the listing card. |

***

### 🔁 Pagination & 1,000+ scale

This **Naver Place scraper** is built for high-volume Korean directory extraction without slow browser overhead:

1. \*\* ~50 businesses per page:\*\* Each list request returns up to 50 full business records in a single HTTP round-trip — no individual per-place detail requests are required.
2. **Unlocked `maxPagesPerQuery: 0` default:** When `maxPagesPerQuery` is `0` (the default), the scraper automatically continues paging (`?page=1`, `?page=2`, `?page=3`…) until `maxItems` is satisfied or the query has no further unique places.
3. **Smart duplicate-page detection:** On very deep pages, Naver occasionally repeats the final page of results. As soon as a page yields zero new unique `placeId`s, the actor stops paging that query and advances immediately to the next query — saving proxy traffic and run time.
4. **Scaling to 1,000–10,000+ Korean businesses:** Because any single area+keyword query in Naver typically returns 200–300 unique places (4–6 pages), combine multiple district/dong queries in `queries` (e.g., all 25 `구` of Seoul or top commercial neighborhoods) with `maxItems: 2000` (or `0`) to collect thousands of unique venues in one run.

***

### ⚙️ How to use

1. **Open the actor** in the Apify Console.
2. **Enter your Korean `queries`** — combine a neighborhood/city with a business keyword (e.g., `강남 맛집`, `성수 카페`, `해운대 횟집`, `판교 IT`).
3. **Select `searchType`** — choose *Restaurants & cafes*, *All places (general)*, *Hair & beauty salons*, *Hospitals & clinics*, or *Attractions*.
4. **Set `maxItems`** — e.g., `100` for a quick test, `1000` for a deep regional sweep, or `0` for unlimited.
5. **Keep the default `KR` Residential proxy** and click **Start**.
6. **Download or integrate** — export your dataset as **JSON, CSV, Excel (XLSX), XML, or HTML**, or fetch items programmatically via the **Apify API**.

#### Calling via the Apify API (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("haketa/naver-place-scraper").call(run_input={
    "queries": ["강남 맛집", "홍대 카페", "성수 카페", "이태원 맛집"],
    "searchType": "restaurant",
    "maxItems": 500,
    "maxPagesPerQuery": 0,
})

for place in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(place["placeId"], place["name"], place["phone"], place["roadAddress"])
```

#### Calling via the Apify API (Node.js)

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('haketa/naver-place-scraper').call({
    queries: ['강남 맛집', '홍대 카페', '제주 호텔'],
    searchType: 'restaurant',
    maxItems: 500,
    maxPagesPerQuery: 0,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Collected ${items.length} South Korean businesses from Naver Place.`);
```

#### Popular Korean area + keyword combinations (`queries` cheatsheet)

| Korean Query | English Meaning | Recommended `searchType` |
|---|---|---|
| `강남 맛집` / `홍대 맛집` / `명동 맛집` | Gangnam / Hongdae / Myeongdong restaurants | `restaurant` |
| `성수 카페` / `연남동 카페` / `제주 카페` | Seongsu / Yeonnam-dong / Jeju cafes | `restaurant` |
| `강남 미용실` / `청담동 네일샵` | Gangnam hair salons / Cheongdam nail salons | `hairshop` |
| `강남 피부과` / `서초 치과` / `압구정 성형외과` | Gangnam dermatology / Seocho dental / Apgujeong plastic surgery | `hospital` |
| `부산 호텔` / `제주 펜션` / `경주 가볼만한곳` | Busan hotels / Jeju pensions / Gyeongju attractions | `place` or `attraction` |
| `강남 헬스장` / `판교 공유오피스` | Gangnam gyms / Pangyo coworking spaces | `place` |

***

### 💡 Pro tips for Korean local business scraping

- 🇰🇷 **Always keep the South Korea (`KR`) Residential proxy enabled:** Naver restricts non-Korean IPs and applies strict per-IP rate limits. The default `KR` residential proxy configuration with automatic session rotation is essential for reliable results.
- 🗺️ **Slice large cities by district (`구`) or neighborhood (`동`):** Instead of a broad query like `서울 식당` (Seoul restaurants), pass granular neighborhood queries (`강남역 맛집`, `역삼동 맛집`, `신사동 맛집`, `압구정 맛집`) to capture 5–10× more unique venues across Seoul.
- 🏢 **Use `searchType: "place"` for general B2B categories:** When scraping gyms (`헬스장`), academies (`학원`), real estate offices (`부동산`), pharmacies (`약국`), or retail stores, switch `searchType` from `"restaurant"` to `"place"`.
- 🐢 **Keep `maxConcurrency` at `2`:** Naver's rate limiter is sensitive to burst traffic from a single session. A concurrency of `2` delivers ~100–200 places per minute cleanly without triggering unnecessary retries.

***

### ❓ FAQ

#### Why do I need a Korean (`KR`) residential proxy?

Naver Place serves domestic Korean business data and actively throttles or blocks requests originating outside South Korea or from datacenter subnets. The actor defaults to Apify's `KR` Residential proxy pool so it works out of the box.

#### Do I need a Naver account or API key?

No. The scraper extracts public Naver Place listings directly without requiring a Naver login, developer application, or API key.

#### What is the difference between `phone`, `virtualPhone`, and `landlinePhone`?

Many South Korean merchants use Naver's free `0507-xxxx-xxxx` safe call-routing service (`virtualPhone`) to protect against spam while still receiving customer calls. The `phone` field always gives you a ready-to-dial number (preferring `landlinePhone` when present, and falling back to `virtualPhone`).

#### Can I search in English?

Naver Place is a Korean-language index. While a few major hotels or landmarks match English names, you will get 10–50× more results by using Korean area + category terms (e.g., `강남 맛집` instead of `"Gangnam restaurant"`, `서울 카페` instead of `"Seoul cafe"`).

#### How many places can I extract per run?

Each page returns ~50 places, and with `maxPagesPerQuery: 0` the scraper pages automatically until all unique results for each query are collected or `maxItems` is reached. By passing 10–30 neighborhood queries, you can easily collect **1,000 to 5,000+ unique Korean businesses** in a single run.

***

### 🔗 Related scrapers

Building an Asia-Pacific or global B2B local-business pipeline? Pair **Naver Place Scraper** with our other extractors:

- 🇰🇷 [Kakao Map Scraper](https://apify.com/haketa/kakao-map-scraper) — South Korea's second-largest map & local business directory.
- 🇹🇭 [Wongnai Scraper](https://apify.com/haketa/wongnai-scraper) — Thailand's #1 restaurant and local business platform with phone, email, LINE & GPS.
- 🏢 [D\&B Scraper](https://apify.com/haketa/dnb-scraper) — Global B2B company firmographics from Dun & Bradstreet.
- ⭐ [BBB Scraper](https://apify.com/haketa/bbb-scraper) — Accredited business profiles, ratings, and contacts from the Better Business Bureau.
- 🎥 [YouTube Contact Scraper](https://apify.com/haketa/youtube-contact-scraper) — Extract creator business emails and social links from YouTube channels.

***

### 📋 Changelog

#### v1.2 (2026-11)

- **Unlocked 1,000+ pagination:** Changed `maxPagesPerQuery` default from `10` to `0` (automatic/unlimited, governed by `maxItems`) so deep multi-page queries paginate until `maxItems` is reached or all unique places are exhausted.
- **Improved default-run logging & documentation:** Expanded README with Korean vertical examples, field coverage indicators, and multi-district scaling strategies.

#### v1.1 (2026-10)

- **Resilient session & review fallback:** Added automatic proxy rotation on `590` tunnel / `429` responses and automatic `totalReviewCount` summation when Naver omits the explicit total counter.
- **Phone normalization:** Exposed `phone`, `virtualPhone`, and `landlinePhone` side by side for maximum lead-gen utility.

#### v1.0 (2026-05)

- Initial release supporting Korean area + keyword search across 5 Naver Place verticals (`restaurant`, `place`, `hairshop`, `hospital`, `attraction`).

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/naver-place-scraper/changelog.md

# Actor input Schema

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

What to look for on Naver Place. Combine an area with a keyword, e.g. '강남 맛집' (Gangnam restaurants), '홍대 카페' (Hongdae cafes) or '제주 호텔' (Jeju hotels). Each line is searched separately. Leave empty to run a ready-made sample of popular Korean searches.

## `searchType` (type: `string`):

Which Naver Place section to search in. Pick 'Restaurants & cafes' for food, 'All places' for any business, or a specific category.

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

Stop after collecting this many places across all searches. Use 0 for no limit.

## `maxPagesPerQuery` (type: `integer`):

How deep to page through each search (about 50 places per page). Set 0 for automatic / unlimited pagination (governed by Max places).

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

Naver serves Korea-specific results and works best from a Korean IP. Korean residential proxies are the reliable default — keep this on for complete, accurate data.

## `maxConcurrency` (type: `integer`):

How many searches to process in parallel. The default keeps results reliable and complete.

## Actor input object example

```json
{
  "queries": [
    "강남 맛집",
    "홍대 카페",
    "제주 호텔"
  ],
  "searchType": "restaurant",
  "maxItems": 100,
  "maxPagesPerQuery": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KR"
  },
  "maxConcurrency": 2
}
```

# Actor output Schema

## `places` (type: `string`):

All place records collected during the run.

## `runUrl` (type: `string`):

Open this run in the Apify Console.

# 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": [
        "강남 맛집",
        "홍대 카페",
        "제주 호텔"
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "KR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/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": [
        "강남 맛집",
        "홍대 카페",
        "제주 호텔",
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "KR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/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": [
    "강남 맛집",
    "홍대 카페",
    "제주 호텔"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KR"
  }
}' |
apify call haketa/naver-place-scraper --silent --output-dataset

```

## MCP server setup

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