Naver Land Scraper - Property Listings, Prices & Locations
Pricing
from $1.50 / 1,000 listing results
Naver Land Scraper - Property Listings, Prices & Locations
Scrape structured property listings from Naver Land map URLs. Extract listing titles, prices, areas, addresses, GPS coordinates, property types, transaction types and source links for clean real estate datasets.
Pricing
from $1.50 / 1,000 listing results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
0
Monthly active users
13 days ago
Last modified
Categories
Share
Naver Land Scraper: Apartment, Villa and Officetel Listings by Search or Link
Naver Land Scraper turns 부동산 네이버 (Naver Land), South Korea's property listings site, into a structured dataset. Search by keyword exactly the way the site's own search box does it (complex or region names such as 잠실 or 강남), and/or paste any new.land.naver.com link: a map search view, a single complex page, a single listing page, or a keyword results page. Every keyword and link is read independently, then all the results are merged and deduplicated into one dataset carrying identity, transaction type, price, area, floor, address, coordinates and source links. Turn on detail enrichment for extra fields pulled from a listing's own page, and export everything as JSON, CSV or Excel, or read it straight through the API.
Why This Scraper?
- Keyword search built in. Search Naver Land the same way its own search box does, by complex or region name, with no need to reverse-engineer a URL.
- Reads any Naver Land link. Map search views, single complex pages, single listing pages, and keyword result pages all work from the same input field.
- Stable identifiers. Every record keeps the source's own article or complex number as its id, so downstream deduplication survives across runs.
- Optional detail enrichment. Turn on Fetch listing details to add fields drawn from a listing's own page, billed only for the listings that actually receive them.
- Nothing lost. The complete source record for every listing is preserved in
raw, even for fields not broken out into their own columns. - Multiple sources per run. Supply several keywords and links together; results are merged and deduplicated by id automatically.
- Built for monitoring. Resume continues an interrupted run without double counting, and Incremental mode tracks new, updated, reappeared and expired listings across scheduled runs.
Use Cases
- Property investors and analysts: track price and inventory changes for specific complexes or neighborhoods over time.
- PropTech tools and internal feeds: build a searchable, deduplicated feed of current listings without visiting the site by hand.
- Market researchers: compare a region's sale, jeonse and monthly-rent mix across scheduled runs.
- Relocation and site-selection planning: pull comparable listings for a target complex or district before a negotiation.
- Data and analytics teams: feed price and area history into a dashboard using Incremental mode's
changedFields.
Data You Get
Sample shape: values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
id | "9988770011" |
articleNo | "9988770011" |
complexNo | "700123" |
title | "샘플아파트 101동 84A타입" |
propertyType | "아파트" |
tradeType | "매매" |
price | "12억 5,000" |
area | "84.97" |
floor | "12/25" |
direction | "남향" |
address | "서울특별시 샘플구 샘플동 12-3" |
latitude / longitude | 37.5000 / 127.0000 |
thumbnailUrl | "https://landthumb-phinf.pstatic.net/sample/sample_1.jpg" |
articleUrl | "https://new.land.naver.com/article/9988770011" |
sourceUrl | "https://new.land.naver.com/complexes?sk=샘플동" |
detailFetched | false (true once detail enrichment has run and its fields arrived) |
crawledAt | "2026-01-01T00:00:00+00:00" |
rank | 1 |
changeType | "UPDATED" (Incremental mode only; also NEW, UNCHANGED, REAPPEARED, EXPIRED) |
changedFields | ["price"] (Incremental mode only) |
firstSeenAt / lastSeenAt | "2026-01-01T00:00:00+00:00" (Incremental mode only) |
raw | the complete source record for this listing |
A complex-level record, read from a zoomed-out map view or a complex page, reports price and area as a min-max range such as "26000-54000" instead of one figure, and it has no floor, direction or thumbnailUrl, since the source never carries those for a complex marker. When Fetch listing details is on, extra fields the listing's own page carries land inside raw, and the named fields above are refreshed with the detail page's own values. changeType, changedFields, firstSeenAt and lastSeenAt only appear on a record when Incremental mode is switched on.
How to Use
- Add one or more search keywords, paste Naver Land links, or both.
- Turn on Fetch listing details if you need the extra fields a listing's own page carries.
- Set Maximum listings to bound the run, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API. Turn on Incremental mode for recurring runs, or use Resume to continue an interrupted one.
Search by keyword:
{"searchKeywords": ["잠실", "래미안"],"maxItems": 20}
A map search URL (set the map area, property types, and transaction filters on the site first, then copy the URL from the browser address bar):
{"startUrls": ["https://new.land.naver.com/complexes?ms=2AM2Zq,3zhF96,16&a=APT:ABYG:JGC&e=RETAIL"],"maxItems": 20}
A single complex page, with detail enrichment:
{"startUrls": ["https://new.land.naver.com/complexes/111380"],"fetchDetails": true,"maxItems": 10}
Recurring monitoring with change detection:
{"searchKeywords": ["잠실"],"incrementalMode": true,"stateKey": "jamsil-watch","emitExpired": true}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/naver-land-listings").call(run_input={"searchKeywords": ["잠실"], "maxItems": 20})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["price"], listing["articleUrl"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/naver-land-listings').call({ searchKeywords: ['잠실'], maxItems: 20 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How keywords, URLs and Maximum listings interact
Keywords are resolved first, in the order you list them, then every pasted link is read; each source is read independently. Maximum listings caps the total number of unique records across everything in the run, and results are deduplicated by id as they arrive, so the same complex reached through both a keyword and a link only counts once.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset ID and every listing id it already collected is skipped in this run. Maximum listings still counts every unique listing the walk scans, including the ones Resume skips, so set it higher than the number of genuinely new records you expect when resuming. - Incremental mode (
incrementalMode) keeps a standing baseline for a scope (its keywords, URLs and Fetch listing details setting, or a State key you set) across separate scheduled runs. Each record is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unless Emit unchanged listings is on),REAPPEARED, orEXPIRED. - A listing is only ever marked absent, and can therefore only ever come back as
REAPPEAREDon a later run, after a run that had Emit expired listings switched on and completed a full scan of the whole scope: no page in that run was refused, and Maximum listings did not cut the walk short. With Emit expired listings left off, no listing is ever marked absent, soREAPPEAREDcannot fire, no matter how many runs you schedule afterward. - Resume and Incremental mode cannot be combined in the same run. With Incremental mode off, output is exactly the plain listing shape, with no change-tracking fields added.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary per listing: a title plus the key fields (property type, transaction type, price, area, an address-and-floor location line, and the listing link) flattened to plain text. The complete record, including the full source payload, always stays in the Apify dataset.
- Authorize a connector once under Apify -> Settings -> Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you have not authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created; other connectors get a best-effort write per listing. - Optionally lower
maxNotifyListingsto cap how many listings are written to each connector per run (default 50).
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchKeywords | array | prefill: ["잠실"] | Keyword search on Naver Land, exactly like the site's own search box: complex or region names such as 잠실 or 래미안. Runs before the URLs below, and all results are merged and deduplicated. |
startUrls | array | prefill: 3 sample links | Naver Land links to read: a map search URL, a single complex page, a single listing page, or a keyword results URL. Each link is read independently. |
maxItems | integer | 20 | Maximum number of unique records returned across all keywords and URLs combined (1 to 1000). |
fetchDetails | boolean | false | Fetch additional detail fields for article cards when available; billed only for the listings whose details actually arrive. |
resumeFromRunId | string | (none) | Paste a previous run ID or dataset ID to skip listings it already collected. Cannot be combined with Incremental mode. |
incrementalMode | boolean | false | Track NEW, UPDATED, UNCHANGED, REAPPEARED, and EXPIRED records for this run's URL and keyword scope. |
stateKey | string | (none) | Optional name for the recurring monitoring scope, so it can be reused or shared deliberately. |
emitUnchanged | boolean | false | Include (and bill) records whose source-derived fields did not change since the last scan. |
emitExpired | boolean | false | Include (and bill) records absent after a complete scan; this is also what lets the actor ever mark a listing as gone, which is required before it can later be reported as REAPPEARED. |
mcpConnectors | array | (none) | Optional MCP connectors to export a summary of results into. |
notionParentPageUrl | string | (none) | Notion parent page for the Notion connector export. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. |
proxy | object | prefill: Residential, South Korea | Connection settings for the run. |
Output Example
Sample shape: values are illustrative placeholders, not from a live listing.
{"id": "9988770011","articleNo": "9988770011","complexNo": "700123","title": "샘플아파트 101동 84A타입","propertyType": "아파트","tradeType": "매매","price": "12억 5,000","area": "84.97","floor": "12/25","direction": "남향","address": "서울특별시 샘플구 샘플동 12-3","latitude": 37.5000,"longitude": 127.0000,"thumbnailUrl": "https://landthumb-phinf.pstatic.net/sample/sample_1.jpg","articleUrl": "https://new.land.naver.com/article/9988770011","sourceUrl": "https://new.land.naver.com/complexes?sk=샘플동","detailFetched": false,"crawledAt": "2026-01-01T00:00:00+00:00","rank": 1,"raw": {}}
Plan Requirement
An Apify account and a run connection that can reach Naver Land are required. The Connection input prefills a residential-style connection scoped to South Korea; keep that setting unless your account needs a different setup. The run automatically retries once on a different connection when a page is refused, and it fails with a clear message only if every page in the run was refused; if at least one page succeeded, the run finishes with the listings it did read plus a note about which pages could not be read.
FAQ
How much does it cost?
You pay a per-run start fee plus a fee for each listing returned in the dataset, and an extra fee only for listings whose detail fields were actually fetched, when Fetch listing details is switched on (it is off by default). With that toggle off, pasting a single listing link already returns that listing's own page fields without the enrichment fee, since the page's own load already carries them; with the toggle on, that same listing's page is fetched again to confirm the detail fields, and the enrichment fee applies to it like any other listing. The toggle mainly matters for map and keyword-search results, where each article otherwise needs its own extra request to pick up those fields. The Pricing tab shows the current rates.
Is it legal to scrape Naver Land?
This actor collects only publicly available listing data. You are responsible for how you use it: follow Naver's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution, especially anything involving contact details tied to an individual agent or agency.
Can I get only new, changed or removed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode with a State key you choose. To ever see a REAPPEARED listing later, also turn on Emit expired listings: that is the only setting that lets the actor record a listing as gone in the first place. Leaving it off means a listing that vanishes and later comes back is simply reported as UPDATED or UNCHANGED against its last known snapshot, never REAPPEARED.
What is the difference between Resume and Incremental mode?
Resume continues one specific interrupted run by its run or dataset ID, skipping listings that run already collected; it is a one-off catch-up. Incremental mode instead keeps a standing baseline for a whole scope (keywords, URLs, and the detail setting) across separate scheduled runs, and classifies each listing as new, updated, unchanged, reappeared or expired. The two cannot be used in the same run.
Why did my run fail instead of returning an empty dataset?
If every page in the run is refused, the run stops with a clear message so a genuine empty result (a rendered page with no listings) is never confused with a page that could not be read at all. If only some pages were refused, the run still finishes and delivers what it could read, with a status message naming how many pages were missed.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each listing into Notion, Linear or Airtable.
🔗 Want more Naver data?
Pair this actor with these related scrapers from the same team:
| 🛒 Naver Shopping Scraper Scrape Naver Shopping products by Korean or English keyword, or by URL. Returns 190+... | ✈️ Naver Map Scraper From $1/1K. Scrape Naver Map places by keyword or URL: names, categories, ratings... |
| 🚗 Dubizzle.com Scraper From $1/1K. Scrape dubizzle.com across the UAE for property, motors, and agent listings... | 🏠 Dot Property + Lamudi PH Scraper Scrape Philippines property listings from dotproperty.com.ph and lamudi.com.ph with exact... |
| 🔌 Zigbang Scraper Scrape Zigbang property listings across Seoul and South Korea, including one-room, villa... | 🏠 591.com.tw Scraper Extract property listings from 591房屋交易網 591.com.tw, Taiwan’s largest real estate... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.