# Taiwan Real Estate Actual-Price Transactions - Per Record (`nexgensignal/tw-real-estate-transaction-records`) Actor

Taiwan Ministry of the Interior actual-price real-estate transactions (sale/presale/lease) by season as clean per-record data - district, address, area, price, date and building attributes. Chinese verbatim; no personal data. OGDL 1.0. $0.05 per record.

- **URL**: https://apify.com/nexgensignal/tw-real-estate-transaction-records.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $33.50 / 1,000 real estate transaction 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Taiwan Real Estate Actual-Price Transactions - Per Record

Taiwan's **actual-price registration** transactions - the official record of real-estate deals - as one clean,
flat record per transaction, for the quarter you choose. Sale, presale and lease transactions, each with
district, address, area, price, date and building attributes. **Chinese text delivered verbatim; no buyer or
seller name.**

### What one record represents

The source is the **Taiwan Ministry of the Interior** Real Estate Actual Price Registration
(`plvr.land.moi.gov.tw`), downloaded as the ministry's quarterly ZIP for the season you select. Each record is
**one transaction** from the main tables: its district, transaction target, land+building address, land area,
transaction date (ROC calendar), building area, room/hall/bath counts, building attributes, total price and
unit price, parking details and a serial number - plus a `transaction_type` (sale, presale or lease) and the
county code.

### Coverage and volume

For season **115S2** the release holds **131,580** transactions - **75,399** sales, **8,571** presales and
**47,610** leases, measured at build time from the downloaded ZIP.

**Sol's Wave-4 index put this door at 131,580 EXACT for 115S2; measured live at build time the season's three
main tables sum to exactly 131,580 (75,399 + 8,571 + 47,610) - matching the index.**

Each quarter is one partition: set the **Season** input (ROC year + quarter, e.g. `115S2`) to pull that
release. The Actor downloads the season ZIP, iterates the per-county sale/presale/lease main tables (skipping
their two header rows), and delivers each transaction, stopping as soon as your **Maximum records** cap is met.

### Licence and attribution

The data is released under the **Open Government Data License, Taiwan, version 1.0 (OGDL 1.0)**. The full
notice travels on every record:

> Open Government Data License, Taiwan, version 1.0 (OGDL 1.0): the data may be used for any purpose, including commercial products and services, provided the source (Ministry of the Interior) is noted.

### Person-data policy

Taiwan actual-price registration **carries no buyer or seller name** - the record is address x area x price x
date. A per-record assertion rejects any buyer/seller/owner/person field (verified with a planted-field test).
No natural-person data is processed.

### Interpretation caveat

One record per Taiwan actual-price registration transaction for the selected season: sale, presale and lease transactions, each carrying district, address, land/building area, transaction date, price and building attributes, plus a transaction\_type and county code. Chinese text is delivered verbatim. The registration carries no buyer or seller name.

Values are reproduced verbatim from the source; the Actor never rewrites a field, and **Chinese text is
delivered as-is with no transliteration** - relabelling would be a modification. Dates are in the ROC calendar
(e.g. `1150601` = 2026-06-01). Prices are in New Taiwan Dollars; `compartmented` and `has_management_org` are
delivered as real booleans.

### Provenance and compliance

Every run reads the door host's `robots.txt` at runtime; the gate result (URL, status, byte length, SHA-256
of the policy) is written to the run's `RUN_RECEIPT`, and the data path is confirmed permitted before any
fetch. The endpoint is keyless. The Actor never bypasses a block or fetches through a mirror.

### Data quality and freshness

Boolean columns are delivered as real booleans and numeric columns as real numbers. Delivery is keyed on a
stable composite id, so the dataset is safe to diff, deduplicate or upsert. Every run re-reads the live door,
so the data is as fresh as the source publishes, and each record's `observed_at` stamp dates the snapshot. The
run's `RUN_RECEIPT` records the source URL and how many records were delivered and charged, and confirms
`charge_equals_delivered`.

### Billing and delivery

Pricing is per record: you are billed only for records the Actor actually delivers, at a flat rate, with the
charge raised after each record is pushed (push-then-charge), so a failed or empty run costs nothing. There is
no subscription and no minimum. The **Maximum records** cap bounds every run, so you control the spend
precisely - set it low to sample the shape of the data cheaply, then raise it once you have confirmed the cell
fits your use. Because delivery is incremental and keyed on a stable id, re-running against the same door and
upserting on that id keeps a downstream table current without re-paying for rows you already hold; only the new
and changed records add cost. Every run's receipt reconciles delivered against charged, so the billing is
auditable against the data you received.

