Data Sources & Methodology
Transparency on data provenance, update cadence, and analytical methodology
Current Status:
This platform currently operates on scraped listing data and parsed NAPIC public reports.
Official NAPIC/KPKT live API integration is integration-ready — schema and ingest contracts are in place, pending formalisation of the institutional data partnership.
Data Sources
| Source | Data Type | Update Frequency | Last Updated | Record Count | Status |
|---|---|---|---|---|---|
| PropertyGuru | Listing price, PSF, unit type, days on market | Daily | — | — | Live |
| iProperty | Listing price, PSF, property type, location | Daily | — | — | Live |
| EdgeProp | Developer news, new launches, project announcements | 3× / week | — | — | Live |
| NAPIC Public Reports | Historical transaction prices, volume, overhang data | Monthly (PDF) | 2025-Q3 | — | Partial |
| Google Trends | Search interest for township / area keywords | Weekly | — | — | Live |
| NAPIC API (official) | Transaction registry — full national coverage | Real-time (pending) | — | — | Integration-Ready |
| KPKT | Development approval data | Real-time (pending) | — | — | Integration-Ready |
| JPPH | Valuation benchmarks | Real-time (pending) | — | — | Integration-Ready |
| REHDA | Developer supply pipeline data | Monthly (pending) | — | — | Integration-Ready |
Demand Score Methodology
The Demand Score is a composite 0–100 index computed nightly. It aggregates four market signals
into a single, readable indicator of demand intensity for each district and property type.
A score above 70 signals strong demand conditions; below 35 indicates weak or oversupplied conditions.
demand_score = (
absorption_rate_score × 0.40
trends_score × 0.30
price_momentum_score × 0.20
supply_tightness_score × 0.10
)
Where:
absorption_rate_score = normalise(absorption_rate, 0%, 20%) → 0–100
trends_score = Google Trends value for area keywords (already 0–100)
price_momentum_score = normalise(price_trend_30d, −5%, +10%) → 0–100
supply_tightness_score = 100 − normalise(active_listings, 0, max_listings_in_dataset) → 0–100
normalise(v, min, max) = clamp((v − min) / (max − min) × 100, 0, 100)
Absorption rate is the primary driver (40% weight) — it measures the fraction of active inventory
that is delisted each month (proxy for sold / leased). An absorption rate of 8% per month is considered healthy for
the Malaysian market; above 12% indicates rapid take-up.
Google Trends (30% weight) serves as a leading indicator — search interest consistently leads physical transactions by 4–8 weeks in Malaysian property markets.
Price momentum (20%) uses the 30-day change in average asking PSF to capture sentiment drift.
Supply tightness (10%) is inversely proportional to active listing count relative to the maximum observed across all districts — a high count indicates oversupply risk.
Google Trends (30% weight) serves as a leading indicator — search interest consistently leads physical transactions by 4–8 weeks in Malaysian property markets.
Price momentum (20%) uses the 30-day change in average asking PSF to capture sentiment drift.
Supply tightness (10%) is inversely proportional to active listing count relative to the maximum observed across all districts — a high count indicates oversupply risk.
PSF Calculation
Price per square foot (PSF) is calculated as
asking_price / floor_area_sf where floor area is in square feet.
All figures are in Malaysian Ringgit (MYR). Asking PSF from listings is distinct from transaction PSF from NAPIC data;
both are shown where available. The spread between asking and transaction PSF is a useful negotiation signal.
Geographic Coverage
The MVP covers two primary corridors. Additional corridors can be added by extending the scraper
configuration and seeding the relevant area data.
Johor (Iskandar Malaysia): Johor Bahru, Iskandar Puteri, Skudai, Kulai, Pasir Gudang
Klang Valley: Petaling Jaya, Subang Jaya, Cheras, Puchong, Shah Alam
Johor (Iskandar Malaysia): Johor Bahru, Iskandar Puteri, Skudai, Kulai, Pasir Gudang
Klang Valley: Petaling Jaya, Subang Jaya, Cheras, Puchong, Shah Alam