# 591.com.tw Scraper - Taiwan Rentals, Sales & Presale (`sian.agency/591-com-property-scraper`) Actor

Scrape 591.com.tw across all 22 Taiwan cities: rent, resale and presale listings with price, ping area, layout, MRT distance, photos and lister.

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

## Pricing

from $0.70 / 1,000 rental searches

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

## 591.com.tw Scraper - Taiwan Rentals, Sales & Presale 🚀

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store-SUUMO-1AE392](https://img.shields.io/badge/Store-SUUMO%20Scraper-1AE392)](https://apify.com/sian.agency/suumo-property-scraper?fpr=sian) [![Store-Zigbang-1AE392](https://img.shields.io/badge/Store-Zigbang%20Scraper-1AE392)](https://apify.com/sian.agency/zigbang-property-scraper?fpr=sian) [![Store-PropertyGuru-1AE392](https://img.shields.io/badge/Store-PropertyGuru%20Scraper-1AE392)](https://apify.com/sian.agency/propertyguru-property-scraper?fpr=sian)

#### 🎉 All three 591 boards — 租屋, 買屋 and 新建案 — in one Actor

##### For analysts pricing the Taiwanese market, agencies sourcing stock, and anyone tired of scrolling 591 at midnight

Scrape 591.com.tw across all 22 Taiwan cities and counties: rent, resale and presale listings with price, ping area, layout, MRT distance, photos and lister.

### 🔎 What is the 591.com.tw Taiwan Property Scraper — and when should you use it?

The **591.com.tw Taiwan Property Scraper** turns public 591.com.tw property listings from anywhere in Taiwan into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** Taiwanese rental, resale and presale listings as rows. Each carries the monthly rent or asking price in NT$, the floor area in ping, the 房/廳/衛 layout, the floor, the district, the full photo set and 591's own card tags. Rental rows also name the nearest MRT station and how many metres away it is, and say whether the landlord or an agency posted the listing. Rental Detail expands one listing into its GPS position, deposit, management fee, appliance list, complete description and the lister's phone. Presale rows carry the developer, the build stage and the sales office's phone.

**Use something else when:** the property is not in Taiwan. Use [SUUMO Scraper](https://apify.com/sian.agency/suumo-property-scraper?fpr=sian) for Japan, rentals and sale listings from the country's largest portal. Use [Zigbang Scraper](https://apify.com/sian.agency/zigbang-property-scraper?fpr=sian) for South Korea — apartments, officetels and villas with jeonse and monthly-rent terms. Use [PropertyGuru Scraper](https://apify.com/sian.agency/propertyguru-property-scraper?fpr=sian) for Singapore and Malaysia, sale and rental, from the region's dominant portal. This actor reads the three public boards 591 publishes — 租屋 rentals, 買屋 second-hand sales and 新建案 presale and new-build projects — across all 22 Taiwanese cities and counties. Taiwan's 實價登錄 actual-transaction-price registry is out of scope: it is a government dataset of completed sales, and every price here is an asking price the lister set. Phone numbers appear where 591 publishes them — on rental detail records and on presale projects — and no row invents one it was not given.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/591-com-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want Taiwanese property listings and asking prices from 591.com.tw using the Apify Actor `sian.agency/591-com-property-scraper`.

Use it when I need: Taiwanese rental, resale and presale listings as rows. Each carries the monthly rent or asking price in NT$, the floor area in ping, the 房/廳/衛 layout, the floor, the district, the full photo set and 591's own card tags. Rental rows also name the nearest MRT station and how many metres away it is, and say whether the landlord or an agency posted the listing. Rental Detail expands one listing into its GPS position, deposit, management fee, appliance list, complete description and the lister's phone. Presale rows carry the developer, the build stage and the sales office's phone.

Don't use it when: the property is not in Taiwan — use suumo-property-scraper or zigbang-property-scraper or propertyguru-property-scraper instead.

How to call it: pick an `operation` — `rentSearch` for the rental board, `saleSearch` for second-hand sales, `presaleSearch` for new-build projects, `rentDetail` to expand rentals you already have ids for. Set `city` to one of 591's 22 area ids (1 is 台北市 Taipei, 3 新北市 New Taipei, 8 台中市 Taichung, 17 高雄市 Kaohsiung) and `maxResults` to your row budget. Narrow with `rentalType` on the rental board (整層住家 whole unit, 獨立套房 self-contained suite, 分租套房, 雅房), `saleCategory` on the sale board (住宅, 套房, 店面, 辦公, 住辦, 土地), `bedrooms`, `minRent`/`maxRent` in NT$ a month, `buildingAge` for resale, and `landlordOnly` to keep only owner-posted rentals. `keyword` takes Traditional Chinese and searches community, street and station names inside the city you picked. For a single district, paste its 591 address into `searchUrls`.

Start with this input:
{
  "operation": "rentSearch",
  "city": "1",
  "rentalType": "1",
  "maxRent": 40000,
  "maxResults": 200
}

Ask me which Taiwanese city to cover, whether they want rentals, resale listings or presale projects, and what rent or property type to narrow to, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull every whole-unit rental in Taipei under NT$40,000 posted by the landlord, and rank the districts by rent per ping.*
- *Find Kaohsiung resale homes under 20 years old with three bedrooms, and give me the price per ping for each district.*
- *List every presale project in Taichung with its developer and sales-office phone number, ready to paste into a sheet.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/591-com-property-scraper.md](https://apify.com/sian.agency/591-com-property-scraper.md).

### 📋 Overview

**591房屋交易網 is where Taiwan looks for property.** It is the country's number-one portal by a wide margin, and its rental board alone draws 301,000 searches a month. This Actor reads the three boards 591 publishes: 租屋 rentals, 買屋 second-hand sales, 新建案 presale projects. Each comes back as typed rows. The rent is a number in NT$, the floor area is a number in 坪, the district arrives as a name and an id, and the nearest MRT station carries its distance in metres.

**Why professionals pick this one:**

- ✅ **Three boards, not one**: rentals, resale listings and presale projects each get their own operation and their own row shape, because 591 keeps them apart and so does the market.
- ⚡ **30 listings per request**: the rental board answers a whole page at a time. A 1,000-row Taipei sweep is 34 requests and about a minute.
- 🎯 **Every filter is a real filter**: each one was tested against the live board and kept only if it moved the result count. Nothing here bills you for narrowing that never happened.
- 💰 **$0.80 per 1,000 rental listings**: 11% under the field leader, on a richer row, with no minimum charge per run.
- 💎 **The MRT distance 591 already publishes**: the nearest station and how many metres away it is, read from the card, not guessed from a geocode.
- ✨ **Owner-direct as a checkbox**: Taiwan's rental board runs heavy on landlord listings, and one toggle keeps only those.

| Operation | Returns | Rows per request | Notes |
|---|---|---:|---|
| `rentSearch` | Rental Search | ~30 | rentals by city, property type, rent band, bedrooms and keyword |
| `saleSearch` | Resale Search | ~31 | second-hand sale listings by city, category, bedrooms and building age |
| `presaleSearch` | Presale Project Search | ~10 | presale and new-build projects with developer and sales-office phone |
| `rentDetail` | Rental Detail | 1 | one rental expanded — GPS, deposit, appliances, full text, phone |

***

### ✨ Features

- 🔑 **Rental board (租屋)**: whole units (整層住家), self-contained suites (獨立套房), shared-flat suites (分租套房), rooms (雅房), parking and more.
- 🏠 **Resale board (買屋)**: homes, studios, storefronts, offices, mixed residential-office units, land, factories and parking spaces.
- 🏗️ **Presale board (新建案)**: new-build and presale projects with the developer, the build stage and the sales office's own phone number.
- 📄 **Rental Detail**: GPS coordinates, deposit terms, management fee, the appliance list, the whole description and the lister's phone.
- 🚇 **Transit context**: the nearest station and its distance in metres, straight from 591's own card.
- 📐 **Numbers as numbers**: rent in NT$, sale prices converted from 萬, area in 坪, price per ping, bedrooms parsed from the 房/廳/衛 layout.
- 👤 **Owner-direct filter**: keep only rentals 591 marks as posted by the 屋主.
- 🗺️ **All 22 cities and counties**: from 台北市 down to 連江縣, using 591's own area ids.
- 🔗 **Paste-a-URL mode**: build any search on 591, copy the address, and the Actor reads the board, city, district and filters off it.
- 📊 **Honest coverage**: the run log prints the total 591 reports for your search before it starts paging.

***

### 🎬 Quick Start

Pick an operation, pick a city, set a row budget. That is the whole setup — everything else narrows the result. A bare run returns 100 Taipei rentals.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~591-com-property-scraper/runs?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"operation": "rentSearch", "city": "1", "maxResults": 100}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose the board

Set `operation` to `rentSearch`, `saleSearch`, `presaleSearch` or `rentDetail`.

#### Step 2: Choose the city

Set `city` to one of 591's 22 area ids — `1` for 台北市, `3` for 新北市, `8` for 台中市, `17` for 高雄市.

#### Step 3: Narrow it and run

Add a rent band, a property type, a bedroom count or a Chinese keyword, set `maxResults`, and start the run.

**That's it. In about a minute, you'll have:**

- Every matching listing as a typed row, in JSON, CSV or Excel
- Prices, ping areas and MRT distances ready to chart
- A run report with the links, the totals and exactly what you were charged

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string | No | `rentSearch` (default), `saleSearch`, `presaleSearch` or `rentDetail` |
| `city` | string | No | One of 591's 22 area ids; `1` = 台北市 Taipei City (default) |
| `maxResults` | integer | No | Row budget for the whole run (default 100) |
| `keyword` | string | No | 591's own search box, in Traditional Chinese — community, street or station names |
| `rentalType` | string | No | Rental board only: 整層住家, 獨立套房, 分租套房, 雅房, 車位, 其他 |
| `saleCategory` | string | No | Sale board only: 住宅, 套房, 店面, 辦公, 住辦, 土地, 廠房, 車位 |
| `bedrooms` | string | No | 1 to 5+, matched against the 房 count in 591's layout string |
| `minRent` / `maxRent` | integer | No | Rental board only: monthly rent band in NT$ |
| `buildingAge` | string | No | Sale board only: 591's own bands — under 5, 5-10, 10-20, 20-30, 30-40 years |
| `landlordOnly` | boolean | No | Rental board only: keep just the 屋主-posted listings |
| `sortBy` | string | No | 591's default order, newest first, or rent low-to-high / high-to-low |
| `searchUrls` | array | No | Paste 591 search addresses instead of using the form |
| `listingUrls` | array | No | Rental Detail: 591 rental addresses (full URLs) |

**Example — whole-unit rentals in Taipei under NT$40,000, landlord only:**

```json
{
  "operation": "rentSearch",
  "city": "1",
  "rentalType": "1",
  "maxRent": 40000,
  "landlordOnly": true,
  "maxResults": 300
}
```

**Example — three-bedroom Kaohsiung resale homes under 20 years old:**

```json
{
  "operation": "saleSearch",
  "city": "17",
  "saleCategory": "9",
  "bedrooms": "3",
  "buildingAge": "10_20",
  "maxResults": 500
}
```

**Example — expand rentals you already have ids for:**

```json
{
  "operation": "rentDetail",
  "listingUrls": [
    { "url": "https://rent.591.com.tw/21822748" },
    { "url": "https://rent.591.com.tw/21967232" }
  ]
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **50+ fields**. The most-used ones:

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | number | 591's own listing id |
| `propertyTitle` | string | The listing title as 591 publishes it |
| `url` | string | Direct link to the listing on 591 |
| `listingType` | string | `rent`, `sale` or `presale` |
| `propertyType` | string | 591's category — 整層住家, 住宅, 預售屋 … |
| `price` | number | Monthly rent, or the asking price, in NT$ |
| `priceText` | string | The price exactly as 591 shows it |
| `pricePerPing` | number | NT$ per 坪, on sale listings |
| `areaPing` | number | Floor area in 坪 |
| `layout` | string | The 房/廳/衛 layout string |
| `bedrooms` | number | Bedroom count parsed from the layout |
| `floorText` | string | Floor and building height, e.g. `9F/14F` |
| `city` / `district` | string | 台北市 / 中山區 |
| `nearestStation` | string | The station 591 names on the card |
| `nearestStationDistanceM` | number | Distance to it, in metres |
| `listerName` / `listerRole` | string | Who posted it, and whether they are 屋主 or 仲介 |
| `isLandlord` | boolean | True when the owner posted it |
| `photos` | array | Every photo URL on the listing |
| `listerPhone` | string | On rental detail and presale rows |
| `latitude` / `longitude` | number | On rental detail rows |
| `facilities` | array | Appliances and fittings, on rental detail rows |
| `developer` | string | On presale rows |

**Example row (rental search):**

```json
{
  "listingId": 21822748,
  "propertyTitle": "南京復興生活圈｜寓居專任・家具全配",
  "url": "https://rent.591.com.tw/21822748",
  "listingType": "rent",
  "propertyType": "整層住家",
  "price": 67000,
  "priceText": "67,000 元/月",
  "currency": "TWD",
  "areaPing": 25,
  "layout": "2房1廳",
  "bedrooms": 2,
  "floorText": "9F/14F",
  "city": "台北市",
  "district": "中山區",
  "address": "中山區-長安東路二段",
  "communityName": "朱崙街 龍江路 冠德君閱 建國北路一段",
  "nearestStation": "距南京復興",
  "nearestStationDistanceM": 511,
  "tags": ["近捷運", "拎包入住", "近商圈", "有電梯"],
  "photoCount": 13,
  "listerName": "謝小姐",
  "listerRole": "仲介",
  "isLandlord": false,
  "extraFeesText": "(額外費用 4,549元/月)"
}
```

***

### 💼 Use Cases & Examples

#### 1. Taipei Rent Index by District

**A property analyst wants rent per ping by district, updated monthly.**

**Input:** `rentSearch`, city 台北市, `maxResults` 5000
**Output:** every rental with rent, ping area, district and layout as numbers
**Use:** group by district, divide rent by ping, and you have the index no single 591 page shows.

#### 2. Owner-Direct Rental Sourcing

**A relocation agency wants listings with no agency fee attached.**

**Input:** `rentSearch` with `landlordOnly: true` and a rent band
**Output:** only the listings 591 marks as posted by the 屋主
**Use:** a shortlist of properties where the tenant deals with the owner directly.

#### 3. Presale Pipeline and Developer Tracking

**A construction supplier wants to know what is being built, and who to call.**

**Input:** `presaleSearch` across six cities
**Output:** project name, developer, build stage, asking range per ping, sales-office phone
**Use:** a quarterly build pipeline with contacts attached, instead of a rumour mill.

#### 4. Estate Agency Lead Generation

**A proptech founder wants to know which agencies hold the stock in a city.**

**Input:** `saleSearch` for a city, then `rentDetail` on the rentals that matter
**Output:** the lister's name and role on every row; the phone and brokerage name on detail rows
**Use:** rank agencies by listing count before approaching any of them.

#### 5. Rental Yield Screening

**An investor wants gross yield by district, not by rumour.**

**Input:** two runs — `rentSearch` and `saleSearch` for the same city
**Output:** monthly rent and asking price, both with ping area
**Use:** match on area and layout, annualise the rent, divide by the price.

#### 6. MRT Catchment Analysis

**A researcher wants the rent premium inside 500 metres of a station.**

**Input:** `rentSearch` for 台北市 or 高雄市 with a large `maxResults`
**Output:** `nearestStation` and `nearestStationDistanceM` on every rental row
**Use:** bucket by walking distance and the premium stops being folklore.

#### 7. New Listing Monitoring

**An agency wants today's new stock, and only today's.**

**Input:** `rentSearch` with `sortBy: "newest"`, on a daily schedule
**Output:** rows carrying the posted timestamp and 591's own refresh note
**Use:** keep the ids you have seen, and pay only for what appeared since yesterday.

***

### 🔗 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/591-com-property-scraper').call({
  operation: 'rentSearch',
  city: '1',
  rentalType: '1',
  maxRent: 40000,
  maxResults: 200,
});

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/591-com-property-scraper').call(
    run_input={
        'operation': 'saleSearch',
        'city': '17',
        'saleCategory': '9',
        'bedrooms': '3',
        'maxResults': 500,
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['propertyTitle'], item.get('price'), item.get('district'))
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~591-com-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "presaleSearch", "city": "8", "maxResults": 100}'
```

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

1. **Trigger**: a daily schedule, or a webhook from your own app
2. **HTTP Request**: call the Actor API with your search
3. **Process**: filter the JSON on rent, ping area or district
4. **Action**: append to a sheet, write to a database, or alert on new listings

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run — every field, every operation, same quality
- No credit card required
- Enough to check the data before you commit

#### PAID Tier (Production Ready)

- **Unlimited** listings per run
- Pay per listing returned — an empty search costs nothing
- Failed inputs are never charged

💰 **Rental listings are $0.80 per 1,000.** That is under both Store rivals, on a row that also carries the MRT distance, the ping area and the owner flag.

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

***

### ❓ Frequently Asked Questions

**Q: Do I need a proxy, a browser or a 591 account?**
A: No. There is no proxy setting to configure and no account to connect, which is why the price per listing is what it is.

**Q: Is the data in Chinese or English?**
A: 591 publishes in Traditional Chinese and the rows carry its text exactly as written. Alongside it every row carries the numbers as numbers and the ids as ids, so you can group and filter without reading a word of Chinese. Every category in the input form is labelled with its English meaning too.

**Q: What is a ping?**
A: The 坪, Taiwan's standard unit of floor area. It is about 3.31 square metres, or 35.6 square feet. Every price on 591 is quoted against it. Multiply by 3.30579 for square metres.

**Q: How many listings can one search return?**
A: Taipei carries roughly 11,600 rentals and 24,700 sale listings at any moment. The run pages through the board until it hits your `maxResults`. To slice a big city, use a rent band, a bedroom count, a building-age band, or paste district-level 591 addresses into `searchUrls`.

**Q: What does Rental Detail add over a search row?**
A: The search row is everything on the card — price, ping area, layout, floor, district, photos, tags, nearest station and who posted it. Rental Detail opens the advert and adds GPS coordinates, the deposit and management fee, the appliance list, the complete description, nearby transport with distances, and the lister's phone number.

**Q: Why does a presale project have no single price?**
A: Because 591 does not publish one. A presale project is a whole building, so the board quotes a range per ping — `185~210 萬/坪`. The row carries that range as text and leaves the numeric price empty rather than inventing a midpoint.

**Q: Can I search a single district?**
A: Two ways. Put the district name in the keyword box, or open the district page on 591, copy the address and paste it into `searchUrls`.

**Q: Does this cover 實價登錄, the actual-transaction-price registry?**
A: No. That is a government dataset of completed sales. Every price here is an asking price a lister set on 591.

***

### 🐛 Troubleshooting

**A run returns no listings**

- Widen it: clear the keyword, set the rental type or sale category back to "any", or drop the rent band.
- Check the board matches the operation. A sale category has no meaning on the rental board.

**Search URLs are being skipped**

- Paste addresses from the board the operation reads: `rent.591.com.tw` for Rental Search, `sale.591.com.tw` for Resale Search, `newhouse.591.com.tw` for Presale.
- Or clear `searchUrls` entirely and use the form instead.

**"Items in input.listingUrls do not contain valid URLs"**

- Rental addresses have to be full URLs. Take the number from the `listingId` column and put `https://rent.591.com.tw/` in front of it.

**A rental id comes back as "no longer published"**

- 591 removes a listing the moment it is rented or withdrawn. Run a fresh Rental Search for live ids. That row is not charged.

**Fewer rows than I set in maxResults**

- The board ran out. The run log prints the total 591 reports for your search before it starts paging, so you can see the ceiling.

**Bedrooms filter removed studios I wanted**

- 591's layout string carries no 房 count on studios and open-plan units, so setting a bedroom count excludes them by design. Leave it on "any" and filter on `layout` yourself.

***

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

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

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

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

591 and 591房屋交易網 are trademarks of Digital Technology (Addcn) Co., Ltd. This Actor is not affiliated with, endorsed by, or sponsored by 591 or Addcn.

***

### 🤝 Support

**Join our active support community**

- For issues or questions, open an issue on the Actor page
- Check the [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

## `operation` (type: `string`):

Pick one per run. Rental Search walks 591's rental board and returns 30 listings a page; Resale Search does the same on the second-hand sale board, 31 a page; Presale Project Search returns the new-build and presale projects 591 lists, 10 a page, each with its developer and sales-office phone; Rental Detail takes 591 rental addresses or IDs and returns one full record each — GPS position, the deposit and management fee, the appliance list, the whole description and the lister's phone number.

## `city` (type: `string`):

Which of Taiwan's 22 cities and counties to read. These are 591's own area ids, taken from the list the site publishes on its own pages, so every value here is one 591 actually indexes. A run reads one area — that is how 591's own search works — and covers every district inside it. To go narrower than a city, add a keyword below or paste a district address into Search URLs.

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

Stop after this many rows for the whole run. A rental page carries 30 listings, a sale page 31 and a presale page 10, so the run ends on the first page that crosses your limit.

## `keyword` (type: `string`):

591's own search box, in Traditional Chinese. It reads community names (冠德君閱), street and district names (中山區, 民權東路) and station names (捷運), and it narrows inside the city you picked rather than replacing it. Leave empty to take the whole city.

## `rentalType` (type: `string`):

Used by Rental Search. 591 splits its rental board by how much of the property you get, which is the distinction Taiwanese renters actually search on: a whole unit, a self-contained suite with its own bathroom, a suite carved out of a shared flat, or a plain room with a shared bathroom. Each option is 591's own category, with its Chinese name alongside.

## `saleCategory` (type: `string`):

Used by Resale Search. 591's own second-hand categories, from homes and studios through shops, offices and mixed residential-office units to land, factories and parking spaces. Each value is the site's category id and each label carries the Chinese name it appears under on 591.

## `bedrooms` (type: `string`):

Keep only properties with this many bedrooms — the 房 count in 591's layout string, so '3' means 3房, whatever the number of living rooms beside it. Applied by 591 on both the rental and the sale board. Studios and open-plan units carry no 房 count and are excluded once you set this.

## `minRent` (type: `integer`):

Used by Rental Search. Skip rentals below this monthly rent in New Taiwan dollars. 0 means no lower bound. 591 applies the band itself, so excluded listings are never fetched and never billed.

## `maxRent` (type: `integer`):

Used by Rental Search. Skip rentals above this monthly rent in New Taiwan dollars. 0 means no upper bound. Pairing it with a minimum is the usual way to slice a large city into bands.

## `buildingAge` (type: `string`):

Used by Resale Search. 591 files second-hand listings into fixed age bands rather than a free range, and these are its bands exactly — asking for anything between them returns the unfiltered board, so only what the site really offers is on the list.

## `landlordOnly` (type: `boolean`):

Used by Rental Search. Keep only the listings 591 marks as posted by the owner (屋主) rather than by an agency or a letting agent. Taiwan's rental board carries heavy owner-direct supply, and this is the site's own flag on the advert, not a guess from the contact name.

## `sortBy` (type: `string`):

How 591 should order the board before the run reads it. 'Newest first' is what a monitoring run wants; the two rent orderings are applied by 591 on the rental board only, where the sale board answers every ordering with its own newest-first sequence.

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

Paste 591 search addresses instead of filling the form. Build the search on rent.591.com.tw, sale.591.com.tw or newhouse.591.com.tw, copy the address bar, and the board, city, district and filters in it are read straight off the URL — including district-level pages such as https://rent.591.com.tw/list?region=1\&section=3 that the form above does not reach. Any page number in the address is ignored; the run starts at the first page and pages forward on its own.

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

Used by Rental Detail: the 591 rental addresses to expand, e.g. https://rent.591.com.tw/21822748. This field takes full addresses only — Apify validates every entry as a URL and rejects a bare number before the run starts. The listingId column of any Rental Search run gives you the number; put https://rent.591.com.tw/ in front of it and you have the address. A two-step pipeline — search once, expand the shortlist — costs nothing but the rows you actually want.

## Actor input object example

```json
{
  "operation": "rentSearch",
  "city": "1",
  "maxResults": 100,
  "keyword": "",
  "rentalType": "any",
  "saleCategory": "any",
  "bedrooms": "any",
  "minRent": 0,
  "maxRent": 0,
  "buildingAge": "any",
  "landlordOnly": false,
  "sortBy": "default",
  "searchUrls": [],
  "listingUrls": []
}
```

# Actor output Schema

## `591ComTwListings` (type: `string`):

Every listing this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "rentSearch",
    "city": "1",
    "maxResults": 100,
    "keyword": "",
    "rentalType": "any",
    "saleCategory": "any",
    "bedrooms": "any",
    "minRent": 0,
    "maxRent": 0,
    "buildingAge": "any",
    "landlordOnly": false,
    "sortBy": "default",
    "searchUrls": [],
    "listingUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/591-com-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 = {
    "operation": "rentSearch",
    "city": "1",
    "maxResults": 100,
    "keyword": "",
    "rentalType": "any",
    "saleCategory": "any",
    "bedrooms": "any",
    "minRent": 0,
    "maxRent": 0,
    "buildingAge": "any",
    "landlordOnly": False,
    "sortBy": "default",
    "searchUrls": [],
    "listingUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/591-com-property-scraper").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 '{
  "operation": "rentSearch",
  "city": "1",
  "maxResults": 100,
  "keyword": "",
  "rentalType": "any",
  "saleCategory": "any",
  "bedrooms": "any",
  "minRent": 0,
  "maxRent": 0,
  "buildingAge": "any",
  "landlordOnly": false,
  "sortBy": "default",
  "searchUrls": [],
  "listingUrls": []
}' |
apify call sian.agency/591-com-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/591-com-property-scraper"
        }
    }
}

```

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/iKyJi7aoIw5JaamIT/builds/HvW0aTnLplseqdaPW/openapi.json