### Inputs

- **Season** (`season`, required) - the quarterly release as ROC year + `S` + quarter (1-4), e.g. `115S2`.
- **Maximum records** (`maxRecords`) - hard cap on transaction records delivered and billed within the season.

### Output

Records land in the Actor's default dataset and export as JSON, CSV, Excel or via the Apify API. A tabular
overview surfaces district, transaction type, address, total and unit price, building area, transaction date
and season.

### Fields in detail

The record carries the full transaction row - district, transaction target, address, land and building area,
use zoning, transaction date, floor and building attributes, room/hall/bath counts, the booleans
`compartmented` and `has_management_org`, total and unit price, parking category/area/price, a note, the serial
number and the main building area - plus `transaction_type`, `county_code` and `season`. The provenance block
closes every record.

### Typical uses

Real-estate analysts and valuation teams use this cell as the authoritative Taiwan actual-price series -
one queryable table per quarter, filterable by district, transaction type or building attributes, with total
and unit price as real numbers ready to chart or model. A group-by on district and transaction type gives
median price per area; the season key lets you assemble a multi-quarter panel by running each release and
concatenating. Because the registration is anonymised, the series is safe to redistribute under OGDL 1.0.

### Scaling and limits

Set **Maximum records** low to sample or high to pull the whole season. The Actor streams the per-county CSVs
inside the ZIP and delivers incrementally, so memory stays flat and you are billed only for what is delivered.
To build a longer history, run the cell once per season and concatenate on the `season` key; each record's
`observed_at` stamp dates the snapshot.

### How the season release is delivered

The ministry publishes actual-price data quarterly, one ZIP per season, with per-county CSVs inside for each
transaction type. This cell downloads the season ZIP and iterates the main tables - the sale, presale and lease
files for every county - so a single run for a season captures all three transaction types across the whole
country. Each source file carries two header rows (Chinese labels and their English glosses); the Actor skips
both and reads by column position, which is stable across the release, so the 29 transaction columns line up
correctly for every county and type. The `transaction_type` and `county_code` on each record record which file
it came from.

### Reading the transaction

The three transaction types answer different questions: `sale` is completed real-estate sales, `presale` is
pre-completion new-build sales, and `lease` is rental registrations - keeping them in one dataset with a type
field lets you analyse them together or filter to one. `total_price_ntd` and `unit_price_ntd_m2` are real
numbers in New Taiwan Dollars, ready to chart or model; `building_area_m2` and `land_area_m2` give the areas;
and the room/hall/bath counts plus `compartmented` and `has_management_org` (real booleans) describe the unit.
The ROC-calendar dates (e.g. `1150601`) are kept verbatim rather than converted, faithful to the source.

### Building a multi-quarter panel

Each run is scoped to one season, which keeps the download bounded and the output on-grain. To build a longer
history, run the cell once per season and concatenate on the `season` key - the schema is identical across
quarters, so the panel assembles without reconciliation. Because the registration is anonymised and released
under OGDL 1.0, the resulting series is safe to redistribute, and each record's `observed_at` stamp dates the
snapshot.

### Sibling Actors

It sits beside the fleet's Singapore URA property-transactions cell (0% overlap - different jurisdiction). It shares its season-zip engineering with the fleet's other records Actors.

# Actor input Schema

## `season` (type: `string`):

Which quarterly release to pull, as ROC-year + S + quarter (1-4). One season is one partition; 115S2 has ~131,580 transactions across sale/presale/lease.

## `maxRecords` (type: `integer`):

Maximum transaction records delivered and billed within the season. You are billed only for records delivered.

## Actor input object example

```json
{
  "season": "115S2",
  "maxRecords": 500
}
```

# Actor output Schema

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

The delivered Taiwan real estate actual-price transaction record.

# 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 = {
    "season": "115S2",
    "maxRecords": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/tw-real-estate-transaction-records").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 = {
    "season": "115S2",
    "maxRecords": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/tw-real-estate-transaction-records").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 '{
  "season": "115S2",
  "maxRecords": 500
}' |
apify call nexgensignal/tw-real-estate-transaction-records --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/tw-real-estate-transaction-records"
        }
    }
}
```

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/VkgGv8nQVug1PVb6Z/builds/kp87uZPX4PuPu7T37/openapi.json
