# 99.co 爬蟲｜新加坡房產、HDB、公寓售租物件一鍵匯出（免 API） (`claude_code_reviewer/99co-scraper`) Actor

免登入抓 99.co 新加坡房產：HDB、公寓、有地住宅（售／租），含價格、坪數、房數、地區與物件類型，輸出 JSON／CSV／Excel。房產市調、投資比價、租金分析必備。

- **URL**: https://apify.com/claude\_code\_reviewer/99co-scraper.md
- **Developed by:** [Chad](https://apify.com/claude_code_reviewer) (community)
- **Categories:** Real estate, E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 搜尋物件

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?

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

## 99.co 爬蟲｜新加坡房產搜尋、HDB、公寓、有地住宅售租物件一鍵下載（免 API、免登入）

一個 Actor 搞定 99.co 新加坡房產搜尋：**關鍵字搜尋**（依條件抓 HDB 組屋、公寓、有地住宅，售或租）。不需要登入、不需要 API token、批量貼上多個搜尋條件都吃得下。全程走 99.co 公開 JSON 端點，不開瀏覽器，速度快、成本低。

給誰用的：追蹤新加坡房價的、做區域市場分析的、比較不同地段租金的、寫房市研究報告的、論文需要資料集的、自己寫 side project 的工程師。

**v1.1 預定功能**：物件詳情（依 ID/網址抓單一物件完整資訊）— 目前版本尚未開放。

***

### 能抓到什麼

每一筆物件都會拿到下面這些欄位（缺值一律回 `null`，不會少欄位）：

| 欄位               | 說明                                   | 範例                                                          |
| ------------------ | -------------------------------------- | ------------------------------------------------------------- |
| `listing_id`       | 99.co 物件 ID                          | `PkhHsqk7hrY7DPXGtPVr6L`                                     |
| `title`            | 物件名稱（專案名或地址）               | `Commonwealth HDB Estate`                                     |
| `listing_type`     | 交易類型                               | `sale`、`rent`                                                |
| `main_category`    | 房產類型                               | `hdb`、`condo`、`landed`                                      |
| `property_segment` | 細分類                                 | `hdb`、`non-landed`、`landed`                                 |
| `price`            | 售價或月租（SGD）                      | `850000`                                                      |
| `currency`         | 幣別（固定 SGD）                       | `SGD`                                                        |
| `price_per_sqft`   | 每平方英尺單價（SGD）                  | `589.24`                                                      |
| `bedrooms`         | 臥室數                                 | `5`                                                           |
| `bathrooms`        | 衛浴數                                 | `2`                                                           |
| `floor_area_sqft`  | 建坪（平方英尺）                       | `1442`                                                        |
| `address`          | 地址                                   | `123 Commonwealth Avenue`                                     |
| `district`         | 地區號碼（D1–D28）                     | `3`                                                           |
| `region`           | 區域名稱                               | `Central Region`                                              |
| `latitude`         | 緯度                                   | `1.2985`                                                      |
| `longitude`        | 經度                                   | `103.8027`                                                    |
| `tenure`           | 地契類型                               | `99-year leasehold`、`freehold`                               |
| `agent_name`       | 仲介姓名                               | `Tan Wei Ming`                                                |
| `agent_id`         | 仲介 ID                                | `user_abc123`                                                 |
| `agency`           | 仲介公司                               | `PropNex Realty Pte Ltd`                                      |
| `posted_at`        | 刊登時間（ISO 8601）                   | `2026-06-15T10:30:00.000Z`                                    |
| `image_urls`       | 物件圖片網址陣列                       | `["https://cdn.99.co/photos/abc123_main.jpg"]`                |
| `listing_url`      | 物件完整網址                           | `https://www.99.co/singapore/sale/map/hdb/...`                |
| `source_mode`      | 這筆從哪個模式來的                     | `search`                                                      |
| `source_query`     | 抓取時用的查詢條件                     | `hdb queenstown sale`                                         |
| `scraped_at`       | 抓取當下時間（ISO 8601）               | `2026-07-04T05:23:28.617Z`                                    |

***

### 模式說明

| 模式          | 幹嘛用的                                      | 計費事件                 | 單價   | 狀態  |
| ------------- | --------------------------------------------- | ------------------------ | ------ | ----- |
| 🔎 **search** | 關鍵字搜尋，依條件抓物件清單                  | `search-listing`（每筆） | $0.002 | v1.0  |
| 📦 **detail** | 依 ID/網址抓單一物件完整資訊                  | `product-detail`（每筆） | $0.008 | v1.1  |

不管跑哪個模式，每次 Run 啟動都會額外收一次性的 `apify-actor-start` 費用 **$0.005**。所有計費都在資料成功寫入 dataset **之後**才會收，Run 結束時 log 會印出 `total_items / charged / skipped` 讓你對帳。

***

### 輸入欄位

| 欄位                   | 型別     |       必填        |    預設    | 說明                                                                                                                                                  |
| ---------------------- | -------- | :---------------: | :--------: | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `mode`                 | enum     |      建議填       |  `search`  | 目前只有 `search`（搜尋列表）可用；`detail` 規劃於 v1.1。                                                                                             |
| `queries`              | string\[] | `search` 模式必填 |     —      | 搜尋條件，一行一個，例如 `hdb queenstown sale`、`condo orchard rent`。單次最多 **50** 個。                                                             |
| `listingType`          | enum     |      選填         |   `sale`   | `sale`（售）或 `rent`（租）。                                                                                                                          |
| `mainCategory`         | enum     |      選填         |     —      | `hdb`（組屋）/ `condo`（公寓）/ `landed`（有地住宅），留空則抓全部類型。                                                                              |
| `bedrooms`             | integer  |      選填         |     —      | 指定臥室數量（1 起）。留空表示不限。                                                                                                                   |
| `priceMin`             | integer  |      選填         |     —      | 只留售/租價 ≥ 此金額的物件（SGD）。留空表示不限。                                                                                                     |
| `priceMax`             | integer  |      選填         |     —      | 只留售/租價 ≤ 此金額的物件（SGD）。留空表示不限。                                                                                                     |
| `bulkInput`            | string   |      選填         |     —      | **一行一個**，按 Enter 換行，不要加引號或逗號。搜尋模式當查詢條件，執行時自動併入 `queries`。從 Google Sheet / Excel 複製一整欄貼進來最快。            |
| `maxItems`             | integer  |      選填         |    `50`    | 每個搜尋條件最多抓幾筆物件（1-500）。越多費用越高。                                                                                                    |
| `proxyConfiguration`   | object   |      選填         |     —      | 99.co 對非新加坡 IP 有限制，建議開啟 Apify Proxy（Residential 或 RESIDENTIAL\_SG）以避免 429 封鎖。                                                    |

***

### 範例

**🔎 基本搜尋：queenstown HDB**

```json
{
    "mode": "search",
    "queries": ["hdb queenstown sale"],
    "maxItems": 20
}
```

**🏠 價格區間 + 指定臥室數**

```json
{
    "mode": "search",
    "queries": ["condo orchard rent"],
    "listingType": "rent",
    "mainCategory": "condo",
    "bedrooms": 2,
    "priceMin": 3000,
    "priceMax": 8000,
    "maxItems": 50
}
```

**📋 批量搜尋多個地段**

```json
{
    "mode": "search",
    "bulkInput": "hdb toa payoh sale\nhdb bishan sale\nhdb ang mo kio sale",
    "maxItems": 100
}
```

***

### 幾個要注意的地方

- **只抓公開資料**。不需要登入、不需要 99.co 帳號，也不會存取任何需要驗證才看得到的內容。
- **不用登入 / 不用 API token**。填好 input 就能跑，沒有任何金鑰要設定。
- **同一物件若命中多個搜尋條件，會以不同 `source_query` 各出一列（依查詢計費）**。例如 `hdb queenstown sale` 跟 `hdb central sale` 兩個條件都搜到同一物件，資料會出現兩筆，各自計費一次 `search-listing`。
- **跨頁去重**：同一搜尋條件內若同一物件出現在多個分頁，只計一筆（已內建去重）。
- **對網站友善**。每個 domain 併發數 ≤5，遇到失敗會用指數退避重試最多 3 次，不會對 99.co 伺服器狂發請求。
- **物件詳情（detail 模式）規劃於 v1.1 推出**。目前只支援搜尋模式。

***

### 常見問題

**Q: 搜尋條件怎麼寫？**
一行一個，格式盡量接近使用者在 99.co 搜尋框輸入的內容，例如 `hdb queenstown sale`、`condo river valley rent`、`landed serangoon`。可不帶 sale/rent（用 `listingType` 欄位控制），也可同時帶進去，爬蟲會把它當查詢標籤傳入。

**Q: 為什麼 `price_per_sqft` 是 null？**
99.co 部分物件沒有列出坪效，或是未在 API 回傳 `area_ppsf` 欄位，此時一律補 `null`，不做估算。

**Q: 費用怎麼算？**
每次 Run 啟動收一次 `apify-actor-start`（$0.005）；`search` 模式每筆物件列表收 `search-listing`（$0.002）。都是資料成功寫入 dataset 後才收費，Run log 會印出實際收費筆數。

**Q: 抓不到資料怎麼辦？**
先確認搜尋條件拼寫是否正確，換個更常見的地名或類型試試。爬蟲連續 5 次拿不到新資料就會自己停並在 log 寫原因，不會空轉燒錢。若遇到 429 封鎖，建議開啟 Proxy 設定。

**Q: 詳情模式（物件完整資訊）什麼時候有？**
規劃於 v1.1 推出。屆時可依物件 ID 或 99.co 物件網址批量抓取完整詳情資料。

***

### 部署

```bash
apify login              # 首次：貼上 Apify token（不會寫進 repo）
apify push               # 建置並上傳到 Apify Store
```

上架後在 Apify Console 的 Monetization 設定 PPE 事件單價：
`apify-actor-start` $0.005、`search-listing` $0.002。

***

### 免責聲明

本爬蟲只收集 99.co **公開可見**的房產物件資料，資料僅供研究與個人用途使用，不用於任何未經授權的商業轉售。使用前請自行確認符合 99.co 服務條款與當地法規。對於資料的正確性、即時性或完整性，本 Actor 不做任何保證，房價與物件狀態請以 99.co 官網當下顯示為準。

***

*99.co 爬蟲、新加坡房產、HDB 組屋、公寓、有地住宅、售出、租賃、房價追蹤、新加坡房市資料、Singapore property data*

# Actor input Schema

## `mode` (type: `string`):

要抓什麼？選一個模式，填下面對應欄位就好。

## `queries` (type: `array`):

搜尋模式的查詢標籤，例如：hdb queenstown sale、condo orchard rent。一個概念一行。

## `listingType` (type: `string`):

售出（sale）或租賃（rent）。

## `mainCategory` (type: `string`):

選擇房產類型，不選則抓全部類型。

## `bedrooms` (type: `integer`):

指定臥室數量（1-5+）。留空表示不限。

## `priceMin` (type: `integer`):

只留售/租價 ≥ 此金額的物件。留空表示不限。

## `priceMax` (type: `integer`):

只留售/租價 ≤ 此金額的物件。留空表示不限。

## `listingIds` (type: `array`):

99.co 物件 ID，例如 PkhHsqk7hrY7DPXGtPVr6L（在物件網址最後一段）。詳情模式用這個。

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

99.co 物件完整網址，例如 https://www.99.co/singapore/sale/map/hdb/foo-PkhHsqk7hrY7DPXGtPVr6L。會自動抽出 ID。

## `bulkInput` (type: `string`):

**一行一個**，按 Enter 換行，不要加引號或逗號。搜尋模式當查詢條件、詳情模式當物件 ID/網址，執行時自動併入上面對應欄位。從 Google Sheet / Excel 複製一整欄貼進來最快。

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

每個搜尋條件最多抓幾筆物件（搜尋模式）。越多費用越高。詳情模式不受此限（依 ID 數量）。

## `proxyConfiguration` (type: `object`):

99.co 對非新加坡 IP 有限制，建議開啟 Apify Proxy（Residential 或 RESIDENTIAL\_SG）以避免 429 封鎖。

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "hdb queenstown sale"
  ],
  "listingType": "sale",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "mode": "search",
    "queries": [
        "hdb queenstown sale"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("claude_code_reviewer/99co-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 = {
    "mode": "search",
    "queries": ["hdb queenstown sale"],
}

# Run the Actor and wait for it to finish
run = client.actor("claude_code_reviewer/99co-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 '{
  "mode": "search",
  "queries": [
    "hdb queenstown sale"
  ]
}' |
apify call claude_code_reviewer/99co-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,claude_code_reviewer/99co-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/UlGlfChwIQ0InJ7Xj/builds/C3bN1CE0oqUEkZ0ok/openapi.json
