# Naver Map Scraper — Korean Places, Phones & Hours (`axery/naver-map-business-places-scraper`) Actor

Naver map scraper to extract Korean business listings, phone numbers, addresses, opening hours & menus by keyword or URL. Fast, no browser, pay per result.

- **URL**: https://apify.com/axery/naver-map-business-places-scraper.md
- **Developed by:** [Axery](https://apify.com/axery) (community)
- **Categories:** Lead generation, Travel, SEO tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 valid business results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Scraper — Korean Business Places, Phone Numbers & Opening Hours

Extract rich, structured data from **Naver Map** (네이버 지도) — South Korea's dominant mapping and local business search platform. Search by Korean keywords or provide direct place URLs to extract verified business names, categories, full street addresses, direct and virtual phone numbers, GPS coordinates, opening hours, menus with prices, and amenities.

Fast, lightweight, and built for scale over direct HTTP without the memory overhead of headless browsers.

***

### What Is Naver Map Scraper?

In South Korea, international mapping services like Google Maps have severe data export restrictions due to national spatial data regulations. As a result, **over 80% of local consumers and businesses rely on Naver Map** for discovery, contact information, operating hours, and menus.

**Naver Map Scraper** is a production-grade Apify Actor designed as a no-code, cost-effective **Naver Map API alternative**. It lets you collect comprehensive Korean local business data at scale without reverse-engineering Naver's internal GraphQL endpoints or dealing with browser automation overhead.

#### Key Highlights

- **No Login or Account Required**: Collects public data directly without requiring Korean phone verification or a Naver account.
- **Direct HTTP Engine**: Consumes only 256 MB of RAM, executing significantly faster and cheaper than browser-based scrapers.
- **Verifiable Data Integrity**: Strictly captures verified fields. Virtual forwarding phones (`0507-xxxx`) and direct landlines (`02-xxxx`) are cleanly separated, and missing data is never fabricated.
- **Pay Per Result**: Transparent pricing with zero Actor start fees. You only pay for valid unique businesses written to your dataset.

***

### Features

- **Korean Keyword Search**: Query any term, region, or category (e.g., `강남 맛집`, `홍대 카페`, `제주 렌트카`, `부산 호텔`) with automatic pagination.
- **Direct Place URLs & Shortlink Support**: Process canonical URLs (`map.naver.com`, `pcmap.place.naver.com`, `m.place.naver.com`) and shortened links (`naver.me`) with automatic redirect resolution.
- **Phone Number Extraction**: Distinguishes direct business landlines/mobile numbers from Naver virtual forwarding numbers (`0507`).
- **Complete Business Schedules**: Extracts daily opening hours, break times, last order schedules, and holiday announcements.
- **Menu & Price Data**: Captures restaurant and cafe menu items, exact displayed prices, and dish descriptions.
- **Precise Geolocation**: High-accuracy latitude and longitude coordinates alongside full Korean road addresses and land-lot addresses.
- **Smart Deduplication**: Built-in Place ID deduplication ensures you never pay for duplicate entries across multiple keywords or URLs.
- **Lightweight List-Only Mode**: Set `includeDetails: false` to skip secondary detail fetches for ultra-fast and budget-friendly list collection.

***

### How to Scrape Naver Map

1. **Set Search Inputs**: Enter Korean search keywords (e.g., `["강남 치과", "성수동 카페"]`) or paste specific Naver place URLs into `searchKeywords` or `placeUrls`.
2. **Configure Run Limits**: Define `maxResults` (e.g., 50 or 500) to control total volume and avoid budget overruns.
3. **Select Data Depth**: Keep `includeDetails: true` for full menus, hours, and amenities, or switch to `false` for basic business cards.
4. **Run the Actor**: Click **Start** in the Apify Console or trigger it via the Apify REST API.
5. **Download Dataset**: Export your results in JSON, CSV, Excel, XML, or connect directly via webhooks and integrations.

***

### Input Configuration

The Actor accepts input in JSON format:

```json
{
  "searchKeywords": ["강남 맛집", "홍대 카페"],
  "placeUrls": [
    "https://map.naver.com/p/entry/place/1068275528",
    "https://naver.me/5XXXXXXX"
  ],
  "maxResults": 100,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

#### Parameter Reference

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `searchKeywords` | Array of Strings | `[]` | List of Korean search queries or location + business terms (e.g. `["서울 게스트하우스", "부산 서면 카페"]`). |
| `placeUrls` | Array of Strings | `[]` | Specific Naver Map URLs or `naver.me` shortlinks to scrape directly. |
| `maxResults` | Integer | `100` | Maximum number of unique businesses to extract across the entire run (up to 1,000). |
| `includeDetails` | Boolean | `true` | When `true`, fetches secondary home endpoints for menus, schedules, and website links. Set `false` for faster list extraction. |
| `proxyConfiguration` | Object | `{ "useApifyProxy": false }` | Optional proxy settings. Direct connections work out of the box; Apify Residential Proxy can be enabled for large batches. |

> **Note**: At least one `searchKeywords` entry or `placeUrls` link must be provided.

***

### Output Data Fields

Each dataset record represents a single unique Korean business:

| Field Name | Type | Description | Example |
| --- | --- | --- | --- |
| `placeId` | String | Unique Naver Place identifier | `"1068275528"` |
| `name` | String | Verified business name | `"몽브루"` |
| `placeUrl` | String | Canonical Naver Map place URL | `"https://map.naver.com/p/entry/place/1068275528"` |
| `category` | String | Business category classification | `"카페,디저트"` |
| `address` | String | Traditional land-lot address (지번주소) | `"서울 강북구 수유동 535-73"` |
| `roadAddress` | String | Official Korean road-name address (도로명주소) | `"서울 강북구 4.19로 105 몽브루"` |
| `phone` | String / null | Direct public landline or phone number | `"02-999-1234"` |
| `virtualPhone` | String / null | Naver 0507 call-forwarding number | `"0507-1382-1094"` |
| `website` | String / null | Representative homepage, Instagram, or blog URL | `"https://www.instagram.com/monbrewcoffee"` |
| `latitude` | Number | WGS84 GPS latitude | `37.6437493` |
| `longitude` | Number | WGS84 GPS longitude | `127.0038848` |
| `businessHours` | Array / null | Structured schedules, breaks, last order, and holidays | `[ { "day": "매일", "start": "11:00", "end": "23:00" } ]` |
| `menus` | Array / null | Menu items with name, price string, and description | `[ { "name": "아메리카노", "price": "5,500원" } ]` |
| `amenities` | Array / null | Available facilities (e.g. Wi-Fi, parking, pets, reservation) | `["포장", "주차", "무선 인터넷", "반려동물 동반"]` |
| `visitorReviewCount` | Integer / null | Total verified visitor receipt review count | `2610` |
| `blogReviewCount` | Integer / null | Verified blog review count (null if aggregated) | `null` |
| `searchQuery` | String / null | The keyword query that discovered this place | `"서울 카페"` |
| `searchRank` | Integer / null | Organic position in Naver search results | `2` |
| `sourceUrl` | String | Source endpoint used to resolve this record | `"https://pcmap.place.naver.com/restaurant/1068275528/home"` |
| `dataStatus` | String | Data depth level: `DETAILS` or `BASIC` | `"DETAILS"` |
| `scrapedAt` | String | ISO 8601 UTC timestamp of extraction | `"2026-10-29T19:27:20.845Z"` |

***

### Example JSON Output

```json
{
  "placeId": "1068275528",
  "name": "몽브루",
  "placeUrl": "https://map.naver.com/p/entry/place/1068275528",
  "category": "카페,디저트",
  "address": "서울 강북구 수유동 535-73",
  "roadAddress": "서울 강북구 4.19로 105 몽브루",
  "phone": null,
  "virtualPhone": "0507-1382-1094",
  "website": "https://www.instagram.com/monbrewcoffee",
  "latitude": 37.6437493,
  "longitude": 127.0038848,
  "businessHours": [
    {
      "name": "기본",
      "businessHours": [
        {
          "day": "매일",
          "businessHours": { "start": "11:00", "end": "23:00" },
          "breakHours": null,
          "lastOrderTimes": [{ "type": "영업시간", "time": "22:30" }]
        }
      ],
      "freeText": "연중무휴 영업합니다 (명절 포함)"
    }
  ],
  "menus": [
    {
      "name": "아메리카노",
      "price": "5,500원",
      "description": "깊은 향미와 부드러운 바디감이 특징인 커피"
    },
    {
      "name": "로투스크로플",
      "price": "12,000원",
      "description": "바닐라아이스크림과 로투스 과자 토핑 크로플"
    }
  ],
  "amenities": [
    "포장",
    "남/녀 화장실 구분",
    "무선 인터넷",
    "예약",
    "단체 이용 가능",
    "주차",
    "반려동물 동반"
  ],
  "visitorReviewCount": 2610,
  "blogReviewCount": null,
  "searchQuery": "서울 카페",
  "searchRank": 2,
  "sourceUrl": "https://pcmap.place.naver.com/restaurant/1068275528/home",
  "dataStatus": "DETAILS",
  "scrapedAt": "2026-10-29T19:27:20.845Z"
}
```

***

### Naver Map Scraper Pricing

This Actor operates under Apify's **Pay-Per-Event (PPE)** model. You only pay for valid, unique business records saved to your dataset.

- **Cost per result**: **$0.00249**
- **Cost per 1,000 businesses**: **$2.49**
- **Actor Start Fee**: **$0.00** (No start-up surcharge)
- **Review Page Fees**: **$0.00** (No hidden per-page fees)
- **Platform Usage**: Compute usage (RAM/CPU) is billed directly by Apify at standard rates. Because this Actor runs over lightweight HTTP (256 MB RAM) without a browser, computing costs remain negligible (~$0.01 - $0.03 per 1,000 places).

#### Pricing Comparison

| Feature | Naver Map Scraper (This Actor) | Typical Competitor |
| --- | --- | --- |
| Price per 1,000 results | **$2.49** | $3.00+ |
| Actor Start Fee | **$0.00** | $0.05 / start |
| Extra Review Fees | **$0.00** | $0.001 / review page |
| RAM Footprint | **256 MB** (Ultra low compute) | 1,024 MB - 2,048 MB (Puppeteer) |
| Duplicate Protection | **Yes** (Never billed twice) | Often re-billed |

***

### Use Cases

1. **B2B Lead Generation & Telemarketing**:
   Extract authentic Korean business contacts, differentiating direct lines from 0507 virtual numbers for outreach.
2. **Food Delivery & Restaurant Tech**:
   Gather restaurant menus, prices, operating hours, and dining amenities across Seoul, Busan, Daegu, and other metropolitan areas.
3. **South Korea Market Expansion**:
   Benchmark competitor density, service categories, and average pricing across different urban districts.
4. **Local Directory & Map Enrichment**:
   Enrich your database with accurate Korean road addresses, GPS coordinates, and business status.
5. **Travel & Tourism Applications**:
   Power itinerary builders and travel apps with up-to-date operating schedules, break times, and parking availability.

***

### Naver Map Scraper API Integration

Integrate seamlessly into your backend applications using the Apify API.

#### Node.js / JavaScript

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

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

const run = await client.actor('axery/naver-map-business-places-scraper').call({
    searchKeywords: ['강남 맛집', '홍대 카페'],
    maxResults: 50,
    includeDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Successfully extracted ${items.length} Korean businesses:`, items);
