hk_property_units
Individual flats with block, floor, flat and floor areas
Download a file
CSV and Parquet. Filtered exports.
See pricingQuery with SQL
DBeaver, DuckDB, MotherDuck, or HTTPS. Sub-second latency.
Open connection detailsConnect to AI
MCP for Claude Desktop, Cursor, ChatGPT, Goose. 1-line install.
See setupIndividual flats/units, the lowest tier of the property hierarchy, built from each unit's most recent registered sale (Centaline publishes no separate unit list). Block, floor, flat and latest known saleable and gross areas, plus model-ready fields: a parsed integer floor_number, the unit's position in its building's grid (unit_grid_x/unit_grid_y, 0-based flat-column and floor ordinals — for per-building flat-grid heatmaps and as hedonic-model features), and ratio-imputed areas flagged by the *_is_imputed columns.
Evaluate it in full below: the evidence and a working sample are open to everyone. Buy or subscribe to unlock the complete dataset — your account is created automatically at checkout.
The evidence
Schema & column quality (22 columns)
Scroll table sideways to see more columns →
| Column | Type | Description | Populated | Distinct |
|---|---|---|---|---|
| unit_code | String | Centaline unit code — primary identifier | — | — |
| building_code | Nullable(String) | Centaline building code — links to hk_property_buildings | — | — |
| centa_unit_id | Nullable(Int64) | Stable numeric Centaline unit id — an integer alternate key; null for units seen only in records that carry no numeric id | — | — |
| block | Nullable(String) | Block/tower label (English); NULL whenever the label carries no information beyond the building's own name (each tower is its own building, so this is almost always NULL) | — | — |
| floor | Nullable(String) | Floor designation (e.g. 30/F) | — | — |
| flat | Nullable(String) | Flat/unit designation (e.g. FLAT C); where a unit's own sales predate the flat-labelled feeds, the label is recovered from the frozen unit-grid master | — | — |
| flat_letter | Nullable(String) | Bare flat token, normalised across eras (FLAT A / A室 → A, FLAT 1 / 1室 → 1); unrecognised forms pass through; null when the raw flat label is blank. The clean structured companion to `flat` | — | — |
| floor_number | Nullable(Int64) | Absolute floor parsed from the floor label: 27樓/27/F/二十七樓 → 27, G/F and 地下 → 0, basements negative, ranges (14-15樓) → the lower bound; null where only a band (high/middle/low) or a special named floor (see named_floor) was reported | — | — |
| floor_band | Nullable(String) | Coarse floor band ('high'/'middle'/'low') when no floor number could be resolved (from the observed label or the frozen unit grid) — mutually exclusive with floor_number; null otherwise | — | — |
| named_floor | Nullable(String) | Canonical token for a special floor that carries no integer floor (M/F, P/H, Podium, B/M, Roof) — mutually exclusive with floor_number. Compose a display label as coalesce(named_floor, floor_number || '/F'); null for ordinary numbered floors and non-floor labels | — | — |
| unit_grid_x | Nullable(Int64) | Building-grid column position of the unit (0-based flat-column ordinal). Native Centaline grid where available (~90% of units, stable), else a derived rank over flat labels — see unit_grid_source | — | — |
| unit_grid_y | Nullable(Int64) | Building-grid floor position of the unit (0-based, dense, basement-aware) — the per-building floor rank; pairs with unit_grid_x for a per-building flat-grid heatmap | — | — |
| unit_grid_source | Nullable(String) | 'native' (Centaline's own grid, stable) or 'derived' (ranked from parsed floors/flat labels for buildings the native grid lacks; may shift as new floors transact); reflects EITHER coordinate being populated — null only when both unit_grid_x and unit_grid_y are null | — | — |
| saleable_area_sqft | Nullable(Float64) | Saleable area in square feet — frozen Centaline unit masters first, else transaction-reported, else ratio-imputed (see saleable_area_is_imputed) | — | — |
| saleable_area_source | Nullable(String) | Provenance of saleable_area_sqft — 'unit_master' (frozen Centaline unit dumps), 'transaction' (latest sale reported it), 'imputed' (per-building ratio); null when unknown | — | — |
| saleable_area_is_imputed | Bool | True when saleable_area_sqft was imputed from the building's mean gross/saleable ratio (mirrors saleable_area_source = 'imputed') | — | — |
| gross_area_sqft | Nullable(Float64) | Gross area in square feet — frozen Centaline unit masters first, else transaction-reported, else ratio-imputed (see gross_area_is_imputed) | — | — |
| gross_area_source | Nullable(String) | Provenance of gross_area_sqft — 'unit_master', 'transaction' or 'imputed' (see saleable_area_source); null when unknown | — | — |
| gross_area_is_imputed | Bool | True when gross_area_sqft was imputed from the building's mean gross/saleable ratio (mirrors gross_area_source = 'imputed') | — | — |
| building_gross_saleable_ratio | Nullable(Float64) | Per-building mean gross/saleable ratio used for area imputation (from units carrying both areas, bounded 1.0–2.0, ≥5 supporting units); null where insufficient support | — | — |
| updated_at | Nullable(Date) | Date of the most recent transaction for this unit | — | — |
| id | String | Stable unique identifier for this row — the last column of every export. Use it to deduplicate, to key an incremental load, or to reference one specific row. It is additive: the entity and join keys you already use (unit_code) are unchanged. | — | — |
A slice of the unit register, grouped by building so whole buildings' flats sit together, full schema: block, floor, flat, floor areas and the parsed floor and grid position.
Choose your access
A Pass gives you freshness within a rolling window. The Full Archive gives you the full history we hold for the dataset, frozen at purchase. They solve different problems, and they work together.
Pass subscription
Hong Kong Property — Property Pass
Continuously updated, with API access.
View full package →- Access window
- Full history (no window)
- Updates
- Continuous, within hours of the source
- Delivery
- API, SQL and downloads
- Exports
- 1,000,000 rows/month included
Included Datasets
Get notified when this dataset is updated.
Questions about this data?
Our data experts are ready to help clarify any aspects of this dataset.
Contact Our Team