# List.my

> List.my organises official Malaysian government property transaction data (JPPH/NAPIC) into searchable, comparable market views. It helps buyers, sellers, renters, and agents check fair pricing with historical subsale transactions, median prices, rental yields, quarterly market reports, auction listings, and a comparable-based valuation tool.

List.my covers residential and commercial property across Malaysia. All transaction data is sourced from official Malaysian government records and normalised before display. Pricing summaries use the **median** (not average) so outliers do not distort fair-value signals. Coverage drills down a geographic hierarchy: State > District > Mukim > Area > Road. The site is free to browse; an optional List Plus subscription unlocks deeper access.

## Core market data

- [Subsale transactions](https://list.my/subsales): Browse historical property transaction records with filters for price, size, property type, and year. Drill down by state, district, mukim, area, and road.
- [Quarterly market reports](https://list.my/quarterly): Quarterly analytics on transaction volume, median prices, and trends, segmented by residential/commercial type and geography.
- [Property valuation tool](https://list.my/tools/property-valuation): Estimate a property's fair value from comparable historical subsale transactions in the same location.
- [Transaction heat map](https://list.my/tools/heat-map): Visualise transaction velocity across states, districts, and mukims.
- [Property auctions](https://list.my/auctions): Browse upcoming Malaysian property auctions by state and property type.
- [Properties for sale](https://list.my/for-sale): Browse user- and agent-created property listings for sale, with seller profiles. Drill down by state, district, mukim, area, and road.
- [Properties for rent](https://list.my/for-rent): Browse user- and agent-created property listings for rent, with seller profiles. Drill down by state, district, mukim, area, and road.
- [Postcode directory](https://list.my/subsales/postcode): Browse transaction data by Malaysian postcode.

## Learn: methodology & guides

- [Full-text guide corpus](https://list.my/llms-full.txt): Every Learn guide inlined in one Markdown file so an LLM can ingest the whole library in a single fetch.
- [Learn library](https://list.my/learn): Evergreen guides on Malaysian property basics, subsale education, and List.my data methodology.
- [What is subsale property?](https://list.my/learn/what-is-subsale-property.md): Subsale means a property sold by an existing owner, not directly by a developer.
- [How to buy subsale property in Malaysia](https://list.my/learn/how-to-buy-subsale-property-malaysia.md): The subsale buying flow from research to completion.
- [What is a property median price?](https://list.my/learn/property-median-price.md): The median is the middle transaction price after prices are sorted low to high.
- [Why use median price instead of average price?](https://list.my/learn/why-median-not-average-property-price.md): Why List.my focuses on median pricing for fair-value signals.
- [Where does List.my get transaction data?](https://list.my/learn/where-transaction-data-comes-from.md): How List.my uses official JPPH transaction data and why records are normalised.
- [How List.my chooses the Size column](https://list.my/learn/how-listmy-chooses-transaction-size.md): Which area field the Size column uses for each property type.
- [Floor area vs land area](https://list.my/learn/floor-area-vs-land-area.md): Why a transaction can show both, and why each yields a different price per square foot.
- [Types of real estate agent registration in Malaysia](https://list.my/learn/malaysian-real-estate-agents-ren-pea-rea.md): The difference between REN, REA, PEA, and related property roles.
- [How to report mistakes or corrections](https://list.my/learn/report-data-corrections.md): How to send data corrections and what details speed up review.

## About & policies

- [Contact List.my](https://list.my/contact): Public contact form for questions and data correction suggestions.
- [List Plus](https://list.my/plus): Premium subscription tier with deeper data access.
- [Privacy Policy](https://list.my/privacy-policy): How List.my collects and handles user data.
- [Terms of Use](https://list.my/terms-of-use): Terms governing use of the List.my service.

## Optional

- [Community feedback board](https://list.my/community): User feedback posts, comments, and voting.
- [Advertise on List.my](https://list.my/advertise): CPM-based advertising portal for property advertisers.

# Learn guides (full text)

# How to check a property's market value in Malaysia
https://list.my/learn/how-to-check-property-market-value-malaysia

## Why asking prices mislead

When people ask how to check the market value of a property in Malaysia (**cara semak harga rumah**), they often start with listings. The problem is that a listing shows an asking price, and an asking price shows hope, not reality.

It helps to separate three different numbers. The **asking price** is what a seller wants. The **market value** is closer to what buyers and sellers actually agree to in completed deals. The **bank valuation** is a separate figure prepared by a licensed valuer, usually for a loan.

These three rarely match exactly. A seller can ask any price they like, but the market value (**harga pasaran rumah**) is set by what similar properties actually sold for.

## Bank value vs market value

The pair that causes the most confusion is **market value** and **bank value** (**nilai bank**). Both purport to state what a property is worth, but they are produced by different parties, from different evidence, for different purposes.

|                             | Market value                                    | Bank value                                                  |
| --------------------------- | ----------------------------------------------- | ----------------------------------------------------------- |
| Who produces it             | The market, through completed transactions      | A registered valuer on the bank's panel                                  |
| Based on                    | What comparable properties transacted at        | An inspection together with comparable evidence, assessed conservatively |
| Used for                    | Pricing, negotiating, deciding whether to offer | Determining the quantum of financing                                     |
| Available in advance        | Yes, from recorded transactions                 | No, only once the bank instructs the valuer                              |

The critical point is that the purchaser does **not** choose the valuer. On application for a housing loan, the bank appoints a valuer from its own panel, and it is that valuer's figure against which financing is extended.

### Why the difference costs money

Banks extend a **margin of financing** against the **lower** of the bank valuation and the price stated in the sale and purchase agreement (SPA). Where the valuation comes in below the agreed price, the shortfall — known as the **differential sum** — must be settled in cash by the purchaser.

Consider a property transacted at **RM600,000** on a 90% margin of financing. Should the valuer concur with the agreed price, the bank advances RM540,000 and the purchaser funds RM60,000. Should the valuer instead return **RM550,000**, financing is computed on that lower figure — RM495,000 — and the cash requirement rises to **RM105,000**. The price has not moved; only the valuation has.

Banks may also revise or withdraw a financing offer where the valuation falls materially short of the agreed price. A shortfall is therefore best anticipated before the SPA is executed, not after.

### What this means when you are checking prices

Panel valuers assess conservatively, so the customary order runs **asking price, then market value, then bank value**, from highest to lowest. Bank valuations are not published and there is no register against which to check one — so the candid answer to "cara semak bank value rumah" is that it cannot be ascertained in advance.

What can be examined is the evidence the valuer will be working from. Where an asking price sits materially above what comparable homes on the same road have recently transacted at, a valuation shortfall is likely, and the purchaser should budget for the differential sum or renegotiate. Where the price is consistent with nearby recorded deals, the valuation will usually follow.

For a full treatment of the margin of financing and down payment, see [the real cost of buying a house](/learn/cost-of-buying-house-malaysia).

## Check actual transacted prices for free

The most reliable way to check house value in Malaysia is to look at **recorded transactions**, not listings. Malaysia's subsale transactions are recorded through government data (NAPIC/JPPH), and List.my makes them browsable for free.

This directly answers a common question: can I check how much a house sold for? Yes, and here is how. On the [subsales pages](/subsales) you drill down through the location hierarchy, from **State to District to Area to Road**, until you reach the neighbourhood you care about.

From there you can filter by **property type and size**, then open individual completed deals to see what buyers actually paid. You also see the **median price** for that group of transactions, which is a better summary than any single deal.

This is how to check property prices in your area (**cara semak harga rumah**) without paying for a report or guessing from asking prices.

## How to compare properly

Raw transaction numbers only help if you compare like with like. The closer the match, the more useful the figure.

Try to match on these where you can:

| Factor           | Why it matters                                             |
| ---------------- | ---------------------------------------------------------- |
| Location         | Same road or project is best; the next street can differ   |
| Property type    | A condo and a terrace house are not comparable             |
| Size             | A 900 sqft unit should not be compared to a 1,500 sqft one |
| Tenure           | Freehold and leasehold can trade at different levels       |
| Transaction date | Recent deals reflect current conditions better             |

Prefer transactions in the **same project or road** before widening your search. Use the **median, not the average**, because one unusually high or low deal can distort an average badly. For more on why, read [property median price](/learn/property-median-price) and [why median not average](/learn/why-median-not-average-property-price).

One common mistake is mixing size bases. Do not compare a price per square foot based on **floor area** against one based on **land area**, or the numbers will not line up. See [floor area vs land area](/learn/floor-area-vs-land-area) before you calculate anything per square foot.

## Use a guided valuation tool

If you would rather not gather comparables by hand, use the free List.my [property valuation tool](/tools/property-valuation). It finds recent comparable transactions for a property and presents them together, so you can see a reasonable range quickly.

This is a practical way to answer "**berapa harga rumah saya**" (how much is my house worth) as a starting estimate. It uses the same recorded transaction data, just gathered for you.

## When you need a formal valuation

Data tools are a starting reference, not a formal valuation. As covered above, a loan application triggers the bank's own valuation — and a **licensed valuer** inspects the property, weighing things raw data cannot capture, such as renovation quality, condition, and legal status.

So treat everything above as a **comparison guide, not a valuation or a guarantee** of worth. It tells you whether an asking price looks reasonable; it does not replace a professional valuation, financing advice, or legal advice.

## How List.my helps

List.my is useful because it shows **recorded subsale transactions**, not only asking prices. That lets you check a seller's expectation against what similar homes actually sold for, before you make an offer or accept one.

Start on the [subsales pages](/subsales), narrow the records by property type and size, then open the deals that look most comparable. When you are ready for a quicker read, run the property through the [property valuation tool](/tools/property-valuation) to pull nearby comparables into one place.

## How to use the estimate, by who you are

The same estimate reads differently depending on why you are looking. Pick the one that fits.

### Home buyer

You are negotiating a price and you do not want to overpay.

- **Sanity-check the ask.** Where the seller's price sits above the high end of the range, ask for the comparables that justify the premium.
- **Anchor your offer near the estimate**, or near the low end when the trend is flat or falling, and point to 3 to 5 of the comparables in writing.
- **Allow for what the data cannot see:** condition, renovation, facing, tower and stack. A freshly renovated unit can justify 5% to 10% above the estimate. A tired one should sit below it.
- **Before you commit, get a bank valuation.** It is effectively free once you apply for a loan, and it is the figure that sets your margin of financing.

### Property investor

You care about yield, entry price and downside.

- **Compare the estimate against rental yield.** Where a unit costs RM X and rents at RM Y a month, gross yield is Y × 12 ÷ X. Below 3% is weak and 5% or more is healthy for Malaysian condominiums, though both depend on the area and the year.
- **Read the trend and sentiment badges together.** Negative sentiment with a declining trend suggests you can afford to be patient. Positive and rising is momentum, so check first that a bulk launch is not behind it.
- **Compare neighbouring areas.** Broaden to the mukim or district and run the estimate again. An area trading at a notable premium to its own mukim, with no obvious reason, is worth a closer look.
- **Work in psf, not total price.** Price per square foot is what lets you compare units of different sizes, and it exposes gaps between similar projects in the same area.

These are ways to read the data, not investment advice. Your own position, financing and tax treatment all change the answer.

### Property agent (REN, REA or PEA)

You need to advise a client or set a listing price you can defend.

- **Listing price.** Set the asking price at the top of the range, or a little above, when confidence is high and the trend is up. Start near the estimate when confidence is medium or the market is soft.
- **Acting for a buyer.** Share the valuation link with your client. The URL is shareable and the comparables sit on the same page, which replaces "trust me" with an audit trail.
- **Handling objections.** When a seller insists their unit is worth 20% more, open the comparables and walk through them. The spread of real sales settles the argument faster than an opinion does.
- **Read the confidence score as a story.** Low confidence usually means thin liquidity. Price for a longer time on the market, not for a higher ask.

### Property developer

You are setting launch prices or benchmarking a new project.

- **Treat secondary-market psf as your resale ceiling.** A launch priced well above it forces buyers to absorb the gap when they exit, and they will push back.
- **Pick the right comparables.** Run the estimate on 2 or 3 nearby projects of a similar age and tier. The median psf across those is your honest market-clearing number.
- **Check liquidity, not just price.** A high psf in an illiquid area is fragile, because buyers cannot exit. The comparable count is a direct proxy for that.
- **Size your floor premium on purpose.** The data shows the per-floor psf gradient the market actually pays. Charging more than that, without a view or layout to justify it, leaves upper-floor stock slower to clear.

### Everyone else

- **Renting and want a benchmark?** Divide the estimate by 240 for a rough monthly rent, which is about a 5% gross yield. A quoted rent far above that is above market.
- **Divorce or inheritance splits.** Share the URL with the other party and a lawyer as a neutral, auditable starting number. A licensed valuer's report is still required for the stamped agreement.
- **Estate executors and probate.** Useful for a first-pass estate figure. A licensed valuer's letter is normally still needed for filing.
- **Accountants and tax advisers.** Handy for a Real Property Gains Tax base-price cross-check, an asset-revaluation note, or a fair-value estimate in management accounts.
- **Journalists, researchers and students.** Every valuation URL is citeable and reproducible, because the page keeps every parameter used to produce the estimate.
- **Simply curious.** Wondering what the neighbour's place is worth is a perfectly good reason.

**One rule for everyone.** The estimate is a starting point, not a final number. For any binding decision — a sale, a loan, a legal filing — pair it with a licensed valuer's report or a bank valuation.

For the formulas and thresholds behind the figure, see [how we calculate the estimate](/learn/how-the-valuation-estimate-works).

# Cara semak nilai rumah dan bank value di Malaysia
https://list.my/learn/cara-semak-nilai-rumah

## Jawapan ringkas

Untuk semak nilai rumah, lihat **harga transaksi yang telah direkodkan** bagi kawasan anda — bukan harga iklan. Harga iklan ialah harga yang penjual harapkan. Harga transaksi ialah harga yang benar-benar dibayar.

Dua angka yang selalu dikelirukan:

- **Market value** — harga pasaran semasa yang pembeli sanggup bayar.
- **Bank value** — nilai yang ditetapkan oleh penilai bank untuk tujuan pinjaman. Biasanya lebih rendah.

Perbezaan antara dua angka ini menentukan berapa banyak tunai yang perlu anda sediakan.

## Kenapa harga iklan tidak boleh dijadikan ukuran

Harga iklan tidak mengikat sesiapa. Penjual boleh letak apa-apa angka, dan rumah yang sama boleh diiklankan pada harga berbeza oleh ejen berbeza.

Harga transaksi pula direkodkan selepas jualan selesai dan duti setem dibayar. Itulah angka yang penilai bank rujuk, dan itulah angka yang patut anda rujuk juga.

## Cara semak transaksi bagi kawasan anda

1. Cari kawasan anda — taman, mukim atau daerah.
2. Lihat **harga median** bagi jenis rumah yang sama. Jangan bandingkan teres dua tingkat dengan kondominium.
3. Bandingkan **saiz yang hampir sama**. Harga per kaki persegi (psf) berubah mengikut saiz, jadi unit kecil selalunya menunjukkan psf lebih tinggi.
4. Lihat **tarikh transaksi**. Transaksi tiga tahun lalu bukan gambaran pasaran hari ini.

Harga median ialah harga tengah — separuh daripada transaksi lebih tinggi, separuh lagi lebih rendah. Kami guna median dan bukan purata kerana satu transaksi luar biasa boleh menarik purata jauh daripada keadaan sebenar.

## Bank value dan margin pinjaman anda

Apabila anda memohon pinjaman, bank akan melantik penilai untuk menetapkan bank value. Bank kemudian mengira margin pinjaman berdasarkan **nilai yang lebih rendah** antara harga belian dan bank value.

Contoh: jika anda bersetuju membeli pada RM500,000 tetapi bank value ialah RM470,000, margin pinjaman dikira atas RM470,000. Perbezaan RM30,000 itu perlu anda tampung sendiri, di samping deposit.

Inilah sebabnya anda patut semak transaksi terkini **sebelum** menandatangani perjanjian jual beli, bukan selepas.

Kadar, margin dan syarat berbeza mengikut bank dan mengikut keadaan anda. Angka di atas adalah contoh sahaja. Rujuk bank anda untuk angka muktamad.

## Had data ini

Data transaksi datang daripada JPPH dan dikeluarkan secara berkala, jadi transaksi paling terkini mungkin belum muncul. Bagi kawasan yang kurang aktif, jumlah transaksi mungkin terlalu sedikit untuk memberi gambaran yang kukuh.

Anggaran daripada data transaksi ialah panduan, bukan penilaian rasmi. Untuk penilaian rasmi, anda perlu melantik penilai berdaftar.

## Langkah seterusnya

- [Semak nilai rumah anda](/tools/property-valuation) — anggaran percuma daripada transaksi berhampiran.
- [Lihat transaksi mengikut kawasan](/subsales) — semua rekod subsale, disusun mengikut negeri dan daerah.
- [How to check a property's market value in Malaysia](/learn/how-to-check-property-market-value-malaysia) — panduan penuh dalam bahasa Inggeris.

# What are the types of real estate agent registration in Malaysia?
https://list.my/learn/malaysian-real-estate-agents-ren-pea-rea

## Short answer

In Malaysia, the main names you will see are **REA**, **REN**, and sometimes **PEA**. They are not the same thing:

- **REA means Registered Estate Agent**, the person who can practise estate agency and be responsible for an agency firm.
- **REN means Real Estate Negotiator**, the person who usually markets listings, arranges viewings, and negotiates under a registered estate agency.
- **PEA means Probationary Estate Agent**, a person still on the pathway toward becoming a registered estate agent.

When you deal with someone on a sale, purchase, rental, or lease, ask for their **REN, REA, or PEA number** and check which agency they represent.

## Comparison of common registration types

| Type | Full name | What it usually means |
| --- | --- | --- |
| REA | Registered Estate Agent | A licensed estate agency professional who can practise estate agency and be responsible for an agency firm. |
| REN | Real Estate Negotiator | A negotiator who can market properties, arrange viewings, communicate offers, and help with transactions under a registered estate agency. |
| PEA | Probationary Estate Agent | A person training or qualifying toward becoming a Registered Estate Agent, usually with limited practice under supervision. |
| Estate agency firm | Registered estate agency business | The firm that provides estate agency services and is responsible for its registered people and negotiators. |

## How the roles differ in practice

Most people meet a REN first because RENs are often the ones handling listings, viewings, messages, and offers. A REN should be attached to a registered estate agency and should not present themselves as an independent agency.

An REA carries higher professional responsibility. In simple terms, the REA is the registered agent behind the estate agency practice, while the REN is the negotiator working under that practice.

A PEA sits between learning and full registration. They may be involved in estate agency work, but their status is different from a full REA.

## Related property professionals are not always estate agents

You may also see valuers, appraisers, and property managers in the property industry. These roles can be properly registered, but they are different from estate agency work. A valuation role, for example, is not automatically the same as representing a seller, landlord, buyer, or tenant in a property deal.

If you are unsure, ask the person what registration they hold, which firm they represent, and what role they are playing in the transaction.

## How List shows agent registration numbers

List displays an agent's registration number on listings when the seller is acting as an agent or negotiator and the information is available to us. This helps readers see whether the person publishing the listing is presenting themselves as a property professional, rather than a private owner.

When List has verified the person's agent registration, we also show a verified label on their profile. This indicates that the registration details have been checked by us, although it does not replace your own due diligence before dealing with the person.

List also provides free listings to owners who want to sell or rent their own property. After a certain number of listings, we require the publisher to verify their registration with us before they can continue publishing listings on the site. This helps reduce abuse by unregistered or unscrupulous agents who may try to appear as private owners.

Even with this check, you should still confirm the person's registration details, agency name, and role before paying money or signing documents.

# What is subsale property?
https://list.my/learn/what-is-subsale-property

## Subsale in simple terms

A **subsale property** is a property sold by an existing owner. The buyer is not buying a new launch directly from the developer.

In simple terms, it is a resale. A condominium owner selling their completed unit, or a terrace house owner selling their home after living in it for a few years, would usually be a subsale transaction.

Subsale is different from a new launch, where the developer sells the property for the first time. It is also different from an asking price on a listing, because a subsale transaction shows a completed deal that was recorded after the sale went through.

## Why subsale data matters

Asking prices can be optimistic. Transacted prices show what buyers and sellers actually agreed to in completed deals.

This makes subsale data useful when you want to check whether a price looks reasonable. For example, if you are looking at a unit in the same condominium, recent transactions from similar unit sizes can give a better starting point than a random asking price from another project.

For landed homes, the comparison should be tighter. A terrace house on the same road may still differ by land size, renovation, frontage, lot position, tenure, and condition.

## How to use subsale data carefully

Use subsale data as a **comparison guide**, not as a valuation or a guarantee of what a property is worth. For a more guided comparison, try the List.my [property valuation tool](/tools/property-valuation), which helps you review nearby comparable transactions.

# Freehold vs leasehold in Malaysia: what tenure means for your property
https://list.my/learn/freehold-vs-leasehold-malaysia

## The two tenures in plain terms

Every property in Malaysia is held under one of two main tenures, and the title tells you which.

**Freehold** (pegangan bebas, or kekal) means you own the property indefinitely. There is no fixed end date and no term counting down. The property stays yours and passes to your heirs.

**Leasehold** (pajakan) means the state owns the land and you hold it for a fixed term. The most common term is **99 years**, though some leases run for 60 or even 30 years. When the term ends, the land reverts to the state unless the lease is renewed.

|                         | Freehold (pegangan bebas) | Leasehold (pajakan)                    |
| ----------------------- | ------------------------- | -------------------------------------- |
| Who owns the land       | You, indefinitely         | The state; you hold a fixed term       |
| Term                    | No end date               | Typically 99 years (some 60 or 30)     |
| On expiry               | Not applicable            | Reverts to the state unless renewed    |
| Transfer or bank charge | No state consent needed   | State authority consent required       |
| Typical price           | Often higher              | Often lower for the same specification |

The practical point is that tenure is a property characteristic, like size or type. It is recorded against transactions, so you can compare it directly.

## What happens as a lease runs down

A leasehold term is a clock. On the day it reaches zero, the land **reverts to the state** unless the lease has been renewed.

Renewal is possible, but it is not automatic. It involves applying to the state authority and paying a **premium** to extend the term. How much that premium costs varies by state and by how many years are left when you apply, so there is no single figure to quote. It is a legal process, and your lawyer is the right person to guide it.

The **remaining lease** also affects value while the property is still held. Two similar units can transact at different levels simply because one has 90 years left and the other has 50, and as the remaining term shrinks the gap tends to widen.

Financing can be affected too. Banks can be more cautious about lending against a property with a **short remaining lease**, so the margin or the approval itself may be influenced as the lease runs down. Check with your bank early rather than assuming, especially for older leasehold properties.

## Why leasehold transactions take longer

The biggest practical difference on the ground is time.

Leasehold **dealings** such as transferring ownership or charging the title to a bank require **consent from the state authority**. That is an extra step that freehold transactions simply do not have. The consent application goes to the relevant state land office, and it takes time to be processed.

In practice this consent commonly takes around **one to three months**, though it varies by state and can be slower. Because of it, leasehold **sale and purchase agreements** typically allow a longer completion window, often up to about **six months**, to give the consent time to come through.

For a buyer or seller, this mostly means planning around a longer timeline. It is normal, not a warning sign, but it is worth budgeting for the wait in any plans that depend on the deal completing.

## Bumi lots and Malay Reserved Land

Two more tenure-related terms often come up, and they are not the same thing.

A **Bumi lot** is a unit reserved under the **Bumiputera quota** in a development. Selling one to a non-Bumiputera buyer generally requires **state consent to release the quota**, which is not guaranteed. Because that shrinks the pool of eligible buyers, Bumi lots often transact at **lower prices** than equivalent non-Bumi units in the same project. If a price looks out of line with its neighbours, it is worth checking whether the unit is a Bumi lot.

**Malay Reserved Land** (Rizab Melayu) is different and more restrictive. It is land that can only ever be owned by Malays, and it **cannot be released** the way a Bumi lot quota sometimes can. The restriction sits on the land itself, not a development quota, so it does not open up to other buyers.

The distinction matters when you read a price. A Bumi lot discount reflects a smaller buyer pool with a possible, if uncertain, path to consent, while Malay Reserved Land is a firmer restriction. Either way, confirm the exact status with your lawyer before you rely on it.

## Is leasehold worth buying?

There is no single answer, but there is a sensible way to think about it.

Leasehold is **often cheaper** than a comparable freehold property of the same specification, and for many buyers a long remaining lease is not a practical concern over their intended holding period. The lower price can be a genuine advantage.

The catch is that the discount only means something if it is a **real** discount. The way to check is to compare actual transacted prices of **similar tenure**, rather than assume leasehold is automatically a bargain or automatically a bad idea. A leasehold unit with a long remaining term, priced well below comparable freehold stock, may be good value. The same unit priced as if it were freehold is not.

You can browse recorded transactions on [List.my subsales](/subsales), where tenure is part of the data, and if you want to go deeper on judging worth, read [how to check property market value in Malaysia](/learn/how-to-check-property-market-value-malaysia).

## Before you rely on any of this

List.my records property transaction data, including tenure, so you can **compare like with like** — leasehold against leasehold, freehold against freehold — when you judge a price. That comparison is what the data is good for.

It is **not** legal advice. The specifics of state consent, lease renewal premiums, and the release of a Bumi lot quota depend on the state and the individual title. Confirm those details with your lawyer before you commit to a purchase.

# How to buy subsale property in Malaysia
https://list.my/learn/how-to-buy-subsale-property-malaysia

## Typical flow

A **subsale property** is bought from an existing owner, so the practical work is to check whether the price, condition, financing, and transfer process make sense before you commit.

The usual flow is straightforward. You research recent transactions, view the property, compare the asking price with similar completed sales, negotiate the price and terms, check financing, appoint the relevant professionals, sign the documents, and complete the transfer through the legal process.

Because timelines and requirements can vary by bank, lawyer, property type, title status, and seller circumstances, treat this as a practical overview rather than legal or financing advice.

## Use data before emotion

A property can feel right and still be overpriced. Before making an offer, compare the asking price against **recent transactions** for similar properties in the same area, project, road, or neighbourhood.

The best comparisons are close in **location, property type, transaction date, size, tenure, and condition**. A renovated corner terrace should not be treated the same as an intermediate unit with original fittings, and a 1,500 sqft condo should not be compared too casually with a 900 sqft unit in the same building.

Use the data to set a reasonable range, then adjust your view after the physical inspection. Transaction data can tell you what similar properties sold for, but it cannot fully show water damage, renovation quality, building management issues, noise, view, or how urgently the seller wants to close.

## What to check before you commit

During viewing, look beyond the parts that photograph well. Check the layout, natural light, leaks, cracks, water pressure, electrical points, parking, lifts, access, surrounding roads, and maintenance of common areas where relevant.

For condos, apartments, and other strata properties, ask about maintenance fees, sinking fund, house rules, facilities, parking allocation, and any visible building issues. For landed homes, pay closer attention to land size, frontage, drains, roof condition, extensions, boundary clarity, and whether the lot position affects value.

When the price and terms look acceptable, speak to a bank or loan adviser about financing and speak to a lawyer about the documents and transfer process. List.my can help with market data, but it does not replace professional advice on loans, contracts, taxes, title matters, or legal risk.

## How List.my helps

List.my is useful near the start of the process because it shows **recorded subsale transactions**, not only asking prices. This helps you see whether a seller's expectation is close to recent completed deals.

Start with the location page, narrow the records by property type and size where possible, then open individual transactions that look most comparable. If you are unsure what subsale means, read [what is subsale property?](/learn/what-is-subsale-property). If price per square foot matters, read [floor area vs land area](/learn/floor-area-vs-land-area) so you do not mix different size bases when comparing properties.

# The real cost of buying a house in Malaysia (beyond the price)
https://list.my/learn/cost-of-buying-house-malaysia

## The price is not the cost

The sticker price on a listing is only the start. To buy a home in Malaysia (**kos beli rumah**) you need upfront cash that goes well beyond the 10% down payment. Stamp duty, legal fees, and disbursements all land around the same time as completion, and they are usually paid in cash rather than financed.

Getting these numbers right early saves you from a nasty surprise weeks before signing. The costs below are the ones most buyers underestimate.

## Down payment and your loan margin

Banks lend against a **margin of finance**. For a first or second residential property, banks typically finance up to 90% of the price, so you budget at least a **10% down payment** (**deposit rumah**). On a RM500,000 home that is RM50,000 out of pocket.

The rule tightens for investors. From your **third residential loan** onwards, the margin is commonly capped at 70%, which means a 30% down payment. The exact margin still depends on the bank, your income, and your existing commitments, so treat 90% as a common ceiling, not a guarantee.

## Stamp duty

Stamp duty is a government tax and it applies twice: once on the transfer of ownership (the **MOT**, Memorandum of Transfer) and once on the **loan agreement**.

For citizens and PRs, MOT stamp duty is tiered:

- 1% on the first RM100,000
- 2% on the next RM400,000 (RM100,001 to RM500,000)
- 3% from RM500,001 to RM1 million
- 4% above RM1 million

Foreigners pay a flat 8% from 1 January 2026. The **loan agreement** stamp duty is a flat 0.5% of the loan amount. For the full breakdown, read [stamp duty and MOT in Malaysia](/learn/stamp-duty-mot-malaysia).

## Legal fees and disbursements

You appoint a lawyer for the **sale and purchase agreement (SPA)**, and usually a second one for the **loan agreement**. Each set of legal fees is scaled to its own value under the **Solicitors' Remuneration Order 2023**:

- 1.25% on the first RM500,000 (minimum RM500)
- 1% on the portion above RM500,000, up to RM7.5 million

So two sets of fees can apply: one for the SPA (based on the purchase price) and one for the loan agreement (based on the loan amount). On top of the scale fees you pay **disbursements** such as land search fees, registration, and stamping charges. These are smaller but real, and they vary by firm.

## The full worked example

Here is a RM500,000 subsale home with a 90% loan of RM450,000, for a Malaysian citizen buyer. The two columns compare a buyer who is **not** eligible for the first-time exemption against one who **is**.

| Cost                   | Not eligible             | First-time buyer (eligible) |
| ---------------------- | ------------------------ | --------------------------- |
| Down payment (10%)     | RM50,000                 | RM50,000                    |
| MOT stamp duty         | RM9,000                  | Waived                      |
| Loan stamp duty (0.5%) | RM2,250                  | Waived                      |
| SPA legal fees         | RM6,250 + disbursements  | RM6,250 + disbursements     |
| Loan legal fees        | ~RM5,625 + disbursements | ~RM5,625 + disbursements    |
| **Rough cash needed**  | **~RM73,000+**           | **~RM62,000**               |

A few notes on the arithmetic. The MOT stamp duty of RM9,000 is 1% of the first RM100,000 (RM1,000) plus 2% of the next RM400,000 (RM8,000). The SPA legal fee of RM6,250 is 1.25% of RM500,000. The loan legal fee of about RM5,625 is 1.25% of the first RM450,000 of the loan. The first-time buyer column waives both stamp duties because the home is priced at RM500,000 or below.

Treat both totals as **estimates that vary** by bank, lawyer, and the disbursements involved.

## Ongoing costs people forget

Once you own the home, the yearly and recurring costs begin:

- **Quit rent** (**cukai tanah**) and **assessment** (**cukai pintu** or taksiran), paid yearly to the state and local council.
- **Maintenance fees and sinking fund** for strata properties like condos and serviced apartments.
- **Mortgage insurance** (MRTA/MRTT or MLTA), often financed into the loan.
- The bank's **valuation fee** for its valuation report during the loan application.
- **Renovation and repairs**, and an **agent fee** where one applies.

These vary widely, so we have not put figures on them, but they belong in your budget from day one.

## Don't overpay on the price itself

For all the fees above, the biggest saving is usually on the price you agree to pay. Fees are largely fixed by scale; the price is negotiable. The strongest position at the negotiating table comes from **real transacted data**, not asking prices.

Start with [recorded subsale transactions](/subsales) for the same area, project, and property type, then sanity-check a specific home with the [property valuation tool](/tools/property-valuation). If you are not sure how to read the numbers, [how to check a property's market value](/learn/how-to-check-property-market-value-malaysia) walks through comparing like with like.

## A note on the figures

This guide is for general information, not financial, legal, or tax advice. The rates and exemptions here are accurate as of 2026, but they change with Budget announcements, and the exact amounts vary by bank, lawyer, and property. Confirm the current figures with your banker and solicitor before you commit.

# Property auctions in Malaysia: how lelong works
https://list.my/learn/property-auction-lelong-malaysia

## What a lelong property is

A **lelong property** is a property sold at auction. In most cases it is a foreclosure: the owner borrowed to buy the property, fell behind on repayments, and the lender moved to auction it off to recover the outstanding debt.

Because the sale is driven by the lender rather than a willing seller, an auction works differently from a normal subsale. The property is offered on set terms, on a set date, at a starting price the seller did not choose, and the highest qualifying bid wins. This is why many buyers watch the auction market: a property that no owner would voluntarily discount can still end up selling for less than similar homes nearby.

## Why lelong properties can be cheaper

Every auction opens at a **reserve price**, which is the minimum the property can be sold for. The reserve is set by a valuation, not by an eager seller, so it already tends to be grounded in numbers rather than hope.

If nobody bids high enough, the auction fails. When it is relisted, the reserve is **commonly reduced by around 10%** for the next round. After one or more failed rounds, the reserve can fall below what comparable properties are actually worth. That gap is the appeal of buying **rumah lelong** and the reason auction hunters keep returning.

The catch is that a lower reserve is not automatically a bargain. A property may be priced low because it carries problems, and the discount only matters once you compare it against real transacted prices.

## How the auction process works

The auction is governed by two documents: the **Proclamation of Sale (POS)** and the **Conditions of Sale**. These set out the reserve price, the deposit, the payment deadline, and who bears which costs. Read them before you do anything else.

The typical flow looks like this:

- **Deposit.** You usually prepare a deposit of around **5% to 10%** of the reserve price, commonly as a bank draft, before you are allowed to bid.
- **Bidding.** On auction day, registered bidders compete and the highest bid at or above the reserve wins.
- **Settlement.** The successful bidder pays the balance within a fixed window, **commonly 90 to 120 days**.

Treat every number here as a rough guide. Deposits, deadlines, and procedures vary by auction type and by the auctioneer, which is exactly why the conditions of sale must be read for each property.

## What to check before you bid

**Title type matters most.** Court and land-office auctions usually involve property where an individual or strata title has been issued. Bank auctions run through an assignment, often called **LACA**, where the title has not yet been issued and you buy the developer's right to the property instead. The paperwork and the risk profile differ, so know which one you are bidding on.

Beyond the title, check:

- **Conditions of sale** for who bears legal fees, transfer costs, and outstanding charges.
- **Arrears** such as utility bills, maintenance fees, sinking fund, and assessment or quit rent. These can follow the property, and the conditions decide who pays.
- **Occupancy.** The property is usually sold as-is, often with no interior viewing, and occupants may still be living there. Getting vacant possession can take time and effort.
- **Financing readiness.** The settlement deadline is tight. Arrange your loan in principle before bidding, because missing the deadline can mean losing your deposit.

Given the legal complexity, it is worth appointing a **lawyer** to review the POS and conditions before you commit.

## Is the reserve price actually a bargain?

A reserve that looks low only tells you what the bank will accept, not what the property is worth. To judge a real discount, compare the reserve against **actual transacted prices** for the same project, road, or area.

On List.my you can browse recorded transactions at [/subsales](/subsales) to see what comparable units genuinely sold for, rather than relying on asking prices. For a structured comparison, read [how to check property market value](/learn/how-to-check-property-market-value-malaysia) and try the [property valuation tool](/tools/property-valuation). If the reserve sits meaningfully below recent transacted prices and the property checks out, the discount is real. If it does not, the lelong label alone is not a saving.

## Where to find upcoming auctions

List.my lists **upcoming property auctions**, which you can browse by **state** and **property type** at [/auctions](/auctions). You can also subscribe to a daily email alert that flags newly listed auctions matching your saved filters, so you do not have to check manually.

## Before you commit

Auction purchases can be rewarding, but they carry more legal and practical risk than an ordinary subsale. The property is sold on the bank's or the court's terms, often without an inside viewing, and the deadlines are unforgiving. Read the **Proclamation of Sale** and **Conditions of Sale** in full, verify them with a **lawyer**, and confirm your financing before you raise your hand. List.my can help you compare prices and find auctions, but it does not replace professional advice on contracts, title, or legal risk.

# First-time home buyer schemes in Malaysia: what you can actually apply for
https://list.my/learn/first-time-home-buyer-schemes-malaysia

## The help available, in one view

If you are buying your first home in Malaysia (**rumah pertama**), the help comes in three main types: paying less tax, getting a loan when a normal one is hard, and buying below market through affordable-housing schemes. Here is the whole picture in one table.

| Scheme                                                     | What it gives you                                          | Who it's for                                               |
| ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- |
| [Stamp duty exemption](https://www.hasil.gov.my/)          | Full waiver of MOT + loan stamp duty on a first home       | Malaysian citizens, first home priced ≤ RM500,000          |
| SRP (Skim Rumah Pertamaku)                                 | Up to 100% financing, no 10% down payment                  | First-time buyers via participating banks                  |
| [MyHome](https://ehome.kpkt.gov.my/)                       | Subsidy of up to RM30,000                                  | Eligible first-time buyers of qualifying homes             |
| [PR1MA](https://www.pr1ma.my/)                             | Affordable homes, ~RM100,000–RM400,000                     | Middle-income (M40), household income up to RM15,000/month |
| [Residensi Wilayah](https://rumawip.kwp.gov.my/)           | Affordable homes, ~RM63,000–RM300,000+, 10-year moratorium | Federal Territory (KL, Putrajaya, Labuan) buyers           |
| [SJKP](https://www.sjkp.com.my/)                           | Government-guaranteed loan without payslips                | Self-employed, gig, informal-sector workers                |
| Rent-to-Own (RTO)                                          | Rent first, buy later                                      | Buyers not yet loan-ready (varies by provider)             |
| State schemes ([Rumah Selangorku](https://lphs.gov.my/) …) | State affordable housing                                   | Residents meeting each state's own rules                   |

Read the rest for the detail, and remember: income limits, prices, and moratoriums change with each Budget, so check the scheme's official site before you commit.

<div class="fthb-flow">
    <div class="fthb-flow__header">
        <p class="fthb-flow__title">Which scheme fits you?</p>
        <div class="fthb-flow__switcher" id="fthbLayoutSwitcher">
            <span>Layout:</span>
            <button type="button" data-mode="column">Column</button>
            <button type="button" data-mode="tree">Tree</button>
            <span class="fthb-flow__zoom">
                <button type="button" class="fthb-flow__zoom-btn" data-zoom="out" aria-label="Zoom out">&minus;</button>
                <button type="button" class="fthb-flow__zoom-label" id="fthbZoomLabel" title="Reset zoom">100%</button>
                <button type="button" class="fthb-flow__zoom-btn" data-zoom="in" aria-label="Zoom in">+</button>
            </span>
        </div>
    </div>
    <div class="chart-wrapper">
        <div class="tree-container">
            <div class="tree">
                <ul>
                    <li>
                        <div class="node decision w-lg">
                            Are you a Malaysian citizen buying your first home?
                        </div>
                        <ul>
                            <li>
                                <span class="edge-label bg-solid">No</span>
                                <div class="node outcome w-xl">
                                    <div class="title">First-time schemes require citizenship</div>
                                    <div class="subtitle" style="font-weight: 500">
                                        Check general financing options
                                    </div>
                                </div>
                            </li>
                            <li>
                                <span class="edge-label yes bg-solid">Yes</span>
                                <ul>
                                    <li>
                                        <div class="node-aside-wrap">
                                            <div class="node decision w-xl">
                                                What's your biggest obstacle right now?
                                            </div>
                                            <div class="node banner aside-note">
                                                <strong>Note:</strong> Stamp duty exemption applies
                                                automatically on MOT + loan agreement for homes &le;
                                                RM500,000 (until 31 Dec 2027)
                                            </div>
                                        </div>
                                        <ul>
                                            <li>
                                                <span class="edge-label bg-solid"
                                                    >Can't save the 10%<br />down payment</span
                                                >
                                                <div class="node outcome w-sm">
                                                    <div class="title">Skim Rumah Pertamaku (SRP)</div>
                                                    <div class="subtitle">Up to 100% financing</div>
                                                </div>
                                            </li>
                                            <li>
                                                <span class="edge-label bg-solid"
                                                    >Self-employed /<br />gig work / no
                                                    payslips</span
                                                >
                                                <div class="node outcome w-sm">
                                                    <div class="title">SJKP</div>
                                                    <div class="subtitle">
                                                        Government-guaranteed loan without
                                                        fixed-income documents
                                                    </div>
                                                </div>
                                            </li>
                                            <li>
                                                <span class="edge-label bg-solid"
                                                    >Want a home priced<br />below market</span
                                                >
                                                <div class="node decision w-sm" style="padding: 16px">
                                                    Where are you buying?
                                                </div>
                                                <ul>
                                                    <li>
                                                        <span class="edge-label bg-solid"
                                                            >KL / Putrajaya / Labuan</span
                                                        >
                                                        <div class="node outcome w-sm">
                                                            <div class="title">Residensi Wilayah</div>
                                                            <div class="subtitle">
                                                                RM63k-RM300k+,<br />10-year resale
                                                                moratorium
                                                            </div>
                                                        </div>
                                                    </li>
                                                    <li>
                                                        <span class="edge-label bg-solid"
                                                            >Elsewhere, income up to
                                                            RM15k/month</span
                                                        >
                                                        <div class="node outcome w-sm">
                                                            <div class="title">PR1MA</div>
                                                            <div class="subtitle">
                                                                RM100k-RM400k homes
                                                            </div>
                                                        </div>
                                                    </li>
                                                    <li>
                                                        <span class="edge-label bg-solid">Elsewhere</span>
                                                        <div class="node outcome w-sm">
                                                            <div class="title">State Schemes</div>
                                                            <div class="subtitle">
                                                                Check your state's own scheme<br />(e.g.
                                                                Rumah Selangorku)
                                                            </div>
                                                        </div>
                                                    </li>
                                                </ul>
                                            </li>
                                            <li>
                                                <span class="edge-label bg-solid">Not loan-ready yet</span>
                                                <div class="node outcome w-sm">
                                                    <div class="title">Rent-to-Own (RTO)</div>
                                                    <div class="subtitle">Rent first, buy later</div>
                                                </div>
                                            </li>
                                        </ul>
                                    </li>
                                </ul>
                            </li>
                        </ul>
                    </li>
                </ul>
            </div>
        </div>
    </div>
    <div class="fthb-flow__footer">
        Eligibility and figures change with each Budget — verify on the scheme's official site.
    </div>
</div>
<style>
    .fthb-flow {
        background-color: #f8fafc;
        border: 1px solid #e2e8f0;
        border-radius: 16px;
        color: #334155;
        font-family:
            -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
        box-sizing: border-box;
        padding: 28px 20px;
        margin: 32px 0;
        position: relative;
    }
    .fthb-flow *,
    .fthb-flow *::before,
    .fthb-flow *::after {
        box-sizing: border-box;
    }
    .fthb-flow__header {
        display: flex;
        align-items: center;
        justify-content: space-between;
        flex-wrap: wrap;
        gap: 12px;
        margin-bottom: 20px;
    }
    .fthb-flow__title {
        color: #111827;
        font-size: 19px;
        font-weight: 700;
        margin: 0;
    }
    .fthb-flow .chart-wrapper {
        width: 100%;
        overflow-x: auto;
        padding-bottom: 12px;
    }
    .fthb-flow .tree-container {
        display: flex;
        justify-content: center;
        min-width: max-content;
        padding: 0 20px;
    }
    .fthb-flow .tree {
        position: relative;
    }
    .fthb-flow .tree ul {
        padding-top: 40px;
        position: relative;
        display: flex;
        justify-content: center;
        margin: 0;
        padding-left: 0;
    }
    .fthb-flow .tree > ul {
        padding-top: 0;
    }
    .fthb-flow .tree li {
        list-style-type: none;
        position: relative;
        padding: 72px 14px 0 14px;
        text-align: center;
    }
    .fthb-flow .tree li::before,
    .fthb-flow .tree li::after {
        content: "";
        position: absolute;
        top: 0;
        right: 50%;
        border-top: 2px solid #64748b;
        width: 50%;
        height: 72px;
    }
    .fthb-flow .tree li::after {
        right: auto;
        left: 50%;
        border-left: 2px solid #64748b;
    }
    .fthb-flow .tree li:first-child::before,
    .fthb-flow .tree li:last-child::after {
        border: 0 none;
    }
    .fthb-flow .tree li:last-child::before {
        border-right: 2px solid #64748b;
        border-radius: 0 8px 0 0;
    }
    .fthb-flow .tree li:first-child::after {
        border-radius: 8px 0 0 0;
    }
    .fthb-flow .tree li:only-child {
        padding-top: 40px;
    }
    .fthb-flow .tree li:only-child::before {
        display: block;
        border-left: 2px solid #64748b;
        border-top: none;
        border-right: none;
        width: 0;
        height: 40px;
        right: auto;
        left: 50%;
        border-radius: 0;
        margin-left: -1px;
    }
    .fthb-flow .tree li:only-child::after {
        display: none;
    }
    .fthb-flow .tree > ul > li:only-child::before {
        display: none;
    }
    .fthb-flow .tree ul ul::before {
        content: "";
        position: absolute;
        top: 0;
        left: 50%;
        border-left: 2px solid #64748b;
        width: 0;
        height: 40px;
        margin-left: -1px;
    }
    .fthb-flow .tree ul.js-custom-junction::before,
    .fthb-flow .tree ul.js-custom-junction > li::before,
    .fthb-flow .tree ul.js-custom-junction > li::after {
        display: none;
    }
    .fthb-flow .js-connector {
        position: absolute;
        background: #64748b;
        pointer-events: none;
    }
    .fthb-flow .node-aside-wrap {
        display: inline-flex;
        align-items: center;
        gap: 20px;
    }
    .fthb-flow .node.aside-note {
        width: 300px;
        flex-shrink: 0;
        font-size: 13px;
        padding: 14px 16px;
        text-align: left;
    }
    .fthb-flow .node {
        display: inline-block;
        padding: 20px 24px;
        border-radius: 12px;
        font-size: 16px;
        position: relative;
        z-index: 2;
        box-sizing: border-box;
        line-height: 1.4;
        text-align: center;
        box-shadow: none;
        border: none;
        text-decoration: none;
        color: #111827;
    }
    .fthb-flow .node.decision {
        background-color: #111827;
        color: #f8fafc;
        font-weight: 600;
    }
    .fthb-flow .node.outcome {
        background-color: #fbbf24;
        color: #111827;
        min-height: 100px;
        display: inline-flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
    }
    .fthb-flow .node.banner {
        background-color: #eff8ff;
        border: 2px dashed #0ea5e9;
        color: #0369a1;
        font-size: 15px;
        padding: 16px 24px;
    }
    .fthb-flow .tree > ul > li > ul > li {
        padding-top: 30px;
    }
    .fthb-flow .tree > ul > li > ul > li:last-child > ul,
    .fthb-flow .tree > ul > li > ul > li:last-child > ul > li {
        padding-top: 20px;
    }
    .fthb-flow .tree > ul > li > ul > li:first-child > .node.outcome {
        margin-top: 40px;
    }
    .fthb-flow .tree > ul > li > ul > li:last-child > ul > li > ul > li:nth-child(3) > ul {
        padding-top: 70px;
    }
    .fthb-flow .tree > ul > li > ul > li:last-child > ul > li > ul {
        justify-content: space-evenly;
        transform: translateX(-160px);
    }
    .fthb-flow .tree > ul > li > ul > li:last-child > ul > li > ul > li:nth-child(3) {
        flex: 0 0 240px;
        width: 240px;
    }
    .fthb-flow
        .tree
        > ul
        > li
        > ul
        > li:last-child
        > ul
        > li
        > ul
        > li:nth-child(3)
        > .node.decision {
        margin-top: 22px;
    }
    .fthb-flow .tree > ul > li > ul > li:last-child > ul > li > ul > li:nth-child(3) > ul::before {
        height: 70px;
    }
    .fthb-flow .edge-label {
        position: absolute;
        top: 15px;
        left: 0;
        right: 0;
        width: max-content;
        margin: 0 auto;
        background-color: #f8fafc;
        padding: 4px 12px;
        color: #64748b;
        font-size: 14px;
        font-weight: 600;
        border-radius: 16px;
        z-index: 10;
        text-align: center;
        max-width: 250px;
        line-height: 1.3;
        text-decoration: none;
        border: none;
    }
    .fthb-flow .edge-label.yes {
        color: #0ea5e9;
        background-color: #e0f2fe;
    }
    .fthb-flow .edge-label.bg-solid {
        background-color: #f8fafc;
    }
    .fthb-flow .w-sm {
        width: 240px;
    }
    .fthb-flow .w-md {
        width: 260px;
    }
    .fthb-flow .w-lg {
        width: 300px;
    }
    .fthb-flow .w-xl {
        width: 380px;
    }
    .fthb-flow .title {
        font-size: 17px;
        font-weight: 700;
        margin-bottom: 6px;
        text-decoration: none;
        color: inherit;
    }
    .fthb-flow .subtitle {
        font-size: 14px;
        font-weight: 400;
        text-decoration: none;
        color: inherit;
    }
    .fthb-flow__footer {
        text-align: center;
        margin-top: 24px;
        color: #64748b;
        font-size: 13px;
    }
    .fthb-flow__switcher {
        background: #fff;
        box-shadow: 0 4px 12px rgba(15, 23, 42, 0.08);
        border: 1px solid #e2e8f0;
        border-radius: 10px;
        padding: 6px 8px;
        display: flex;
        align-items: center;
        gap: 6px;
        font-size: 13px;
    }
    .fthb-flow__switcher span {
        color: #64748b;
        padding: 0 2px;
        user-select: none;
    }
    .fthb-flow__switcher button {
        border: none;
        background: #f1f5f9;
        color: #334155;
        padding: 5px 12px;
        border-radius: 6px;
        font-size: 13px;
        font-weight: 600;
        cursor: pointer;
        font-family: inherit;
        transition: background 0.15s;
    }
    .fthb-flow__switcher button:hover {
        background: #e2e8f0;
    }
    .fthb-flow__switcher button.active {
        background: #111827;
        color: #fff;
    }
    .fthb-flow__zoom {
        display: flex;
        align-items: center;
        gap: 4px;
        margin-left: 6px;
        padding-left: 10px;
        border-left: 1px solid #e2e8f0;
    }
    .fthb-flow:not(.mode-tree) .fthb-flow__zoom {
        display: none;
    }
    .fthb-flow__zoom-btn {
        width: 26px;
        padding: 5px 0 !important;
        text-align: center;
    }
    .fthb-flow__zoom-label {
        min-width: 44px;
        background: transparent !important;
        color: #64748b !important;
        font-weight: 500 !important;
        padding: 5px 2px !important;
    }
    /* ===== Column mode: balanced single-column vertical flow (default) ===== */
    .fthb-flow.mode-column .chart-wrapper {
        overflow-x: visible;
        padding-bottom: 0;
    }
    .fthb-flow.mode-column .tree-container {
        display: block;
        min-width: 0;
        padding: 0;
    }
    .fthb-flow.mode-column .tree {
        max-width: 640px;
        margin: 0 auto;
    }
    .fthb-flow.mode-column .tree,
    .fthb-flow.mode-column .tree ul {
        display: block;
        margin: 0;
        padding: 0;
    }
    .fthb-flow.mode-column .tree ul {
        position: relative;
        margin-left: 13px;
        padding-left: 28px;
        /* hold the card→rail gap as padding (not the first li's margin, which would
           collapse through the ul) so the rail's border-left reaches up to the card */
        padding-top: 20px;
        border-left: 2px solid #cbd5e1;
    }
    .fthb-flow.mode-column .tree ul > li:first-child {
        margin-top: 0;
    }
    .fthb-flow.mode-column .tree > ul {
        margin-left: 0;
        padding-left: 0;
        padding-top: 0;
        border-left: none;
    }
    .fthb-flow.mode-column .tree ul:has(> li:only-child) {
        margin-left: 0;
        padding-left: 16px;
        border-left: none;
    }
    .fthb-flow.mode-column .tree ul:has(> li:only-child) > li::before {
        display: none !important;
    }
    /* Exception: the "Yes -> What's your biggest obstacle" wrapper is a single child,
       but leaving it rail-less floats the obstacle node disconnected below the No/Yes
       rail. Restore its rail + horizontal tick so "Yes" visibly leads into it. */
    .fthb-flow.mode-column .tree > ul > li > ul > li:last-child > ul {
        margin-left: 13px;
        padding-left: 28px;
        /* Hold the gap as padding on the wrapper (not margin on the li) so the rail's
           border-left actually spans it — a margin above the li would collapse through
           and leave the rail starting at the node, floating below "Yes". */
        padding-top: 20px;
        border-left: 2px solid #cbd5e1;
    }
    .fthb-flow.mode-column .tree > ul > li > ul > li:last-child > ul > li {
        padding-top: 0;
        margin-top: 0;
    }
    /* Fully re-declare the obstacle's horizontal tick: this li is BOTH :last-child and
       :only-child, and the column ":only-child::before" neutralize rule blanks it to
       content:none — so restoring display alone leaves no box. Redeclare content+geometry. */
    .fthb-flow.mode-column .tree > ul > li > ul > li:last-child > ul > li::before {
        content: "" !important;
        display: block !important;
        position: absolute;
        top: 17px;
        left: -28px;
        width: 24px;
        height: 2px;
        background: #cbd5e1;
        border: none;
        border-radius: 0;
    }
    .fthb-flow.mode-column .tree li {
        position: relative;
        padding: 0;
        margin-top: 22px;
        text-align: left;
    }
    .fthb-flow.mode-column .tree > ul > li {
        margin-top: 0;
    }
    .fthb-flow.mode-column .tree > ul > li + li {
        margin-top: 22px;
    }
    .fthb-flow.mode-column .tree ul > li::before {
        content: "" !important;
        position: absolute;
        top: 17px;
        left: -28px;
        width: 24px;
        height: 2px;
        background: #cbd5e1;
        border: none;
        border-radius: 0;
    }
    .fthb-flow.mode-column .tree li::after,
    .fthb-flow.mode-column .tree ul ul::before,
    .fthb-flow.mode-column .tree li:first-child::after,
    .fthb-flow.mode-column .tree li:only-child::before,
    .fthb-flow.mode-column .tree li:only-child::after {
        content: none !important;
        border: none !important;
        display: none !important;
    }
    .fthb-flow.mode-column .tree ul > li:last-child::after {
        content: "" !important;
        display: block !important;
        position: absolute;
        left: -30px;
        right: auto;
        top: 18px;
        bottom: 0;
        /* base tree rule sets height:72px; with height set, bottom is ignored and the
           mask becomes a stub — rails then overshoot past their last tick */
        height: auto;
        width: 5px;
        background: #f8fafc;
        border: none !important;
        border-radius: 0;
    }
    .fthb-flow.mode-column .node {
        display: block;
        width: 100% !important;
        max-width: 100% !important;
        box-sizing: border-box;
        padding: 16px 20px;
        font-size: 16px;
    }
    .fthb-flow.mode-column .node.outcome {
        min-height: 0;
        align-items: stretch;
    }
    .fthb-flow.mode-column .tree > ul > li > ul > li:first-child > .node.outcome {
        margin-top: 0;
    }
    .fthb-flow.mode-column
        .tree
        > ul
        > li
        > ul
        > li:last-child
        > ul
        > li
        > ul
        > li:nth-child(3)
        > ul {
        padding-top: 40px;
    }
    /* Undo the desktop-tree-only geometry hacks that would otherwise leak into the
       stacked column layout (shift the obstacle group left, cap its width, etc.). */
    .fthb-flow.mode-column .tree > ul > li > ul > li:last-child > ul > li > ul {
        transform: none;
    }
    .fthb-flow.mode-column
        .tree
        > ul
        > li
        > ul
        > li:last-child
        > ul
        > li
        > ul
        > li:nth-child(3) {
        flex: none;
        width: auto;
    }
    .fthb-flow.mode-column
        .tree
        > ul
        > li
        > ul
        > li:last-child
        > ul
        > li
        > ul
        > li:nth-child(3)
        > .node.decision {
        margin-top: 0;
    }
    .fthb-flow.mode-column .node.banner {
        padding: 14px 18px;
        font-size: 15px;
    }
    .fthb-flow.mode-column .node-aside-wrap {
        display: block;
        width: 100%;
    }
    .fthb-flow.mode-column .node.aside-note {
        width: 100%;
        margin-top: 12px;
    }
    .fthb-flow.mode-column .edge-label {
        position: static;
        display: inline-block;
        transform: none;
        margin: 0 0 8px 0;
        max-width: 100%;
        font-size: 13px;
        background: #e2e8f0;
        color: #475569;
        border-radius: 999px;
        padding: 4px 12px;
    }
    .fthb-flow.mode-column .edge-label.yes {
        color: #0369a1;
        background: #e0f2fe;
    }
    /* ---- Narrow / mobile: same stacked flow, tighter spacing ---- */
    @media (max-width: 560px) {
        .fthb-flow__switcher {
            display: none;
        }
        .fthb-flow {
            padding: 20px 14px;
        }
        .fthb-flow__title {
            font-size: 17px;
        }
        .fthb-flow .tree li {
            margin-top: 18px;
        }
        .fthb-flow .title {
            font-size: 16px;
        }
        .fthb-flow .subtitle {
            font-size: 13px;
        }
    }
</style>
<script>
    (function () {
        var root = document.querySelector(".fthb-flow");
        if (!root) return;
        var KEY = "fthb-flow-layout";
        var buttons = root.querySelectorAll("#fthbLayoutSwitcher button[data-mode]");
        function apply(mode) {
            root.classList.toggle("mode-column", mode === "column");
            root.classList.toggle("mode-tree", mode === "tree");
            buttons.forEach(function (b) {
                b.classList.toggle("active", b.dataset.mode === mode);
            });
            try {
                localStorage.setItem(KEY, mode);
            } catch (e) {}
            requestAnimationFrame(updateConnectors);
        }
        buttons.forEach(function (b) {
            b.addEventListener("click", function () {
                apply(b.dataset.mode);
            });
        });
        function getChildLis(ul) {
            return Array.prototype.filter.call(ul.children, function (el) {
                return el.tagName === "LI";
            });
        }
        function findAnchorNode(li) {
            if (!li) return null;
            var direct = li.querySelector(":scope > .node");
            if (direct) return direct;
            var wrap = li.querySelector(":scope > .node-aside-wrap");
            if (wrap) return wrap.querySelector(".node:not(.aside-note)") || wrap;
            var childUl = li.querySelector(":scope > ul");
            if (childUl) {
                var kids = getChildLis(childUl);
                if (kids.length === 1) return findAnchorNode(kids[0]);
            }
            return null;
        }
        function getAnchorChainUls(li) {
            var uls = [];
            var current = li;
            while (current) {
                if (
                    current.querySelector(":scope > .node") ||
                    current.querySelector(":scope > .node-aside-wrap")
                ) {
                    break;
                }
                var childUl = current.querySelector(":scope > ul");
                if (!childUl) break;
                var kids = getChildLis(childUl);
                if (kids.length !== 1) break;
                uls.push(childUl);
                current = kids[0];
            }
            return uls;
        }
        function drawLine(treeEl, x, y, w, h) {
            var el = document.createElement("div");
            el.className = "js-connector";
            el.style.left = x + "px";
            el.style.top = y + "px";
            el.style.width = w + "px";
            el.style.height = h + "px";
            treeEl.insertBefore(el, treeEl.firstChild);
        }
        var TARGET_GAP = 50;
        var MIN_SUBTREE_GAP = 40;
        /* Tree-mode zoom: userZoom=null means the default zoom. CSS zoom (not
           transform) so the scaled size IS the layout size — transform left the
           untransformed box in the scroll area on Safari, causing a phantom
           horizontal scrollbar. Connectors are measured/drawn at zoom 1 first. */
        var DEFAULT_ZOOM = 0.5;
        var userZoom = null;
        var zoomLabel = root.querySelector("#fthbZoomLabel");
        function fitZoom() {
            var wrapper = root.querySelector(".chart-wrapper");
            var tree = root.querySelector(".tree");
            if (!wrapper || !tree || !tree.offsetWidth) return DEFAULT_ZOOM;
            /* offsetWidth is in the tree's own (pre-zoom) coordinates; 40 = the
               tree-container's horizontal padding */
            return (wrapper.clientWidth - 40) / tree.offsetWidth;
        }
        function currentZoom() {
            /* default: 53%, shrunk to fit the column if 53% would overflow */
            return userZoom || Math.min(DEFAULT_ZOOM, fitZoom());
        }
        function resetZoomStyles() {
            var tree = root.querySelector(".tree");
            if (tree) tree.style.zoom = "";
        }
        function applyZoom() {
            var tree = root.querySelector(".tree");
            if (!tree) return;
            if (!root.classList.contains("mode-tree")) {
                resetZoomStyles();
                return;
            }
            var z = currentZoom();
            tree.style.zoom = z;
            if (zoomLabel) zoomLabel.textContent = Math.round(z * 100) + "%";
        }
        root.querySelectorAll(".fthb-flow__zoom-btn").forEach(function (b) {
            b.addEventListener("click", function () {
                var z = currentZoom() + (b.dataset.zoom === "in" ? 0.1 : -0.1);
                userZoom = Math.min(1.5, Math.max(0.3, z));
                applyZoom();
            });
        });
        if (zoomLabel) {
            zoomLabel.addEventListener("click", function () {
                userZoom = null;
                applyZoom();
            });
        }
        function updateRootJunction(treeEl) {
            var rootNode = root.querySelector(".tree > ul > li > .node");
            var rootChildUl = root.querySelector(".tree > ul > li > ul");
            if (!rootNode || !rootChildUl) return;
            rootNode.style.transform = "";
            rootChildUl.classList.remove("js-custom-junction");
            var childLis = getChildLis(rootChildUl);
            childLis.forEach(function (li) {
                li.style.marginLeft = "";
                var label = li.querySelector(":scope > .edge-label");
                if (label) label.style.transform = "";
                getAnchorChainUls(li).forEach(function (ul) {
                    ul.classList.remove("js-custom-junction");
                });
            });
            if (childLis.length < 2) return;
            var firstLi = childLis[0];
            var lastLi = childLis[childLis.length - 1];
            var firstNode = findAnchorNode(firstLi);
            var lastNode = findAnchorNode(lastLi);
            if (!firstNode || !lastNode) return;
            rootChildUl.classList.add("js-custom-junction");
            getAnchorChainUls(firstLi).forEach(function (ul) {
                ul.classList.add("js-custom-junction");
            });
            getAnchorChainUls(lastLi).forEach(function (ul) {
                ul.classList.add("js-custom-junction");
            });
            var firstNodeRect = firstNode.getBoundingClientRect();
            var lastNodeRect = lastNode.getBoundingClientRect();
            var firstLiRect = firstLi.getBoundingClientRect();
            var lastLiRect = lastLi.getBoundingClientRect();
            var containerRect = root.querySelector(".tree-container").getBoundingClientRect();
            var desiredShift = firstNodeRect.right + TARGET_GAP - lastNodeRect.left;
            var maxShiftVsFirst = firstLiRect.right + MIN_SUBTREE_GAP - lastLiRect.left;
            var maxShiftVsContainer = containerRect.left - lastLiRect.left;
            var shift = Math.min(0, desiredShift, maxShiftVsFirst);
            shift = Math.max(shift, maxShiftVsContainer);
            /* margin-left, not translateX: a transform leaves the untransformed box
               in the scroll area (Safari), producing a dead horizontal scrollbar */
            lastLi.style.marginLeft = shift.toFixed(1) + "px";
            var firstAnchor = firstNode.getBoundingClientRect();
            var lastAnchor = lastNode.getBoundingClientRect();
            var treeRect = treeEl.getBoundingClientRect();
            var firstCenterX = firstAnchor.left + firstAnchor.width / 2 - treeRect.left;
            var lastCenterX = lastAnchor.left + lastAnchor.width / 2 - treeRect.left;
            var barY = firstLi.getBoundingClientRect().top - treeRect.top;
            var firstDropH = firstAnchor.top - treeRect.top - barY;
            var lastDropH = lastAnchor.top - treeRect.top - barY;
            var leftX = Math.min(firstCenterX, lastCenterX);
            var rightX = Math.max(firstCenterX, lastCenterX);
            var mid = (firstCenterX + lastCenterX) / 2;
            var rootNodeRect = rootNode.getBoundingClientRect();
            var stemTop = rootNodeRect.bottom - treeRect.top;
            drawLine(treeEl, mid - 1, stemTop, 2, Math.max(0, barY - stemTop));
            drawLine(treeEl, leftX, barY, rightX - leftX, 2);
            drawLine(treeEl, firstCenterX - 1, barY, 2, firstDropH);
            drawLine(treeEl, lastCenterX - 1, barY, 2, lastDropH);
            var rootCenter = rootNodeRect.left + rootNodeRect.width / 2;
            rootNode.style.transform =
                "translateX(" + (mid + treeRect.left - rootCenter).toFixed(1) + "px)";
            [
                [firstLi, firstCenterX],
                [lastLi, lastCenterX],
            ].forEach(function (pair) {
                var label = pair[0].querySelector(":scope > .edge-label");
                if (!label) return;
                var labelRect = label.getBoundingClientRect();
                var labelCenter = labelRect.left + labelRect.width / 2 - treeRect.left;
                var labelShift = pair[1] - labelCenter;
                label.style.transform = "translateX(" + labelShift.toFixed(1) + "px)";
            });
        }
        function updateObstacleJunction(treeEl) {
            var obstacleLi = root.querySelector(".tree > ul > li > ul > li:last-child > ul > li");
            if (!obstacleLi) return;
            var childUl = obstacleLi.querySelector(":scope > ul");
            childUl && childUl.classList.remove("js-custom-junction");
            if (!childUl) return;
            var anchor = findAnchorNode(obstacleLi);
            var childLis = getChildLis(childUl);
            if (!anchor || childLis.length < 2) return;
            var anchors = childLis.map(findAnchorNode);
            if (
                anchors.some(function (a) {
                    return !a;
                })
            )
                return;
            childUl.classList.add("js-custom-junction");
            var treeRect = treeEl.getBoundingClientRect();
            var barY = childLis[0].getBoundingClientRect().top - treeRect.top;
            var centers = anchors.map(function (a) {
                var r = a.getBoundingClientRect();
                return r.left + r.width / 2 - treeRect.left;
            });
            var drops = anchors.map(function (a) {
                return a.getBoundingClientRect().top - treeRect.top - barY;
            });
            var leftX = Math.min.apply(null, centers);
            var rightX = Math.max.apply(null, centers);
            var anchorRect = anchor.getBoundingClientRect();
            var stemX = anchorRect.left + anchorRect.width / 2 - treeRect.left;
            var stemTop = anchorRect.bottom - treeRect.top;
            drawLine(treeEl, stemX - 1, stemTop, 2, Math.max(0, barY - stemTop));
            drawLine(treeEl, leftX, barY, rightX - leftX, 2);
            centers.forEach(function (cx, i) {
                drawLine(treeEl, cx - 1, barY, 2, drops[i]);
            });
        }
        function updateConnectors() {
            var treeEl = root.querySelector(".tree");
            if (!treeEl) return;
            resetZoomStyles();
            treeEl.querySelectorAll(".js-connector").forEach(function (el) {
                el.remove();
            });
            treeEl.querySelectorAll(".js-custom-junction").forEach(function (el) {
                el.classList.remove("js-custom-junction");
            });
            var isTreeMode = root.classList.contains("mode-tree");
            var isDesktop = window.innerWidth > 700;
            if (!isTreeMode || !isDesktop) {
                var rootNode = root.querySelector(".tree > ul > li > .node");
                var rootChildUl = root.querySelector(".tree > ul > li > ul");
                if (rootNode) rootNode.style.transform = "";
                if (rootChildUl) {
                    getChildLis(rootChildUl).forEach(function (li) {
                        li.style.marginLeft = "";
                        var label = li.querySelector(":scope > .edge-label");
                        if (label) label.style.transform = "";
                    });
                }
                applyZoom();
                return;
            }
            updateRootJunction(treeEl);
            updateObstacleJunction(treeEl);
            applyZoom();
        }
        var resizeTimer;
        window.addEventListener("resize", function () {
            clearTimeout(resizeTimer);
            resizeTimer = setTimeout(updateConnectors, 150);
        });
        window.addEventListener("load", updateConnectors);
        var saved = "column";
        try {
            saved = localStorage.getItem(KEY) || "column";
        } catch (e) {}
        apply(saved);
        updateConnectors();
    })();
</script>

## Save on tax: the stamp duty exemption

The single biggest saving most first-time buyers can claim is the **stamp duty exemption**. Malaysian citizens buying a first home priced at **RM500,000 or below** get a full exemption on both the transfer (**MOT**, Memorandum of Transfer) and the **loan agreement** stamp duty. This has been extended until **31 December 2027**.

On a RM500,000 home that is roughly RM11,000 you do not have to find in cash. It applies automatically to eligible buyers, so there is no separate scheme to join. For the tiers, the exact wording, and how it interacts with the rest of your costs, read [stamp duty and MOT in Malaysia](/learn/stamp-duty-mot-malaysia). The current rules and exemption orders are published by LHDN on [hasil.gov.my](https://www.hasil.gov.my/).

## Get financed: SRP and SJKP

Two different problems, two different schemes.

If you can service a loan but cannot save the **10% down payment**, look at **Skim Rumah Pertamaku (SRP)**, also called the **My First Home Scheme**. It enables up to **100% financing** through participating banks, meaning you can buy without the usual deposit. You still need to qualify with the bank and pay cash costs like legal fees, so treat it as removing the deposit hurdle, not every cost.

If your problem is **documents rather than income**, look at **[SJKP](https://www.sjkp.com.my/)**, the **Skim Jaminan Kredit Perumahan (Housing Credit Guarantee Scheme)**. Banks are cautious with buyers who cannot show payslips: the self-employed, gig-economy drivers, small traders, and informal-sector workers. SJKP has the government **guarantee** the loan so the bank is more willing to lend. Budget 2026 **doubled the guarantee facility to RM20 billion**, expected to help around **80,000 more buyers**.

There is also **[MyHome](https://ehome.kpkt.gov.my/)**, a government **subsidy of up to RM30,000** for eligible first-time buyers of qualifying homes. It reduces the price you finance rather than the financing itself; applications run through KPKT's housing portal.

## Buy below market: PR1MA and Residensi Wilayah

Some schemes sell homes at controlled prices below the open market. Two of the best known:

**[PR1MA](https://www.pr1ma.my/)** is federal affordable housing, with homes generally priced around **RM100,000 to RM400,000**. It targets **middle-income (M40)** households, and its household income limit goes **up to RM15,000 a month**. That limit is deliberately high, so PR1MA covers households that earn too much for lower-income schemes but still cannot afford open-market prices.

**[Residensi Wilayah](https://rumawip.kwp.gov.my/)** (formerly **RUMAWIP**) is affordable housing for the **Federal Territories**: Kuala Lumpur, Putrajaya, and Labuan. Prices run roughly **RM63,000 to over RM300,000**. The important catch is a **10-year resale moratorium**: you generally cannot sell on the open market for ten years, which keeps it in the affordable pool rather than being flipped. **Residensi Madani** falls under this same programme.

Beyond these, most states run their own affordable-housing schemes, such as **[Rumah Selangorku](https://lphs.gov.my/)** in Selangor and equivalents elsewhere. Each has its own income limits, quotas, and residency rules, so check the specific state programme. Budget 2026 also committed to scaling up **Rent-to-Own (RTO)** models, where you rent first and buy later; the exact terms vary by provider.

## "Residensi" doesn't always mean affordable housing

A lot of people get confused here. Many ordinary private condominiums are simply **named** "Residensi something" by their developer, the way others are called "Residence" or "Suites". A project name with the word **Residensi does not make it scheme housing**.

**Residensi Wilayah** and **Residensi Madani** are government affordable-housing **schemes** with income limits and moratoriums. A private development called "Residensi XYZ" is usually just a normal condo sold at market prices with no scheme benefits at all. Before you assume a project is affordable housing, check whether it is actually listed under the Residensi Wilayah programme, not just whether its name starts with the word.

## Check the price is genuinely below market

Scheme housing is meant to be cheaper than the open market, but "meant to be" is not a guarantee, and private projects with scheme-sounding names are priced at full market rate. Either way, double-check the price against what homes in that area have **actually transacted** for.

Start with [recorded subsale transactions](/subsales) for the same area and property type, so you are comparing against real deals rather than asking prices. [How to check a property's market value](/learn/how-to-check-property-market-value-malaysia) walks through comparing like with like. And because the purchase price is only part of what you pay, [the real cost of buying a house in Malaysia](/learn/cost-of-buying-house-malaysia) lays out the full cash picture, including the stamp duty exemption above.

## A note on the figures

Schemes, price bands, and allocations change with **every Budget**, and eligibility rules (income limits, citizenship, first-property conditions, moratoriums) differ from one scheme to the next. This guide is general information, not financial or legal advice. Confirm the current criteria on each scheme's **official site** before you apply. List.my's job is the market-data side: helping you check that whatever you buy, scheme or not, is priced against what similar homes really sold for.

# Brickz alternative: check Malaysian property prices for free
https://list.my/learn/brickz-alternative-malaysia

## Looking for a Brickz alternative?

Found a place you like, then saw the asking price and thought: *wait, is it really worth that much?* or *How much other units or houses here sold recently?* Fair question.

Brickz is a familiar Malaysian property-data site. Its free pages show recent transaction summaries, while its paid reports provide more historical detail for a project or township. [See its current pricing](https://www.brickz.my/pricing/).

List.my is a great alternative if you want to check **recorded subsale transactions for free** before you spend on a report or commit to an offer. And its transaction records goes all the way back to 2021.

## The main thing: asking price is not sold price

Listings show what sellers want. Transaction records show what buyers actually paid.

That difference matters. A nice listing can be priced way above recent sales. Or it may be fair because it has a better view, renovation, corner lot or larger built-up area. The data helps you work out which one it is.

## Brickz or List.my?

<div class="not-prose my-8 grid gap-4 sm:grid-cols-2">
  <section class="rounded-xl border border-slate-200 bg-slate-50 p-5">
    <p class="text-lg font-bold text-slate-950">Brickz</p>
    <p class="mt-2 text-sm leading-6 text-slate-700">Useful when you want a paid report with historical details for one project or township.</p>
    <a class="mt-4 inline-flex text-sm font-bold text-slate-950 underline decoration-slate-300 underline-offset-4 hover:decoration-slate-950" href="https://www.brickz.my/pricing/">See Brickz pricing</a>
  </section>
  <section class="rounded-xl border border-sky-300 bg-sky-100 p-5 text-sky-950">
    <p class="text-lg font-bold">List.my</p>
    <p class="mt-2 text-sm leading-6 text-sky-900">Useful when you want to compare nearby subsale deals for free before you make an offer.</p>
    <a class="mt-4 inline-flex text-sm font-bold text-sky-950 underline decoration-sky-400 underline-offset-4 hover:decoration-sky-950" href="/subsales">Browse transactions</a>
  </section>
</div>

Both are research tools. A registered valuer or bank process is still needed for a formal valuation.

## How to do a proper price check

Go to [List.my subsales](/subsales), find the area, then pull up transactions closest to the home you are looking at.

Match these where possible:

- **Same project or road.** The next taman can be a different market.
- **Same property type.** A serviced apartment is not a terrace house.
- **Similar size.** Do not compare land area with built-up area, especially when looking at psf.
- **Similar tenure.** Freehold and leasehold can trade differently.
- **Recent sales.** Old transactions are still useful, but recent ones matter more.

Do not stop at one sale. Open a few. One unit may be renovated. Another may have sold quickly. You want the pattern, not the outlier.

## Use the median, not the most dramatic number

The highest sale is not always the market. Neither is the lowest.

Look at the **median** instead. It is the middle price in the group, so one unusual deal is less likely to throw you off. We explain it in [why the median is more useful than the average](/learn/why-median-not-average-property-price).

Want the short version? Use the [List.my property valuation tool](/tools/property-valuation) after you have checked the comparables. It gives you a quick starting range, not a guaranteed value.

## What transaction data cannot show

List.my uses completed transaction records from **Jabatan Penilaian dan Perkhidmatan Harta (JPPH)**. [Read where the data comes from](/learn/where-transaction-data-comes-from).

Still, data cannot see everything: renovation quality, a great view, a noisy road, condition, or unusual sale terms. It can also lag the date a deal was agreed.

Use it to ask better questions. If an asking price is well above recent comparable sales, ask what justifies the gap. For a loan, estate matter or any binding decision, rely on the registered valuer or bank process.

# What is a property median price?
https://list.my/learn/property-median-price

## The middle price

The **median price** is the middle transaction price after all recorded prices are arranged from lowest to highest. It is a quick way to understand what a typical deal looked like in a location, project, or property type.

If five properties transacted at **RM300k, RM330k, RM350k, RM390k, and RM900k**, the median price is **RM350k** because it sits in the middle of the sorted list. The RM900k sale still matters, but it does not pull the median upwards as strongly as it would pull a simple average.

## Why List.my uses median price

Property transactions can vary a lot even within the same area. One corner lot, newly renovated unit, larger land parcel, or premium-facing condo can sell for much more than the surrounding deals. A distressed or unusually small unit can sell for much less.

Median price gives you a steadier starting point because it focuses on the centre of the transaction set. When you are scanning a market, **median is usually more useful than the highest, lowest, or most unusual sale**.

## How to read it on List.my

Use median price as a **market benchmark**, not as a valuation for one specific property. It helps answer questions such as, “What did typical terrace houses in this area sell for recently?” or “Is this condo project generally trading higher or lower than nearby projects?”

For a fairer comparison, narrow the records by **location, property type, transaction date, size, tenure, and condition** where the data is available. A 900 sqft condo should not be compared too casually with a 1,600 sqft unit, and a corner terrace should not be treated the same as an intermediate terrace just because they share the same road.

## When median price is less useful

Median price becomes less reliable when there are very few transactions, when the records mix different property types, or when the properties are too different in size and condition. In those cases, open the individual transaction records and compare similar sales one by one.

# What is NAPIC Malaysia? The property data explained
https://list.my/learn/napic-malaysia

## What is NAPIC Malaysia?

NAPIC is the **National Property Information Centre** — in Malay, Pusat Maklumat Harta Tanah Negara. It is the government body that collects and publishes Malaysia's property market data.

It is not a separate agency. NAPIC was set up and is run by the **Valuation and Property Services Department**, or Jabatan Penilaian dan Perkhidmatan Harta (JPPH), under the Ministry of Finance. It started work nationwide on 1 October 1999 and operates from Putrajaya.

Its job is straightforward: keep a national property database, and give the government, developers, banks and the public a single trusted read on supply, demand and prices. When you see a news headline about house prices, overhang or unsold stock in Malaysia, the numbers almost always trace back to NAPIC.

## Where NAPIC's numbers come from

This is the part that matters to a buyer.

NAPIC's transaction records come from property transfers that pass through JPPH for stamp duty assessment. In other words, they are **completed deals with money that changed hands** — not advertisements, not agent estimates, not a seller's hope.

That is why the data is treated as the strongest starting point for a price check. A listing tells you what someone wants. A transaction record tells you what someone paid.

## What NAPIC publishes

NAPIC's portal splits into four families of published reports:

- **Property Market** — the Property Market Report, covering transaction volume and value by state, district and property type.
- **Property Inventory** — existing stock, incoming supply and planned supply.
- **Property Status** — completions, starts and unsold units, including the overhang figures that make the news.
- **Property Price and Rental Index** — the Malaysian House Price Index (MHPI), published quarterly and covering all 14 states.

Alongside those, NAPIC offers two ways to get at the underlying numbers:

- **Open Sales Data** — a free, downloadable file of residential, commercial and industrial property transactions.
- **e-Data** — a paid service for unpublished or more detailed data. Fees are worked out from what your search returns and paid online. Note that a month's transaction data is not on sale until the 15th of the following month.

The reports are excellent if you want the national picture. They are close to useless if you want to know what the unit two floors below you sold for.

## The catch: the raw file is a spreadsheet, not a search

The open transaction data is genuinely open, and that is a good thing. But it arrives as a flat data file, and a flat data file is not a research tool.

One row gives you roughly this: the district, the mukim, the scheme or area name, the road, the property type, the tenure, the land area and main floor area, the month of the transaction, and the price.

Now try to answer a normal question with it — _is RM650,000 fair for this 1,100 sq ft condo in Cheras?_ You would have to:

- **Find the right rows.** Filter by state, district, mukim, then the scheme name, which arrives in capitals and does not always match the name on the signboard.
- **Fix the units.** Areas come in square metres in places and square feet in others, and land area is not built-up area.
- **Work out psf yourself.** The file gives you a price and an area. The division is your problem.
- **Compute a median.** One row is an anecdote. You need the middle price across comparable sales, and a spreadsheet will not group them for you.
- **Do it again next quarter.** Every new release is another file to merge.

Most people open it once, scroll, and close it.

## How List.my reads the same data for you

List.my takes the same NAPIC transaction records and does that work in advance.

Right now that is **509,587 recorded subsale transactions across 37,228 Malaysian areas**, covering January 2021 to June 2026, free to browse. Here is what we do to the raw rows:

- **Sort them into a proper hierarchy.** State, district, mukim, area, then road — so you drill down to the taman instead of guessing at a mukim code. Start at [subsale transactions](/subsales).
- **Normalise the names.** The same taman is spelled several ways across releases. We merge them so one search finds all of it.
- **Convert and compute.** Square metres become square feet, and psf is worked out on both floor area and land area. We explain which size we use in [how List.my chooses transaction size](/learn/how-listmy-chooses-transaction-size).
- **Group property types.** A serviced apartment, a condominium and a flat are different markets, so we keep them apart rather than averaging them together.
- **Show the median, not the average.** The middle price is far harder to distort than the mean. Here is [why we use the median](/learn/why-median-not-average-property-price).
- **Track it over time.** [Quarterly updates](/quarterly) show volume and median movement by state, district and mukim.
- **Put it on a map.** The [price map](/tools/price-map) shades median prices by area and the [heat map](/tools/heat-map) shows where transactions are actually happening.
- **Give you a starting range.** The [property valuation tool](/tools/property-valuation) reads comparable transactions and returns an indicative range — a research aid, not a formal valuation.

Same source. Different amount of work for you.

## What NAPIC data cannot tell you

Be honest about the limits, because they affect how you use the numbers.

- **No condition or renovation.** Two identical units on the same floor can trade RM80,000 apart because one was renovated. The data cannot see that.
- **No view, no aspect, no noise.** Corner lot, facing the highway, west sun — none of it is recorded.
- **No individual address.** You get the scheme and the road, not the house number or unit number.
- **A lag.** A deal has to be transferred, stamped and processed before it appears. Expect the newest published quarter to be a few months old.
- **Unusual deals are still in there.** A transfer between family members, or a rushed sale, sits in the file looking like any other transaction. This is exactly why you read the pattern rather than one row.

For a loan application, an estate matter or anything binding, the transaction data is background reading. The valuation itself comes from a registered valuer or the bank's own process.

## NAPIC or List.my: which one do you need?

Go **straight to NAPIC** when you want the national or state-level picture — overhang figures, incoming supply, the house price index, or a report you can cite. Visit [the NAPIC portal](https://napic.jpph.gov.my/en/) for those.

Use **List.my** when you have a specific property in front of you and a price you are not sure about. That is a comparables question, and it needs search, filters and medians rather than a PDF.

Most buyers need the second one. Find the area, pull the recent sales for the same property type and a similar size, read a handful of them, and then decide whether the asking price makes sense. If you want the full method, read [how to check a property's market value in Malaysia](/learn/how-to-check-property-market-value-malaysia).

For anything that looks wrong in a record, tell us through the [contact form](/contact) — we check it against the source. More on that in [how to report a data correction](/learn/report-data-corrections).

# Why use median price instead of average price?
https://list.my/learn/why-median-not-average-property-price

## Outliers can distort the picture

List.my focuses on **median price** because property transactions are often uneven. A few unusually high or low deals can make a simple average look different from what most buyers and sellers are actually seeing in the market.

Median price is the middle recorded price after transactions are sorted from lowest to highest. If one premium bungalow, corner lot, or heavily renovated unit sells far above the rest, the median is less likely to be pulled away from the centre of the market.

For example, if five similar homes sold for **RM500k, RM520k, RM540k, RM560k, and RM900k**, the median is **RM540k**. The RM900k sale may be genuine, but it is not a good shortcut for understanding the typical transaction unless you know why it sold for so much more.

## Why this matters in property data

Property is not like a shelf of identical products. Prices can move because of **land size, floor area, renovation, view, tenure, frontage, lot position, urgency, and transaction timing**. Even within the same project or road, two records can describe properties that are similar on paper but very different in value.

A simple average treats every price as part of one blended number. That can be useful in some types of analysis, but for quick market reading it often gives too much influence to unusual transactions. Median gives a steadier benchmark because it asks a simpler question: **where is the middle of the recorded market?**

## How to use median price on List.my

Use median price to understand the **typical recorded transaction level** for an area, project, property type, or time period. It is most useful when the transaction group is reasonably similar, such as condos in the same project or terrace houses in the same neighbourhood.

## Still compare carefully

Median price is a **guide, not a valuation**. It becomes less useful when there are very few transactions, when different property types are mixed together, or when the records include very different sizes and conditions.

If you need the basic definition first, read [what is a property median price?](/learn/property-median-price). If you are judging one specific property, use the median as a starting point and then check the closest comparable transactions one by one.

# Stamp duty and MOT in Malaysia: how much does a property transfer cost?
https://list.my/learn/stamp-duty-mot-malaysia

## What the MOT is

When you buy a property, the sale is not final until ownership is legally moved into your name. The document that does this is the **Memorandum of Transfer**, or MOT (pindah milik), officially known as **Borang 14A**. It is lodged at the land office and registers you as the new owner on the title.

**Stamp duty** (duti setem) is the tax charged on that transfer. It is the single largest transfer cost most buyers pay, and it is separate from the purchase price, the legal fees, and the loan costs. When people ask about the kos pindah milik rumah, MOT stamp duty is usually the biggest line in that number.

The duty is charged on the **higher of** the price stated in the sale and purchase agreement or the market value assessed by the authorities. That distinction matters, and we come back to it below.

## Stamp duty rates

For Malaysian citizens and permanent residents, MOT stamp duty is **progressive**. Each tier of the property's value is taxed at its own rate.

| Property value          | Stamp duty rate |
| ----------------------- | --------------- |
| First RM100,000         | 1%              |
| RM100,001 – RM500,000   | 2%              |
| RM500,001 – RM1,000,000 | 3%              |
| Above RM1,000,000       | 4%              |

Because the rates are tiered, you do not pay a single flat percentage on the whole price. Here is how it works out for a **RM500,000 home**:

| Portion of price       | Rate | Duty        |
| ---------------------- | ---- | ----------- |
| First RM100,000        | 1%   | RM1,000     |
| Next RM400,000         | 2%   | RM8,000     |
| **Total on RM500,000** |      | **RM9,000** |

So a RM500,000 property carries **RM9,000** in MOT stamp duty at the standard rates.

## First-time buyer exemption

If this is your **first home**, you may not pay the RM9,000 at all.

First-time Malaysian buyers can claim a **full stamp duty exemption** on both the MOT and the loan agreement for a first residential property priced up to **RM500,000**. Budget 2026 extended this exemption until **31 December 2027**.

A few points worth knowing:

- The exemption is for **Malaysian citizens** only.
- It applies to your **first residential property**, so it is not available if you already own a home.
- The RM500,000 cap is on the property price. Above that, the standard tiered rates apply.

This is one of the larger savings a first-time buyer can get, so it is worth confirming with your lawyer whether your purchase qualifies before you complete.

## Loan agreement stamp duty

There is a second stamp duty that is easy to forget: the one on your **loan agreement**.

If you take a housing loan, the loan agreement is also stamped, at a **flat 0.5% of the loan amount**. On a RM400,000 loan, that is **RM2,000**. It is charged separately from the MOT duty, so a buyer who budgets only for the transfer duty can be caught short.

If you qualify for the first-time buyer exemption above, this loan agreement duty is exempted too, for a first home up to RM500,000.

## Foreign buyers

The rates above are for citizens and permanent residents. **Non-citizen foreign buyers** are treated differently.

From **1 January 2026**, foreign buyers (excluding PRs) pay a **flat 8%** stamp duty on the MOT. This replaced the progressive tiers for this group. On a RM1,000,000 property, that is RM80,000 in MOT stamp duty, considerably more than a citizen would pay on the same property.

## Why the property's market value matters

Remember that stamp duty is charged on the **higher of** the price in your SPA or the **market value** assessed by the authorities (LHDN and the valuation department, JPPH).

This means a low price on paper does not always lower your duty. If the assessed market value is higher than your agreed price, the duty is calculated on the higher figure. This is why the valuation matters, and why it helps to have a sense of what similar properties actually sold for.

Checking **recent transacted prices** for comparable properties is a practical way to sanity-check an assessment. If nearby homes of a similar type and size transacted around your price, the assessed value should be in a similar range. You can browse recorded transactions on [List.my subsales](/subsales), and if you want to go deeper on estimating a property's worth, read [how to check property market value in Malaysia](/learn/how-to-check-property-market-value-malaysia).

## Before you rely on any of this

List.my shows recorded property transaction data, which is useful for checking whether a price and its likely stamp duty are in a sensible range. It is **not** tax or legal advice.

Stamp duty rates, exemptions, and the treatment of first-time and foreign buyers are set by policy and change with each Budget announcement. Confirm the specifics of your own transfer with your lawyer, who handles the MOT and the stamping, and check the current rules with the authorities (such as [LHDN](https://www.hasil.gov.my)) before you commit to a number.

# RPGT in Malaysia: the tax you pay when you sell property
https://list.my/learn/rpgt-malaysia-guide

## What RPGT is

**RPGT** (Real Property Gains Tax, or _cukai keuntungan harta tanah_) is the tax you pay when you sell or otherwise dispose of a property in Malaysia at a profit.

The important point is that RPGT is charged on the **gain**, not on the sale price. If you buy a property and later sell it for more than it cost you, the profit is what gets taxed. Sell at no gain, and there is no RPGT to pay.

This is the main tax that affects sellers in the Malaysian property market, so it is worth understanding before you decide when and whether to sell.

## RPGT rates by holding period

The rate depends on how long you held the property and on who you are. The year count starts from the **acquisition date**, which is usually the date of the sale and purchase agreement (SPA).

| Holding period | Citizens & PRs | Companies | Foreigners |
| -------------- | -------------- | --------- | ---------- |
| Year 1 to 3    | 30%            | 30%       | 30%        |
| Year 4         | 20%            | 20%       | 30%        |
| Year 5         | 15%            | 15%       | 30%        |
| Year 6 onwards | 0%             | 10%       | 10%        |

The pattern for **Malaysian citizens and permanent residents** is that the tax is highest in the early years and falls to zero once you have held the property for more than five years. Companies incorporated in Malaysia follow the same early schedule but never reach zero. Foreigners pay a flat 30% for the first five years.

## What counts as the gain

The **chargeable gain** is the disposal price minus the acquisition price. Allowable costs then reduce that gain, which lowers the tax. These costs include stamp duty paid, legal fees, agent or brokerage fees, and renovation or enhancement costs. Keep your receipts, because you need proof to claim them.

Here is a simple illustration for a Malaysian citizen. **The figures are an example only.**

- Bought at RM400,000
- Sold at RM550,000
- Gross gain: RM150,000

Now subtract allowable costs:

- Legal fees, stamp duty, and agent commission: RM20,000
- Documented renovations: RM10,000
- Net chargeable gain: RM120,000

Next apply the automatic waiver, which is RM10,000 or 10% of the gain, whichever is **higher**. Here 10% of RM120,000 is RM12,000, which beats RM10,000, so RM12,000 is exempt.

- Taxable gain after waiver: RM108,000

Finally apply the rate for the holding year. If the property was sold in year 4, the rate is 20%.

- RPGT payable: RM108,000 × 20% = RM21,600

Change the holding year and the outcome changes a lot. The same gain sold in year 6 or later would be taxed at 0%.

## Exemptions that matter

A few exemptions can make a real difference:

- **Automatic waiver.** For citizens, RM10,000 or 10% of the chargeable gain, whichever is higher, is exempt on every disposal.
- **Once-in-a-lifetime exemption.** A citizen can claim a full exemption on the disposal of one private residential property. You can only use this once, so it is worth saving for a disposal where the gain is large.
- **Transfers by love and affection.** Transfers between spouses, parent and child, or grandparent and grandchild are treated as **no-gain-no-loss** disposals, so no RPGT arises at the point of transfer.

## Self-assessment since 2025

Since **1 January 2025**, RPGT operates under **self-assessment**. This means the seller is responsible for computing the gain and filing their own CKHT forms, rather than waiting for an assessment to be issued.

In practice this puts more weight on keeping good records. Hold on to your SPA, receipts for legal fees, stamp duty, agent commission, and renovation invoices, so your computation stands up if it is ever reviewed.

## Timing your sale

For citizens, the gap between selling in **year 5 (15%)** and **year 6 (0%)** is significant. On a large gain, waiting a little longer can save a meaningful amount of tax, though you also have to weigh holding costs and where the market is heading.

Checking recent transacted prices helps you judge whether waiting is worth it. Browse completed deals for similar properties at [/subsales](/subsales) to see what buyers and sellers have actually agreed to, and read [how to check property market value](/learn/how-to-check-property-market-value-malaysia) for a practical way to estimate where your property sits today.

## A note before you file

List.my provides **market data** to help you understand pricing and time a sale. It does not provide tax advice. RPGT rules involve conditions and exceptions that depend on your circumstances, and the rates can change with each Budget.

Confirm any RPGT computation with a **tax professional or lawyer** before you file. Treat this guide as a plain-English overview, not as tax or legal advice.

# Floor area vs land area: what is the difference?
https://list.my/learn/floor-area-vs-land-area

## The short answer

**Floor area** is the recorded built or unit size. **Land area** is the recorded lot or parcel size.

Both can appear on the same transaction because they answer different questions. **Floor PSF** divides the transaction price by the recorded floor area, while **land PSF** divides the same price by the recorded land area. You should compare floor PSF with floor PSF, and land PSF with land PSF.

If a transaction table shows one Size column, List.my uses an [effective size](/learn/how-listmy-chooses-transaction-size) to decide which recorded area should be used for comparison. This is needed because some property types are mainly recorded with **floor area**, while others are mainly recorded with **land or parcel area**. Using one effective size makes the table easier to filter, sort, and compare without mixing two different size bases in the same column. The transaction detail page can still show both floor area and land area when both fields are available.

## When floor area is useful

Floor area is usually the better starting point for strata and unit-based properties, such as apartments, flats, SOHO units, offices, and shop units. It reflects the recorded space of the unit or built area, which is the size most buyers and renters think about when comparing similar units.

It can also matter for some multi-storey landed, shop, factory, or commercial properties where the building itself carries much of the value. For example, two shoplots on similar roads may have similar land sizes, but one may have more usable built space across floors.

## When land area matters

Land area matters most when the lot itself is an important part of the property value. This is common for landed homes, detached houses, factories, warehouses, and other properties where frontage, shape, access, and land scarcity can affect how people compare transactions.

A two-storey terrace house can have a land area that is smaller than its built-up area, while a detached house can have a large land area even if the building is modest. In both cases, the two area fields are not competing measurements. They describe different parts of the same property.

## Why the PSF can be different

The same transaction price can produce two different PSF figures because the denominator changes. If the recorded floor area is larger than the land area, the floor PSF will usually look lower. If the recorded land area is larger than the floor area, the land PSF will usually look lower.

That does not mean one figure is wrong. It means you need to choose the PSF basis that matches the property type and the comparison you are trying to make.

## How big is a 1,000 sqft condo?

Sizes in listings and transaction records are easier to judge with some reference points. These are common ranges in Malaysian projects, not rules — layouts vary by project and era.

| Recorded size      | What it commonly is                                    |
| ------------------ | ------------------------------------------------------ |
| 450 – 650 sqft     | Studio or one-bedroom unit                             |
| 700 – 900 sqft     | Compact two- or three-bedroom unit                     |
| 1,000 – 1,200 sqft | Standard three-bedroom family unit                     |
| 1,400 sqft +       | Large three- or four-bedroom unit, dual-key, or duplex |

For landed homes, a common intermediate terrace lot is around **20 × 70 feet**, which is 1,400 sqft of land area — while its built-up floor area across two storeys can be larger than the lot itself.

These reference points also explain why size filters matter. An 800 sqft unit and a 1,500 sqft unit in the same project serve different buyers and trade at different PSF levels, so when you browse [recorded transactions](/subsales), narrow to the size band you actually want before comparing prices.

## How to compare transactions

Start with the same area basis, then narrow the comparison by **location, property type, transaction date, and size** where possible. A condo unit should usually be compared against similar unit sizes in the same project or nearby projects, while a landed house may need closer attention to land size, frontage, renovation, and whether it is intermediate, end lot, corner, or detached.

List.my may group area transactions by **similar effective size** because PSF is easier to compare within the same size range. Smaller properties often show a higher PSF than larger properties, so avoid comparing very different sizes too casually. See [how List.my chooses transaction size](/learn/how-listmy-chooses-transaction-size) for more detail.

# How List.my chooses the Size column in transaction tables
https://list.my/learn/how-listmy-chooses-transaction-size

## The short answer

The **Size** column on List.my area pages is an **effective size**. It is the area field List.my chooses for filtering, sorting, grouping, and PSF comparison.

It may refer to **floor area**, **land or parcel area**, or **recorded unit size**, depending on the property type. This is necessary because Malaysian transaction records are not recorded the same way for every type of property. Some records mainly have floor area, some mainly have land or parcel area, and some unit-based properties store the unit size in the same source field that is also used for land or parcel area.

The individual transaction detail page can still show both floor area and land area when both fields are available. The table uses one Size column so you can scan, filter, and compare records more consistently.

## Which area does each property type use?

This is the current List.my mapping for the Size column.

| Property type | Size column uses |
| --- | --- |
| Condominium/Apartment | Recorded unit size |
| Service Apartment | Recorded unit size |
| Flat | Recorded unit size |
| Low-Cost Flat | Recorded unit size |
| SOHO/SOFO/SOVO | Recorded unit size |
| Town House | Recorded unit size |
| Shop Unit/Retail Lot | Recorded unit size |
| Office Lot | Recorded unit size |
| Detached | Land or parcel area |
| Cluster House | Land or parcel area |
| Low-Cost House | Land or parcel area |
| 1 - 1 1/2 Storey Terraced | Land or parcel area |
| 1 - 1 1/2 Storey Semi-Detached | Land or parcel area |
| 2 - 2 1/2 Storey Semi-Detached | Land or parcel area |
| Detached Factory/Warehouse | Land or parcel area |
| Semi-Detached Factory/Warehouse | Land or parcel area |
| Industrial Unit | Land or parcel area |
| 2 - 2 1/2 Storey Terraced | Floor area |
| 1 - 1 1/2 Storey Shop | Floor area |
| 2 - 2 1/2 Storey Shop | Floor area |
| 3 - 3 1/2 Storey Shop | Floor area |
| 4 - 4 1/2 Storey Shop | Floor area |
| 5 - 5 1/2 Storey Shop | Floor area |
| 6 - 6 1/2 Storey Shop | Floor area |
| Terraced Factory/Warehouse | Floor area |

## Why some unit sizes use the land or parcel field

For properties such as apartments, flats, SOHO units, shop units, and office lots, the Size column is meant to represent the **unit area**. In List.my's data, that unit area may be stored in the land or parcel area field, but it should not be read as a literal land parcel for these property types.

| Example property type | Where the value may come from in List.my data | How to read the Size column |
| --- | --- | --- |
| Condominium/Apartment | Land or parcel area field | The size of the unit |
| Flat or Low-Cost Flat | Land or parcel area field | The size of the unit |
| SOHO/SOFO/SOVO | Land or parcel area field | The size of the unit |
| Shop Unit/Retail Lot | Land or parcel area field | The size of the unit |
| Office Lot | Land or parcel area field | The size of the unit |
| Terrace house or detached house | Land or parcel area field | The size of the land parcel, unless the property type uses floor area |

This means an apartment showing 900 sqft in the Size column should usually be read as a 900 sqft unit, not as a 900 sqft land parcel.

## Why this helps PSF comparison

PSF is only useful when the size basis is comparable. A landed house compared by land area and a shoplot compared by floor area are answering different questions, so List.my chooses the basis that usually fits the property type.

Area pages may also group transactions by similar effective size. This helps because smaller properties often show a higher PSF than larger properties in the same project, road, or area. Use the Size column as a starting point, then still compare similar records by location, type, date, tenure, condition, and any available floor or land details.

## What to check on the transaction page

The Size column is designed for browsing and comparison, not as a guarantee of the property's exact measurement. Some records may have missing fields, inconsistent naming, older source formats, or imperfect normalisation.

If the difference matters, open the individual transaction page and check whether floor area, land or parcel area, or both are shown. You can also read [floor area vs land area](/learn/floor-area-vs-land-area) for the difference between the two measurements.

# How List.my calculates a valuation estimate
https://list.my/learn/how-the-valuation-estimate-works

## No black box

This guide sets out exactly how the [free valuation tool](/tools/property-valuation) turns recorded transactions into an estimated market value. It covers every step, the formulas, and the thresholds we actually use.

The estimate is a starting reference, not a formal valuation. Nobody inspects the property, and the figure carries none of the condition and renovation detail a valuer records on site. For anything binding — a sale, a refinance, a legal filing — you need a licensed valuer.

## Step 1: Pull comparable transactions

We query JPPH subsale records that match your selection:

- Exact match on state, district, mukim and area. A township or postcode search resolves to a list of areas instead.
- Exact match on property type. "Condo" maps to Condominium and Apartment; "terrace" covers single, one-and-a-half, double and two-and-a-half storey terrace houses, including low-cost.
- Transactions from the last 3 years only.
- Progressive size tolerance. We try within 30% of your built-up area first, widen to 50%, then drop the size filter — whichever first yields at least 3 comparables.
- Capped at the 50 most recent transactions. Three is the minimum; one or two puts the tool into rough-estimate mode.

## Step 2: Strip the outliers

Developer bulk transfers and anomalous sales get removed in two phases.

**Batch cap.** Where the same date and area carry more than 5 transactions, we keep only the 5 highest-priced. Bulk sale and purchase agreements from developers often cluster on one date in one area, and they drag the median down.

**Interquartile range filter on psf.** We work out price per square foot for each transaction, sort them, then:

```
Q1  = 25th percentile
Q3  = 75th percentile
IQR = Q3 − Q1

keep if  Q1 − 1.5 × IQR  ≤  psf  ≤  Q3 + 1.5 × IQR
```

You can switch this off by adding `?outliers=0` to a valuation URL.

## Step 3: Weight each sale by how recent it is

Newer sales tell you more about today's market, so each comparable gets an exponential decay weight:

```
weight = e^(−0.05 × age_months)
```

| Age    | 1 month | 6 months | 12 months | 24 months | 36 months |
| ------ | ------- | -------- | --------- | --------- | --------- |
| Weight | 0.95    | 0.74     | 0.55      | 0.30      | 0.17      |

Add `?recency=0` to a valuation URL for a plain unweighted median instead.

## Step 4: Take the weighted median psf

We use the median, never the average — a single luxury sale wrecks an average. The weighted median sorts the psf values by size, walks the cumulative weight, and picks the value where that cumulative weight crosses half the total.

```
psf(i) = price(i) ÷ effective_area_sqft(i)

weighted_median_psf = psf(k)  where  Σ weight(1..k)  ≥  ½ Σ weight(all)
```

## Step 5: Multiply by your built-up area

```
base_price = weighted_median_psf × your_size_sqft
```

Why work from psf? Location and property type are already fixed by the comparable filter in step 1, so scaling by psf adjusts for your specific unit without counting either factor twice.

## Step 6: Apply four adjustments

These are applied multiplicatively.

**a. Tenure.** Freehold commands roughly a 10% premium over leasehold. Some of that premium already sits inside the comparables, so we apply only the gap:

```
freehold_ratio    = freehold_comps ÷ total_comps
user_premium      = 0.10 if freehold, else 0
implicit_premium  = freehold_ratio × 0.10
tenure_mult       = 1 + (user_premium − implicit_premium)
```

**b. Floor level (high-rise only).** We split the comparables that carry floor data into a lower and an upper half, measure the psf gap between them, and extrapolate to your floor against the median floor. Capped at 2% per floor either way. Where fewer than 10 comparables carry floor data, we fall back to 0.5% per floor above or below the median.

```
premium_per_floor = (upper_psf ÷ lower_psf − 1) ÷ floor_span
floor_mult        = 1 + (your_floor − median_floor) × premium_per_floor
```

**c. Market sentiment**, capped at 15%. We compare the average price of the 10 most recent comparables against the 10 older ones behind them.

```
momentum      = (recent10_avg − older10_avg) ÷ older10_avg
sentiment     = clamp(0.5 + momentum, 0.1, 0.9)
sentiment_adj = (sentiment − 0.5) × 0.15 × price
```

**d. Market trend**, capped at 10%. An ordinary least squares regression on price against the ordinal index of the comparables, normalised to the average price.

```
slope     = (nΣxy − ΣxΣy) ÷ (nΣx² − (Σx)²)
trend     = slope ÷ avg_price
trend_adj = trend × 0.10 × price
```

Putting it together:

```
estimate = base_price × tenure_mult × floor_mult + sentiment_adj + trend_adj
```

## Step 7: Build the range

We use 15% of the standard deviation of the comparable prices as a one-sigma proxy:

```
σ      = stdev(comparable_prices)
margin = 0.15 × σ
low    = max(0, estimate − margin)
high   = estimate + margin
```

## Step 8: Score the confidence

Confidence starts at 0.5, then moves on four signals:

| Signal                              | Contribution                 |
| ----------------------------------- | ---------------------------- |
| Comparable count                    | + min(0.4, count ÷ 50 × 0.4) |
| Share under 6 months old            | + (recent ÷ total) × 0.2     |
| Price consistency (low variation)   | + max(0, 0.2 − σ ÷ μ)        |
| Sane location premium (0.5 to 2.0×) | + 0.1                        |

```
confidence = clamp(sum, 0.10, 0.95)
```

The labels you see on the result: 0.8 and above is High, 0.6 and above is Medium, 0.4 and above is Moderate, and below 0.4 is Low.

## What the estimate does not know

We do not account for the condition of the unit or its renovation, the view, the specific tower or stack in a condominium, the shape or frontage of an individual lot, or any market shock after the JPPH data was published.

The `effective_area_sqft` value in our dataset is JPPH's best-available area figure — built-up area for most stratified properties, land area for landed. See [how List.my chooses which size to use](/learn/how-listmy-chooses-transaction-size).

For anything binding — a sale, a refinance, a legal filing — use a licensed valuer.

## Related reading

- [Where our transaction data comes from](/learn/where-transaction-data-comes-from)
- [How to check a property's market value in Malaysia](/learn/how-to-check-property-market-value-malaysia)
- [Why we use the median, not the average](/learn/why-median-not-average-property-price)

# Where does List.my get transaction data?
https://list.my/learn/where-transaction-data-comes-from

## The data comes from JPPH

List.my's transaction records come from the **Valuation and Property Services Department**, known in Malay as **Jabatan Penilaian Dan Perkhidmatan Harta (JPPH)**.

JPPH is part of the Malaysian government, so these are **official Malaysian property transaction records** rather than asking prices, agent estimates, or listing advertisements. This is why List.my treats transaction data as the strongest starting point when you want to understand what properties actually sold for.

## How to report a correction

If a location, road, property type, size, or other detail looks wrong, please tell us through the [List.my contact form](/contact). Include the transaction URL and the detail that needs review so we can check it against the source and improve the dataset where appropriate.

# How do I report mistakes or corrections?
https://list.my/learn/report-data-corrections

## What to send

If you see a transaction, location, road name, property type, or other detail that looks wrong, please tell us through the [List.my contact form](/contact). Corrections are easier to review when the message points us to the exact record and explains what looks incorrect.

For a transaction correction, include the **transaction URL**, the field that looks wrong, what you believe it should be, and any supporting context. If the issue is about a location, include the **state, district, mukim, area, and road** where possible.

## What helps us review faster

A short, specific message is usually better than a broad note such as “this area is wrong”. For example, tell us that a road appears under the wrong area, a project name has a spelling issue, a property type looks mismatched, or a size field seems inconsistent with the property shown.

If you have a reliable reference, such as a developer brochure, official address wording, project website, title detail, or other public source, include that context in your message. Please do not send private documents unless you are comfortable sharing them for review.

## How corrections are handled

List.my reviews correction requests before changing the product because transaction data can affect area pages, market summaries, filters, and comparisons. Some issues can be corrected directly, while others may need to remain as recorded if the underlying source data cannot be confidently changed.

The fastest way to inform us is still the [contact form](/contact). Include enough detail for us to find the record and understand the correction you are suggesting.
