Data Sets
Jan 1, 2021
6
Minutes read

TEDUH Housing Project Data

No items found.
Authors
Khazanah Research Institute
No items found.
Key Takeaways
Data Sets Overview

This database is scraped from the TEDUH portal maintained by the Ministry of Housing and Local Government (KPKT), which provides public transparency into licensed housing development projects in Malaysia. The scraper collects data on developers (pemaju), projects, and individual housing units, storing periodic snapshots to enable longitudinal tracking of project and sales status.

teduh-housing-project-data
Data Sets
Disclaimer
As we transition to a digital-first communication and continue building our knowledge hub, publications released before October 2025 are preserved in their original format. Publications released from October 2025 onward adopt a new, digitally friendly format for easier online reading. The official versions of earlier publications, including their original language and formatting, remain available in the downloadable PDF.

Introduction

The TEDUH (Transaksi, Ejen, Daftar, Unit, Harga) portal is a government-run platform that consolidates information on licensed housing developers and their projects in Malaysia. It provides visibility into project progress, unit-level pricing and sales status, licensing details, and developer contact information.

This dataset is built from two main scraping sources:-

  • **Project and unit data** — scraped from [https://teduh.kpkt.gov.my/semakan-status-kemajuan](https://teduh.kpkt.gov.my/semakan-status-kemajuan), covering project listings, nested project details (unit summaries, PJP timelines, construction progress), and individual unit records.-
  • **Developer (pemaju) data** — scraped from [https://teduh.kpkt.gov.my/senarai-projek-berlesen](https://teduh.kpkt.gov.my/senarai-projek-berlesen), covering licensed developer profiles and their project counts.All tables include a `snapshot_date` field, allowing the database to track how values change over successive scraping runs.

Caveats and Limitations

  • Data reflects the state of the TEDUH portal at the time of each scraping run and may not capture intra-day changes.
  • Fields marked as nullable may appear as `NULL` where the source website displayed `"-"` or left the field blank.
  • Price fields are cleaned from formatted strings (e.g. `RM 415,905.00`) into numeric values; values that cannot be parsed are stored as `NULL`.
  • Date fields are standardised to `YYYY-MM-DD`; unparseable dates are stored as `NULL`.
  • The `project_status_rows` table may have multiple rows per project per snapshot, representing different unit type breakdowns.
  • PJP (Perjanjian Jual Beli) fields are scraped as displayed and may be text ranges or codes rather than structured values.

Metadata

Data Source(s) Web scraping — TEDUH portal (KPKT)
Last Updated Ongoing (snapshot-based)
Frequency Weekly cron runs
Format Parquet
Source URLs [semakan-status-kemajuan](https://teduh.kpkt.gov.my/semakan-status-kemajuan), [senarai-projek-berlesen](https://teduh.kpkt.gov.my/senarai-projek-berlesen)

Tables

1. Projects

Project-level records for each licensed housing development. One row per project per snapshot.

**Primary Key:** `(kod_projek, snapshot_date)

Dataset Preview
kod_projek permit_no nama_projek permit_mula permit_tamat daerah negeri no_lesen lesen_mula lesen_tamat nama_pemaju kod_pemaju telefon alamat_perniagaan status_pemaju snapshot_date
31278-1 31278-1/04-2028/0312(N)-(L) Perumahan Lot 4329, Taman Kijal Kemuning 2 2026-04-27 2028-04-26 NULL Terengganu 31278/01-2031/0025(A) 2026-01-28 2031-01-27 NILAI UNGGUL PROPERTIES SDN. BHD. 31278 098585373 K-580, Tingkat 2, Jalan Da'omar, 24000, Terengganu Aktif 2026-06-04
31274-1 31274-1/04-2029/0279(N)-(S) Aosis Mont Kiara 2026-04-10 2029-04-09 NULL Wp Kuala Lumpur 31274/01-2031/0021(N) 2026-01-19 2031-01-18 MODERN PLUS SDN. BHD. 31274 0327758688 27 Th Floor, Menara Jkg, No. 282, Jalan Raja Laut, 50350, Wp Kuala Lumpur Aktif 2026-06-04
31263-1 31263-1/04-2029/0315(N)-(S) Residensi Legasi Pinus 2026-04-28 2029-04-27 NULL Johor 31263/01-2031/0010(N) 2026-01-08 2031-01-07 PARAMOUNT LIFESTYLE SDN. BHD. 31263 073310599 Lot 30462, Jalan Kempas Baru, 81200, Johor Aktif 2026-06-04
Note: `daerah` is NULL where the source displayed `"-"`. `snapshot_date` reflects the date of the scraping run.
Column Definitions
kod_projek TEXT Unique project code assigned by KPKT String 31278-1
permit_no TEXT Advertising and sales permit number String 31278-1/04-2028/0312(N)-(L)
nama_projek TEXT Name of the housing project String Perumahan Lot 4329, Taman Kijal Kemuning 2
permit_mula DATE Permit start date YYYY-MM-DD 2026-04-27
permit_tamat DATE Permit expiry date YYYY-MM-DD 2028-04-26
daerah TEXT District where the project is located String, nullable Petaling
negeri TEXT State where the project is located String Terengganu
no_lesen TEXT Developer licence number String 31278/01-2031/0025(A)
lesen_mula DATE Developer licence start date YYYY-MM-DD 2026-01-28
lesen_tamat DATE Developer licence expiry date YYYY-MM-DD 2031-01-27
nama_pemaju TEXT Name of the developer (pemaju) String NILAI UNGGUL PROPERTIES SDN. BHD.
kod_pemaju TEXT Unique developer code; foreign key to pemajus String 31278
telefon TEXT Developer contact phone number String, nullable 098585373
alamat_perniagaan TEXT Developer's business address String K-580, Tingkat 2, Jalan Da'omar, 24000, Terengganu
status_pemaju TEXT Current licence status of the developer String (e.g. Aktif, Tamat) Aktif
snapshot_date DATE Date this record was scraped YYYY-MM-DD 2026-06-04

2. Pemajus

Licensed developer (pemaju) profiles. One row per developer per snapshot.

**Primary Key:** `(kod_pemaju, snapshot_date)`

Dataset Preview
kod_pemaju nama_pemaju jumlah_projek projek_sakit_count projek_terbengkalai_count no_lesen lesen_mula lesen_tamat telefon emel laman_web laman_web_url alamat_daftar alamat_perniagaan snapshot_date
13366 128 ARA DAMANSARA SDN. BHD. 1 0 0 13366-1/12-2020/03394(L) 2019-12-09 2020-12-08 NULL NULL NULL NULL Level 18, The Garden North Tower Mid Valley City Lingkaran Syed Putra 59200 Kuala Lumpur Suite 16.1, Level 16, Menara Weld, 76 Jalan Raja Chulan, 50200 Kuala Lumpur 2026-06-04
30300 168 PARK SELAYANG SDN. BHD. 2 0 0 30300/11-2027/0299(A) 2022-11-29 2027-11-28 0362747969 marketing@168parkselayang.com www.168parkselayang.com.my http://www.168parkselayang.com.my D-19-08, Menara Mitraland, No. 13a, Jalan Pju 5/1, Kota Damansara Pju 5, 47810 Petaling Selangor Lot 37672, Jalan 3/37a, Kawasan Industri Taman Bukit Maluri, Kepong, 52100 Kuala Lumpur 2026-06-04
30053 19 DEVELOPMENT SDN. BHD. 1 0 0 30053/04-2027/0052(A) 2022-04-14 2027-04-13 0380519291 19developmentsdnbhd@gmail.com NULL NULL 3-3-8, Kompleks Kantonmen Prima, 698, Jalan Sultan Azlan Shah, 51200 Kuala Lumpur 22-2 Jalan Puteri 5/5 Bandar Puteri 47100 Petaling Selangor 2026-06-04
Note: `telefon`, `emel`, `laman_web`, and `laman_web_url` are NULL where the source displayed `"-"` or left blank. `snapshot_date` reflects the date of the scraping run.
Column Definitions
Column Name Data Type Description Valid Values / Units Example Value
kod_pemaju TEXT Unique developer code assigned by KPKT String 30300
nama_pemaju TEXT Registered name of the developer String 168 PARK SELAYANG SDN. BHD.
jumlah_projek INTEGER Total number of projects under this developer ≥ 0 2
projek_sakit_count INTEGER Number of sick (distressed) projects ≥ 0 0
projek_terbengkalai_count INTEGER Number of abandoned projects ≥ 0 0
no_lesen TEXT Developer licence number String 30300/11-2027/0299(A)
lesen_mula DATE Licence start date YYYY-MM-DD 2022-11-29
lesen_tamat DATE Licence expiry date YYYY-MM-DD 2027-11-28
telefon TEXT Contact phone number String, nullable 0362747969
emel TEXT Contact email address String, nullable marketing@168parkselayang.com
laman_web TEXT Display text of developer's website String, nullable www.168parkselayang.com.my
laman_web_url TEXT Full URL of developer's website String, nullable http://www.168parkselayang.com.my
alamat_daftar TEXT Registered address of the developer String D-19-08, Menara Mitraland, No. 13A, Jalan PJU 5/1, 47810 Petaling Jaya, Selangor
alamat_perniagaan TEXT Business operating address String Lot 37672, Jalan 3/37A, Kawasan Industri Taman Bukit Maluri, Kepong, 52100 Kuala Lumpur
snapshot_date DATE Date this record was scraped YYYY-MM-DD 2026-06-04

3. Units

Individual housing unit records within a project. One row per unit per project per snapshot.

**Primary Key:** `(no, project_id, snapshot_date)`

Dataset Preview
Column Name Data Type Description Valid Values / Units Example Value
no TEXT Unit number or identifier String 3A-3
status TEXT Current availability status of the unit avail, sold, booked, reserved, etc. avail
kuota BOOLEAN Indicates whether the unit is subject to a quota restriction true, false false
noPtLotPlot TEXT PT/Lot/Plot reference number for the unit String, nullable NULL
kuotaBumi TEXT Bumiputera quota status of the unit Ya, Tidak Tidak
hargaJualan DECIMAL(15,2) Listed selling price of the unit MYR 2340333.00
hargaSPJB DECIMAL(15,2) Sale and Purchase Agreement (SPA) price MYR, nullable NULL
statusJualan TEXT Sales status of the unit Belum Dijual, Dijual, Tempahan, etc. Belum Dijual
group_jenis TEXT Property type category String Rumah Pangsa/Kondo
pembangunan_id INTEGER Unique identifier for the development Integer 59737
project_id TEXT Project identifier String 31274-1
snapshot_date DATE Date this record was scraped YYYY-MM-DD 2026-06-04
Note: `noPtLotPlot` and `hargaSPJB` are NULL where the source displayed `"-"`. `hargaJualan` is cleaned from `"RM 2,340,333.00"` to a numeric value.*
Column Definitions
Column Name Data Type Description Valid Values / Units Example Value
no TEXT Unit identifier (e.g. block-floor-unit number) String 3A-3
status TEXT Availability status of the unit as scraped String (e.g. avail, sold) avail
kuota BOOLEAN Whether this unit is under a quota scheme true, false false
noPtLotPlot TEXT Lot/plot/parcel number of the unit String, nullable NULL
kuotaBumi TEXT Bumiputera quota classification of the unit String (e.g. Ya, Tidak) Tidak
hargaJualan NUMERIC Advertised sale price of the unit, cleaned to numeric (RM) RM, numeric 2340333.00
hargaSPJB NUMERIC Sale and Purchase Agreement (SPA) price, cleaned to numeric (RM) RM, numeric, nullable NULL
statusJualan TEXT Sales status of the unit String (e.g. Dijual, Belum Dijual, Tempahan) Belum Dijual
group_jenis TEXT Property type group/category String (e.g. Rumah Pangsa/Kondo, Rumah Teres) Rumah Pangsa/Kondo
pembangunan_id INTEGER Internal development sub-component identifier Integer 59737
project_id TEXT Project that the unit is under String 31274-1
snapshot_date DATE Date this record was scraped YYYY-MM-DD 2026-06-04

4. Project_unit_summary

High-level unit summary for a project (total units, floor area range, room and bathroom counts). One row per project per snapshot.

**Primary Key:** `(kod_projek, snapshot_date)`  
**Foreign Key:** `(kod_projek, snapshot_date)` → `projects`

Dataset Preview
kod_projek unit keluasan bilik bilik_air snapshot_date
31278-1 25 119-125 mps 3 2 2026-06-04
31274-1 244 0 mps 3, 4, 5 4, 5, 6 2026-06-04
31263-1 970 0 mps 1, 2, 3 2, 3 2026-06-04
Note: `keluasan` is scraped as displayed (including unit suffix). Multiple bedroom/bathroom counts appear as comma-separated strings where a project has mixed unit types.
Column Definitions
Column Name Data Type Description Valid Values / Units Example Value
kod_projek TEXT Project this summary is under String PRJ-0001
unit INTEGER Total number of units in the project ≥ 0 200
keluasan TEXT Floor area range of units String (e.g. "850 - 1200 sqft") 850 - 1200 sqft
bilik TEXT Number of bedrooms String 3
bilik_air TEXT Number of bathrooms String 2
snapshot_date DATE Date this record was scraped YYYY-MM-DD 2024-06-01

5. Project_pjp

Perjanjian Jual Beli (SPA) timeline details for a project, including original and revised handover dates. One row per project per snapshot.

**Primary Key:** `(kod_projek, snapshot_date)`  
**Foreign Key:** `(kod_projek, snapshot_date)` → `projects`

Dataset Preview
kod_projek jenis tempoh_asal tarikh_pjb_pertama serah_kosong_ikut_pjb pindaan_tempoh_serah_kosong tempoh_tambahan_diluluskan tempoh_pembinaan_baharu serah_kosong_baharu_ikut_pjb_pertama snapshot_date
31278-1 Jadual G 24 Bulan NULL NULL Tidak NULL NULL NULL 2026-06-04
31274-1 Jadual H 36 Bulan NULL NULL Tidak NULL NULL NULL 2026-06-04
31263-1 Jadual H 36 Bulan NULL NULL Ya 24 Bulan 60 Bulan NULL 2026-06-04
Note: Date fields are NULL where the source displayed `"-"` (i.e. no SPA has been signed yet). `pindaan_tempoh_serah_kosong` of `"Ya"` indicates an amendment has been approved, with details in `tempoh_tambahan_diluluskan` and `tempoh_pembinaan_baharu`.
Column Definitions
Column Name Data Type Description Valid Values / Units Example Value
kod_projek TEXT Project this pjb is under String PRJ-0001
jenis TEXT Type of SPA/development (e.g. Strata, Tanah) String Strata
tempoh_asal TEXT Original construction period as stated in SPA String (e.g. "36 bulan") 36 bulan
tarikh_pjb_pertama DATE Date of first SPA signed YYYY-MM-DD 2021-03-01
serah_kosong_ikut_pjb DATE Vacant possession date per original SPA YYYY-MM-DD 2024-03-01
pindaan_tempoh_serah_kosong TEXT Amendment to the vacant possession period String, nullable -
tempoh_tambahan_diluluskan TEXT Additional construction period approved String, nullable -
tempoh_pembinaan_baharu TEXT New (revised) construction period String, nullable -
serah_kosong_baharu_ikut_pjb_pertama DATE Revised vacant possession date based on first SPA YYYY-MM-DD, nullable -
snapshot_date DATE Date this record was scraped YYYY-MM-DD 2024-06-01

6. Project_status

Overall construction progress status for a project. One row per project per snapshot.

**Primary Key:** `(kod_projek, snapshot_date)`  
**Foreign Key:** `(kod_projek, snapshot_date)` → `projects`

Dataset Preview
kod_projek maklumat_pembangunan keseluruhan nota snapshot_date
31278-1 Berfasa Lancar Status komponen adalah berdasarkan laporan 7(f) terkini di HIMS. 2026-06-04
31274-1 Berfasa Lancar Status komponen adalah berdasarkan laporan 7(f) terkini di HIMS. 2026-06-04
31263-1 Berfasa Belum Mula Status komponen adalah berdasarkan laporan 7(f) terkini di HIMS. 2026-06-04
Note: `keseluruhan` reflects the overall project status label (e.g. Lancar, Belum Mula, Lewat, Siap Dengan CCC) rather than a numeric percentage.
Column Definitions
Column Name Data Type Description Valid Values / Units Example Value
kod_projek TEXT Project this status is describing String PRJ-0001
maklumat_pembangunan TEXT Narrative description of development progress String Pembinaan sedang berjalan
keseluruhan TEXT Overall percentage completion of the project String (e.g. "75%") 75%
nota TEXT Additional notes or remarks on project status String, nullable -
snapshot_date DATE Date this record was scraped YYYY-MM-DD 2024-06-01

7. Project_status_rows

Detailed row-level breakdown of construction progress by unit type, floor level, and component. Multiple rows per project per snapshot.

**Primary Key:** `id` (serial)  
**Unique Constraint:** `(kod_projek, jenis, tingkat, bilik, tandas, snapshot_date)`  
**Foreign Key:** `(kod_projek, snapshot_date)` → `projects`

Dataset Preview
id kod_projek jenis tingkat bilik tandas keluasan unit harga_min harga_max peratus komponen ccc vp snapshot_date
1 31278-1 Rumah Teres 1 3 2 119 - 125 25 320000.00 433000.00 17.00 Lancar NULL NULL 2026-06-04
2 31274-1 Rumah Pangsa/Kondo 40 3, 4, 5 4, 5, 6 0 244 1871778.00 4682889.00 8.98 Lancar NULL NULL 2026-06-04
3 31263-1 Pangsapuri Servis 47 1, 2, 3 2, 3 0 970 654000.00 1109000.00 0.00 NULL NULL NULL 2026-06-04
Note: `harga_min` and `harga_max` are cleaned from formatted strings (e.g. `"320,000.00"`) to numeric values. `ccc` and `vp` are NULL where the source displayed `"-"`.
Column Definitions
Column Name Data Type Description Valid Values / Units Example Value
id SERIAL Auto-incrementing surrogate primary key Integer 1
kod_projek TEXT Project this status row is under String PRJ-0001
jenis TEXT Unit/property type within the project String (e.g. Kondominium, Rumah Teres) Kondominium
tingkat TEXT Floor level String or integer 10
bilik TEXT Number of bedrooms for this row's unit type String 3
tandas TEXT Number of bathrooms for this row's unit type String 2
keluasan TEXT Floor area for this row's unit type String (e.g. "950 sqft") 950 sqft
unit INTEGER Number of units of this type at this floor level ≥ 0 20
harga_min NUMERIC Minimum price for this unit type (RM) RM, numeric 420000.00
harga_max NUMERIC Maximum price for this unit type (RM) RM, numeric 480000.00
peratus NUMERIC Construction completion percentage for this component Numeric (e.g. 80%) 80%
komponen TEXT Construction component being reported (e.g. Struktur) String Struktur
ccc TEXT Certificate of Completion and Compliance (CCC) status String, nullable -
vp TEXT Vacant possession status or date String, nullable -
snapshot_date DATE Date this record was scraped YYYY-MM-DD 2024-06-01

Credits

Scraper developed by: KID Team, Khazanah Research Institute

This data dictionary was prepared and maintained by the Knowledge, Innovation & Data Hub (KID) team at Khazanah Research Institute. The team is responsible for the structuring, documentation, and ongoing maintenance of the dataset.

Read Full Publication

Article highlight

featured report

Conclusion

Download Resources
Files
Datasets
Attributes
Footnotes
References
Photography Credit

Related to this Publication

No results found for this selection
You can  try another search to see more

Want more stories like these in your inbox?

Stay ahead with KRI, sign up for research updates, events, and more

Thanks for subscribing. Your first KRI newsletter will arrive soon—filled with fresh insights and research you can trust.

Oops! Something went wrong while submitting the form.
Follow Us On Our Socials