```

#### Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.getenv('APIFY_TOKEN'))

run_input = {
    "searchKeywords": ["강남 치과", "서초 한의원"],
    "maxResults": 100,
    "includeDetails": True
}

run = client.actor("axery/naver-map-business-places-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['name']} | {item.get('phone') or item.get('virtualPhone')} | {item.get('roadAddress')}")
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/axery~naver-map-business-places-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{
       "searchKeywords": ["서울 게스트하우스"],
       "maxResults": 25,
       "includeDetails": true
     }'
```

***

### Frequently Asked Questions

#### Do I need a Naver account or Korean phone number?

No. The scraper accesses Naver's public directory endpoints directly. No login, session cookies, or Korean identity verification are required.

#### Why use a Naver Map scraper instead of Google Maps in Korea?

Google Maps is restricted in South Korea by law regarding domestic spatial and cartographic data exports. As a consequence, Google Maps in Korea lacks walking routes, real-time operating hours, local menu updates, and up-to-date listings. Naver Map is the primary local search engine for over 80% of the population.

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

Many Korean businesses on Naver use virtual forwarding numbers starting with `0507` to track call conversions and protect privacy. When available, direct landlines (`02`, `031`, etc.) or mobile numbers are saved in `phone`, while forwarding numbers are saved in `virtualPhone`.

