# Naver Land Scraper - Korea Apartments & Officetels (`haketa/naver-land-scraper`) Actor

Naver Land scraper & data API for South Korea real estate: search apartments, officetels & villas for sale (매매), jeonse (전세) & monthly rent (월세); export price, area, floor, direction, location, tags & the listing agent. Korea property market data & lead generation — fast.

- **URL**: https://apify.com/haketa/naver-land-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Real estate, Lead generation
- **Features:** Limited permissions
- **Stats:** 21 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 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 Land Scraper — South Korea Real Estate, Apartments (아파트), Officetels, Jeonse/Sale Prices & Agent Leads

> **Scrape South Korean property listings from [Naver Land](https://new.land.naver.com/) (`네이버 부동산`) — Korea's #1 real estate portal.** Extract **apartments (`아파트`), officetels (`오피스텔`), villas (`빌라`), pre-sale units (`분양권`), and commercial properties** for **sale (`매매`), jeonse deposit lease (`전세`), and monthly rent (`월세`)**. Captures Korean price strings (`12억 5,000`), monthly rent, supply & exclusive area (`m²`), floor info, facing direction (`남향`), building/complex details, GPS coordinates, tags, photos, and **full real estate brokerage (`공인중개사`) contact details including agent phone numbers**.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-00C853?style=flat-square\&logo=apify)](https://apify.com/haketa/naver-land-scraper)
[![Market](https://img.shields.io/badge/Market-South%20Korea%20%F0%9F%87%B0%F0%9F%87%B7-blue?style=flat-square)]()
[![Deep Pagination](https://img.shields.io/badge/Scale-1%2C000%2B%20Listings%20Pagination-orange?style=flat-square)]()
[![B2B Leads](https://img.shields.io/badge/Lead%20Gen-Agent%20Offices%20%2B%20Phones-success?style=flat-square)]()
[![Data Formats](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel%20%7C%20API-purple?style=flat-square)]()

***

### ⚡ At a glance

| Capability | Details |
| --- | --- |
| **Target Platform** | [Naver Land](https://new.land.naver.com/) (`new.land.naver.com` — 네이버 부동산) |
| **Location Targeting** | 35+ pre-mapped Korean districts (`구` dropdown: Gangnam, Seocho, Songpa, Mapo, Bundang, Haeundae, etc.) · Custom neighborhoods (`동` / towns: `역삼동`, `판교동`) · Direct `cortarNos` region codes |
| **Property Types (`realEstateTypes`)** | Apartment (`APT`), Officetel (`OPST`), Villa (`VL`), Pre-sale (`ABYG`), Reconstruction (`JGC`), One-room (`OR`), Detached house (`DDDGG`), Retail (`SG`), Commercial (`SMS`), Land (`GJCG`) |
| **Deal Types (`tradeTypes`)** | Sale (`A1` 매매) · Jeonse deposit (`B1` 전세) · Monthly rent (`B2` 월세) · Short-term (`B3` 단기임대) |
| **Core & Property Fields** | `articleNo`, `articleName`, `price`, `rentPrice`, `supplyAreaM2`, `exclusiveAreaM2`, `floorInfo`, `direction`, `buildingName`, `confirmDate`, `tags`, `latitude`, `longitude` |
| **Agent Lead Enrichment** | `agentName`, `agentOffice`, `agentRepName`, `agentPhone`, `agentAddress`, `exposeAddress`, `description` |
| **Pagination & Scale** | Round-robin multi-region deep pagination — scales seamlessly to **1,000+ unique listings** with 0% duplicates |
| **Export Formats** | JSON, JSONL, CSV, Excel (XLSX), XML, HTML Table, REST API, Webhooks |

***

### 🔎 Why scrape Naver Land (네이버 부동산)?

[Naver Land](https://new.land.naver.com/) is the definitive source of real estate data in South Korea. Virtually every Korean apartment complex (`단지`), officetel tower, and residential brokerage syndicates its live inventory to Naver Land, making it the primary benchmark for **sale prices (`매매`)**, Korea's unique **lump-sum deposit leases (`전세` / Jeonse)**, and **monthly rentals (`월세`)**.

However, extracting data from Naver Land is notoriously difficult for analysts and international teams:

- **Short-lived session authentication & geo-fencing:** Naver Land is a single-page map application gated behind Korean IP checks and dynamically generated client-side authorization tokens.
- **Complex regional hierarchy (`시/도` → `시/군/구` → `읍/면/동`):** Every Korean district and neighborhood maps to an internal 10-digit administrative code (`cortarNo`, e.g., `1168000000` for Gangnam-gu).
- **Two-step agent contact retrieval:** While the listing feed provides prices, areas, and coordinates, the licensed brokerage's representative name (`agentRepName`), phone number (`agentPhone`), and street address (`agentAddress`) live on a per-article detail endpoint.

This **Naver Land scraper** automates the entire workflow: it bootstraps a valid Korean session once, resolves any Korean district (`구`) or neighborhood (`동`) name to its exact `cortarNo`, paginates across regions in round-robin order with strict `articleNo` deduplication, enriches agent contact details in parallel, and outputs clean JSON/CSV records.

***

### ✨ What this Naver Land data extractor does

- 🏙️ **35+ Major Korean Districts Built In (`regions`):** Select top markets in Seoul (`강남구` Gangnam, `서초구` Seocho, `송파구` Songpa, `마포구` Mapo, `용산구` Yongsan, `성동구` Seongdong, `영등포구` Yeongdeungpo, etc.), Gyeonggi/Incheon (`분당구` Bundang, `수지구` Suji, `영통구` Yeongtong, `일산동구` Ilsan, `인천 연수구` Yeonsu), and regional metros (`해운대구` Haeundae Busan, `수성구` Suseong Daegu, `유성구` Yuseong Daejeon).
- 🔍 **Free-Text Korean Location Resolver (`customLocations`):** Type any neighborhood (`동`), district (`구`), or city in Korean (e.g., `"역삼동"`, `"판교동"`, `"청담동"`, `"광교"`) and the actor resolves its `cortarNo` automatically.
- 🔓 **Unlocked 1,000+ Multi-Region Pagination:** Uses round-robin pagination across all selected regions, stepping through `page=1, 2, 3...` until `maxItems` (including **1,000+ listings**) is reached or `isMoreData` is exhausted, with strict `articleNo` deduplication.
- 📐 **Dual Korean Area Metrics (`공급면적` & `전용면적`):** Captures both `supplyAreaM2` (`area1`) and `exclusiveAreaM2` (`area2`), plus floorplan `areaName` (e.g., `84A`, `49C`).
- 📞 **Real Estate Brokerage Lead Generation (`includeAgentDetails`):** Extracts `agentOffice`, `agentRepName` (licensed representative), `agentPhone` (landline or mobile), `agentAddress`, `exposeAddress`, and full listing `description`.
- 🗺️ **Complex & Duplicate-Listing Price Ranges:** Includes `complexNo`, `sameAddrCount` (number of competing brokers advertising the same unit), `sameAddrMinPrice`, and `sameAddrMaxPrice`.

***

### 🎯 High-value use cases & Korean property intelligence

#### 1. Seoul & Metro Apartment Price & Jeonse-to-Sale Ratio Tracking

Monitor `매매` (sale) vs. `전세` (jeonse deposit) prices across Seoul's core districts (`강남 3구`: Gangnam, Seocho, Songpa; `마용성`: Mapo, Yongsan, Seongdong) to calculate live Jeonse ratios (`전세가율`) and detect market inflection points.

#### 2. Licensed Korean Real Estate Agent (`공인중개사`) Lead Generation

Enable `includeAgentDetails: true` to harvest verified brokerage names (`agentOffice`), representative names (`agentRepName`), phone numbers (`agentPhone`), and office addresses (`agentAddress`) for B2B PropTech SaaS, mortgage, interior/moving services, and advertising sales.

#### 3. Automated Valuation Models (AVM) & Institutional Research

Combine `exclusiveAreaM2`, `supplyAreaM2`, `floorInfo`, `direction`, `confirmDate`, `tags`, `latitude`, `longitude`, and `price` to train machine-learning valuation models for Korean residential and commercial assets.

#### 4. Expat Housing, Corporate Relocation & English-Friendly Platforms

Power international relocation portals and bilingual property apps targeting Yongsan (`용산구`), Hannam-dong, Itaewon, Gangnam (`강남구`), Mapo (`마포구`), and Bundang (`분당구`) with live availability and photos.

***

### 📥 Input parameters

All fields are optional. Running with default/empty locations automatically collects a balanced sample across 8 premier Korean districts.

| Parameter | Type | Default / Prefill | Description |
| --- | --- | --- | --- |
| `regions` | `array<string>` | `[]` (Auto sample) | Select one or more Korean districts from the dropdown (`강남구`, `서초구`, `송파구`, `강동구`, `마포구`, `용산구`, `성동구`, `영등포구`, `분당구`, `해운대구`, `수성구`, `유성구`, etc.). |
| `realEstateTypes` | `array<string>` | `["APT", "OPST", "VL"]` | Property types to include:<br>• `APT` (Apartment 아파트) · `OPST` (Officetel 오피스텔) · `VL` (Villa 빌라/연립)<br>• `ABYG` (Pre-sale 분양권) · `JGC` (Reconstruction 재건축) · `OR` (One-room 원룸)<br>• `DDDGG` (Detached 단독/다가구) · `SG` (Retail 상가) · `SMS` (Office 사무실) · `GJCG` (Factory/Warehouse) |
| `tradeTypes` | `array<string>` | `[]` (All deal types) | Deal types to include:<br>• `A1` — Sale (`매매`) · `B1` — Jeonse deposit (`전세`) · `B2` — Monthly rent (`월세`) · `B3` — Short-term (`단기임대`). Empty = all. |
| `includeAgentDetails` | `boolean` | `true` | Fetch each listing's detail endpoint to add `agentOffice`, `agentRepName`, `agentPhone`, `agentAddress`, `exposeAddress`, and full `description`. |
| `maxItems` | `integer` | Default `100` (Prefill `50`) | Maximum total listings to return (`0` = unlimited). Set to `1000+` for deep market extraction. (Also accepts `maxListings` / `maxRecords`). |
| `customLocations` | `array<string>` | `[]` | **Advanced:** Free-text Korean neighborhood (`동`), district (`구`), or town names (e.g., `["역삼동", "판교동", "압구정동"]`). |
| `cortarNos` | `array<string>` | `[]` | **Advanced:** Direct 10-digit Naver Land region codes (e.g., `["1168010100"]`). |
| `maxConcurrency` | `integer` | `8` | Parallel detail requests during agent enrichment (`1` to `20`). |
| `proxyConfiguration` | `object` | Residential `KR` | Apify Proxy configuration. **South Korean Residential proxy (`KR`) is preconfigured and required.** |

***

### 🛠️ Input recipes & examples

#### Recipe 1: Deep 1,000+ Gangnam, Seocho & Songpa (`강남 3구`) apartment sweep

Extract 1,200 apartment and officetel listings across Gangnam-gu, Seocho-gu, and Songpa-gu:

```json
{
  "regions": ["강남구", "서초구", "송파구"],
  "realEstateTypes": ["APT", "OPST"],
  "tradeTypes": ["A1", "B1"],
  "includeAgentDetails": true,
  "maxItems": 1200,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "KR"
  }
}
```

#### Recipe 2: Neighborhood-level (`동`) monthly rent & jeonse search

Target specific high-demand neighborhoods (`역삼동` Yeoksam-dong and `판교동` Pangyo-dong) for officetels and villas:

```json
{
  "customLocations": ["역삼동", "판교동"],
  "realEstateTypes": ["OPST", "VL"],
  "tradeTypes": ["B1", "B2"],
  "includeAgentDetails": true,
  "maxItems": 500
}
```

#### Recipe 3: Fast 2,000-listing price & coordinate sweep (without agent detail requests)

Disable `includeAgentDetails` for ultra-fast bulk collection of prices, areas, floors, and GPS coordinates:

```json
{
  "regions": ["강남구", "마포구", "용산구", "분당구", "해운대구"],
  "realEstateTypes": ["APT", "OPST", "VL"],
  "includeAgentDetails": false,
  "maxItems": 2000
}
```

***

### 📤 Output schema & field reference

Every dataset item is a flat JSON object representing one unique Naver Land listing (`articleNo`).

#### 🏷️ Core Identity, Property Type & Price Fields

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `articleNo` | `string` | 🟢 High (100%) | Unique Naver Land listing ID (primary deduplication key). |
| `articleName` | `string` | 🟢 High (100%) | Complex or building title (e.g., `"아츠논현(도시형)"`, `"래미안대치팰리스"`). |
| `url` | `string` | 🟢 High (100%) | Direct link to the listing (`https://new.land.naver.com/articles/{articleNo}`). |
| `realEstateType` | `string` | 🟢 High (100%) | Korean property type label (`"아파트"`, `"오피스텔"`, `"빌라"`, `"분양권"`, `"상가"`). |
| `tradeType` | `string` | 🟢 High (100%) | Korean deal type (`"매매"` Sale, `"전세"` Jeonse, `"월세"` Monthly rent, `"단기임대"` Short-term). |
| `price` | `string` | 🟢 High (100%) | Sale price or lease deposit in traditional Korean units (`억` = 100M KRW, `만` = 10K KRW, e.g., `"12억 5,000"`). |
| `rentPrice` | `string` | 🟡 Conditional (`월세`) | Monthly rent amount in `만 원` (10,000 KRW units) for `월세` and `단기임대` listings. |
| `priceChangeState` | `string` | 🟢 High (100%) | Price trend indicator (`"SAME"`, `"INCREASE"`, `"DECREASE"`). |
| `sameAddrCount` | `number` | 🟢 High (100%) | Number of co-listed ads for the same unit across brokerages. |
| `sameAddrMinPrice` / `MaxPrice` | `string` | 🟢 High (100%) | Minimum and maximum asking price across co-listed ads for the same property. |

#### 📐 Dimensions, Floor, Direction & Media Fields

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `supplyAreaM2` | `number` | 🟢 High (100%) | Supply area (`공급면적` / `area1`) in square meters (`m²`). |
| `exclusiveAreaM2` | `number` | 🟢 High (100%) | Exclusive private area (`전용면적` / `area2`) in square meters (`m²`). |
| `areaName` | `string` | 🟢 High (~95%) | Floorplan type identifier (e.g., `"84A"`, `"49C"`, `"112B"`). |
| `floorInfo` | `string` | 🟢 High (100%) | Unit floor and total building floors (e.g., `"12/25"`, `"고/20"`, `"중/15"`). |
| `direction` | `string` | 🟢 High (~98%) | Main window orientation (`"남향"` South, `"남동향"` Southeast, `"동향"` East, etc.). |
| `buildingName` | `string` | 🟢 High (~95%) | Building/dong identifier (e.g., `"101동"`, `"1동"`). |
| `confirmDate` | `string` | 🟢 High (100%) | Listing verification date (`YYYYMMDD`, e.g., `"20261028"`). |
| `verificationType` | `string` | 🟡 Conditional | Verification method code (`OWNER`, `DOC`, `SITE`, `NDOC1`, etc.). |
| `features` | `string` | 🟢 High (~92%) | Highlight summary written by the listing agent. |
| `tags` | `array<string>` | 🟢 High (~98%) | Feature tags (e.g., `["역세권", "신축", "대단지", "주차가능", "탑층"]`). |
| `imageCount` | `number` | 🟢 High (100%) | Number of site photos attached to the listing. |
| `representativeImage` | `string` | 🟡 Conditional (~75%) | Full URL to the listing's primary thumbnail photo when present. |
| `latitude` / `longitude` | `string/number` | 🟢 High (100%) | WGS-84 GPS coordinates of the building/complex. |
| `complexNo` | `string` | 🟡 Conditional | Naver Land complex (`단지`) ID when the unit belongs to an indexed complex. |
| `source` | `string` | 🟢 High (~95%) | Partner MLS feed name (e.g., `"부동산뱅크"`, `"매경부동산"`, `"한국공인중개사협회"`). |

#### 📞 Brokerage & Agent Contact Fields (`includeAgentDetails: true`)

| Field | Type | Coverage (Enriched) | Description |
| --- | --- | --- | --- |
| `realtorName` | `string` | 🟢 High (100%) | Brokerage office name from the search card. |
| `agentName` / `agentOffice` | `string` | 🟢 High (~99%) | Official licensed real estate brokerage name (`공인중개사사무소`). |
| `agentRepName` | `string` | 🟢 High (~98%) | Licensed representative broker's full name (`대표 공인중개사`). |
| `agentPhone` | `string` | 🟢 High (~98%) | Direct brokerage telephone or mobile number (e.g., `"02-557-7712"`, `"010-xxxx-xxxx"`). |
| `agentAddress` | `string` | 🟢 High (~98%) | Full street address of the real estate agency office. |
| `exposeAddress` | `string` | 🟢 High (~99%) | City, district (`구`), and neighborhood (`동`) of the property (e.g., `"서울시 강남구 논현동"`). |
| `description` | `string` | 🟢 High (~98%) | Full detailed property description from the detail view. |
| `scrapedAt` | `string` | 🟢 High (100%) | ISO-8601 UTC extraction timestamp. |

***

### 📋 Sample JSON output

```json
{
  "articleNo": "2657970383",
  "articleName": "아츠논현(도시형)",
  "url": "https://new.land.naver.com/articles/2657970383",
  "realEstateType": "아파트",
  "tradeType": "매매",
  "price": "12억 5,000",
  "rentPrice": null,
  "priceChangeState": "SAME",
  "areaName": "49C",
  "supplyAreaM2": 49,
  "exclusiveAreaM2": 38,
  "floorInfo": "20/20",
  "direction": "동향",
  "buildingName": "1동",
  "confirmDate": "20261028",
  "features": "인기 최고층,화사한 화이트톤 인테리어 하이엔드 오피스텔",
  "tags": ["4년이내", "소형평수", "탑층", "방한개"],
  "imageCount": 1,
  "representativeImage": "https://landthumb-phinf.pstatic.net/20261028_19/1793182835420X911o_JPEG/424a2c61aa9601d507863f1d7565ded3.JPG",
  "sameAddrCount": 4,
  "sameAddrMinPrice": "12억 5,000",
  "sameAddrMaxPrice": "12억 5,000",
  "latitude": "37.512229",
  "longitude": "127.036154",
  "realtorName": "하이엔드공인중개사사무소",
  "source": "부동산뱅크",
  "complexNo": "140219",
  "verificationType": "OWNER",
  "agentName": "하이엔드공인중개사사무소",
  "agentOffice": "하이엔드공인중개사사무소",
  "agentRepName": "김범수",
  "agentPhone": "02-557-7712",
  "agentAddress": "서울특별시 강남구 언주로 563 ,",
  "exposeAddress": "서울시 강남구 논현동",
  "description": "🌈 [아츠 논현 최다보유] 언주역·학동역·선정릉역 트리플 역세권 하이엔드 주거 공간...",
  "scrapedAt": "2026-11-10T02:30:00.000Z"
}
```

***

### 🔁 Pagination, round-robin scaling & deduplication

- **Round-Robin Multi-Region Pagination:** When you select multiple districts in `regions` (or run with the 8 default districts), the scraper pages through all regions in round-robin order (`page 1` across each region, then `page 2`, `page 3`...). This ensures every selected district is represented evenly while scaling seamlessly to **1,000+ listings**.
- **Strict `articleNo` Deduplication:** Every listing is deduplicated in memory by `articleNo` before detail enrichment, guaranteeing **0% duplicate records** and avoiding wasted detail requests.
- **Parallel Detail Enrichment:** Detail requests run concurrently via `maxConcurrency` (default `8`, up to `20`), allowing 50–100 enriched listings to complete in under 90 seconds.

***

### 💻 API & integration examples

#### Python (`apify-client`)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("haketa/naver-land-scraper").call(run_input={
    "regions": ["강남구", "서초구"],
    "realEstateTypes": ["APT", "OPST"],
    "tradeTypes": ["A1", "B1"],
    "includeAgentDetails": True,
    "maxItems": 500,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["articleNo"], item["articleName"], item["price"], item["agentPhone"])
```

#### Node.js (`apify-client`)

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

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

const run = await client.actor('haketa/naver-land-scraper').call({
    customLocations: ['역삼동', '판교동'],
    realEstateTypes: ['OPST'],
    includeAgentDetails: true,
    maxItems: 300,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Collected ${items.length} Naver Land listings`);
```

***

### 🗺️ Korean property types, deal codes & district reference

#### Property Type Codes (`realEstateTypes`)

| Code | Korean Label | English Description | Typical Market Use Case |
| --- | --- | --- | --- |
| `APT` | 아파트 | Apartment complex unit | Primary residential benchmark across Seoul & metro Korea |
| `OPST` | 오피스텔 | Officetel (studio/work-live) | Urban rental yield, young professional & expat housing |
| `VL` | 빌라/연립 | Villa / low-rise multi-family | Affordable urban housing & redevelopment (`재개발`) tracking |
| `ABYG` | 아파트분양권 | Pre-sale apartment right | New construction pricing & pre-completion premium analysis |
| `JGC` | 재건축 | Reconstruction property | High-upside urban redevelopment investment tracking |
| `OR` | 원룸 | One-room studio | University district & single-occupant rental benchmarking |
| `DDDGG` | 단독/다가구 | Detached / multi-household house | Land-value & whole-building yield analysis |
| `SG` | 상가 | Retail / storefront | Street-level commercial rent & vacancy monitoring |
| `SMS` | 사무실 | Commercial office | Business district (`GBD`, `YBD`, `CBD`) office leasing comps |
| `GJCG` | 공장/창고 | Factory / warehouse / land | Industrial & logistics real estate intelligence |

#### Deal Type Codes (`tradeTypes`)

| Code | Korean Term | English Meaning | Price Field Mapping |
| --- | --- | --- | --- |
| `A1` | 매매 | Outright purchase / sale | `price` holds full asking sale price (e.g., `"12억 5,000"`); `rentPrice` is `null` |
| `B1` | 전세 | Jeonse (2-year lump-sum deposit, no monthly rent) | `price` holds lump-sum deposit (e.g., `"6억 8,000"`); `rentPrice` is `null` |
| `B2` | 월세 | Monthly rent with security deposit | `price` holds deposit (e.g., `"5,000"`); `rentPrice` holds monthly rent (e.g., `"250"`) |
| `B3` | 단기임대 | Short-term furnished rental | `price` holds short-term deposit; `rentPrice` holds monthly charge |

#### Major Korean Districts Included in Dropdown (`regions`)

| Region Group | Districts (`구` / `시`) | Market Highlights |
| --- | --- | --- |
| **Seoul Gangnam 4-Gu (`강남4구`)** | `강남구` (Gangnam), `서초구` (Seocho), `송파구` (Songpa), `강동구` (Gangdong) | Korea's highest-value apartment complexes, flagship officetels & premier school districts |
| **Seoul Central & Riverside (`마용성` / CBD)** | `마포구` (Mapo), `용산구` (Yongsan), `성동구` (Seongdong), `종로구` (Jongno), `중구` (Jung-gu), `광진구` (Gwangjin) | High-growth riverside complexes, Hannam/Seongsu luxury developments & CBD offices |
| **Seoul West & South (`여의도` / `목동`)** | `영등포구` (Yeongdeungpo), `양천구` (Yangcheon), `동작구` (Dongjak), `강서구` (Gangseo), `구로구` (Guro), `관악구` (Gwanak) | Yeouido financial district, Mokdong school zone, Magok tech park & Guro/Gasan digital hubs |
| **Gyeonggi & Incheon Metro** | `분당구` (Bundang), `수지구` (Suji), `영통구` (Yeongtong), `일산동구`/`일산서구` (Ilsan), `부천시`, `인천 연수구` (Songdo), `인천 서구` | Pangyo/Bundang tech valley, Gwanggyo/Suwon Samsung corridor & Songdo International City |
| **Busan, Daegu & Daejeon** | `해운대구` (Haeundae), `수영구` (Suyeong), `수성구` (Suseong), `유성구` (Yuseong), `서구`, `남구` | Haeundae marine luxury condos, Suseong-gu Daegu & Daedeok/Yuseong R\&D corridor |

***

### 🔌 Workflow automation & Korean price conversion tip

#### Converting Korean price strings (`억` / `만`) to numeric KRW in Python

Naver Land formats prices in traditional Korean units where `1억` = `100,000,000 KRW` and `1` (or `1만`) = `10,000 KRW`:

```python
import re

def parse_krw(price_str):
    if not price_str:
        return None
    s = str(price_str).replace(",", "").strip()
    eok = re.search(r"(\d+)\s*억", s)
    rem = re.sub(r"\d+\s*억", "", s).strip()
    man = re.search(r"(\d+)", rem)
    total_man = (int(eok.group(1)) * 10000 if eok else 0) + (int(man.group(1)) if man else 0)
    return total_man * 10000  # Exact KRW integer (e.g. "12억 5,000" -> 1250000000)
```

***

### ⚠️ Known limitations

- **Korean (`KR`) Residential Proxy Required:** Naver Land enforces strict geo-fencing and session validation. Always keep the default `proxyConfiguration` (`RESIDENTIAL`, country `KR`) enabled.
- **Korean Price Notation:** Prices (`price` and `rentPrice`) are returned in Naver Land's native Korean financial notation (`억` = 100 million KRW, `만` = 10,000 KRW, e.g., `"12억 5,000"` = `1,250,000,000 KRW`).

***

### ❓ Frequently Asked Questions

#### How do I scrape 1,000+ listings in one run?

Set `maxItems: 1000` (or `0` for unlimited). The scraper automatically paginates through all available pages across your selected `regions` or `customLocations` until your target is reached.

#### Can I search specific neighborhoods (`동`) instead of entire districts (`구`)?

Yes. Enter any neighborhood or town name in Korean under `customLocations` (e.g., `["역삼동", "잠실동", "성수동", "판교동"]`) or supply 10-digit `cortarNos` directly.

#### How can I make large 2,000+ listing runs faster and cheaper?

If you only need property prices, areas, floors, tags, and GPS coordinates (and do not need `agentPhone` or full `description`), set `includeAgentDetails: false`. That skips per-listing detail requests and speeds up large runs by 5×.

***

### 🔗 Related scrapers

- [Yad2 Scraper (Israel)](https://apify.com/haketa/yad2-scraper) — Israel real estate and classifieds listings.
- [VivaReal Scraper (Brazil)](https://apify.com/haketa/vivareal-scraper) — Brazilian property listings and agency leads.
- [Boliga Scraper (Denmark)](https://apify.com/haketa/boliga-scraper) — Danish property listings and valuation data.
- [Realtor.ca Scraper (Canada)](https://apify.com/haketa/realtor-ca-scraper) — Canadian MLS real estate listings.
- [Domain.com.au Scraper (Australia)](https://apify.com/haketa/domain-com-au-scraper) — Australian real estate listings.

***

### 📋 Changelog

| Version | Date | Highlights |
| --- | --- | --- |
| **v1.2** | `2026-11` | **Unlocked 1,000+ round-robin pagination & strict deduplication:** Replaced single-region-first queuing with round-robin multi-region pagination across districts, added strict `articleNo` deduplication before enrichment (0% duplicates), optimized prefill to `maxItems: 50` for fast sub-90s execution, and added `maxListings`/`maxRecords` input alias support. |
| **v1.1** | `2026-11` | Added `complexNo` and `verificationType` fields, improved session cookie sharing between bootstrap and HTTP calls, and expanded the Korean district dropdown to 35+ markets. |
| **v1.0** | `2026-06` | Initial release with Korean location resolution (`cortarNo`), `APT`/`OPST`/`VL` filtering, and `공인중개사` agent contact enrichment. |

# Changelog

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

# Actor input Schema

## `regions` (type: `array`):

Pick one or more Korean districts to scrape. Covers the most popular property markets in Seoul and the wider metro area. Leave empty to scrape a diverse mix of top districts automatically.

## `realEstateTypes` (type: `array`):

Which kinds of property to include. Apartment, officetel and villa cover the most common residential listings.

## `tradeTypes` (type: `array`):

Which deal types to include. Leave empty to include all deal types (sale, jeonse and monthly rent).

## `includeAgentDetails` (type: `boolean`):

Add each listing's real-estate office, agent phone number and full description. Great for lead generation.

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

Maximum number of listings to return. Set to 0 for no limit.

## `customLocations` (type: `array`):

Optional. Type any Korean district (구), neighborhood (동) or town name to scrape locations not in the dropdown above. Examples: 역삼동, 판교동, 광교.

## `cortarNos` (type: `array`):

Optional. Naver Land internal region codes (cortarNo) to scrape directly, e.g. 1168010100. For power users who already have specific codes.

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

How many listing detail pages to fetch in parallel while enriching. Higher is faster but heavier.

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

Naver Land works best through a Korean (KR) residential proxy. Keep the default unless you have your own KR residential proxy.

## Actor input object example

```json
{
  "regions": [],
  "realEstateTypes": [
    "APT",
    "OPST",
    "VL"
  ],
  "tradeTypes": [],
  "includeAgentDetails": true,
  "maxItems": 50,
  "customLocations": [
    "역삼동",
    "판교동"
  ],
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KR"
  }
}
```

# Actor output Schema

## `listings` (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 = {
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "KR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/naver-land-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 = {
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "KR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/naver-land-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 '{
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KR"
  }
}' |
apify call haketa/naver-land-scraper --silent --output-dataset

```

## MCP server setup

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