# Sarangbang Scraper — Korea Property Data & API (`sian.agency/sarangbang-property-scraper`) Actor

Sarangbang scraper & real estate data API for one of Korea's biggest property portals. Sale, jeonse & monthly-rent listings nationwide: price, deposit, rent, size, floor, address, agency, phone, photos — clean JSON/CSV. Fast overview or full detail. No-code, no API key needed.

- **URL**: https://apify.com/sian.agency/sarangbang-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 overview listings

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Sarangbang Korea Property Scraper — Real Estate Data & API 🏠🇰🇷

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store-Dabang Korea Property](https://img.shields.io/badge/Store-Dabang%20Korea%20Property-1AE392)](https://apify.com/sian.agency/dabang-property-scraper?fpr=sian) [![Store-Homemate Korea Property](https://img.shields.io/badge/Store-Homemate%20Korea%20Property-1AE392)](https://apify.com/sian.agency/homemate-property-scraper?fpr=sian) [![Store-Goo Housing Property](https://img.shields.io/badge/Store-Goo%20Housing%20Property-1AE392)](https://apify.com/sian.agency/goo-housing-property-scraper?fpr=sian)

#### 🎉 Pull every Sarangbang listing into clean JSON or CSV — ~90% of fields straight from the source, no account or API key needed
##### For Korean real-estate analysts, proptech teams, investors and agencies who need structured property data fast

---

### 📋 Overview

**Need structured property data from one of Korea's biggest real-estate portals?** This actor turns Sarangbang (home.sarangbang.com) listings — apartments, villas, officetels, houses and commercial — into clean, ready-to-use datasets across all of South Korea, for sale (매매), jeonse (전세) and monthly rent (월세).

**Why teams choose this scraper:**
- ✅ **~90% field coverage in one fast pass**: price, deposit, monthly rent, supply & exclusive area, floor, address, agency, phone and photos — straight from the listing feed.
- ⚡ **Fast Overview mode**: paginate thousands of listings quickly, no per-page browser overhead.
- 🎯 **Detail enrichment on demand**: add full road address, legal-dong code, lot number and the complete photo gallery only when you need them.
- 💰 **Transparent pay-per-result pricing**: you're charged per listing extracted — no charge until your input is validated.
- 💎 **Korea-native**: KRW pricing, square-metre areas, correct sale/jeonse/monthly-rent split — no guesswork.
- ✨ **No-code or API**: run from the Apify console or call it from any language.

---

### ✨ Features

- 🏠 **All property types**: apartments (apt), officetels (city), villas, studios, houses, offices and commercial.
- 🤝 **All deal types**: sale (매매), jeonse (전세) and monthly rent (월세) — with deposit and monthly-rent split out cleanly.
- 📂 **Search by category**: pick a property type and region, no URL fiddling.
- 🔗 **Search by URL**: paste a Sarangbang search-results link and every filter carries through.
- 🔎 **Detail enrichment**: full road address, legal-dong code, lot number and full photo gallery per listing.
- 💴 **Korea-native fields**: KRW prices, ㎡ areas, computed price-per-㎡.
- 🖼️ **Photo galleries**: every listing image URL, plus a cover thumbnail.
- 📊 **Clean exports**: JSON, CSV or Excel directly from the Apify dataset.

---

### 🎬 Quick Start

Pick a mode, set a category or paste a search URL, and run. Results land in the dataset as clean rows you can export to JSON, CSV or Excel. Start with FREE-tier runs to see the data, then scale up.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~sarangbang-property-scraper/runs?token=YOUR_TOKEN \
-H 'Content-Type: application/json' \
-d '{"scrapeMode":"overview","searchMode":"byCategory","cat":"life","menu":"apt","maxResults":100}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose your data

Pick **Overview** (fast, ~90% of fields) or **Detail** (overview + per-listing enrichment).

#### Step 2: Choose your search

Select a category + region, paste a Sarangbang search URL, or (Detail only) supply specific listing URLs / record numbers.

#### Step 3: Run and export

Click **Start** (or call the API). Export the dataset as JSON, CSV or Excel.

**That's it! In a couple of minutes, you'll have:**

- A clean dataset of Korean property listings
- Prices, deposits, rents, sizes, floors, addresses, agencies and photos
- Ready-to-analyze JSON/CSV

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (fast) or `detail` (overview + enrichment) |
| searchMode | string | No | `byCategory`, `bySearchUrl`, or `byListingUrl` (Detail only) |
| cat | string | No | Top category: `life` (residential), `biz`, `land` |
| menu | string | No | Property type: `apt`, `city`, `villa`, `studio`, `house`, `office` |
| area1 / area2 / area3 | string | No | Region codes (province / district / neighbourhood) |
| opt | string | No | Specific apartment-complex code |
| submenu | string | No | Deal type: `sell` or `rent` |
| minPrice / maxPrice | integer | No | Price range filter (KRW) |
| minArea / maxArea | integer | No | Area range filter (㎡) |
| orderby / sort | string | No | Sort key and direction |
| searchUrls | array | No | Sarangbang search-results URLs |
| listingUrls | array | No | Detail-page URLs or record numbers (Detail mode) |
| maxResults | integer | No | Max listings per run (FREE: 25, PAID: unlimited) |

**Example — overview by category:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "byCategory",
  "cat": "life",
  "menu": "apt",
  "maxResults": 200
}
```

**Example — detail from a search URL:**

```json
{
  "scrapeMode": "detail",
  "searchMode": "bySearchUrl",
  "searchUrls": ["https://home.sarangbang.com/v2/page/linead/search.html?cat=life&menu=apt&area1=46"],
  "maxResults": 50
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **39 fields** including:

| Field | Type | Description |
|-------|------|-------------|
| id | string | Sarangbang record number |
| propertyTitle | string | Listing title |
| property\_type | string | apt / city / villa / studio / house / office |
| deal\_type | string | sell (매매) or rent (전세 / 월세) |
| price | integer | Sale price or deposit (KRW) |
| deposit | integer | Deposit for jeonse / monthly rent (KRW) |
| monthly\_rent | integer | Monthly rent for 월세 (KRW) |
| price\_per\_m2\_krw | integer | Computed price per square metre |
| area\_supply\_m2 | number | Supply area (㎡) |
| area\_exclusive\_m2 | number | Exclusive area (㎡) |
| floor | string | Floor |
| dong | string | Neighbourhood |
| address | string | Address summary |
| road\_address | string | Road address (Detail) |
| seller\_name | string | Agency / agent |
| seller\_tel | string | Agency phone |
| images | array | All photo URLs |

**Example:**

```json
{
  "id": "20260619110803580",
  "propertyTitle": "글로벌",
  "property_type": "apt",
  "deal_type": "sell",
  "money_type": "매매",
  "price": 180000000,
  "price_per_m2_krw": 2435064,
  "area_supply_m2": 99.11,
  "area_exclusive_m2": 73.92,
  "floor": "13",
  "dong": "나주 남평읍",
  "road_address": "나주시 남평읍 동사리",
  "seller_name": "남평공인중개사",
  "seller_tel": "010-8513-4984",
  "image_count": 33,
  "source": "overview"
}
```

***

### 💼 Use Cases & Examples

#### 1. Korean property market research

**Analysts tracking price and supply across cities and neighbourhoods.**

**Input:** A category + region, Overview mode.
**Output:** A clean dataset of listings with prices, deposits, rents and areas.
**Use:** Build price indices and supply dashboards by district.

#### 2. Investment & rental-yield modelling

**Investors comparing sale prices against jeonse/monthly-rent levels.**

**Input:** Two runs — one `submenu=sell`, one `submenu=rent`, same region.
**Output:** Matched sale and rental datasets with deposits and monthly rents.
**Use:** Compute gross yields and jeonse-to-price ratios.

#### 3. Proptech & data pipelines

**Engineering teams feeding listings into a product or warehouse.**

**Input:** Scheduled runs via the API.
**Output:** Fresh JSON appended to your store on a schedule.
**Use:** Keep your Korea property dataset continuously up to date.

#### 4. Lead generation for agencies

**Agencies sourcing listing agencies and contact numbers.**

**Input:** Overview mode over a target region.
**Output:** Agency names and phone numbers attached to each listing.
**Use:** Build a verified contact list of active agents.

#### 5. Listing enrichment

**Teams that already have record numbers and need full detail.**

**Input:** Detail mode, `byListingUrl` with record numbers.
**Output:** Road address, legal-dong code, lot number and full photo gallery.
**Use:** Enrich an existing catalogue with authoritative location data.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/sarangbang-property-scraper').call({
  scrapeMode: 'overview', searchMode: 'byCategory', cat: 'life', menu: 'apt', maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/sarangbang-property-scraper').call(
    run_input={'scrapeMode': 'overview', 'searchMode': 'byCategory', 'cat': 'life', 'menu': 'apt', 'maxResults': 100}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~sarangbang-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"scrapeMode":"overview","searchMode":"byCategory","cat":"life","menu":"apt","maxResults":100}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle the JSON results