#### Can I scrape without menus and hours to save time?

Yes. Simply set `"includeDetails": false` in the input. The scraper will extract only the primary search result cards, running up to 3x faster while minimizing source requests.

#### How does deduplication work?

The Actor tracks every unique numeric Naver Place ID. If multiple search keywords or URL inputs match the same business, it is extracted and billed only once.

#### Are `naver.me` short links supported?

Yes. You can pass shortened `naver.me` URLs directly in `placeUrls`. The Actor resolves the redirect to find the numeric Place ID automatically.

***

### Limitations and Troubleshooting

- **Pagination Limit**: Naver Map's search interface serves a maximum of 20 results per page, up to an organic limit per single search phrase. To scrape thousands of places across a city, supply multiple specific neighborhood queries (e.g. `["강남역 카페", "신사역 카페", "역삼역 카페"]`).
- **Dynamic Site Changes**: Naver periodically updates its Apollo state structure. If an endpoint change occurs, the Actor marks the failure in the run `SUMMARY` and stops cleanly without corrupting your dataset.
- **Access Restrictions**: Naver may rate-limit high-frequency traffic from shared IP addresses. For large-scale crawls (>1,000 requests), enabling Apify Proxy is recommended.
- **Menu Availability**: Menus and detailed price structures are primarily available for food & beverage businesses (restaurants, cafes, bakeries). Non-hospitality businesses (e.g. banks, repair shops) may return `menus: null`.

