# Naver Map & Place Scraper: Places, Menus & Reviews (`unitbytes/naver-place-scraper`) Actor

⚡ Fastest Naver Map (네이버 지도) & Naver Place (네이버 플레이스) scraper ($2.80/1K). Extract South Korean local business leads, phone numbers, GPS coordinates, opening hours, full menus with KRW prices, visitor reviews, blog reviews & HD photos. MCP & AI ready.

- **URL**: https://apify.com/unitbytes/naver-place-scraper.md
- **Developed by:** [UnitBytes | Enterprise Web Data](https://apify.com/unitbytes) (community)
- **Categories:** Lead generation, E-commerce, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 place or review scrapeds

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 Map & Place Scraper: Places, Menus & Reviews (네이버 지도·플레이스)

Extract complete South Korean local business leads, menus with KRW prices, 7-day opening hours, phone numbers, GPS coordinates, visitor reviews, and linked Naver Blog reviews from **Naver Map (`map.naver.com`)** and **Naver Place** in seconds.

***

### Why Choose This Naver Map & Place Scraper?

- **All-in-One Transparent Pricing (From $2.80 / 1,000 Results)**: Pay a single predictable per-result rate (`result-scraped`) with full place details, menus, 7-day business hours, sentiment analytics, and embedded visitor & blog reviews included at no extra add-on fee.
- **Complete 45+ Field Local Business Profiles**: Extracts business names, categories, phone & SmartCall (`0507`) numbers, road (`도로명`) & lot (`지번`) addresses, GPS coordinates (`latitude` / `longitude`), official websites & social links, subway exit walking directions, parking fees, and amenities.
- **Full Menus, KRW Prices & POS Insights**: Captures every menu item with KRW price, menu description, recommended badges, high-resolution menu photos, popular dishes, average customer spend, and average stay time.
- **Verified Visitor Reviews & Naver Blog Reviews**: Collects receipt-verified visitor reviews (`방문자 리뷰`), server-side photo-only review filtering (`onlyPhotoReviews`), customer sentiment keyword rankings (e.g., *"음식이 맛있어요"*, *"친절해요"*), owner replies, and linked Naver Blog & Cafe review posts (`블로그 리뷰`).
- **100% Working Permanent HD Media Links**: Automatically normalizes cover photos, menu images, and customer review photos to full-resolution uncropped image URLs.
- **Clean Flat Output Schema for Excel, CSV & AI Agents**: Every record uses clean root-level keys so you can export directly to Excel, CSV, Google Sheets, Pandas (`pd.DataFrame(items)`), or Apify MCP AI workflows without `[object Object]` formatting errors.

***

### What Data Can You Extract?

| Category | Extracted Fields |
| :--- | :--- |
| **Business Identity & Contact** | `placeId`, `name`, `businessCategory` (`restaurant`, `hospital`, `hairshop`, `accommodation`, `place`), `category`, `categoryCode`, `phone`, `virtualPhone`, `talktalkUrl`, `homepageUrl`, `instagramUrl`, `allLinks` |
| **Location & Transit** | `roadAddress`, `address`, `commonAddress`, `fullAddress`, `postalCode`, `latitude`, `longitude`, `distance`, `directions`, `nearestSubway`, `parkingInfo`, `url`, `mapUrl` |
| **Operating Hours & Amenities** | `businessStatus` (e.g., `영업 중`), `businessHoursText`, `businessHours` (7-day schedule with break times & last order), `conveniences`, `paymentMethods`, `hasBooking`, `bookingUrl` |
| **Menus & Spend Insights** | `menuCount`, `menus` (`name`, `priceText`, `priceKrw`, `description`, `isRecommended`, `imageUrl`), `menuImages`, `popularMenusText`, `priceAvgDescription`, `stayTimeDescription` |
| **Ratings & Sentiment Analytics** | `rating`, `visitorReviewCount`, `blogCafeReviewCount`, `bookingReviewCount`, `saveCount`, `imageReviewCount`, `topVotedKeywords`, `reviewThemes`, `microReview`, `description` |
| **Reviews & Media** | `visitorReviews` (rating, text, visit date, verification method, voted keywords, owner reply, author, HD photos), `blogReviews` (title, snippet, blogger name, URL, date), `mainImage`, `imageCount`, `images` |

***

### Two Flexible Scraping Modes

#### 1. `places` Mode (Default — Business Leads + Full Details, Menus & Embedded Reviews)

Outputs one rich record per business listing. By default (`scrapeDetails: true`), every place includes its full menu list, 7-day opening hours, contact links, sentiment keyword breakdown, up to `maxReviewsPerPlace` visitor reviews, and up to `maxBlogReviewsPerPlace` linked blog reviews.
Set `scrapeDetails: false` when you only need rapid search summary cards (up to 50 places per page in under a second).

#### 2. `reviews` Mode (Dedicated Visitor & Blog Review Stream)

Outputs one flat dataset row per review (`visitor` or `blog`), enriched with parent business metadata (`placeId`, `placeName`, `placeCategory`, `placeAddress`, `placeRating`). Ideal for Korean consumer sentiment analysis, brand monitoring, and LLM/RAG datasets.

***

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `queries` | `array` | `["강남 맛집"]` | Search terms to look up on Naver Map / Place (e.g., `강남 맛집`, `성수동 카페`, `강남 피부과`, `명동 호텔`, `홍대 미용실`). Also accepts direct URLs or Place IDs. |
| `placeUrls` | `array` | `[]` | Direct Naver Map URLs (`https://map.naver.com/p/entry/place/2025884279`), Mobile Place URLs (`https://m.place.naver.com/restaurant/2025884279/home`), `naver.me` shortlinks, Map search URLs, or numeric Place IDs (`2025884279`). Automatically overrides prefilled `queries`. |
| `mode` | `string` | `"places"` | `"places"` (one record per place with menus, hours & reviews) or `"reviews"` (one record per review). |
| `scrapeDetails` | `boolean` | `true` | Fetch complete place details (menus, 7-day hours, subway directions, website & social links, sentiment breakdown, and reviews). |
| `maxItems` | `integer` | `20` | Maximum number of places (in `places` mode) or reviews (in `reviews` mode) to collect. |
| `maxReviewsPerPlace` | `integer` | `10` | Maximum visitor reviews (`방문자 리뷰`) to collect per place (`0`–`5000`). Automatically scales up to `maxItems` in `reviews` mode if left at `10`. |
| `includeBlogReviews` | `boolean` | `true` | Include linked Naver Blog & Cafe reviews (`블로그 리뷰`) for each place. |
| `maxBlogReviewsPerPlace` | `integer` | `10` | Maximum linked blog/cafe reviews per place (`0`–`500`). |
| `onlyPhotoReviews` | `boolean` | `false` | Filter visitor reviews 100% server-side on Naver (`isPhotoUsed`) to only return reviews with customer-uploaded photos or receipt images. |
| `sortBy` | `string` | `"popular"` | Server-side search sort order: `"popular"` (Relevance/Popularity), `"precision"` (Exact Match), or `"distance"` (Nearest to `searchCoordinates`). |
| `searchCoordinates` | `string` | `""` | Optional map center coordinates as `latitude,longitude` (e.g., `37.497942,127.027610` for Gangnam Station). |
| `language` | `string` | `"ko"` | `"ko"` (original Korean) or `"en"` (English localized category and address names). |
| `startPage` | `integer` | `1` | Starting page number for keyword searches (50 places per page). |
| `resumptionToken` | `string` | `""` | Continuation token from `RESUMPTION_TOKEN` in the Key-Value Store to resume multi-batch pagination with 0 duplicate overlap. |

***

### Input Examples

#### Example 1: Search Korean Businesses with Full Menus, Hours & Reviews

```json
{
    "queries": [
        "강남 맛집",
        "성수동 카페"
    ],
    "mode": "places",
    "scrapeDetails": true,
    "maxItems": 30,
    "maxReviewsPerPlace": 15,
    "includeBlogReviews": true
}
```

#### Example 2: Scrape Specific Places by URL or Place ID

```json
{
    "placeUrls": [
        "https://map.naver.com/p/entry/place/2025884279",
        "https://m.place.naver.com/restaurant/1707220837/home",
        "1969798289"
    ],
    "mode": "places",
    "scrapeDetails": true,
    "maxReviewsPerPlace": 50
}
```

#### Example 3: Dedicated Visitor & Photo Review Stream (`mode: "reviews"`)

```json
{
    "placeUrls": [
        "https://map.naver.com/p/entry/place/2025884279"
    ],
    "mode": "reviews",
    "onlyPhotoReviews": true,
    "includeBlogReviews": false,
    "maxItems": 200
}
```

***

### Output Sample (`places` Mode)

```json
{
    "placeId": "2025884279",
    "name": "대물섬 강남점",
    "businessCategory": "restaurant",
    "category": "한식",
    "categoryCode": "220053",
    "phone": "0507-1451-3697",
    "virtualPhone": "0507-1451-3697",
    "roadAddress": "서울 강남구 언주로148길 14 1층 103~106호",
    "address": "서울 강남구 논현동 98-12",
    "commonAddress": "서울 강남구 논현동",
    "fullAddress": "서울 강남구 언주로148길 14 1층 103~106호",
    "postalCode": "09680108",
    "latitude": 37.5206335,
    "longitude": 127.0361667,
    "distance": "2.6km",
    "directions": "강남구청역 3-1번 출구로 나오셔서 보이는 올리브영 방향으로 쭉 직진하시다가 커피빈 골목에서 왼쪽으로 꺾어서 200m정도 오시면 왼쪽에 있습니다.",
    "nearestSubway": "강남구청역 7호선",
    "parkingInfo": "2시간 4000원 (발렛파킹 가능)",
    "businessStatus": "영업 중",
    "businessHoursText": "02:00에 영업 종료",
    "businessHours": [
        {
            "day": "월",
            "start": "11:00",
            "end": "02:00"
        }
    ],
    "rating": 4.97,
    "visitorReviewCount": 177,
    "blogCafeReviewCount": 37,
    "bookingReviewCount": 0,
    "imageReviewCount": 143,
    "popularMenusText": "소금김밥, 대물 숙성회 정식(광어), 1% 대광어 숙성회",
    "menuCount": 6,
    "menus": [
        {
            "name": "1% 대광어 숙성회",
            "priceText": "56,000원",
            "priceKrw": 56000,
            "description": "중 56000 / 대 78000",
            "isRecommended": true,
            "imageUrl": "https://ldb-phinf.pstatic.net/20260830_85/1788068876946WkcM7_JPEG/menu.jpg"
        }
    ],
    "topVotedKeywords": [
        {
            "code": "food_good",
            "keyword": "음식이 맛있어요",
            "count": 165
        },
        {
            "code": "fresh",
            "keyword": "재료가 신선해요",
            "count": 121
        }
    ],
    "conveniences": [
        "포장",
        "단체 이용 가능",
        "예약",
        "남/녀 화장실 구분",
        "간편결제",
        "주차",
        "발렛파킹"
    ],
    "paymentMethods": [
        "간편결제"
    ],
    "hasBooking": true,
    "homepageUrl": "https://map.naver.com/p/entry/place/2025884279",
    "instagramUrl": null,
    "allLinks": [
        "https://map.naver.com/p/entry/place/2025884279"
    ],
    "microReview": "한 점 한 점 정성 가득한 숙성회",
    "mainImage": "https://ldb-phinf.pstatic.net/20260831_172/17881344168901EW1Q_JPEG/cover.jpg",
    "imageCount": 57,
    "url": "https://map.naver.com/p/entry/place/2025884279",
    "mapUrl": "https://m.place.naver.com/restaurant/2025884279/home",
    "searchQuery": "강남 맛집",
    "detailLevel": "full",
    "language": "ko",
    "scrapedAt": "2026-10-24T16:30:00.000000+00:00"
}
```

***

### Pricing (Pay-Per-Event)

This Actor uses transparent **Pay-Per-Event (PPE)** pricing with Apify Compute and Proxy usage included:

| Event Name | Event ID | No Discount (Free) | Bronze Discount | Silver Discount | Gold+ Discount | Description |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| **Actor Start** | `apify-actor-start` | **$0.00005** | **$0.00005** | **$0.00005** | **$0.00005** | Charged once when the run starts. |
| **Place or Review Scraped** | `result-scraped` | **$3.50 / 1,000**<br>(`$0.0035`) | **$3.20 / 1,000**<br>(`$0.0032`) | **$3.00 / 1,000**<br>(`$0.0030`) | **$2.80 / 1,000**<br>(`$0.0028`) | Charged per valid Naver Place business record or standalone review row pushed to the dataset. |

- **$0.00 for Missing Targets or Empty Searches**: Non-existent Place IDs, zero-result queries, and input validation errors are never billed.
- **Strict Maximum Cost Cap Support**: Respects your Apify run budget limit (`maxTotalChargeUsd`) and stops cleanly the instant your cap is reached.

***

### Support & Feedback

Need custom fields, higher volume tips, or found an edge case? Open an issue directly in the Actor's **Issues** tab on the Apify Console and we will respond promptly.

# Actor input Schema

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

Keywords to search on Naver Map / Naver Place (e.g., `강남 맛집`, `성수동 카페`, `강남 피부과`, `명동 호텔`, `홍대 미용실`). You can also paste direct Naver Map / Place URLs or numeric Place IDs here.

## `placeUrls` (type: `array`):

Optional list of direct Naver Map URLs (`https://map.naver.com/p/entry/place/2025884279`), Mobile Place URLs (`https://m.place.naver.com/restaurant/2025884279/home`), `naver.me` shortlinks, search URLs (`https://map.naver.com/p/search/강남%20맛집`), or raw numeric Place IDs (`2025884279`). Takes precedence over prefilled search queries.

## `mode` (type: `string`):

Select whether to output enriched Place records (`places` — includes menus, hours, contacts, sentiment stats, and embedded reviews) or dedicated individual review rows (`reviews` — outputs one row per visitor/blog review for deep sentiment analysis).

## `scrapeDetails` (type: `boolean`):

When enabled (default), visits each place page to extract 7-day opening hours, full menu list with KRW prices & photos, walking directions, nearest subway stations, parking fees, website/Instagram links, sentiment keyword breakdown, and recent visitor/blog reviews. Disable for ultra-fast summary search cards.

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

Maximum number of items (places in `places` mode, or reviews in `reviews` mode) to collect across the run.

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

Maximum number of visitor reviews (방문자 리뷰) to fetch per place when `scrapeDetails` is enabled or in `reviews` mode.

## `includeBlogReviews` (type: `boolean`):

Include Naver Blog and Cafe review posts linked to each place (author name, post title, URL, snippet, date, and thumbnail).

## `maxBlogReviewsPerPlace` (type: `integer`):

Maximum number of linked Naver Blog / Cafe reviews to fetch per place.

## `onlyPhotoReviews` (type: `boolean`):

Filter visitor reviews server-side to only return reviews that include customer-uploaded photos or receipt images.

## `sortBy` (type: `string`):

Server-side sorting order for Naver Place search results (`popular` / relevance default, or `distance` from search coordinates).

## `searchCoordinates` (type: `string`):

Optional GPS center point as `latitude,longitude` (e.g., `37.497942,127.027610` for Gangnam Station, Seoul) used for localized ranking and `distance` sorting.

## `language` (type: `string`):

Language preference for Naver Place category and address fields (`ko` for original Korean, `en` for English localized strings where available).

## `startPage` (type: `integer`):

1-indexed search page to start from (50 places per page).

## `resumptionToken` (type: `string`):

Optional compact continuation token emitted at the end of a previous batch run (`RESUMPTION_TOKEN` in Key-Value Store) to resume pagination with 0 duplicate overlap.

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

Proxy settings for accessing Naver Place endpoints reliably.

## Actor input object example

```json
{
  "queries": [
    "강남 맛집"
  ],
  "mode": "places",
  "scrapeDetails": true,
  "maxItems": 20,
  "maxReviewsPerPlace": 10,
  "includeBlogReviews": true,
  "maxBlogReviewsPerPlace": 10,
  "onlyPhotoReviews": false,
  "sortBy": "popular",
  "language": "ko",
  "startPage": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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": [
        "강남 맛집"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("unitbytes/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": ["강남 맛집"] }

# Run the Actor and wait for it to finish
run = client.actor("unitbytes/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": [
    "강남 맛집"
  ]
}' |
apify call unitbytes/naver-place-scraper --silent --output-dataset

```

## MCP server setup

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