# KB Land Scraper — South Korea Property Data & KB 시세 API (`sian.agency/kbland-property-scraper`) Actor

KB Land scraper & real estate data API for kbland.kr (South Korea). Apartment complexes, official KB 시세 valuations (sale/jeonse/monthly), regional price markers, jeonse ratios & recent deals — clean JSON/CSV. Fast overview or full complex detail. No account needed. 한국 부동산 데이터·KB시세 스크래퍼.

- **URL**: https://apify.com/sian.agency/kbland-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 records

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

## KB Land Scraper — South Korea Property Data & KB 시세 API 🏠🇰🇷

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Immobiliare Scraper](https://img.shields.io/badge/Store-Immobiliare%20Scraper-E60023)](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian) [![Suumo Scraper](https://img.shields.io/badge/Store-Suumo%20Property-1AE392)](https://apify.com/sian.agency/suumo-property-scraper?fpr=sian) [![Zillow Scraper](https://img.shields.io/badge/Store-Zillow%20Property-1F4E79)](https://apify.com/sian.agency/zillow-property-scraper?fpr=sian)

#### 🎉 Pull Korea's bank-grade KB 시세 valuations and apartment-complex data — clean JSON, no account, pay only per result
##### Built for proptech teams, market analysts, investors, and data engineers who need reliable Korean real estate data

---

### 📋 Overview

**Tap into Korea's most trusted property valuations.** This actor turns KB Land (kbland.kr) — the real estate platform run by Korea's largest bank — into clean, structured datasets: apartment complexes, official KB 시세 valuations (sale / jeonse / monthly), regional price markers, jeonse ratios, and recent transaction prices.

**Why teams choose this actor:**
- ✅ **Official KB valuations**: the same 시세 numbers Korean banks use for mortgage lending — sale, jeonse, and monthly, with high/low bands
- ⚡ **Two speeds, one tool**: cheap regional price markers for whole-market sweeps, or full complex detail when you need every field
- 🎯 **60+ data points per complex**: spec, unit types, regulations, GPS, recent deal price, floor, and date
- 💰 **Pay-per-result pricing**: no charge until your input validates — only pay for records you actually receive
- 💎 **No account, no API key**: paste a map viewport or a complex serial and run — no login to kbland.kr required
- ✨ **Clean exports**: JSON, CSV, or Excel straight from the dataset

---

### ✨ Features

- 🗺️ **Regional price markers**: average sale/jeonse prices, price-per-pyeong, jeonse ratio, and monthly change per district (동/구)
- 🇰🇷 **Whole-country sweep**: auto-tile every province (시도) in one run
- 🏢 **Full complex detail**: name, type, build year, households, floors, parking, heating, builder, FAR/BCR
- 🏦 **Official KB 시세**: sale/jeonse/monthly valuations with high/low bands and AI-valuation flag
- 🤝 **Recent deal price**: most recent actual transaction price, floor, and date
- 📊 **Jeonse-ratio analytics**: the lease-to-price ratio that drives Korean rental investment
- 📐 **Unit-type breakdown**: per-floorplan areas (supply / exclusive / contract), rooms, baths, household counts
- ⚖️ **Regulatory flags**: speculation-zone and adjustment-area markers
- 🌐 **Map-ready geodata**: WGS84 latitude/longitude on every record
- 📷 **Optional photos**: pull complex images on demand

---

### 🎬 Quick Start

Pick a mode, point it at a viewport (overview) or a complex serial (detail), and run. Results land in the dataset within seconds.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~kbland-property-scraper/runs?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"scrapeMode": "overview", "searchMode": "byBbox", "bboxes": ["37.488,127.041,37.560,127.110"]}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose a mode

**Overview** for regional KB price markers (cheap, whole-market) or **Detail** for full complex records with KB 시세.

#### Step 2: Set your target

Paste a map viewport (`swLat,swLng,neLat,neLng`) for overview, or apartment-complex serial numbers (단지기본일련번호) for detail.

#### Step 3: Run and export

Click **Start** and export your dataset as JSON, CSV, or Excel.

**That's it! In under a minute, you'll have:**

- District-level KB price markers across your viewport
- Full apartment-complex records with official valuations
- Clean, analysis-ready data with GPS coordinates

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (regional markers) or `detail` (full complex) |
| searchMode | string | No | `byBbox` / `bySido` (overview) or `bySerial` (detail) |
| bboxes | array | No | Map viewports `swLat,swLng,neLat,neLng` (overview) |
| complexSerials | array | No | Apartment-complex serials 단지기본일련번호 (detail) |
| level | integer | No | Map zoom level for marker granularity (default 15) |
| priceStatus | string | No | `1` KB 시세 or `2` actual transactions |
| withPhotos | boolean | No | Include complex photos in detail mode |
| filters | object | No | Advanced KB Land filter keys (verbatim) |
| maxResults | integer | No | Max records per run |

