
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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.






