# Korea Apartment Prices in English: Sale, Rent & Monthly Medians (`seoulsmith/korea-apartment-transactions`) Actor

Search any Korean district by English name. Official MOLIT sale & rent records with romanized names, m²/pyeong/sqft, and monthly median summaries. No API key needed.

- **URL**: https://apify.com/seoulsmith/korea-apartment-transactions.md
- **Developed by:** [Seoul Smith](https://apify.com/seoulsmith) (community)
- **Categories:** Real estate
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Korea Apartment Prices in English: Sale, Rent & Monthly Medians

> **Source: Ministry of Land, Infrastructure and Transport (MOLIT), Republic of Korea, via the Public Data Portal (data.go.kr)**
>
> This Actor translates field names into English, romanizes place names and converts units (10,000 KRW → KRW, m² → pyeong and ft²). It also romanizes apartment complex names (keeping the Korean originals), normalizes dates to ISO 8601, adds USD amounts at an exchange rate you choose, and can calculate monthly summary statistics. The transaction figures themselves are not changed. Every record has a `source` field with this attribution and the dataset URL.

**Search any Korean district by its English name** and get official MOLIT apartment **sale** and **rent (jeonse / monthly rent)** records, plus **monthly median summaries** if you want them. No data.go.kr account or API key needed.

- **English district search.** Type `Gangnam-gu`, `Seoul Gangnam`, `Bundang` or `Haeundae`; Korean (`강남구`, `서울 강남구`) and 5-digit codes (`11680`) work too. All of Korea's ~250 si/gun/gu are covered, and a city name such as `Seoul` expands to every district in it.
- **Sales and rents in one run.** MOLIT's detailed apartment sale records and its jeonse / monthly-rent records, side by side.
- **Monthly medians.** Optional summary rows per district and month: transaction count, median / min / max price and median price per m² (for rents: deposit and median monthly rent).
- **Analysis-ready fields.** English keys, romanized names next to the Korean originals, KRW integers, m² / pyeong / sqft, ISO dates.
- **No API key needed.** The Actor uses its own data.go.kr key. You can still pass your own key for large jobs.

Typical users: foreign real-estate investors and analysts, proptech developers, journalists and researchers covering the Seoul housing market.

### How to use

1. Enter one or more **districts**, for example `Gangnam-gu`, `Seoul Seocho-gu`, `마포구` or `11680`.
2. Pick the **deal type** (sales, rentals, or both) and the **contract months** (`YYYY-MM`). By default you get the last 3 months plus the current month.
3. Optionally filter by exclusive area or apartment name, turn on **summary rows**, or add a **USD/KRW rate**.
4. Run the Actor and download the dataset as JSON, CSV, Excel or via the API. The dataset has three views: **Sales**, **Rentals** and **Summary**.

#### Example input

```json
{
    "dealType": "both",
    "districts": ["Gangnam-gu", "Seoul Seocho-gu", "Songpa"],
    "fromMonth": "2026-01",
    "toMonth": "2026-10",
    "minAreaM2": 80,
    "maxAreaM2": 90,
    "includeSummary": true,
    "usdKrwRate": 1380
}
```

### Input

| Field                    | Type                     | Default          | Description                                                                                                                                                                             |
| ------------------------ | ------------------------ | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `dealType`               | `sale` · `rent` · `both` | `sale`           | Sales, rentals (jeonse/wolse), or both                                                                                                                                                  |
| `districts`              | string\[]                 | `["Gangnam-gu"]` | English (`Gangnam-gu`, `Seoul Gangnam`), Korean (`강남구`, `서울 강남구`) or 5-digit code (`11680`). If a name exists in several cities (e.g. `Jung-gu`), add the city: `Seoul Jung-gu` |
| `fromMonth`              | string `YYYY-MM`         | 3 months ago     | First contract month                                                                                                                                                                    |
| `toMonth`                | string `YYYY-MM`         | this month       | Last contract month. At most 36 months per run                                                                                                                                          |
| `includeCancelled`       | boolean                  | `false`          | Include sales that were later cancelled                                                                                                                                                 |
| `minAreaM2`, `maxAreaM2` | number                   | none             | Exclusive-use area filter, m²                                                                                                                                                           |
| `apartmentNameContains`  | string                   | none             | Complex name contains this text (Korean or romanized)                                                                                                                                   |
| `includeSummary`         | boolean                  | `false`          | Add one summary row per district × month × deal type                                                                                                                                    |
| `usdKrwRate`             | number                   | none             | Adds USD amounts at this rate. No external exchange-rate service is used                                                                                                                |
| `serviceKey`             | string (secret)          | none             | Optional: your own data.go.kr key (Decoding key), used instead of the Actor's key                                                                                                       |
| `maxItems`               | integer                  | 10,000           | Maximum number of transaction records, to cap cost. Summary rows come on top; `0` with summary rows gives only the summary                                                              |

Months are contract months in Korea time. Data is available from January 2006.

#### District names

- English: `Gangnam-gu`, `Gangnam`, `Gangnam District`, `Seoul Gangnam`, `Gangnam-gu, Seoul`
- Korean: `강남구`, `강남`, `서울 강남구`, `서울특별시 강남구`
- Code: `11680` (the first 5 digits of the legal-dong code, `LAWD_CD`)
- Districts inside a city: `Bundang-gu`, `Seongnam Bundang-gu`, `성남시 분당구`
- Whole cities and provinces: `Seoul`, `Busan`, `Suwon`, `Gyeonggi-do` expand to all their districts
- Ambiguous names (`Jung-gu`, `Seo-gu`, `Goseong-gun`, `Gwangju`, `Jeju`) stop the run with a list of candidates. Add the city or use the code.

Recent reorganizations are handled: Gwangju and Jeollanam-do merged into **Jeonnam-Gwangju** (code 12) in 2026, Incheon's Jung-gu, Dong-gu and Seo-gu became Jemulpo-gu, Yeongjong-gu, Seohae-gu and Geomdan-gu, and Hwaseong-si and Bucheon-si were split into districts. Old names (`Gwangju Dong-gu`, `Incheon Seo-gu`) and old codes (`29110`, `42110`, `45111`) still work and are mapped to the current districts; MOLIT files historical data under the current codes.

### Output

Every record has `recordType` (`sale`, `rent` or `summary`) and `source`.

#### Common fields (sales and rentals)

| Field                                      | Description                                           | Example                           |
| ------------------------------------------ | ----------------------------------------------------- | --------------------------------- |
| `recordType`                               | `sale` · `rent` · `summary`                           | `sale`                            |
| `contractDate`                             | Contract date, ISO 8601                               | `2026-08-01`                      |
| `city` / `cityKo`                          | Province or metropolitan city                         | `Seoul` / `서울특별시`            |
| `district` / `districtKo` / `districtCode` | District                                              | `Gangnam-gu` / `강남구` / `11680` |
| `neighborhood` / `neighborhoodKo`          | Legal neighborhood (beopjeong-dong)                   | `Daechi-dong` / `대치동`          |
| `apartmentName` / `apartmentNameKo`        | Complex name: romanized reference / exact Korean name | `Eunma` / `은마`                  |
| `apartmentId`                              | Complex identifier                                    | `11680-218`                       |
| `lotNumber`                                | Lot number (jibun)                                    | `316`                             |
| `areaM2` / `areaPyeong` / `areaSqft`       | Exclusive-use area                                    | `76.79` / `23.23` / `826.56`      |
| `floor`                                    | Floor                                                 | `8`                               |
| `buildYear`                                | Year built                                            | `1979`                            |
| `source`                                   | Attribution and dataset URL                           |                                   |

> **`apartmentName` is a romanized reference, not the official name.** The exact name of the complex is `apartmentNameKo`; use it to identify, match or cite a complex. In `apartmentName`, common apartment brands and loanwords take their English spelling (자이 → Xi, 힐스테이트 → Hillstate, 아이파크 → I-Park, 래미안포레 → Raemian Forêt, 타워팰리스 → Tower Palace), the rest is Revised Romanization, and the parts are separated by spaces (마포그랑자이 → Mapogeurang Xi).

#### Sales only

| Field                           | Description                                       |
| ------------------------------- | ------------------------------------------------- |
| `priceKrw` / `priceManwon`      | Price in KRW / as published, in 10,000 KRW        |
| `pricePerM2Krw`                 | Price per m² of exclusive area                    |
| `priceUsd`                      | Price in USD (only when `usdKrwRate` is set)      |
| `dealMethod`                    | `brokered` · `direct`                             |
| `sellerType` / `buyerType`      | `individual` · `corporation` · `public` · `other` |
| `isCancelled` / `cancelledDate` | Whether and when the sale was cancelled           |
| `registrationDate`              | Title registration date, when available           |

#### Rentals only

| Field                                           | Description                                 |
| ----------------------------------------------- | ------------------------------------------- |
| `rentType`                                      | `jeonse` (no monthly rent) or `monthly`     |
| `depositKrw` / `monthlyRentKrw`                 | Deposit and monthly rent, KRW               |
| `depositUsd` / `monthlyRentUsd`                 | USD amounts (only when `usdKrwRate` is set) |
| `contractTerm`                                  | Contract term, `YYYY-MM/YYYY-MM`            |
| `contractKind`                                  | `new` · `renewal`                           |
| `previousDepositKrw` / `previousMonthlyRentKrw` | Previous terms of a renewed contract        |

#### Summary rows (`includeSummary`)

One row per district × month × deal type: `dealType`, `month`, `city`, `district`, `districtCode`, `transactionCount`, `medianPriceKrw`, `medianPricePerM2Krw`, `minPriceKrw`, `maxPriceKrw`. For rentals the prices are deposits, and `medianMonthlyRentKrw` is the median monthly rent of monthly-rent contracts. Cancelled sales never count. Filters (area, name) apply to summaries too.

#### Example sale record

A real record from a run with the default input (Gangnam-gu, sales) on 2026-11-07:

```json
{
    "recordType": "sale",
    "contractDate": "2026-08-01",
    "city": "Seoul",
    "cityKo": "서울특별시",
    "district": "Gangnam-gu",
    "districtKo": "강남구",
    "districtCode": "11680",
    "neighborhood": "Daechi-dong",
    "neighborhoodKo": "대치동",
    "apartmentName": "Eunma",
    "apartmentNameKo": "은마",
    "apartmentId": "11680-218",
    "lotNumber": "316",
    "areaM2": 76.79,
    "areaPyeong": 23.23,
    "areaSqft": 826.56,
    "floor": 8,
    "buildYear": 1979,
    "priceKrw": 3450000000,
    "priceManwon": 345000,
    "pricePerM2Krw": 44927725,
    "dealMethod": "brokered",
    "sellerType": "individual",
    "buyerType": "individual",
    "isCancelled": false,
    "cancelledDate": null,
    "registrationDate": null,
    "source": "Source: Ministry of Land, Infrastructure and Transport (MOLIT), Republic of Korea, via the Public Data Portal (data.go.kr). Dataset: https://www.data.go.kr/data/15126468/openapi.do"
}
```

#### Example rent record

From a run for `Seoul Jung-gu`, both deal types, 2026-10 to 2026-11:

```json
{
    "recordType": "rent",
    "contractDate": "2026-10-01",
    "city": "Seoul",
    "cityKo": "서울특별시",
    "district": "Jung-gu",
    "districtKo": "중구",
    "districtCode": "11140",
    "neighborhood": "Hwanghak-dong",
    "neighborhoodKo": "황학동",
    "apartmentName": "DUO302",
    "apartmentNameKo": "DUO302",
    "apartmentId": "11140-1206",
    "lotNumber": "819",
    "areaM2": 15.97,
    "areaPyeong": 4.83,
    "areaSqft": 171.9,
    "floor": 6,
    "buildYear": 2014,
    "rentType": "monthly",
    "depositKrw": 20000000,
    "monthlyRentKrw": 750000,
    "contractTerm": "2026-10/2027-09",
    "contractKind": "renewal",
    "previousDepositKrw": 20000000,
    "previousMonthlyRentKrw": 680000,
    "source": "Source: Ministry of Land, Infrastructure and Transport (MOLIT), Republic of Korea, via the Public Data Portal (data.go.kr). Dataset: https://www.data.go.kr/data/15126474/openapi.do"
}
```

#### Example summary row

From the same `Seoul Jung-gu` run (`includeSummary: true`):

```json
{
    "recordType": "summary",
    "dealType": "sale",
    "month": "2026-10",
    "city": "Seoul",
    "cityKo": "서울특별시",
    "district": "Jung-gu",
    "districtKo": "중구",
    "districtCode": "11140",
    "transactionCount": 30,
    "medianPriceKrw": 1572500000,
    "medianPricePerM2Krw": 16397807,
    "minPriceKrw": 220000000,
    "maxPriceKrw": 2280000000,
    "source": "Source: Ministry of Land, Infrastructure and Transport (MOLIT), Republic of Korea, via the Public Data Portal (data.go.kr). Dataset: https://www.data.go.kr/data/15126468/openapi.do"
}
```

### Pricing

The Actor is **free to use** during its launch period: there is no charge per result. You only pay for your own Apify platform usage, which is a fraction of a cent for a typical run (one district over four months takes about 4 seconds). The Pricing tab always shows the current price. If pay-per-event pricing is introduced later, it will be announced there before it applies.

### Limitations

- **Daily request limit.** The Actor's built-in data.go.kr key allows about 10,000 API requests per day (Korea time), shared by all users. Each district × month × deal type is one request (more when a month has over 1,000 rentals), so Seoul's 25 districts × 12 months of sales is 300 requests. If a run needs more requests than are left for the day, it stops before calling the API and says so. Try again after midnight Korea time (15:00 UTC), or use your own free data.go.kr key in `serviceKey`.
- **Reporting lag.** Contracts must be reported within 30 days, so the most recent weeks are incomplete and fill up later. In a run on 2026-11-07, Seoul Jung-gu had 30 sales for October but only 3 for November. Re-run recent months for complete figures.
- **Period.** Up to 36 months per run, from January 2006 onward.
- **Apartments only.** Officetels, row houses and land are not covered.
- **Cancellations.** MOLIT keeps cancelled sales in the data and flags them. They are excluded by default (`includeCancelled`).
- **Romanization.** Place names follow the official Revised Romanization rules. `apartmentName` is a reading aid only: about 20 common brands and loanwords use their English spelling (Raemian, Xi, Hillstate, I-Park, Prugio, Lotte Castle, The Sharp, e-Pyeonhan Sesang, SK View, The H, Heights, Tower, Park, Central, Palace, Castle, City, View, Forest, Forêt, Ville, Apt), and other brand words are transliterated (래미안블레스티지 → Raemian Beulleseutiji, not "Blesstige"). The exact name is always `apartmentNameKo`. `apartmentNameContains` matches the Korean name, `apartmentName` and a letter-by-letter spelling, ignoring case, spaces and accents (`Xi`, `raemian foret` and `Dogok` for 도곡렉슬 all work).
- **Personal data.** The source data has no personal names. Buyers and sellers are only classified as individual, corporation, public or other.

### Data source and license

| Dataset                                                                                                                              | Publisher             | License                                         |
| ------------------------------------------------------------------------------------------------------------------------------------ | --------------------- | ----------------------------------------------- |
| [국토교통부_아파트 매매 실거래가 상세 자료](https://www.data.go.kr/data/15126468/openapi.do) (apartment sale transactions, detailed) | MOLIT, via data.go.kr | No restrictions on use (이용허락범위 제한 없음) |
| [국토교통부_아파트 전월세 실거래가 자료](https://www.data.go.kr/data/15126474/openapi.do) (apartment rent transactions)              | MOLIT, via data.go.kr | No restrictions on use (이용허락범위 제한 없음) |

District names and codes come from MOLIT's 법정동 code list ([국토교통부_전국 법정동](https://www.data.go.kr/data/15063424/fileData.do), 2026-06-30).

Source: Ministry of Land, Infrastructure and Transport (MOLIT), Republic of Korea, via the Public Data Portal (data.go.kr). This Actor is not affiliated with or endorsed by MOLIT or the Public Data Portal. The data is provided as published; for official use, check the original source.

### FAQ

**Do I need a data.go.kr account?** No. If you have one, you can pass your own key to use your own quota.

**Why is the latest month small?** See "Reporting lag" under Limitations.

**Can I get officetels, row houses or land?** Not yet; this Actor covers apartments only.

**Something is wrong or missing?** Open an issue on the Issues tab.

# Actor input Schema

## `dealType` (type: `string`):

Sales, rentals (jeonse/wolse), or both. Example: "both" returns sale and rent records in one dataset.

## `districts` (type: `array`):

Districts (si/gun/gu) anywhere in Korea, one per line. Examples: "Gangnam-gu", "Seoul Gangnam", "강남구", "서울 강남구" or the 5-digit district code "11680". A city or province name ("Seoul", "Suwon") selects all of its districts. When a name exists in several cities (e.g. Jung-gu), add the city: "Seoul Jung-gu".

## `fromMonth` (type: `string`):

First contract month, YYYY-MM. Example: "2026-01". Defaults to 3 months before the current month (Korea time). Data starts in 2006-01.

## `toMonth` (type: `string`):

Last contract month, YYYY-MM. Example: "2026-10". Defaults to the current month. The period can be at most 36 months.

## `includeCancelled` (type: `boolean`):

Include sales that were later cancelled (isCancelled = true). Example: turn on to see deals that fell through. Cancelled sales never count in summary rows.

## `minAreaM2` (type: `number`):

Only transactions with at least this exclusive-use area in square meters. Example: 59 (a typical small family unit; 84 m² is the common "34-pyeong" size).

## `maxAreaM2` (type: `number`):

Only transactions with at most this exclusive-use area in square meters. Example: 85.

## `apartmentNameContains` (type: `string`):

Only complexes whose name contains this text, in Korean or romanized. Examples: "래미안", "Raemian", "Eunma". Case and spaces are ignored.

## `includeSummary` (type: `boolean`):

Add one row per district × month × deal type with transaction count, median / min / max price and median price per m². For rentals the deposit is used, plus the median monthly rent. Example: Gangnam-gu, 2026-10, sales → 100 transactions, median 2,615,000,000 KRW.

## `usdKrwRate` (type: `number`):

If set, adds USD amounts (priceUsd; depositUsd and monthlyRentUsd for rentals) converted at this rate in KRW per USD. Example: 1380. No external exchange-rate service is used.

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

Upper limit on transaction records, to cap cost. Example: 500. Summary rows come on top. Set 0 with "Add summary rows" to get only the summary.

## `serviceKey` (type: `string`):

Not needed: the Actor uses its own key. If you have a data.go.kr key approved for the two MOLIT apartment datasets, paste its Decoding key here to use your own daily quota instead. Example: the "Decoding" key shown on your data.go.kr My Page (마이페이지 → 일반 인증키).

## Actor input object example

```json
{
  "dealType": "sale",
  "districts": [
    "Gangnam-gu"
  ],
  "includeCancelled": false,
  "includeSummary": false,
  "maxItems": 10000
}
```

# Actor output Schema

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

No description

## `sales` (type: `string`):

No description

## `rentals` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "districts": [
        "Gangnam-gu"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seoulsmith/korea-apartment-transactions").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 = { "districts": ["Gangnam-gu"] }

# Run the Actor and wait for it to finish
run = client.actor("seoulsmith/korea-apartment-transactions").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "districts": [
    "Gangnam-gu"
  ]
}' |
apify call seoulsmith/korea-apartment-transactions --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seoulsmith/korea-apartment-transactions"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/5BpSf5nZHlw2E1sDH/builds/MrHP7KpcKnTKXqaIL/openapi.json
