# Taiwan Property Price Stats by District (實價登錄) — MOI Data (`waisuan/taiwan-property-district-stats`) Actor

Quarterly Taiwan housing price statistics per district and building type from the official MOI actual-price registration data: transaction count, price per ping (excl. parking) median, mean, P25, P75, median total price.

- **URL**: https://apify.com/waisuan/taiwan-property-district-stats.md
- **Developed by:** [Waisuan](https://apify.com/waisuan) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## Taiwan Property Price Stats by District (實價登錄) — Official MOI Data

Get **ready-made quarterly housing price statistics for every district in Taiwan**, split by building type, computed from the official Ministry of the Interior actual-price registration open data (實價登錄). Each output row is one **district × building type** (for example Taipei · Da'an District · residential high-rise) with the transaction count, **price per ping excluding parking** (median, mean, 25th and 75th percentile), price per m², median total price and median floor area. No need to download and clean tens of thousands of raw transactions yourself.

### Who is it for

- **Real-estate agents, developers and valuers** who need a quick, defensible price benchmark per district and building type every quarter.
- **Investors, banks and proptech / mortgage teams** tracking price levels and dispersion (P25–P75) across Taiwan's 22 counties and cities.
- **Journalists, researchers and dashboard builders** who want a clean quarterly time series without parsing raw MOI CSV files.
- **AI agents** that answer "how much does a flat cost in district X" with official numbers.

### Why use it

- **Official source**: the MOI actual-price registration season files (plvr.land.moi.gov.tw), the same data behind the government's price lookup.
- **Sensible cleaning built in**: land-only and parking-only deals are dropped; parking-space price **and** area are removed before computing price per ping; related-party deals (relatives, employees, co-owners, other special relations noted by the registrar) are excluded by default.
- **Latest season by default**: leave `seasons` empty and the Actor detects the newest published quarter.
- **Sale, pre-sale and rental** data: for rentals the unit price is monthly rent per ping.
- **Polite to the government server**: one download at a time, a delay before each (default 1.5 s), 3 retries with backoff, clear error messages.

### Input example

```json
{
  "seasons": ["115S3"],
  "counties": ["F", "H"],
  "transactionTypes": ["sale", "presale"],
  "buildingTypes": ["highRiseResidential"],
  "minTransactions": 5
}
```

| Field | Meaning |
|---|---|
| `seasons` | ROC year + S + quarter, e.g. `115S3` = 2026 Q3. Empty = latest published season. |
| `counties` | MOI letter codes: A Taipei, F New Taipei, H Taoyuan, B Taichung, D Tainan, E Kaohsiung, O Hsinchu City, J Hsinchu County, … (default `["A"]`). |
| `transactionTypes` | `sale` (default), `presale`, `lease`. |
| `buildingTypes` | `highRiseResidential` 住宅大樓, `midRiseResidential` 華廈, `walkUpApartment` 公寓, `townhouse` 透天厝, `studio` 套房, `shop` 店面, `officeBuilding` 辦公商業大樓, `factoryOffice` 廠辦, `factory` 工廠, `warehouse` 倉庫, `farmhouse` 農舍, `other` 其他. Empty = all. |
| `districts` | Exact district names, e.g. 大安區. Empty = all. |
| `excludeSpecialRelations` | Drop related-party deals (default `true`). |
| `minTransactions` | Skip groups smaller than this (default 1). |
| `maxItems` | Maximum rows (default 1,000). |

With an empty input `{}` the Actor returns all district × building-type rows for **Taipei, existing-home sales, latest season** (48 rows for 2026 Q3).

### Output example

Real row from the default run (season 115S3, published October 2026):

```json
{
  "id": "115S3-A-sale-大安區-highRiseResidential",
  "season": "115S3",
  "seasonLabel": "2026-Q3",
  "countyCode": "A",
  "county": "臺北市",
  "district": "大安區",
  "transactionType": "sale",
  "buildingType": "highRiseResidential",
  "buildingTypeZh": "住宅大樓",
  "buildingTypeEn": "Residential high-rise (11+ floors, elevator)",
  "transactionCount": 248,
  "pricedCount": 248,
  "unitPriceTwdPerPingMedian": 1363068,
  "unitPriceTwdPerPingMean": 1339548,
  "unitPriceTwdPerPingP25": 1045015,
  "unitPriceTwdPerPingP75": 1587279,
  "unitPriceTwdPerSqmMedian": 412328,
  "totalPriceTwdMedian": 50580000,
  "buildingAreaPingMedian": 37.47,
  "firstTransactionDate": "2021-07-16",
  "lastTransactionDate": "2026-08-11",
  "unitPriceBasis": "price per ping, excluding parking space price and area",
  "excludesSpecialRelations": true,
  "source": "Ministry of the Interior, Real Estate Actual Price Registration open data (內政部不動產成交案件實際資訊), plvr.land.moi.gov.tw",
  "sourceUrl": "https://plvr.land.moi.gov.tw/DownloadSeason?season=115S3&fileName=A_lvr_land_A.csv",
  "license": "Open Government Data License, version 1.0 (Taiwan)"
}
```

1 ping (坪) = 3.305785 m². `id` is stable (season-county-type-district-buildingType), so you can upsert rows into your own database.

### Pricing

Suggested pay-per-event price: **US$0.01 per output row (one district × building type)**, charged through the default dataset-item event, plus the standard Actor start event.

| Use case | Rows | Cost |
|---|---|---|
| Default run (Taipei, sales, all building types, 1 quarter) | 48 | US$0.48 |
| New Taipei + Taoyuan, high-rises, sale + pre-sale, 1 quarter | 60 | US$0.60 |
| All 22 counties, sales, all types, 2026 Q3 | 899 | US$8.99 |
| Taipei, 4 quarters, all types (a year of history) | ~190 | ~US$1.90 |

### FAQ

**What does "season" mean exactly?** It is MOI's publication season: deals *registered* in that quarter. Most transactions happened in the same or previous quarter, but late registrations can be older; `firstTransactionDate` and `lastTransactionDate` show the real range.

**Why do some rows have very few transactions?** Small groups (e.g. a handful of townhouse deals in a city district) are kept by default for completeness. Set `minTransactions` to 5–10 for more stable medians.

**How is the price per ping calculated?** (total price − parking price) ÷ (building area − parking area) in ping, for each transaction, then aggregated. Deals with no building area are not priced (`pricedCount` can be lower than `transactionCount`).

**Can I get the individual transactions?** This Actor outputs statistics only (one row per district × building type), which keeps runs cheap and avoids handling address-level records.

**Which counties are fastest?** Each county/type/season is one CSV download of 0.5–3 MB; a single county runs in under 15 seconds, all 22 counties (sales, one quarter) in about 45 seconds.

### Data source and license (資料來源與授權)

- 內政部不動產成交案件實際資訊資料供應系統 (Real Estate Actual Price Registration open data), season files: https://plvr.land.moi.gov.tw/DownloadOpenData
- Listed on the national open-data portal as 不動產買賣實價登錄批次資料, data.gov.tw dataset 25119: https://data.gov.tw/dataset/25119

Released under the **Open Government Data License, version 1.0 (政府資料開放授權條款－第1版)**, which permits commercial use with attribution. Attribution:

> 內政部 2026 不動產成交案件實際資訊（實價登錄）。此開放資料依政府資料開放授權條款 (Open Government Data License) 進行公眾釋出，使用者於遵守本條款各項規定之前提下，得利用之。政府資料開放授權條款：https://data.gov.tw/license

The statistics are computed by this Actor from the official records; they are not official MOI statistics. This Actor is an independent tool by Waisuan and is not affiliated with or endorsed by the Ministry of the Interior.

### 繁體中文簡介

本 Actor 讀取內政部實價登錄開放資料（季別檔），自動排除純土地、純車位與特殊關係交易，扣除車位價格與面積後，計算每個「行政區 × 建物型態」的成交筆數、每坪單價中位數／平均／P25／P75、每平方公尺單價中位數、總價中位數與面積中位數。支援買賣、預售屋與租賃（租賃為每坪月租金）。預設輸出臺北市最新一季買賣的各區統計。建議價格：每列 US$0.01。資料採政府資料開放授權條款第 1 版，可商用，需標示出處；統計結果為本工具計算，非官方統計。

# Actor input Schema

## `seasons` (type: `array`):

e.g. 115S2 = 2026 Q2 (ROC year 115 = 2026). Leave empty to use the latest published season automatically.

## `counties` (type: `array`):

Counties/cities (MOI letter codes, e.g. A = Taipei, F = New Taipei, H = Taoyuan). One download per county per season per transaction type.

## `transactionTypes` (type: `array`):

sale = existing homes (買賣), presale = pre-sale contracts (預售屋), lease = rentals (租賃; unit price is then monthly rent per ping).

## `buildingTypes` (type: `array`):

Building types (建物型態) to include. Empty = all types. Land-only and parking-only transactions are always excluded.

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

Only these districts/townships, e.g. 大安區, 板橋區. Empty = all districts of the selected counties.

## `excludeSpecialRelations` (type: `boolean`):

Drop transactions whose official note mentions relatives, employees, co-owners or other special relations (these distort prices).

## `minTransactions` (type: `integer`):

Skip district × building-type groups with fewer transactions than this (small groups give unstable medians).

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

Maximum number of statistics rows to output (each row is one billable result).

## `requestDelayMs` (type: `integer`):

Pause before each download from the MOI server.

## Actor input object example

```json
{
  "seasons": [],
  "counties": [
    "A"
  ],
  "transactionTypes": [
    "sale"
  ],
  "buildingTypes": [],
  "districts": [],
  "excludeSpecialRelations": true,
  "minTransactions": 1,
  "maxItems": 1000,
  "requestDelayMs": 1500
}
```

# Actor output Schema

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

All records in the default dataset (JSON, CSV, Excel and more via the API).

# 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("waisuan/taiwan-property-district-stats").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("waisuan/taiwan-property-district-stats").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 '{}' |
apify call waisuan/taiwan-property-district-stats --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,waisuan/taiwan-property-district-stats"
        }
    }
}
```

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/fB8wOXjo232zxgvqD/builds/70qYJpjfE1e4XdRz2/openapi.json
