# Naver Place Rank Tracker & Geo-Grid \[💰 $0.003/search] (`cocomoon/naver-place-rank-tracker`) Actor

Check your Naver Place (네이버 플레이스/지도) rank for any keyword from any spot in Korea. Geo-grid scan (3×3 to 7×7), many places and competitors per run, organic vs ad slots, average rank and top-3 share, plus an HTML heat-map report. Built for agencies and local businesses.

- **URL**: https://apify.com/cocomoon/naver-place-rank-tracker.md
- **Developed by:** [PARK MOONNAM](https://apify.com/cocomoon) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 searches

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

Learn more: https://docs.apify.com/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 Rank Tracker — 네이버 플레이스 순위 체크 & Geo-Grid

Find out **where a business ranks on Naver Place (네이버 플레이스 / 네이버 지도)** for any keyword, as seen from any location in Korea. Track your own place and your competitors across many keywords, scan a **geo-grid** around a neighbourhood (like Local Falcon, but for Naver), and get a colour-coded **rank heat-map report** with every run. No login, no browser, no Naver API key.

> 🇰🇷 한국어 안내는 [아래](#한국어-안내)에 있습니다.

### Why Naver Place rank matters

In Korea, local search happens on Naver, not Google. When someone searches `강남 피부과` (Gangnam dermatology) or `성수 카페` (Seongsu café), the Naver Place list decides which clinics, restaurants, salons and academies get the call. Agencies and owners check this rank every day — usually by hand, on a phone, from one spot.

This Actor does the same check automatically:

- 📍 **Location-aware** — Naver orders places by relevance *and* distance from the searcher. You choose where the search comes from.
- 🗺️ **Geo-grid scan** — check a 3×3, 5×5 or 7×7 grid of points around a location to see where you win and where you disappear.
- 🎯 **Multiple places × multiple keywords** in one run — your business and your competitors.
- 📢 **Ad slots separated** — organic rank and the paid Naver Place ad (플레이스 광고) slot are reported separately.
- 🏆 **Who owns the area** — every run also lists the places that rank best across the whole grid, with category and review counts.
- 📊 **Summary + HTML heat-map** — average rank, best/worst, % of points in the top 3 / 10 / 20.

### ⚡ Try it in 30 seconds

1. Click **Try for free** — the input is pre-filled with keyword `강남역 카페` and location Gangnam Station.
2. Click **Start**. With no place to track, you get the full top-100 ranking for that keyword (about 5 seconds).
3. Now add your business to **Places to track** (Naver Place ID, place URL, or part of the name), set **Geo-grid size** to `3`, and run again.
4. Open **Output → Rank report** for the heat-map.

### Example: one keyword, 3×3 grid

Keyword `카페` (café), 3×3 grid, 500 m spacing around Gangnam Station, tracking two cafés (run on 26 September 2026):

| | Center rank | Average rank | Found at | In top 3 |
| --- | --- | --- | --- | --- |
| 레뽀드라라 강남점 | **1** | 29.5 | 6 / 9 points | 33% |
| 퍼스트커피랩 강남점 | 100+ | 40.5 | 4 / 9 points | 11% |

The same café can be #1 at one grid point and missing from the top 100 five hundred metres away — which a single manual check from the office never shows.

### Input

| Field | What it does |
| --- | --- |
| `keywords` | Search keywords exactly as customers type them: `강남 피부과`, `홍대 헤어샵`, `성수 카페`. |
| `targetPlaces` | Places to track: a Naver Place ID (`1317157725`), a place URL (`https://m.place.naver.com/place/1317157725`, `https://map.naver.com/p/entry/place/1317157725`) or part of the name (`레뽀드라라`). Leave empty to get the full top-100 list instead. |
| `locations` | Where the search is made from: `latitude,longitude` or `label=latitude,longitude`, e.g. `강남역=37.4979,127.0276`. Default: Gangnam Station. Tip: right-click a spot in Google Maps to copy its coordinates. |
| `gridSize` | `1` = only the location itself. `3` / `5` / `7` = a square grid of points around it. |
| `gridSpacingMeters` | Distance between grid points (default 500 m). |
| `topResults` | How many top competitors to attach to each rank row (default 3). |
| `proxyConfiguration` | The default Apify Proxy works. Switch to Korean residential only if you see blocking. |

Each **search** is one keyword at one grid point, so a run makes `keywords × locations × gridSize²` searches. Example: 2 keywords × 1 location × 5×5 grid = 50 searches.

```json
{
    "keywords": ["강남 피부과", "피부과"],
    "targetPlaces": ["https://m.place.naver.com/place/123456789", "경쟁병원"],
    "locations": ["강남역=37.4979,127.0276"],
    "gridSize": 5,
    "gridSpacingMeters": 400
}
```

### Output

#### 1. Rank rows (dataset)

One row per keyword × grid point × tracked place:

```json
{
    "keyword": "카페",
    "location": "강남역",
    "latitude": 37.4979,
    "longitude": 127.0276,
    "gridRow": 2,
    "gridCol": 2,
    "isGridCenter": true,
    "totalResults": 246332,
    "scannedDepth": 100,
    "target": "레뽀드라라",
    "placeId": "1317157725",
    "placeName": "레뽀드라라 강남점",
    "found": true,
    "rank": 1,
    "rankText": "1",
    "adRank": null,
    "visitorReviewCount": 1661,
    "blogReviewCount": 1545,
    "topResults": [{ "rank": 1, "placeId": "1317157725", "name": "레뽀드라라 강남점", "category": "카페,디저트", "visitorReviewCount": 1661, "blogReviewCount": 1545, "distance": "380m" }],
    "placeUrl": "https://m.place.naver.com/place/1317157725",
    "checkedAt": "2026-09-26T14:25:24.035Z"
}
```

`rank` is `null` and `rankText` is `"100+"` when the place is not in the top 100. `adRank` is the place's position among the paid ad slots, if it is advertising.

With **no tracked places**, the dataset instead holds the full organic ranking — one row per place with rank, name, category, visitor and blog review counts, address, phone, distance, URL and whether it also runs an ad.

#### 2. Summary (key-value store `SUMMARY`)

Per keyword × location: for each tracked place the center rank, best / worst rank, average rank (where found), average rank counting "not found" as 101, share of points in the top 3 / 10 / 20, and the full rank grid (top row = north). Plus a **leaders** list: the 10 places with the best average rank across the grid.

#### 3. Rank report (key-value store `REPORT`)

A self-contained HTML page with a colour-coded grid per tracked place and the leaders table — ready to screenshot for a client report.

### 💰 Pricing: $0.003 per search

You pay **$0.003 per search** — one keyword checked at one location / grid point — no matter how many places you track in it or whether you take the full top-100 list. Failed searches are free.

| Run | Searches | Cost |
| --- | --- | --- |
| 1 keyword, 1 location | 1 | $0.003 |
| 10 keywords, 1 location, every weekday for a month | 220 | $0.66 |
| 3 keywords, 5×5 grid | 75 | $0.23 |
| 5 keywords, 7×7 grid | 245 | $0.74 |

Set **Maximum cost per run** in the run options and the Actor stops cleanly when it is reached.

### Good to know

- **Depth: top 100.** Places below rank 100 are reported as `100+`.
- **Keywords with a place name ignore the grid.** For `압구정 영어학원` Naver anchors the results to 압구정 no matter where you search from, so every grid point returns the same rank. Use the grid with keywords *without* a place name (`영어학원`, `피부과`, `카페`) to see real neighbourhood differences.
- **Ranks move.** Naver's order shifts by time of day and small location changes; a rank that moves 2–3 places between runs is normal. Compare trends, not single checks.
- Results match the **mobile** Naver Place list without personalisation (no login).
- Name matching is a substring match ignoring spaces; if a chain has several branches, use the place ID or URL. In the summary, a name is locked to the branch it matched most often.

### Use cases

- **Marketing agencies** — daily or weekly rank reports for every client and keyword; schedule the Actor and send the heat-map.
- **Business owners** — see the radius where your clinic, restaurant or academy is actually visible.
- **Competitor research** — who owns `강남 피부과` across Gangnam, and how many reviews they have.
- **Before/after measurement** — check the grid before and after a review campaign or a place-info update.

### Scheduling

Create a task with your input and add an Apify **Schedule** (e.g. every weekday at 11:00 KST). Each run adds dated rows, so you can export the dataset to Google Sheets or connect it through the API / Make / Zapier and chart rank over time.

### 한국어 안내

**네이버 플레이스 순위 체크 & 지오그리드.** 키워드 여러 개 × 업체 여러 곳의 네이버 플레이스(지도) 순위를 원하는 위치 기준으로 자동 조회합니다.

- **추적할 업체**: 플레이스 ID, 플레이스 URL, 업체명 일부 중 아무거나. 비워 두면 키워드별 상위 100개 전체 목록이 나옵니다.
- **검색 위치**: `라벨=위도,경도` (예: `강남역=37.4979,127.0276`). 네이버는 검색하는 위치에 따라 순위가 달라집니다.
- **지오그리드**: 3×3 / 5×5 / 7×7 지점에서 동시에 조회해 동네별로 어디서 상위 노출되는지 보여 줍니다. 단, `압구정 영어학원`처럼 **지역명이 들어간 키워드는 위치와 상관없이 같은 순위**가 나오므로, 그리드는 `영어학원`, `피부과`처럼 지역명 없는 키워드에 쓰세요.
- **결과물**: 순위 데이터(자연 순위·광고 순위·리뷰 수·상위 경쟁 업체), 요약(평균 순위·Top3/10/20 비율), 색상 히트맵 HTML 보고서.
- **범위**: 상위 100위까지 조회하며, 100위 밖은 `100+`로 표시됩니다.
- **가격**: 검색 1건(키워드 1개 × 지점 1곳)당 $0.003. 추적 업체 수와 무관하며, 실패한 검색은 무료입니다.
- 대행사라면 스케줄을 걸어 매일·매주 클라이언트 순위 보고서를 자동으로 받을 수 있습니다.

### More Korean data Actors by me

- [Olive Young Scraper](https://apify.com/cocomoon/oliveyoung-scraper) — K-beauty product search with prices, ratings and review counts.
- [Olive Young Reviews Scraper](https://apify.com/cocomoon/oliveyoung-review-scraper) — K-beauty customer reviews with skin type/tone/concern profiles and repurchase flags.
- [Daiso Korea Scraper](https://apify.com/cocomoon/daiso-scraper) — Daiso products with real total units sold, prices and reviews.
- [Musinsa Scraper](https://apify.com/cocomoon/musinsa-scraper) — K-fashion search, official best-seller rankings and size-fit reviews with reviewer height/weight.

### FAQ

**Do I need a Naver account or API key?** No.

**Is this the same rank I see on my phone?** It is the same mobile Naver Place list for that keyword and location, without login personalisation. Small differences between runs are normal.

**How do I find a place ID?** Open the place in Naver Map; the number in the URL (`/place/1317157725`) is the ID. You can also paste the whole URL.

**Found a problem or need another Naver data point?** Open an issue on the Issues tab.

# Actor input Schema

## `keywords` (type: `array`):

Search keywords exactly as a customer would type them in Naver, e.g. <code>강남 피부과</code>, <code>홍대 헤어샵</code>, <code>성수 카페</code>.

## `targetPlaces` (type: `array`):

Your business (and competitors) as a Naver Place ID, a place URL (<code>https://m.place.naver.com/place/123456789</code>, <code>https://map.naver.com/p/entry/place/123456789</code>) or part of the business name. Leave empty to get the full top-100 ranking for each keyword instead.

## `locations` (type: `array`):

Naver ranks places by distance from the searcher, so the result depends on where the search is made. Enter <code>latitude,longitude</code> or <code>label=latitude,longitude</code>, e.g. <code>강남역=37.4979,127.0276</code>. Default: Gangnam Station.

## `gridSize` (type: `integer`):

1 = check only the location itself. 3, 5 or 7 = check a 3×3, 5×5 or 7×7 grid of points around each location (like Local Falcon) to see how your rank changes across the neighbourhood. Each point is one search.

## `gridSpacingMeters` (type: `integer`):

Distance between neighbouring grid points in metres.

## `topResults` (type: `integer`):

How many of the top-ranked places to include with each rank row (name, category, review counts).

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

Parallel searches.

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

Proxy used to reach Naver.

## Actor input object example

```json
{
  "keywords": [
    "강남역 카페"
  ],
  "locations": [
    "강남역=37.4979,127.0276"
  ],
  "gridSize": 1,
  "gridSpacingMeters": 500,
  "topResults": 3,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `report` (type: `string`):

No description

## `summary` (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 = {
    "keywords": [
        "강남역 카페"
    ],
    "locations": [
        "강남역=37.4979,127.0276"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cocomoon/naver-place-rank-tracker").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 = {
    "keywords": ["강남역 카페"],
    "locations": ["강남역=37.4979,127.0276"],
}

# Run the Actor and wait for it to finish
run = client.actor("cocomoon/naver-place-rank-tracker").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 '{
  "keywords": [
    "강남역 카페"
  ],
  "locations": [
    "강남역=37.4979,127.0276"
  ]
}' |
apify call cocomoon/naver-place-rank-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cocomoon/naver-place-rank-tracker"
        }
    }
}
```

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/hXpnyfiyGtZc2Z5eG/builds/UfwbT2O6clS62oAyk/openapi.json
