# Singapore HDB Resale Price Data — Prices, $/sqft & Analytics (`inexhaustible_glass/singapore-property-data`) Actor

- **URL**: https://apify.com/inexhaustible\_glass/singapore-property-data.md
- **Developed by:** [Hitman studio](https://apify.com/inexhaustible_glass) (community)
- **Categories:** Business, Real estate, AI
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 transactions

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/platform/actors/running/actors-in-store#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

## 🇸🇬 Singapore HDB Resale Price Data — Prices, $/sqft & Analytics

**The most complete HDB resale price tool on Apify.** Search **~980,000 official HDB resale flat transactions** (1990–present) from **data.gov.sg**, enriched with the numbers people actually compare on — **price per sqft**, price per sqm, floor area in sqft, storey, flat age and remaining lease — plus built-in **median / average price & $/sqft analytics** by town, flat type and year.

> ✅ **Official source, no blocks.** Straight from the Singapore government open-data API — **no API key, no captcha, no login, no IP blocks.**

### ⚡ What this HDB scraper does

- 🏠 Search **980k+ HDB resale transactions** by **town**, **flat type**, price, floor area, remaining lease, street, block & date
- 💲 **Price per sqft & per sqm** on every record (raw scrapers don't give this)
- 📊 **Analytics summary** — median & average resale price and $/sqft **by town, flat type and year** (trend)
- 💰 Find **million-dollar HDB flats** (set minimum price to 1,000,000)
- 🕒 Full history **1990 → present** (5 official period datasets, nothing missed)
- 📥 **CSV + JSON** export, ready for Excel / dashboards / valuation models
- 🤖 Works as a **tool for AI agents** (ChatGPT / Claude) via the Apify MCP server

### 🎯 Perfect for

- **Property agents** — instant comps & pricing ($/sqft) for a town or block
- **Buyers & sellers** — check fair resale value before an offer
- **Valuers & mortgage / banks** — automated valuation inputs
- **Investors** — spot underpriced blocks, lease-decay analysis, trends
- **Proptech & analysts** — feed clean data into models, dashboards & AI

### 📋 Input

| Field | Description |
|---|---|
| `town` | HDB town (e.g. `TAMPINES`, `QUEENSTOWN`) — or all towns |
| `flatType` | `1 ROOM` … `5 ROOM`, `EXECUTIVE`, `MULTI-GENERATION` |
| `monthFrom` / `monthTo` | Date range `YYYY-MM` |
| `minPrice` / `maxPrice` | Resale price range in SGD (min 1,000,000 = million-dollar flats) |
| `minAreaSqm` / `maxAreaSqm` | Floor area range |
| `minRemainingLease` | Minimum remaining lease (years) |
| `street` / `block` / `flatModel` | Location & model filters |
| `allHistory` | Search all 1990–present (default: most recent period) |
| `includeAnalytics` | Median/avg price & $/sqft by town, flat type & year |
| `maxResults` | 1–20000 |

#### Example input

```json
{
  "town": "TAMPINES",
  "flatType": "4 ROOM",
  "monthFrom": "2024-01",
  "minRemainingLease": 80,
  "maxResults": 500
}
```

### 📤 Output (per transaction)

```json
{
  "month": "2024-03",
  "town": "TAMPINES",
  "flat_type": "4 ROOM",
  "block": "866A",
  "street_name": "TAMPINES ST 83",
  "address": "866A TAMPINES ST 83",
  "flat_model": "Model A",
  "resale_price": 620000,
  "floor_area_sqm": 92,
  "floor_area_sqft": 990,
  "price_per_sqm": 6739,
  "price_per_sqft": 626,
  "storey_range": "10 TO 12",
  "storey_mid": 11,
  "lease_commence_year": 2004,
  "flat_age_years": 20,
  "remaining_lease_years": 79.4,
  "record_type": "hdb_resale"
}
```

The run's key-value store also holds a **`DATA_CSV`** file and a **`SUMMARY`** with the analytics:

```json
{
  "analytics": {
    "overall": { "count": 500, "median_price": 615000, "median_price_per_sqft": 618 },
    "by_town": { "TAMPINES": { "median_price": 615000, "median_price_per_sqft": 618 } },
    "by_flat_type": { "4 ROOM": { "median_price": 615000 } },
    "price_trend_by_year": { "2024": { "avg_price": 610000, "avg_price_per_sqft": 615 } }
  }
}
```

### ❓ FAQ

**Q: Where is the data from?** The official **data.gov.sg** HDB "Resale Flat Prices" datasets (1990–present). Public, free, no key.

**Q: Does it include price per sqft?** Yes — computed on every record, plus median/average $/sqft by town & flat type.

**Q: Can I find million-dollar flats?** Yes — set `minPrice` to `1000000`.

**Q: How far back does it go?** 1990 to the latest month. Enable `allHistory` (or set `monthFrom`) for older data.

### 🔖 Keywords

singapore hdb resale price, hdb resale scraper, hdb price per sqft, hdb resale transactions, singapore property price data, hdb flat price, hdb resale api, hdb price checker, singapore property scraper, hdb valuation data, resale flat prices singapore, hdb price trends, price per square foot singapore, million dollar hdb flat, hdb resale market data, singapore real estate data, property price analytics singapore, hdb resale price index, data.gov.sg property, hdb transaction history, singapore housing data, hdb price by town, proptech data singapore, AI agent tool, MCP server, LLM tool, tool for ChatGPT, tool for Claude, real estate data for AI

# Actor input Schema

## `town` (type: `string`):

HDB town to search (leave empty for all towns). Prices vary a lot by town.

## `flatType` (type: `string`):

HDB flat type (leave empty for all).

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

How many transactions to return (1–20000).

## `monthFrom` (type: `string`):

Only transactions on/after this month, e.g. 2024-01. Controls which historical dataset is searched.

## `monthTo` (type: `string`):

Only transactions on/before this month, e.g. 2025-12.

## `minPrice` (type: `integer`):

Only flats sold for at least this price. Tip: set 1000000 to find million-dollar HDB flats.

## `maxPrice` (type: `integer`):

Only flats sold up to this price.

## `street` (type: `string`):

Filter by street name, e.g. "BISHAN ST 22".

## `block` (type: `string`):

Exact HDB block number, e.g. "174".

## `flatModel` (type: `string`):

Filter by exact HDB flat model (fast, server-side). Leave empty for all.

## `minAreaSqm` (type: `integer`):

Only flats with at least this floor area in square metres.

## `maxAreaSqm` (type: `integer`):

Only flats with up to this floor area in square metres.

## `minRemainingLease` (type: `integer`):

Only flats with at least this many years of lease remaining (lease decay matters for value).

## `allHistory` (type: `boolean`):

Search all ~980k transactions from 1990. By default only the most recent period is searched (faster).

## `includeAnalytics` (type: `boolean`):

Compute median/average price & price-per-sqft by town, flat type and year (saved to the run's SUMMARY).

## `useProxy` (type: `boolean`):

Escalate to Apify proxy only if data.gov.sg rate-limits. Recommended ON.

## Actor input object example

```json
{
  "town": "ANG MO KIO",
  "flatType": "4 ROOM",
  "maxResults": 200,
  "monthFrom": "2024-01",
  "minPrice": 0,
  "maxPrice": 0,
  "flatModel": "",
  "minAreaSqm": 0,
  "maxAreaSqm": 0,
  "minRemainingLease": 0,
  "allHistory": false,
  "includeAnalytics": true,
  "useProxy": true
}
```

# 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 = {
    "town": "ANG MO KIO",
    "flatType": "4 ROOM",
    "maxResults": 200,
    "monthFrom": "2024-01"
};

// Run the Actor and wait for it to finish
const run = await client.actor("inexhaustible_glass/singapore-property-data").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 = {
    "town": "ANG MO KIO",
    "flatType": "4 ROOM",
    "maxResults": 200,
    "monthFrom": "2024-01",
}

# Run the Actor and wait for it to finish
run = client.actor("inexhaustible_glass/singapore-property-data").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "town": "ANG MO KIO",
  "flatType": "4 ROOM",
  "maxResults": 200,
  "monthFrom": "2024-01"
}' |
apify call inexhaustible_glass/singapore-property-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=inexhaustible_glass/singapore-property-data",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/dsDWyMau6znsuR0D2/builds/14hUM14MVPRmbXZH7/openapi.json