**Example — overview by viewport:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "byBbox",
  "bboxes": ["37.488,127.041,37.560,127.110"]
}
```

**Example — detail by complex serial:**

```json
{
  "scrapeMode": "detail",
  "searchMode": "bySerial",
  "complexSerials": ["2030"]
}
```

***

### 📤 Output

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

| Field | Type | Description |
|-------|------|-------------|
| propertyTitle | string | Apartment complex name (단지명) |
| sale\_price\_avg\_krw | number | Average KB sale valuation (KRW) |
| jeonse\_price\_avg\_krw | number | Average KB jeonse valuation (KRW) |
| recent\_deal\_price\_krw | number | Most recent actual transaction price (KRW) |
| jeonse\_ratio | number | Jeonse-to-sale ratio (전세가율 %) |
| sale\_price\_per\_pyeong\_krw | number | Average sale price per pyeong (overview) |
| build\_year | number | Year the complex was completed |
| households\_total | number | Total households |
| dong\_name | string | Neighborhood / dong |
| latitude / longitude | number | WGS84 coordinates |
| unit\_types | array | Per-floorplan area / room / bath breakdown |
| url | string | KB Land page link |

**Example record (detail):**

```json
{
  "id": "2030",
  "source": "detail",
  "propertyTitle": "건진",
  "category": "아파트",
  "dong_name": "목동",
  "recent_deal_price_krw": 270000000,
  "is_ai_valuation": true,
  "build_year": 1994,
  "households_total": 18,
  "latitude": 37.5371,
  "longitude": 126.8688,
  "currency": "KRW",
  "url": "https://kbland.kr/map?xy=37.5371,126.8688,17&단지기본일련번호=2030"
}
```

***

### 💼 Use Cases & Examples

#### 1. Korea Property Market Research

**Analysts mapping price trends across Seoul, Busan, and beyond.**

**Input:** A city or province viewport in overview mode
**Output:** District-level average sale/jeonse prices, price-per-pyeong, and monthly change
**Use:** Build heatmaps and track regional momentum.

#### 2. KB Valuation Benchmarking

**Lenders and proptech teams comparing asking prices to official KB 시세.**

**Input:** Complex serials in detail mode
**Output:** Sale/jeonse valuations with high/low bands and recent deal prices
**Use:** Flag over- or under-priced listings against the bank benchmark.

#### 3. Jeonse-Ratio Investment Screening

**Investors hunting high jeonse-ratio complexes (low cash outlay).**

**Input:** A target district viewport
**Output:** Jeonse ratio (전세가율) per region
**Use:** Rank neighborhoods by leverage potential.

#### 4. Proptech Data Feeds

**Apps and dashboards needing fresh Korean valuation data.**

**Input:** Scheduled runs over your coverage area
**Output:** Clean JSON ready to ingest
**Use:** Power valuation widgets, alerts, and comparables.

#### 5. Comparables & Appraisal

**Appraisers gathering recent transactions and complex specs.**

**Input:** Complex serials in detail mode
**Output:** Recent deal price/floor/date, build year, FAR/BCR, unit types
**Use:** Assemble defensible comparables fast.

***

### 🔗 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/kbland-property-scraper').call({
  scrapeMode: 'detail',
  searchMode: 'bySerial',
  complexSerials: ['2030'],
});

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/kbland-property-scraper').call(
    run_input={'scrapeMode': 'overview', 'searchMode': 'byBbox',
               'bboxes': ['37.488,127.041,37.560,127.110']}
)

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

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~kbland-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"scrapeMode": "detail", "searchMode": "bySerial", "complexSerials": ["2030"]}'
```

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

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

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

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

#### PAID Tier (Production Ready)

- **Unlimited** records per run
- Faster throughput, no caps
- Pay-per-result: only charged for records you receive

💰 **Transparent pay-per-result** — the cheap overview event drives the headline price; detail enrichment is a separate per-record event.

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

***

### ❓ Frequently Asked Questions

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

**Q: What is KB 시세?**
A: KB 시세 is the official market valuation published by KB (Kookmin Bank) — the benchmark Korean banks use for mortgage lending. This actor returns sale, jeonse, and monthly valuations with high/low bands.

**Q: What's the difference between overview and detail mode?**
A: Overview crawls cheap regional price markers across a map area. Detail pulls a full apartment complex (60+ fields) including the KB 시세 valuation.

