HDB Resale Transactions Singapore
Pricing
from $0.50 / 1,000 result items
HDB Resale Transactions Singapore
Extract Singapore HDB resale transaction data from the official data.gov.sg API. 900k+ records from 1990 to present.
Pricing
from $0.50 / 1,000 result items
Rating
0.0
(0)
Developer
Unfenced Group
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share

Every HDB resale flat transaction in Singapore, from January 1990 to the present — around 889,000 records. Filter by town, flat type, and month range. No API key required.
Why this scraper?
🏙️ Complete history
All HDB resale transactions since 1990 in one place — close to 889,000 records across the full period.
🔍 Precise filtering
Filter by town, flat type, and month range. Pull just one estate for one quarter, or the entire national history.
📐 Derived price intelligence
Every record includes price per square foot and price per square metre in SGD, computed for you — not just the raw resale price.
🏠 Full flat detail
Town, block, street, storey range, flat model, floor area, lease commencement, and remaining lease where available.
💸 Lowest price in category
The most affordable HDB resale source on the Apify Store — many times cheaper than the alternatives.
Input parameters
| Field | Type | Default | Description |
|---|---|---|---|
town | string | "" | Filter by HDB town, exact match (e.g. BISHAN, TAMPINES). Empty returns all towns. |
flatType | string | "" | Filter by flat type, partial match (e.g. 4 ROOM, EXECUTIVE). Empty returns all types. |
monthFrom | string | "" | Only transactions on or after this month (YYYY-MM). Empty for no lower bound. |
monthTo | string | "" | Only transactions on or before this month (YYYY-MM). Empty for no upper bound. |
datasetPeriods | array | ["2017-present"] | Which source periods to query: 1990-2014, 2000-2016, 2017-present, or all. |
maxResults | integer | 5 | Maximum number of transactions to return. |
requestDelayMs | integer | 300 | Delay between page requests in milliseconds. |
Output schema
| Field | Type | Description |
|---|---|---|
month | string | Transaction month (YYYY-MM). |
transactionYear | integer | Year of transaction. |
transactionQuarter | string | Quarter of transaction (Q1–Q4). |
town | string | HDB town. |
block | string | Block number. |
streetName | string | Street name. |
address | string | Combined block and street. |
flatType | string | Flat type (e.g. 4 ROOM). |
flatModel | string | Flat model (e.g. Improved, New Generation). |
storeyRange | string | Storey range (e.g. 10 TO 12). |
storeyMin | integer | Lower bound of storey range. |
storeyMax | integer | Upper bound of storey range. |
floorAreaSqm | number | Floor area in square metres. |
floorAreaSqft | number | Floor area in square feet (derived). |
resalePrice | number | Resale price in SGD. |
priceCurrency | string | Always SGD. |
priceText | string | Formatted price string (e.g. SGD 550,000). |
pricePerSqftSGD | number | Price per square foot in SGD (derived). |
pricePerSqmSGD | number | Price per square metre in SGD (derived). |
leaseCommenceDate | integer | Year the lease commenced. |
remainingLease | string | Remaining lease (2017-present dataset only; null otherwise). |
leaseAgeYears | integer | Years since lease commencement. |
source | string | Always data.gov.sg. |
datasetPeriod | string | Source dataset period the record came from. |
scrapedAt | string | ISO timestamp of retrieval. |
contentHash | string | Stable hash of the transaction for deduplication. |
{"month": "2026-05","transactionYear": 2026,"transactionQuarter": "Q2","town": "BISHAN","block": "284","streetName": "BISHAN ST 22","address": "284 BISHAN ST 22","flatType": "4 ROOM","flatModel": "Model A","storeyRange": "10 TO 12","storeyMin": 10,"storeyMax": 12,"floorAreaSqm": 92,"floorAreaSqft": 990,"resalePrice": 720000,"priceCurrency": "SGD","priceText": "SGD 720,000","pricePerSqftSGD": 727,"pricePerSqmSGD": 7826,"leaseCommenceDate": 1992,"remainingLease": "65 years 08 months","leaseAgeYears": 34,"source": "data.gov.sg","datasetPeriod": "2017-present","scrapedAt": "2026-06-25T00:00:00.000Z","contentHash": "a1b2c3d4e5f6a7b8"}
Examples
All recent transactions in Bishan:
{"town": "BISHAN","datasetPeriods": ["2017-present"],"maxResults": 100}
4-room flats in Tampines for 2025:
{"town": "TAMPINES","flatType": "4 ROOM","monthFrom": "2025-01","monthTo": "2025-12","maxResults": 500}
Executive flats nationwide, full history:
{"flatType": "EXECUTIVE","datasetPeriods": ["all"],"maxResults": 2000}
Single quarter snapshot across all towns:
{"monthFrom": "2026-04","monthTo": "2026-06","datasetPeriods": ["2017-present"],"maxResults": 1000}
💰 Pricing
$0.50 per 1,000 results — you only pay for transactions actually returned.
| Results | Cost |
|---|---|
| 100 | ~$0.05 |
| 1,000 | ~$0.50 |
| 10,000 | ~$5.00 |
| 100,000 | ~$50.00 |
Flat-rate alternatives typically charge $29–$49/month regardless of usage.
Use the Max results cap in the input to control your spend exactly.
Performance
| Run size | Approximate time |
|---|---|
| 100 records | under 10 seconds |
| 1,000 records | under 30 seconds |
| 10,000 records | 2–4 minutes |
Known limitations
- Town and flat-type filters apply to the official town names used by the source data (e.g. ANG MO KIO, BUKIT BATOK). Spelling must match.
remainingLeaseis only available for transactions from 2017 onward; earlier records return null.- Data reflects what the source has published and may lag the most recent transactions by a short period.
Technical details
- Source: data.gov.sg — Singapore government open data on HDB resale transactions
- Coverage: January 1990 to present, around 889,000 transactions
- Memory: 512 MB
- Retry: Automatic retry on network errors, exponential backoff
Related scrapers
Other scrapers in our Real Estate — Singapore collection:
Run it on a schedule
This actor is built for repeat use. Set it to run daily, weekly, or hourly, and the data keeps flowing without you touching it.
- Schedule runs — open the actor, go to Schedules, and pick a cadence. Each run only charges you for the results it returns.
- Connect it to your stack — push results straight to Google Sheets, Slack, a webhook, or your database using Apify Integrations. No glue code needed.
- Pull results via API — every run writes a clean dataset you can fetch with one API call, ready for whatever you build on top of it.
Set it once and it runs on its own.
Need a custom scraper?
Unfenced Group builds Apify actors for any website — for free.
If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.
Get in touch: www.unfencedgroup.nl