# NAVER Map Scraper (`parsebird/naver-map-scraper`) Actor

Scrape Naver Map places by keyword or URL: name, category, address, phone, business hours, menus, facilities, images, and reviews. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/naver-map-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Travel, Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.29 / 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/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 Map Scraper — Places and Reviews from Naver Map

Scrape places from [Naver Map](https://map.naver.com/) — South Korea's leading map and local-search platform. Search by keyword or paste place URLs to extract business name, category, address, phone, business hours, menus, facilities, images, subway access, and full visitor and Naver Blog reviews. Export as JSON, CSV, or Excel.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search Naver Map by keyword or scrape specific places by URL — get structured business data, business hours, menus, review statistics, and both visitor and blog reviews, ready for analysis, monitoring, or integration.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/naver-map-scraper — scrapes map.naver.com places and reviews. $2.99/1000 places on the Free plan ($2.79/1000 Bronze, $2.59/1000 Silver, $2.29/1000 Gold), $0.99/1000 reviews on all plans. Call via ApifyClient: client.actor("parsebird/naver-map-scraper").call(run_input={"searchKeywords": ["강남 맛집"], "maxResultsPerKeyword": 50, "includeReviews": True}). Inputs: searchKeywords (array of strings, e.g. ["강남 맛집", "홍대 카페"]), urls (array of strings — full, short naver.me, or mobile place URLs), maxResultsPerKeyword (integer, default 100, max 10000 — Naver's own search stops after roughly 300 results per keyword), includeDetails (boolean, default true — fetches business hours, menus, facilities, images, description; has no effect on direct URLs, which always get full details), includeReviews (boolean, default false), maxReviewPages (integer, default 50 — visitor reviews return 50/page, blog reviews 10/page capped around 100/place), reviewCutoffDate (string, default "2024-01-01" — only reviews on or after this date), proxyConfiguration (object). Output: place records with place_id, name, category, categoryCode, address, roadAddress, phone, virtualPhone, homepage, siteUrl, x, y, businessHours, conveniences, facilities, hasMobilePhoneNumber, visitorReviewsTotal, visitorReviewsScore, reviewStats, reviewThemes, reviewMenus, menus, images, subwayStations, description, url; when includeReviews is on, also visitorReviews (review_id, rating, body, author_nickname, visited, created, tags, voted_keywords, media_count) and blogReviews (title, contents, author_name, url, date). API docs: https://docs.apify.com/api/v2 Token: https://console.apify.com/settings/integrations
```

### What is Naver Map Scraper?

**Naver Map Scraper** is an [Apify Actor](https://apify.com/actors) that extracts structured business data and reviews from [Naver Map](https://map.naver.com/) (네이버 지도) — the dominant local-search and navigation platform in South Korea, covering millions of restaurants, cafes, salons, clinics, and other local businesses. It pulls data straight from Naver Map's own place API, including business hours, full menus with prices and photos, review statistics, and both visitor and Naver Blog reviews.

Think of it as a **Naver Map API alternative** — Naver has no public API for bulk place search or review export, but this scraper delivers the same structured data programmatically. It's built for local SEO agencies, franchise and multi-location analytics, competitive restaurant research, and review monitoring across the Korean market.

### What can Naver Map Scraper do?

- 🔍 **Keyword search** — search any Naver Map term, such as "강남 맛집" (Gangnam restaurants) or "홍대 카페" (Hongdae cafes), across multiple keywords in one run
- 🔗 **Direct place URLs** — paste full place URLs, search-result URLs, short `naver.me` links, or mobile `m.place.naver.com` links; short links are resolved automatically
- 🏢 **Full business profiles** — business hours (including separate schedules for dine-in, drive-thru, and delivery), menus with prices, descriptions, and photos, facilities and conveniences, subway station access, homepage and booking links
- ⭐ **Review statistics** — average rating, total review count, photo review count, and Naver's own review theme and popular-menu breakdowns per place
- 💬 **Visitor and Blog reviews** — collect both native Naver Place visitor reviews (rating, text, tags, visit date) and linked Naver Blog posts
- 📅 **Review date filtering** — set a cutoff date so only recent reviews are collected, saving time and cost on long-running places
- ⚡ **Fast mode** — skip the detail page fetch for search results and get search-level data (name, category, phone, address, coordinates, review counts) roughly twice as fast and cheap
- ⏱️ **Scheduling & API access** — run on autopilot with [Apify Schedules](https://docs.apify.com/platform/schedules) and pull results via the [Apify API](https://docs.apify.com/api/v2) or client libraries
- 📊 **Multiple export formats** — download as JSON, CSV, Excel, XML, HTML, or RSS

### What data can you extract from Naver Map?

| Field | Description |
|-------|-------------|
| `name` | Business name |
| `category` | Naver Map category label (e.g. 중식당, 카페) |
| `address` / `roadAddress` | Jibun and road-name addresses |
| `phone` / `virtualPhone` | Direct phone number and Naver's smart-call virtual number |
| `businessHours` | Named schedules (e.g. store hours, delivery, drive-thru) with per-day open/close times |
| `menus` | Menu items with name, price, description, images, and recommended flag |
| `conveniences` / `facilities` | Amenity tags shown on the place page and its Information tab |
| `visitorReviewsTotal` / `visitorReviewsScore` | Aggregate rating and review count |
| `reviewThemes` / `reviewMenus` | Naver's review-derived theme breakdown (taste, service, mood…) and most-mentioned menu items |
| `images` | Business photo URLs |
| `subwayStations` | Nearest subway station and walking distance |
| `description` | Owner-written business description |
| `visitorReviews` | Individual visitor review text, rating, tags, and visit date (when reviews are included) |
| `blogReviews` | Linked Naver Blog posts about the place (when reviews are included) |

### How to scrape Naver Map

1. **Go to Naver Map Scraper** on [Apify Store](https://apify.com/parsebird/naver-map-scraper) and click **Try for free**
2. **Enter a search keyword** — e.g. "강남 맛집", or paste Naver Map place URLs directly
3. **Set max results per keyword** — start with 20–50 for a quick test
4. **Turn on Include reviews** if you need visitor and blog reviews, and set a review cutoff date
5. **Run the Actor** — click **Start** and wait for results
6. **Export your data** — download as JSON, CSV, or Excel, or access via the [Apify API](https://docs.apify.com/api/v2)

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchKeywords` | array of strings | No\* | — | Naver Map search terms, e.g. `["강남 맛집", "홍대 카페"]` |
| `urls` | array of strings | No\* | — | Naver Map place URLs — full, short `naver.me`, or mobile links |
| `maxResultsPerKeyword` | integer | No | 100 | Max places to collect per keyword (1–10,000; Naver search itself stops after ~300) |
| `includeDetails` | boolean | No | true | Fetch each place's detail page for menus, hours, facilities, images, and description |
| `includeReviews` | boolean | No | false | Collect visitor and Naver Blog reviews |
| `maxReviewPages` | integer | No | 50 | Max review pages per place (visitor: 50/page; blog: 10/page, capped ~100/place) |
| `reviewCutoffDate` | string | No | `2024-01-01` | Only collect reviews on or after this date (`YYYY-MM-DD`) |
| `proxyConfiguration` | object | No | `{"useApifyProxy": true}` | Apify Proxy configuration, recommended for larger runs |

\* At least one of `searchKeywords` or `urls` is required.

### Output example

```json
{
    "place_id": "38239053",
    "name": "스타벅스 압구정점",
    "category": "카페",
    "categoryCode": "restaurant",
    "address": "서울 강남구 신사동 609",
    "roadAddress": "서울 강남구 압구정로30길 17 (신사동)",
    "phone": "1522-3232",
    "virtualPhone": null,
    "homepage": "http://www.starbucks.co.kr/",
    "siteUrl": "https://m.booking.naver.com/booking/6/bizes/392658/search",
    "x": "127.02956",
    "y": "37.526283",
    "businessHours": [
        {
            "name": "매장",
            "status": "영업 중",
            "description": "22:00에 영업 종료",
            "schedule": [{ "day": "화", "start": "06:30", "end": "22:00" }]
        }
    ],
    "conveniences": ["주차"],
    "facilities": [],
    "hasMobilePhoneNumber": false,
    "visitorReviewsTotal": 4149,
    "visitorReviewsScore": 4.44,
    "reviewStats": { "avgRating": 4.44, "totalCount": 4149, "imageReviewCount": 469, "authorCount": 1203 },
    "reviewThemes": [{ "code": "taste", "label": "맛", "count": 267 }],
    "reviewMenus": [{ "label": "커피", "count": 103 }],
    "menus": [{ "name": "카페 아메리카노", "price": "4700", "description": "강렬한 에스프레소 샷", "images": [], "recommend": false }],
    "images": ["https://ldb-phinf.pstatic.net/..."],
    "subwayStations": [{ "name": "압구정역", "typeDesc": "3번 출구에서 75m" }],
    "description": null,
    "url": "https://map.naver.com/p/entry/place/38239053"
}
```

Download results in JSON, CSV, Excel, XML, HTML, or RSS, or access via the [Apify API](https://docs.apify.com/api/v2).

### Use cases

- 📊 **Local SEO and competitive research** — pull structured data on every competitor within a category and neighborhood
- 🏪 **Franchise and multi-location tracking** — monitor business hours, menus, and ratings across every branch of a chain
- ⭐ **Review monitoring** — collect fresh visitor and blog reviews on a schedule to track sentiment and flag issues early
- 🍽️ **Menu and pricing intelligence** — track menu items, prices, and recommended dishes across a market segment
- 🎯 **Lead generation** — build prospect lists of local businesses with phone numbers, addresses, and category filters
- 🔌 **Pipeline integration** — feed place and review data into Google Sheets, Slack, Zapier, Make, or custom systems via [Apify Integrations](https://docs.apify.com/platform/integrations)

### How it works

1. For each search keyword, the Actor queries Naver Map's own search API and collects matching place IDs; for each URL, it resolves short links and extracts the place ID directly
2. When details are included, every place ID is used to fetch Naver Map's full place-detail data: business hours, menus, facilities, images, subway access, description, and review statistics
3. When reviews are included, visitor reviews and Naver Blog reviews are paginated newest-first per place, stopping once a review predates `reviewCutoffDate`
4. Every place and review is pushed to the dataset as it's collected, so partial results are available even if a run is stopped early

### How to use via API — Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("parsebird/naver-map-scraper").call(run_input={
    "searchKeywords": ["강남 맛집"],
    "maxResultsPerKeyword": 50,
    "includeReviews": True,
    "maxReviewPages": 10,
    "reviewCutoffDate": "2025-01-01",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if "place_id" in item and "name" in item:
        print(f"{item['name']} — {item['category']} — {item['visitorReviewsScore']}")
```

### How to use via API — JavaScript

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('parsebird/naver-map-scraper').call({
    searchKeywords: ['강남 맛집'],
    maxResultsPerKeyword: 50,
    includeReviews: true,
    maxReviewPages: 10,
    reviewCutoffDate: '2025-01-01',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => {
    if (item.place_id && item.name) {
        console.log(`${item.name} — ${item.category} — ${item.visitorReviewsScore}`);
    }
});
```

### How much does it cost to scrape Naver Map?

Naver Map Scraper uses [pay-per-event pricing](https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event) with two separate events — one for places, one for reviews — so you only pay for the data you actually collect.

**How much does it cost to scrape 1,000 places without reviews?**

$2.99 on the Free plan, down to $2.29 on the Gold plan.

**How much does it cost to scrape 1,000 reviews?**

$0.99 on any plan. New users get a free trial with platform credit to try the Actor before committing.

### Pricing

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| `result-scraped` (per place) | $0.00299 | $0.00279 | $0.00259 | $0.00229 |
| `review-scraped` (per review) | $0.00099 | $0.00099 | $0.00099 | $0.00099 |

A place counts as one `result-scraped` event whether it came from a search keyword or a direct URL. Each visitor review or Naver Blog review counts as one `review-scraped` event.

### Is it legal to scrape Naver Map?

This Actor extracts publicly available data from Naver Map's public place and search pages — the same business and review data any visitor can see without logging in.

Web scraping of publicly available data is generally legal in the United States and the European Union, as established by the [hiQ Labs v. LinkedIn ruling](https://en.wikipedia.org/wiki/HiQ_Labs_v._LinkedIn). For more information, see Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

Users are responsible for ensuring their use of extracted data complies with applicable laws and Naver's Terms of Service in their jurisdiction.

### Related Actors

Looking for more Naver data extraction tools? Check out these ParseBird actors:

- [Naver Place Review Scraper](https://apify.com/parsebird/naver-place-review-scraper) — Scrape visitor and blog reviews from a specific Naver Place

Browse all [ParseBird actors on Apify Store](https://apify.com/parsebird).

### FAQ

**Why does `maxResultsPerKeyword` sometimes return fewer places than requested?**
Naver Map's own search results stop after roughly 300 matches per keyword, regardless of how high `maxResultsPerKeyword` is set. Use more specific keywords (adding a neighborhood or category) to reach different result sets.

**What's the difference between `conveniences` and `facilities`?**
`conveniences` are the amenity icons shown at the top of the place page (e.g. parking, reservations). `facilities` come from Naver's separate Information tab and can include additional detail. The two lists often overlap but are sourced independently.

**Does `includeDetails: false` affect places added via `urls`?**
No. Places added through `urls` always get full details, since there's no search-level summary to fall back on for a directly requested place.

**Why do some places have no `businessHours` or `menus`?**
Not every Naver Place listing publishes structured hours or a menu — smaller or newly listed businesses often leave these fields empty on Naver itself, and the Actor reflects that.

**How does the review cutoff date work?**
Reviews are returned newest-first, so the Actor stops paging through a place's reviews as soon as it reaches one older than `reviewCutoffDate`. This keeps re-running a monitoring job cheap, since it won't re-fetch reviews you already have.

**What's the difference between `tags` and `voted_keywords` on a visitor review?**
`tags` are the human-readable keyword badges shown on the review (e.g. "음식이 맛있어요"). `voted_keywords` are the same keywords as Naver's internal codes (e.g. `food_good`), useful for programmatic matching across languages.

**What happens if a search or URL returns no places?**
The Actor finishes successfully with an empty dataset and logs a warning — this isn't treated as an error.

**Can I schedule recurring runs?**
Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to run daily, weekly, or at any interval, and combine with `reviewCutoffDate` to track only new reviews.

**Can I access the data via API?**
Yes. Use the [Apify API](https://docs.apify.com/api/v2) or the official [Python](https://docs.apify.com/api/client/python) and [JavaScript](https://docs.apify.com/api/client/js) client libraries to run the Actor and retrieve results programmatically.

**What export formats are supported?**
JSON, CSV, Excel (XLSX), XML, HTML, and RSS. Download directly from the Apify Console or via the API.

**Is there a free trial?**
Yes. New Apify users get free platform credit to try Naver Map Scraper before committing to a paid plan.

**I found an issue or have a feature request.**
Open an issue on the [Issues tab](https://apify.com/parsebird/naver-map-scraper/issues) or contact ParseBird via the Apify Console.

# Actor input Schema

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

Naver Map search terms, such as 강남 맛집 or 홍대 카페. The Actor collects the matching places for each keyword.

## `urls` (type: `array`):

Naver Map place URLs to scrape directly, one per line. Accepts full place URLs, search-result place URLs, short naver.me links, and mobile m.place.naver.com links.

## `maxResultsPerKeyword` (type: `integer`):

Maximum number of places to collect for each search keyword. Naver's own search results stop after roughly 300 places, even for a higher limit.

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

Fetch each place's detail page for menus, business hours, facilities, images, and description. Turn off for a faster, cheaper run that returns only search-level data (name, category, phone, address, coordinates, review counts). Has no effect on places added via Place URLs, which always include full details.

## `includeReviews` (type: `boolean`):

Collect visitor reviews and Naver Blog reviews for each place.

## `maxReviewPages` (type: `integer`):

Review pages to fetch per place when reviews are included. Visitor reviews return 50 per page; Naver Blog reviews return 10 per page and are capped at roughly 100 per place regardless of this setting.

## `reviewCutoffDate` (type: `string`):

Only collect reviews created on or after this date (YYYY-MM-DD). Reviews are returned newest first, so the Actor stops paging once it reaches older reviews.

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

Apify Proxy configuration. Recommended for larger runs to avoid rate limiting.

## Actor input object example

```json
{
  "searchKeywords": [
    "강남 맛집"
  ],
  "urls": [],
  "maxResultsPerKeyword": 20,
  "includeDetails": true,
  "includeReviews": false,
  "maxReviewPages": 2,
  "reviewCutoffDate": "2025-01-01",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchKeywords": [
        "강남 맛집"
    ],
    "urls": [],
    "maxResultsPerKeyword": 20,
    "maxReviewPages": 2,
    "reviewCutoffDate": "2025-01-01",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/naver-map-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": ["강남 맛집"],
    "urls": [],
    "maxResultsPerKeyword": 20,
    "maxReviewPages": 2,
    "reviewCutoffDate": "2025-01-01",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/naver-map-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": [
    "강남 맛집"
  ],
  "urls": [],
  "maxResultsPerKeyword": 20,
  "maxReviewPages": 2,
  "reviewCutoffDate": "2025-01-01",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/naver-map-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/naver-map-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/5cT6gZruPjoaCl68Z/builds/MxF0iU5Jid8YyASwY/openapi.json