**Q: Where do I find a complex serial number?**
A: It's the 단지기본일련번호 in the kbland.kr complex URL. You can also run overview first to scope regions.

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

**Q: Do I need a kbland.kr account?**
A: No. No account, login, or API key is required.

**Q: Is this legal?**
A: Yes — only publicly available data is collected. See the legal section below.

***

### 🐛 Troubleshooting

**No records in overview mode**

- Check your bbox format: `swLat,swLng,neLat,neLng` (south-west corner first)
- Widen the viewport or lower the `level` value for coarser districts

**Empty detail record**

- Confirm the complex serial (단지기본일련번호) is valid and numeric
- Some very small complexes have partial KB valuation data

**Hit the FREE cap**

- FREE runs stop at 25 records — upgrade to PAID for unlimited output

***

### ⚖️ 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 platform 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 notice:** This actor is an independent tool and is **not** affiliated with, endorsed by, or sponsored by KB Kookmin Bank, KB Land (kbland.kr), or any of their subsidiaries. "KB", "KB Land", "KB 시세", and all related marks are the property of their respective owners and are used here for descriptive and identification purposes only.

***

### 🤝 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** (cheap, primary): crawl regional KB price markers across a map viewport or the whole country — average sale/jeonse prices, price-per-pyeong, jeonse-ratio, monthly change, deal counts per district (동/구).

🏢 **DETAIL** (enrich): pull a full apartment complex by its KB serial number (단지기본일련번호) — complex spec, unit types, official KB 시세 valuation, recent deal price, regulations, GPS.

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

How to target what gets scraped.

🗺️ **byBbox** (overview): paste one or more map viewports.
🇰🇷 **bySido** (overview): automatically tile the whole country (one viewport per 시도 province).
🏢 **bySerial** (detail): paste apartment-complex serial numbers.

Leave on **auto** to use byBbox for overview / bySerial for detail.

## `bboxes` (type: `array`):

🗺️ **OVERVIEW · byBbox:** One or more map viewports to crawl for regional KB price markers.

Format each as `swLat,swLng,neLat,neLng` (south-west corner, then north-east corner).

**Example (Seoul Gangnam belt):** `37.488,127.041,37.560,127.110`

💡 **TIP:** Use **bySido** mode instead to auto-tile the whole country.

🆓 **FREE users:** up to 25 records per run · 💎 **PAID users:** unlimited.

## `complexSerials` (type: `array`):

🏢 **DETAIL · bySerial:** Apartment-complex serial numbers (단지기본일련번호) to enrich into full records with the official KB 시세 valuation.

**Example:** `2030` (목동 "건진").

💡 **TIP:** Find serials in the URL on kbland.kr, or run overview first to discover regions.

🆓 **FREE users:** up to 25 records per run · 💎 **PAID users:** unlimited.

## `level` (type: `integer`):

🔍 Map zoom level driving marker granularity for overview crawls. Lower = wider districts (시군구); higher = finer (동). Default 15.

## `priceStatus` (type: `string`):

💹 Which price basis the regional markers use: KB official 시세, or actual transacted (실거래) prices.

## `withPhotos` (type: `boolean`):

📷 In detail mode, also fetch complex photos (one extra request per complex). Off by default to keep runs fast and cheap.

## `filters` (type: `object`):

🎛️ **Advanced:** Pass KB Land's own filter keys verbatim (Korean keys) as a JSON object, e.g. `{ "물건종류": "01" }` for apartments only. Unknown keys are ignored. Most users can leave this empty.

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