4. **Action**: Save, notify, or transform

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run — full feature access, same data quality
- No credit card required
- Perfect for testing and small projects

#### PAID Tier (Production Ready)

- **Unlimited** listings per run
- Pay-per-result: only charged for listings actually extracted
- Fast, direct extraction — no per-page browser overhead

💰 **Pay only for what you pull** — a cheap, high-volume Overview event plus an optional Detail enrichment event.

🔗 [View current pricing](https://apify.com/sian.agency/sarangbang-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many listings can I extract?**
A: FREE tier: 25 per run. PAID tier: unlimited.

**Q: What's the difference between Overview and Detail mode?**
A: Overview returns ~90% of fields fast from the listing feed. Detail additionally fetches each listing page to add road address, legal-dong code, lot number and the full photo gallery.

**Q: Does it handle sale, jeonse and monthly rent?**
A: Yes — sale (매매), jeonse (전세) and monthly rent (월세), with deposit and monthly rent split into separate fields.

**Q: What output formats are available?**
A: JSON, CSV and Excel — export directly from the Apify dataset.

**Q: Do I need an account or API key for the source site?**
A: No. No account, no key, no manual login.

**Q: Can I run it on a schedule?**
A: Yes — schedule it in the Apify console or trigger it from the API.

**Q: Is this legal?**
A: We only extract publicly available listing data. See the legal section below.

***

### 🐛 Troubleshooting

**No results returned**

- Check your category (`cat`/`menu`) and region codes are valid Sarangbang codes.
- If using `bySearchUrl`, confirm the URL is a Sarangbang search-results page.

**Fewer results than expected**

- FREE tier caps at 25 listings per run — increase `maxResults` on the PAID tier.
- Tighten or loosen your price/area filters.

**Detail mode returns the same fields as Overview**

- Detail enrichment adds a few fields (road address, legal-dong code, lot number, full gallery); most fields already come from Overview.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

> **Trademark note:** "Sarangbang" and any related names, logos and brands are the property of their respective owners. This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the operators of home.sarangbang.com. It accesses only publicly available data.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `scrapeMode` (type: `string`):

**Overview** is the fast, cheap path — paginates Sarangbang's listing feed and returns ~90% of every field straight from the source (price, deposit, monthly rent, size, floor, address, agency, phone, photos). **Detail** additionally fetches each listing page to enrich a few extras (full road address, legal-dong code, lot number, full photo gallery).

## `searchMode` (type: `string`):

**By category** — pick a property type and (optionally) a region by its Sarangbang code. **By search URL** — paste a Sarangbang search-results page URL and every filter carries through. **By listing URL** — supply specific listing pages or record numbers (Detail mode only).

## `cat` (type: `string`):

Top-level Sarangbang category. `life` = residential (default), `biz` = commercial, `land` = land/plots.

## `menu` (type: `string`):

Property type within the category. Common residential values: `apt` (apartment), `city` (officetel), `villa`, `studio`, `house`, `office`.

## `area1` (type: `string`):

Top-level province/metro region code (e.g. Seoul, Gyeonggi). Copy it from a Sarangbang search URL (`area1=...`). Optional — leave blank for nationwide.

## `area2` (type: `string`):

District (city / gu / gun) code. Copy from a search URL (`area2=...`). Optional.

## `area3` (type: `string`):

Neighbourhood (legal-dong) code. Copy from a search URL (`area3[]=...`). Optional.

## `opt` (type: `string`):

Specific apartment-complex code to restrict results to one complex. Copy from a search URL (`opt[]=...`). Optional.

## `submenu` (type: `string`):

Restrict to one deal type, e.g. `sell` (매매 sale) or `rent` (전세 jeonse / 월세 monthly). Optional — leave blank for all deal types.

## `minPrice` (type: `integer`):

Minimum price filter in Korean won. Optional.

## `maxPrice` (type: `integer`):

Maximum price filter in Korean won. Optional.

## `minArea` (type: `integer`):

Minimum area in square metres. Optional.

## `maxArea` (type: `integer`):

Maximum area in square metres. Optional.

## `orderby` (type: `string`):

Result ordering: `regdate` (newest), `num2_asc`/`num2_desc` (price), `area_asc`/`area_desc` (area), `floor_asc`/`floor_desc` (floor).

## `sort` (type: `string`):

Sort direction for the chosen key.

## `searchUrls` (type: `array`):

Paste one or more Sarangbang search-results page URLs (https://home.sarangbang.com/v2/page/linead/search.html?...). Every filter in the URL carries through. Used when Search Mode = By search URL.

**TIP:** Build the search you want on sarangbang.com, then copy the address-bar URL.

## `listingUrls` (type: `array`):

Detail mode only. Supply specific Sarangbang detail-page URLs (https://home.sarangbang.com/v2/page/linead/detail.html?l\_type=apt\&recordno=...) or bare record numbers. Used when Search Mode = By listing URL.

## `lType` (type: `string`):

Property type used when expanding bare record numbers into detail URLs (default `apt`).

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

Maximum listings to return per run. FREE tier is capped at 25; PAID tier is unlimited.

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "byCategory",
  "cat": "life",
  "menu": "apt",
  "orderby": "regdate",
  "sort": "desc",
  "lType": "apt",
  "maxResults": 100
}
```

# Actor output Schema

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

The full dataset of scraped Sarangbang property listings.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/sarangbang-property-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/sarangbang-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call sian.agency/sarangbang-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sian.agency/sarangbang-property-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Sarangbang Scraper — Korea Property Data & API",
        "description": "Sarangbang scraper & real estate data API for one of Korea's biggest property portals. Sale, jeonse & monthly-rent listings nationwide: price, deposit, rent, size, floor, address, agency, phone, photos — clean JSON/CSV. Fast overview or full detail. No-code, no API key needed.",
        "version": "1.0",
        "x-build-id": "dgg1BjhuKTW1khXVt"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~sarangbang-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-sarangbang-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sian.agency~sarangbang-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-sarangbang-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sian.agency~sarangbang-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-sarangbang-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "scrapeMode": {
                        "title": "🧭 Scrape Mode",
                        "enum": [
                            "overview",
                            "detail"
                        ],
                        "type": "string",
                        "description": "**Overview** is the fast, cheap path — paginates Sarangbang's listing feed and returns ~90% of every field straight from the source (price, deposit, monthly rent, size, floor, address, agency, phone, photos). **Detail** additionally fetches each listing page to enrich a few extras (full road address, legal-dong code, lot number, full photo gallery).",
                        "default": "overview"
                    },
                    "searchMode": {
                        "title": "🔀 Search Mode",
                        "enum": [
                            "byCategory",
                            "bySearchUrl",
                            "byListingUrl"
                        ],
                        "type": "string",
                        "description": "**By category** — pick a property type and (optionally) a region by its Sarangbang code. **By search URL** — paste a Sarangbang search-results page URL and every filter carries through. **By listing URL** — supply specific listing pages or record numbers (Detail mode only).",
                        "default": "byCategory"
                    },
                    "cat": {
                        "title": "🏷️ Category",
                        "type": "string",
                        "description": "Top-level Sarangbang category. `life` = residential (default), `biz` = commercial, `land` = land/plots.",
                        "default": "life"
                    },
                    "menu": {
                        "title": "🏠 Property Type",
                        "type": "string",
                        "description": "Property type within the category. Common residential values: `apt` (apartment), `city` (officetel), `villa`, `studio`, `house`, `office`.",
                        "default": "apt"
                    },
                    "area1": {
                        "title": "🗺️ Region Code (시도)",
                        "type": "string",
                        "description": "Top-level province/metro region code (e.g. Seoul, Gyeonggi). Copy it from a Sarangbang search URL (`area1=...`). Optional — leave blank for nationwide."
                    },
                    "area2": {
                        "title": "📍 District Code (시군구)",
                        "type": "string",
                        "description": "District (city / gu / gun) code. Copy from a search URL (`area2=...`). Optional."
                    },
                    "area3": {
                        "title": "📌 Legal-dong Code (읍면동)",
                        "type": "string",
                        "description": "Neighbourhood (legal-dong) code. Copy from a search URL (`area3[]=...`). Optional."
                    },
                    "opt": {
                        "title": "🏢 Complex / Apartment Code",
                        "type": "string",
                        "description": "Specific apartment-complex code to restrict results to one complex. Copy from a search URL (`opt[]=...`). Optional."
                    },
                    "submenu": {
                        "title": "🤝 Deal Type",
                        "type": "string",
                        "description": "Restrict to one deal type, e.g. `sell` (매매 sale) or `rent` (전세 jeonse / 월세 monthly). Optional — leave blank for all deal types."
                    },
                    "minPrice": {
                        "title": "💰 Min Price (KRW)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum price filter in Korean won. Optional."
                    },
                    "maxPrice": {
                        "title": "💰 Max Price (KRW)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum price filter in Korean won. Optional."
                    },
                    "minArea": {
                        "title": "📐 Min Area (㎡)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum area in square metres. Optional."
                    },
                    "maxArea": {
                        "title": "📐 Max Area (㎡)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum area in square metres. Optional."
                    },
                    "orderby": {
                        "title": "↕️ Sort By",
                        "enum": [
                            "regdate",
                            "num2_asc",
                            "num2_desc",
                            "area_asc",
                            "area_desc",
                            "floor_asc",
                            "floor_desc"
                        ],
                        "type": "string",
                        "description": "Result ordering: `regdate` (newest), `num2_asc`/`num2_desc` (price), `area_asc`/`area_desc` (area), `floor_asc`/`floor_desc` (floor).",
                        "default": "regdate"
                    },
                    "sort": {
                        "title": "🔃 Sort Direction",
                        "enum": [
                            "desc",
                            "asc"
                        ],
                        "type": "string",
                        "description": "Sort direction for the chosen key.",
                        "default": "desc"
                    },
                    "searchUrls": {
                        "title": "🔗 Search URLs",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Paste one or more Sarangbang search-results page URLs (https://home.sarangbang.com/v2/page/linead/search.html?...). Every filter in the URL carries through. Used when Search Mode = By search URL.\n\n**TIP:** Build the search you want on sarangbang.com, then copy the address-bar URL.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "listingUrls": {
                        "title": "🔎 Listing URLs / Record Numbers",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Detail mode only. Supply specific Sarangbang detail-page URLs (https://home.sarangbang.com/v2/page/linead/detail.html?l_type=apt&recordno=...) or bare record numbers. Used when Search Mode = By listing URL.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "lType": {
                        "title": "🏠 Listing Type (for record numbers)",
                        "type": "string",
                        "description": "Property type used when expanding bare record numbers into detail URLs (default `apt`).",
                        "default": "apt"
                    },
                    "maxResults": {
                        "title": "🔢 Max Results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum listings to return per run. FREE tier is capped at 25; PAID tier is unlimited.",
                        "default": 100
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
