Source-of-truth document
Methodology
Where haio’s numbers come from, how the price estimate is built, and what this dataset cannot tell you. Written so a journalist can cite a figure on any property page without legal or factual exposure, and so a first-time buyer can understand — and decide whether to trust — the estimate they are looking at.
Retrieved 2026-08-31· coverage refreshed hourly
1. Coverage
1.1 Data sources
haio is a join over five Singapore datasets. Four are public and free, and every figure drawn from them can be checked against the originals. The fifth is REALIS, URA’s subscription-only property information service. It is the reason a haio page can show the actual unit a sale happened in, and the house number on a landed sale, where the free caveat download publishes only a floor band.
| Source | Covers | Last refresh | Rows last run |
|---|---|---|---|
| URA (Urban Redevelopment Authority) | Private resale caveats — condo, apartment, EC, private landed. 1995–present. Public and free. Carries price, date, area, project and a floor band (for example 07 TO 09), but no unit number and no house number. | 2026-08-30 | 4,752 |
| URA Master Plan 2025 land use, via data.gov.sg | The land parcel each MOE primary school actually sits on. MOE measures P1 priority from your building outline to the school boundary, not to a pin in the middle of the campus, so every 1 km / 2 km band on this site is measured to the real parcel edge. URA Master Plan land use via data.gov.sg — Singapore Open Data Licence. | MP2025 edition | 181 of 182 schools |
| MOE (Ministry of Education) P1 Registration Exercise | Backs the Primary Schools section’s ballot chips and outcome sentences on a property page — the published vacancies, applicants and ballot-cut figures for each MOE primary school, exactly as MOE published them (never rebased, rounded or recomputed). MOE’s Terms of Use require the copyright credit shown on any page that carries this data: Source: Ministry of Education, Singapore — 2025 P1 Registration Exercise. © Ministry of Education, Government of Singapore. MOE P1 past vacancies & balloting data. | Annual | — |
| LTA DataMall + OpenStreetMap | Backs the Location section’s commute-reach (isochrone) map on a property page: public-transit schedules from LTA and the walking network from OpenStreetMap. Two different licences, both credited on every page that draws the map: “Transit schedules © LTA; © OpenStreetMap contributors.” OpenStreetMap is ODbL 1.0 — attribution is required and share-alike can extend to a derivative database; LTA’s terms carry no equivalent open-data licence name, so it is credited by copyright only, never folded into the Singapore Open Data Licence line above. | — | — |
| REALIS (URA property information service) | Paid, subscription-only. The unmasked unit number on a private sale, and the house number on a landed sale. These two fields are the ones the free caveat download does not publish, so figures that rest on them cannot be reproduced from public data. | — | — |
| HDB via data.gov.sg | HDB resale transactions, full historical depth. Daily delta from 2026-06-02 onwards. | 2026-08-30 | 238,927 |
| SLA OneMap | Landed property registry, polygon-keyed addresses. | 2026-08-30 | 93,076 |
| MAS (Monetary Authority of Singapore) | SORA daily snapshots (1m / 3m / 6m), used for mortgage rate display only. | — | — |
— means the source had not yet written a watermark at page-build time. URA, HDB, SLA OneMap and MAS are public and free: anything sourced from them can be checked against the originals. REALIS is not. It is a paid URA service, and the unit and house numbers it supplies are the part of haio you could not rebuild yourself from data.gov.sg. That is a deliberate choice: the free caveat download, and anything built only on it, can tell you a sale happened somewhere between the 7th and 9th floor. We would rather tell you which unit.
1.2 Coverage by tenure
Live counts from the address-keyed properties and transactions tables. Pulled at page build, refreshed hourly.
- HDB
- 13,481 blocks
- 980,077 txns
- Condo / Apartment / EC
- 3,131 projects
- 601,800 txns
- Landed
- 93,064 addresses
- 83,501 txns
Corpus total: 1,665,378 transactions across 109,676 addresses.
1.3 Update cadence
- The database refreshes daily, in an overnight window (Singapore time). Each source updates incrementally.
- SORA refreshes daily. URA caveats land roughly weekly behind URA’s own release schedule (caveats are lodged retrospectively).
- HDB resale carries full historical depth, with new transactions added daily.
2. How the estimate works
haio values a home the way a careful human valuer does: find recent sales of genuinely similar properties nearby, then adjust each one for the ways it differs from the home you’re looking at. We don’t guess a price from a black box, and we don’t learn a number from features. Every estimate is built from real recorded transactions and a chain of adjustments you could check by hand.
The unit that does the work is PSF — price per square foot. A $2.4m sale of an 800 sqft flat and a $3.6m sale of a 1,200 sqft flat are both $3,000 PSF; reducing every sale to PSF lets us compare homes of different sizes on the same footing. For landed homes, the comparable unit is PSF of land, because what is being traded is mostly the plot.
2.1 Choosing the comparables
A comparable (“comp”) is a past sale similar enough to inform the subject’s price. Two things make a comp trustworthy: proximity (the same micro-market — prices change street by street) and recency (the market moves, so last quarter beats five years ago). We never mix tenure cohorts (HDB, condo and landed are separate markets) and never mix property types (a terrace is not compared to a detached house).
Rather than draw a fixed radius, the landed model widens its search in ordered steps and stops as soon as it has enough genuine comps:
- the same named estate (e.g. Serangoon Gardens, Frankel);
- the same subzone (a URA-defined planning sub-area);
- adjacent subzones;
- the wider planning area.
On top of that ladder, any sale within 300 metres of the subject is always allowed in, even if it sits across an estate boundary — a house two streets away is a better comp than one at the far end of the same label. The search also holds two hard limits: the comp’s plot size must be within about ±25% of the subject’s, and it should have sold within roughly the last 18 months. If a pocket of the market is so thin that these filters return too few sales, the model loosens them one notch at a time — and records every step it took, because how far it had to reach is itself a signal of how much to trust the answer (see §2.4). For HDB and condo pages, the same idea runs in a simpler form: same district and tenure, similar floor area, most-recent sales first.
2.2 Adjusting each comparable
No two homes are identical, so a raw comp PSF is rarely the right answer for the subject. We apply hedonic adjustments — “hedonic” just means decomposing a price into the value of its individual characteristics, then correcting for the ones that differ. Each factor below is estimated from the transaction history itself (a regression across the whole market), not hand-set, so it is defensible to a professional valuer.
- Time. The market has moved since the comp sold. We carry its price to today using a quarterly price index — a measure of how landed (or condo, or HDB) prices have drifted, built from our own transaction record. A comp that sold when the index was 150 and is being used when the index is 165 is scaled up by 165÷150. This is why a slightly older comp is still safe to use: we are not pretending it sold today, we are explicitly re-pricing it to today.
- Size. Bigger plots usually sell for a lower PSF — land gets cheaper per foot as the parcel grows. We measure exactly how much from the data (an elasticity, typically in the range of a 10–30% PSF give for a doubling of land) and scale the comp toward the subject’s size.
- Floor and stack (condos). Higher floors and better-facing stacks command a premium; URA records the floor as a 5-storey band, and the comparable mix reflects it.
- Tenure and remaining lease. A 99-year leasehold loses value as its lease runs down; a freehold does not. Within the leasehold cohort we re-price a comp to the subject’s remaining years using Bala’s Table, the standard SLA/URA leasehold curve (see §4). Freehold and 999-year homes need no lease adjustment.
- Age, structure and rebuilds (landed). A freshly rebuilt 3-storey house is worth more than a tired single-storey one on the same plot. We separate the land value from the building value, depreciate the building over its economic life, and credit recent reconstructions. A&A works that refresh a house without rebuilding it do not reset its age.
After these adjustments, each comp is no longer “what that house sold for” — it is “what that sale implies the subject is worth today, in today’s market.”
2.3 The estimate and the confidence band
We combine the adjusted comps into a single number using a weighted median, not a simple average. The median is robust: one freak sale can’t drag the estimate the way it would drag a mean. The weights give more say to comps that are closer, more recent, and closer in size — a sale next door last month counts for more than one across the planning area two years ago.
Around the point estimate we show a range, not a single figure. The width of that band is the spread of the adjusted comps themselves: when the comps agree closely, the band is tight; when they disagree — or when there are few of them — the band is wide. The band is honest by construction. It gets narrower where the evidence is strong and wider where it is thin, rather than being a cosmetic fixed ±percent.
2.4 The confidence score
Every landed estimate also carries a 0–100 confidence score. It goes down when the model had to reach far for comps (loosening the search in §2.1), when there were few comps, when the comps disagreed with each other, or when key facts (like a home’s age) had to be inferred rather than known. A number is far more useful — and more honest — when it arrives with a measure of how much to trust it.
We hold ourselves to a hard test: the estimate must be measurably more accurate when it says it is confident. On a held-out test of 2025 landed sales the model never saw during tuning, its highest-confidence estimates landed within about 6–7% of the eventual sale price (median), versus a wider error on its low-confidence ones — the score tracks reality. Overall median error across all landed estimates was around 9%. That is an honest estimate of central value, not an appraisal: roughly half of homes will transact within ~9% of our number and half outside it, and individual homes — especially unusual ones — can differ more.
3. What the estimate can and can’t say
The method above is only as good as the evidence underneath it. Where the evidence is thin, we widen the band, lower the confidence score, or decline to estimate — we would rather show you nothing than show you a confident wrong number. A clearly-uncertain estimate is the product working, not failing.
- Thin markets. Rare enclaves and Good Class Bungalow areas transact a handful of times a year. With one or two comps, the band is wide and the confidence score is low by design — sometimes a single comp is all that exists, and we say so rather than manufacture precision.
- Brand-new launches. A project with no resale history has no like-for-like comps; new-sale prices behave differently from resale, and our error is higher there. We flag these rather than pretend otherwise.
- Unusual properties. An oversized plot, a corner site, an unusual structure, or a home whose age or lease we can only infer will all widen the band — the further a property sits from its neighbours’ profile, the less a comparable-sales method can pin it down.
- Properties with no transaction history at all. Some addresses exist in the registry but have never lodged a caveat (see §7.1). For those we can confirm the address exists — not what it is worth.
The estimate is a transparent read on central value from recorded transaction data, and every adjustment behind it is shown rather than hidden in a model. It is not a formal valuation or an appraisal, and it is not financial advice. For a binding number — a mortgage, a sale, a dispute — commission a licensed valuer.
3b. The comparables table on each page
So you can audit the estimate yourself, every property page shows the actual comparable sales behind it (source: lib/data/comparables.ts). The table is deliberately plain — what URA / HDB recorded, filtered, with no price filter and no outlier trimming:
- Same tenure cohort and property type as the subject — never mixed.
- Nearby, per the proximity ladder in §2.1.
- Similar in size to the subject.
- Transacted recently, most recent first; up to 12 shown by default.
The table shows the raw recorded prices. The estimate in §2 is what those same sales imply after the time, size, tenure and structure adjustments — so a comp’s headline price and its contribution to the estimate can legitimately differ.
4. Lease decay
Leasehold property value decays with remaining tenure. We surface a projected residual value on leasehold pages using the Bala’s Table coefficients — the standard curve published by SLA / URA for leasehold valuation.
Implementation: lib/calculators/lease-decay.ts. Eleven anchor points from 99 years remaining (multiplier 1.000) down to 0 years (multiplier 0.000); intermediate years are linearly interpolated between adjacent anchors.
Applied only when tenure_type is 99 or 999 AND lease_start is populated. Freehold and properties with unknown lease start show no decay projection.
5. Affordability: LTV / TDSR / MSR
The affordability calculator implements the MAS envelope as published in MAS Notice 645 (TDSR) and the corresponding MSR framework for HDB / EC purchases. Source: lib/calculators/affordability.ts.
- TDSR cap
- 55% of gross monthly income, inclusive of all recurring debt obligations.
- MSR cap
- 30% of gross monthly income, HDB and EC only. The tighter of TDSR and MSR binds.
- Stress-test rate
- 4.00% p.a. — MAS-mandated medium-term rate. Used for the TDSR / MSR repayment calculation regardless of the live SORA rate, exactly as banks underwrite.
- Default LTV
- 75% — standard first-loan LTV on a private property or an HDB resale bank loan. Lower (55% or 45%) tiers apply where the loan tenor extends past age 65, or beyond 25 (HDB) / 30 (private) years; surface those through the calculator’s tenor input.
- Default tenor
- 30 years. Cap is 25 (HDB) / 30 (private) by regulation; the calculator enforces this.
This is a structural calculator, not a credit decision. Banks add their own underwriting (credit history, employment type, foreign-income haircut, etc.) on top.
5b. Mortgage rates
The Mortgage calculator quotes a monthly payment built from a live reference rate plus a bank spread. Two distinct rates do different jobs — one for the payment shown, one for the affordability check — and conflating them is a common source of confusion. Source: lib/calculators/mortgage.ts.
5b.1 SORA — the live reference
SORA (Singapore Overnight Rate Average) replaced SIBOR in 2024 as the MAS-endorsed reference for SGD floating-rate loans. The calculator uses the published 3-month compounded SORA from www.mas.gov.sg/statistics/sgs-rates, updated each business day. The headline rate you see at the top of the calculator is SORA + spread — this is what your actual monthly payment is computed against.
5b.2 MAS 4% stress test — the affordability gate
For TDSR / MSR (see section 5), MAS requires banks to underwrite at a medium-term floor of 4.00% p.a., regardless of the live SORA. This is a regulatory minimum to keep borrowers solvent if rates rise. Haio applies the same 4% rate inside the affordability check, exactly as a bank would. That means the maximum loan you qualify for is computed at 4%, while the monthly payment shown is computed at the live SORA + spread — usually lower.
5b.3 Bank spread variability
The spread over SORA (typically 50–100 basis points) varies by bank, by loan size, by lock-in tenor, and by whether the loan is for a private property, HDB resale, or commercial. The calculator uses a neutral default; real bank packages can come in tighter or wider. Treat the payment shown as directional — for a binding quote, speak to a mortgage broker or the lender directly.
6. Stamp duty
Implemented per IRAS-published bands. Source: lib/calculators/stamp-duty.ts.
6.1 BSD — Buyer’s Stamp Duty (residential)
| Band of purchase price | Rate |
|---|---|
| First $180,000 | 1% |
| Next $180,000 | 2% |
| Next $640,000 | 3% |
| Next $500,000 | 4% |
| Next $1,500,000 | 5% |
| Remainder | 6% |
6.2 ABSD — Additional Buyer’s Stamp Duty
| Buyer | 1st property | 2nd property | 3rd+ property |
|---|---|---|---|
| Singapore Citizen | 0% | 20% | 30% |
| Singapore PR | 5% | 30% | 35% |
| Foreigner | 60% on every purchase | ||
| Entity / Trust | 65% on every purchase | ||
6.3 SSD — Seller’s Stamp Duty
SSD depends on when the property was purchased, not when it is sold. A 2025 revision — effective for purchases on or after 4 July 2025 — extended the holding period from three years to four and raised every tier, so two schedules are now live in parallel.
Purchased on or after 4 July 2025 — 4-year holding period
If the property is resold within:
- 1 year: 16% of resale price
- 2 years: 12%
- 3 years: 8%
- 4 years: 4%
- Beyond 4 years: nil
Purchased before 4 July 2025 — 3-year holding period
If the property is resold within:
- 1 year: 12% of resale price
- 2 years: 8%
- 3 years: 4%
- Beyond 3 years: nil
Source: IRAS Singapore. Rates correct as of the last review on 2026-07-08. ABSD remission schemes (matrimonial, mixed-nationality) are not modelled.
7. Known data limitations
What this dataset cannot tell you. Read this before citing a figure.
7.1 Cadastral-only landed addresses
Of the 93,064 landed addresses we surface, 46,904 (50%) come from the SLA polygon registry alone — we have a postal address but no transactional evidence (no caveat ever lodged). These pages carry a cadastral_only flag and explicitly say so. Treat them as “this address exists”, not “this address is on the market”.
7.2 Private leasehold reclassification
Prior to commit e803379 (2026-06-02), private condo rows defaulted tenure_type = freehold when URA’s caveat had no explicit field. This systematically misclassified an unknown number of leasehold projects. The ETL now derives tenure_type and remaining_lease directly from URA’s parquet feed. If you are citing a tenure label, prefer a page retrieved after 2026-06-02.
7.3 Sparse HDB floor area
HDB area_sqft is missing on a non-trivial share of older resale rows. When a transaction has no area, no PSF can be computed; charts that aggregate PSF silently drop these. Where all rows in scope lack area, the chart falls back to absolute price and labels the axis accordingly.
7.4 Floor band granularity
URA publishes the floor of a caveat as a 5-storey band (e.g. 06–10), not an exact floor. We surface the band as-is. Two units on different floors of the same band are indistinguishable to us.
7.5 HDB watermark seeded 2026-06-02
The historical HDB resale corpus is in the database. The daily delta-write watermark was seeded at 2026-06-02T04:00:58Z to keep the cron memory-bounded. Any HDB row with updated_at earlier than that came in via backfill; later rows came in via the daily delta.
7.6 What we don’t have
Rental yields are computed only at project level — a project-wide figure from our enriched dataset, surfaced on the Projects Ranking view — not per unit or per listing. No predicted appreciation. No future-supply impact modelling beyond the raw upcoming-supply registry. No agent or developer ratings. No listings; haio is a transaction-history site, not a marketplace.
8. En-bloc likelihood
On a private condo page we may surface an en-bloc (collective-sale) likelihood tier. It answers one narrow question: relative to other private condos, how does this development rank for the chance of a successful collective sale over roughly the next 5 years?
8.1 A tier, never a percentage
We show a relative tier — Very low, Low, Moderate, High, or Very high likelihood — and never a number. The honest reason: our model produces a literal probability, but that probability is not yet trustworthy on its own (it is inflated in the mid-range and moves with the property cycle). What is reliable is the ranking: the top tiers genuinely concentrate the developments that go on to transact collectively. So we surface the rank-honest tier and deliberately withhold the raw percentage. A tier is a ranking signal, not a probability and not a prediction of any specific outcome.
8.2 How the tier is derived
A gradient-boosted model scores each eligible private condo from structural factors — building age, remaining lease, Master-Plan plot ratio (development headroom), unit count, and recent collective-sale activity nearby. Each development is then placed by its percentile within the scored universe: roughly the top twentieth is Very high, the rest of the top sixth is High, the next fifth is Moderate, the middle of the pack is Low, and the bottom half — where the model sees little to separate one development from another — is Very low. The card lists the two or three factors pushing a given development up its ranking, in plain language.
8.3 Grounded in real past deals
The model is trained and validated against actual historical collective-sale outcomes. That history is compiled from private aggregators rather than a government release: URA does not publish a collective-sale record, so these rows are not government data and each one carries its own source. Where we have them, the card names a few comparable past deals (development + year) so you can see the basis. When the model has too little structural data for a development, it abstains — we show no tier rather than a guess.
8.4 Limits
A real en-bloc needs the requisite owner consent (80% or 90% by share value depending on the development’s age) and a buyer willing to pay — neither of which a structural model can see. Treat the tier as a starting signal for further research, not as advice or a forecast. It is refreshed periodically as new collective-sale outcomes and URA Master-Plan data come in.
9. Selling pressure
On a condo project page or an HDB block page we may surface a selling-pressure tier — a read on how likely nearby owners are to sell, and when. It is deliberately two-sided: an owner uses it to time their own exit and avoid listing into a flood; a buyer uses it to spot where a wave of supply — and negotiating room — is building; an agent uses the same aggregate to plan coverage.
9.1 A decile rank, never a probability
Selling pressure is a composite of several signals, and that composite is not validated as a literal likelihood. So, exactly as with en-bloc likelihood, we surface only a relative rank and never a number. Every comparable development is scored and placed by percentile into one of ten tiers — tier 1 is the lowest selling pressure, tier 10 the highest (the hottest to prospect). The top tiers concentrate the developments where a supply wave — and the best chance of winning a listing — is building. On the prospecting map these tiers render as a heatmap, and a tier filter lets an agent isolate the highest ones (say, tiers 8, 9 and 10) to see where to prospect first. It remains a ranking signal, not a prediction that any particular home will be listed.
9.2 What goes into it
For a condo project we blend three things from URA caveat data: the share of units that are free to sell now (past the seller’s-stamp-duty window), the share that have been held over ten years (latent turnover), and the share of recent resales that sold at a gain (motivation), with a small lift for higher en-bloc interest. For an HDB block there is no resale profit-and-loss lens, so the signal is purely MOP timing: a block past its estimated Minimum Occupation Period is free to sell now; one reaching MOP in the next year or two is an incoming supply wave.
9.3 Privacy and honesty
Every figure is an aggregate count with its sample size shown; we never surface an owner’s name, a unit number, or an exact address. Projects and blocks with fewer than ten units are suppressed entirely — the floor is enforced in the precomputed data, not hidden in the page. The condo signal is computed at project level (not block or stack), because the underlying unit records don’t reliably carry block identity and a finer split would be silently wrong. It refreshes nightly.
9b. Exit risk
On a condo project page we may surface an exit-risk share: if you bought into this project today at roughly the recent resale price, what percentage of the current owners hold at a lower per-square-foot price — owners who could sell below your entry and still walk away with a profit.
9b.1 An exact count, not a model
Unlike the en-bloc and selling-pressure tiers, this number is not a composite or a model output. It is an exact count over haio’s unit-level records: we keep one entry price per traced current owner — their latest purchase — so an owner who sold on is not counted, and a flipped unit counts once, not twice. The share is always shown with its sample (“n=… traced current owners”) and with how much of that sample is unit-exact. The only estimated input is “today’s price”: the median resale price per square foot over the last 12 months. When a project has fewer than 3 resales in that window we show no default score rather than widen the window.
9b.2 The band, the slider and the SSD-free share
The deeper view shows the full band of where current owners entered (exact percentile points, in 5% steps), lets you test your own entry price against it (values between stored points are interpolated, and marked ≈), and overlays the share who bought cheaper and are already past their seller’s-stamp-duty window — the owners who could undercut you today, penalty-free.
9b.3 How to read a high number
In a project that has appreciated for years, almost every owner naturally holds at a lower price — a 90%+ share is common and is not by itself a warning. Long holders rarely sell low. Read the headline together with the SSD-free share and the project’s own history. Projects with fewer than ten traced owners are suppressed entirely; no owner names, unit numbers or addresses are ever shown. It refreshes nightly. It is a description of the caveat record, not advice.
10. How to cite haio
Where a figure comes straight from a public source, we’d rather you cite that source: for prices, dates, areas and projects, haio is a convenience layer over URA / HDB / SLA / MAS, not a separate authority. Two things do not work that way. A figure that rests on a unit number or a landed house number traces to REALIS, which a reader cannot pull from data.gov.sg. And a figure that comes from a haio computation (our price estimate, our comparables ordering, our lease-decay projection) is ours to stand behind. Attribute both to haio.
Suggested format
Source: haio (https://haio.sg), based on URA / HDB / SLA / MAS public data and URA REALIS records, retrieved 2026-08-31.
Per-property pages have stable URLs of the form /{tenure}/{slug} — for example /condo/the-orie or /hdb/ang-mo-kio-ave-3-block-123. Linking to a property page is the best way to let a reader audit the number you’re quoting.