🔢 Upper bound on records saved this run. 🆓 FREE is capped at 25; 💎 PAID is unlimited (this value still applies as a ceiling).

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "byBbox",
  "bboxes": [
    "37.488,127.041,37.560,127.110"
  ],
  "complexSerials": [
    "2030"
  ],
  "level": 15,
  "priceStatus": "2",
  "withPhotos": false,
  "filters": {},
  "maxResults": 100
}
```

# Actor output Schema

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

Complex detail records (with KB 시세) and regional price markers.

# 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 = {
    "scrapeMode": "overview",
    "searchMode": "byBbox",
    "bboxes": [
        "37.488,127.041,37.560,127.110"
    ],
    "complexSerials": [
        "2030"
    ],
    "filters": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/kbland-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 = {
    "scrapeMode": "overview",
    "searchMode": "byBbox",
    "bboxes": ["37.488,127.041,37.560,127.110"],
    "complexSerials": ["2030"],
    "filters": {},
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/kbland-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 '{
  "scrapeMode": "overview",
  "searchMode": "byBbox",
  "bboxes": [
    "37.488,127.041,37.560,127.110"
  ],
  "complexSerials": [
    "2030"
  ],
  "filters": {}
}' |
apify call sian.agency/kbland-property-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "KB Land Scraper — South Korea Property Data & KB 시세 API",
        "description": "KB Land scraper & real estate data API for kbland.kr (South Korea). Apartment complexes, official KB 시세 valuations (sale/jeonse/monthly), regional price markers, jeonse ratios & recent deals — clean JSON/CSV. Fast overview or full complex detail. No account needed. 한국 부동산 데이터·KB시세 스크래퍼.",
        "version": "1.0",
        "x-build-id": "wmxUclfe7iqq5AskS"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~kbland-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-kbland-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~kbland-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-kbland-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~kbland-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-kbland-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** (cheap, primary): crawl regional KB price markers across a map viewport or the whole country — average sale/jeonse prices, price-per-pyeong, jeonse-ratio, monthly change, deal counts per district (동/구).\n\n🏢 **DETAIL** (enrich): pull a full apartment complex by its KB serial number (단지기본일련번호) — complex spec, unit types, official KB 시세 valuation, recent deal price, regulations, GPS.",
                        "default": "overview"
                    },
                    "searchMode": {
                        "title": "🔎 Search Mode",
                        "enum": [
                            "byBbox",
                            "bySido",
                            "bySerial"
                        ],
                        "type": "string",
                        "description": "How to target what gets scraped.\n\n🗺️ **byBbox** (overview): paste one or more map viewports.\n🇰🇷 **bySido** (overview): automatically tile the whole country (one viewport per 시도 province).\n🏢 **bySerial** (detail): paste apartment-complex serial numbers.\n\nLeave on **auto** to use byBbox for overview / bySerial for detail.",
                        "default": "byBbox"
                    },
                    "bboxes": {
                        "title": "🗺️ Map Viewports (Overview)",
                        "type": "array",
                        "description": "🗺️ **OVERVIEW · byBbox:** One or more map viewports to crawl for regional KB price markers.\n\nFormat each as `swLat,swLng,neLat,neLng` (south-west corner, then north-east corner).\n\n**Example (Seoul Gangnam belt):** `37.488,127.041,37.560,127.110`\n\n💡 **TIP:** Use **bySido** mode instead to auto-tile the whole country.\n\n🆓 **FREE users:** up to 25 records per run · 💎 **PAID users:** unlimited.",
                        "default": [
                            "37.488,127.041,37.560,127.110"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "complexSerials": {
                        "title": "🏢 Complex Serial Numbers (Detail)",
                        "type": "array",
                        "description": "🏢 **DETAIL · bySerial:** Apartment-complex serial numbers (단지기본일련번호) to enrich into full records with the official KB 시세 valuation.\n\n**Example:** `2030` (목동 \"건진\").\n\n💡 **TIP:** Find serials in the URL on kbland.kr, or run overview first to discover regions.\n\n🆓 **FREE users:** up to 25 records per run · 💎 **PAID users:** unlimited.",
                        "default": [
                            "2030"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "level": {
                        "title": "🔍 Map Zoom Level (Overview)",
                        "minimum": 5,
                        "maximum": 18,
                        "type": "integer",
                        "description": "🔍 Map zoom level driving marker granularity for overview crawls. Lower = wider districts (시군구); higher = finer (동). Default 15.",
                        "default": 15
                    },
                    "priceStatus": {
                        "title": "💹 Price Basis (Overview)",
                        "enum": [
                            "1",
                            "2"
                        ],
                        "type": "string",
                        "description": "💹 Which price basis the regional markers use: KB official 시세, or actual transacted (실거래) prices.",
                        "default": "2"
                    },
                    "withPhotos": {
                        "title": "📷 Include Complex Photos (Detail)",
                        "type": "boolean",
                        "description": "📷 In detail mode, also fetch complex photos (one extra request per complex). Off by default to keep runs fast and cheap.",
                        "default": false
                    },
                    "filters": {
                        "title": "🎛️ Site Filters (Overview)",
                        "type": "object",
                        "description": "🎛️ **Advanced:** Pass KB Land's own filter keys verbatim (Korean keys) as a JSON object, e.g. `{ \"물건종류\": \"01\" }` for apartments only. Unknown keys are ignored. Most users can leave this empty.",
                        "default": {}
                    },
                    "maxResults": {
                        "title": "🔢 Max Records Per Run",
                        "minimum": 1,
                        "type": "integer",
                        "description": "🔢 Upper bound on records saved this run. 🆓 FREE is capped at 25; 💎 PAID is unlimited (this value still applies as a ceiling).",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
