Data endpoints
Search an area
Median HDB resale price per square foot, resales and price history for any district or neighbourhood in Singapore.
There is no server and there are no query parameters. Every endpoint is a static JSON file served from the filesystem, immutable for the life of a build, and safe to cache hard. Every statistical page on this site links its own JSON in its head (link rel="alternate" type="application/json") and in its Cite us section, so the fastest route to a page’s data is the page itself.
The current build is dataset 2026-07: 983,157 HDB resales from January 1990 to July 2026, and 135,166 private sale caveats over URA's rolling window.
Endpoints
/data/index.json: the national figures, the region and area lists, the flat types, the methodology object, and the coverage tables./data/quality.json: every check the pipeline ran for this build, with its result, plus the source register descriptions./data/rankings/index.jsonand/data/rankings/{slug}.json: the league tables, with every disclosure field (total_shown,total_ranked,window_months, exclusions)./data/compare/index.jsonand/data/compare/{a}-vs-{b}.json: the published pairs, each side carrying the mix-adjusted rate and interval the verdict is computed on./data/search-index.json: the search rows the in-site search ranks over.
The index, from this build
This example is rendered from the live file, not typed: the values below are the current build’s own.
GET /data/index.json
{
"dataset_version": "2026-07",
"data_anchor": "2026-07",
"history_from": "1990-01",
"history_to": "2026-07",
"total_transactions": 983157,
"national": { /* object */ },
"national_trend": [ /* 147 items */ ],
"national_growth": { /* object */ },
"regions": [ /* 5 items */ ],
"towns": [ /* 55 items */ ],
"flat_types": [ /* 5 items */ ],
"coverage": [ /* 11 items */ ],
"methodology": { /* object */ },
"outlier_fence": { /* object */ },
"stock": { /* object */ },
"private": { /* object */ },
"rent": { /* object */ }
}The area payload
Every geographic level shares one shape. The sections, in the order a page renders them:
name,slug,level,level_label,path,ancestors,siblings,dataset_version: identity and position in the taxonomy.window_months: the months of resales every HDB figure in this payload covers. Read it before comparing anything.stats: the HDB cross-section. Median price per square foot and square metre, median price, p20 and p80, the 95% interval on the median (ci_lo_psf,ci_hi_psf), median floor area, median remaining lease, andn, the count every one of those figures is computed from.headline: the named-flat-type figure the page leads with, with its ownn, interval andpublishableflag.median_psf_mixandmix_coverage: the mix-adjusted rate, the only figure areas are ranked on, and how much of the national flat-type weight this area's stock covers.by_type,by_lease_type,by_storey_type: the cross-section cut by flat type, remaining-lease band and storey band, each row carrying its own count and each band gated at 8.trend: the quarterly series back to 1990 where the area has one, with per-quarter counts, intervals, and the real-terms restatement.growth: year on year and compound annual change, with the endpoint quarters and span stated.rent: HDB renting-out medians and gross yields by flat type, withyield_withheld_becausepopulated wherever a yield is not.private: the URA-derived statistics for the private market, where the area has one: resale rate, launches beside it, projects, rents by bedroom count, and size-band yields. Derived statistics only; no caveat-level records appear in any payload.children,nearby,compare_partner: the level below, the neighbours, and the area’s published comparison.transactions: individual HDB resales for the map and table, capped deterministically at 1,000 rows withtransactions_totalstating the real count. HDB rows only, at HDB’s own published grain (block and street, no unit).suppressionfields throughout: where a figure is withheld, the payload says why, in the same words the page renders.
Conventions
- All price-per-area values are dollars per square foot, to three significant figures. Multiply by 10.7639 for dollars per square metre.
- Floor areas are in square metres, as HDB records them.
nullmeans suppressed or unavailable, never zero, and a suppressed figure’s reason ships beside it.window_monthstells you how many months of resales a figure covers. Compare like with like.- Counts are per register and never summed across registers: HDB resales and URA caveats record different events.
Licence, per register
The HDB-derived figures are published under the Singapore Open Data Licence version 1.0: reuse them, commercially included, with attribution to HDB via Data.gov.sg and IndexProp SG. The private figures are derived statistics from the URA Data Service, published under URA’s terms: the statistics may be cited with attribution to URA, but the underlying caveat and contract records are not redistributed here in any form, so there is no record-level private endpoint to ask for.