***

### Support

Have questions, suggestions, or need custom scraping solutions?

- Report issues or request features directly via the **Issues** tab on Apify Console.
- Regularly maintained to stay aligned with Naver Map updates and schema enhancements.

# Actor input Schema

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

Korean keywords including the city or district, for example 서울 카페. At least one keyword or place URL is required.

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

HTTPS map.naver.com, pcmap.place.naver.com, m.place.naver.com place URLs, or naver.me short URLs. Redirect destinations are validated.

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

Global limit across all keywords and URLs, including results already saved in a restarted run. Not a promise that every search can return this many.

## `includeDetails` (type: `boolean`):

Fetch each business home page for available hours, menus and website. Failed detail fetches are skipped and reported without a dataset result. Direct place URLs always require one detail request to establish identity.

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

Optional proxy. A stable session is used; denial does not trigger IP rotation. Direct connections worked in the recorded feasibility tests.

## Actor input object example

```json
{
  "searchKeywords": [
    "서울 카페"
  ],
  "placeUrls": [],
  "maxResults": 100,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `businesses` (type: `string`):

One valid unique business per dataset item. Errors are excluded.

## `summary` (type: `string`):

Request metrics, failures, stop reason and billing information.

# 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 = {
    "searchKeywords": [
        "서울 카페"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("axery/naver-map-business-places-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 = { "searchKeywords": ["서울 카페"] }

# Run the Actor and wait for it to finish
run = client.actor("axery/naver-map-business-places-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 '{
  "searchKeywords": [
    "서울 카페"
  ]
}' |
apify call axery/naver-map-business-places-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axery/naver-map-business-places-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/8hMScohUiU7YXqSL6/builds/ipxh7JK91ibXC8iOf/openapi.json
