PropertyGuru MY $1๐ฐ Search By URLs and Keywords
Pricing
from $1.00 / 1,000 results
PropertyGuru MY $1๐ฐ Search By URLs and Keywords
From $1/1K. Fast, reliable scraper for propertyguru.com.my. Extract sale and rent listings with 30+ structured fields including price (MYR), built-up area, tenure, nearby transit, agent details, and GPS coordinates.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
10
Total users
3
Monthly active users
3 days ago
Last modified
Categories
Share
PropertyGuru Malaysia Scraper
Fast, reliable scraper for propertyguru.com.my - Malaysia's largest property portal. Extract sale and rent listings with 30+ structured fields including price (MYR), built-up area, tenure, nearby transit, agent details, and GPS coordinates.
Features
- High throughput - 20 listings per page, ~60 listings/min with pagination
- Sale & Rent listings with full filter support
- Property types: Condo / Apartment, Landed (terrace houses), Commercial (shop / office / factory), Residential Land
- 30+ data fields per listing including price, PSF, features, transit distance, agent info
- Coordinate enrichment via detail-page extraction (lat/lng)
- Robust - handles site protection automatically
- State-aware - dropdown for all 13 states + 3 federal territories, plus free-text fallback for towns/neighbourhoods
Quick Start
All properties for sale in Kuala Lumpur
{"mode": "search","listing_type": "sale","state": "kuala-lumpur","max_pages": 5}
Condos for rent in Mont Kiara
{"mode": "search","listing_type": "rent","property_type": "condo","search": "Mont Kiara"}
Landed houses in Selangor under MYR 1,500,000
{"mode": "search","listing_type": "sale","property_type": "landed","state": "selangor","bedrooms": 4,"max_price": 1500000}
Commercial properties in Penang
{"mode": "search","listing_type": "sale","property_type": "commercial","state": "penang"}
Custom URL mode
{"mode": "url","urls": ["https://www.propertyguru.com.my/condo-for-sale?freetext=Bangsar&bedrooms=3"],"max_pages": 10}
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (build URL from filters) or url (use provided URLs) |
urls | array | - | URLs to scrape (url mode only) |
listing_type | string | sale | sale or rent |
property_type | string | - | condo, landed, commercial, or land |
state | string | - | Malaysian state slug (see table below). Pick this OR search, not both. |
search | string | - | Free-text location (e.g. "Mont Kiara", "Bangsar", "Cyberjaya") |
min_price | integer | - | Minimum price in MYR |
max_price | integer | - | Maximum price in MYR |
bedrooms | integer | - | Number of bedrooms (0=Studio) |
sort | string | date | Sort by date, price, or psf |
sort_order | string | desc | asc or desc |
max_properties | integer | 10 | Max properties to scrape (0=unlimited) |
max_pages | integer | 20 | Max search result pages (20 listings/page) |
enable_detail_pages | boolean | true | Fetch detail pages for richer fields (coords, description, facilities, schools) |
proxy | object | Apify Residential MY | Proxy configuration |
resumeFromRunId | string | - | Continue one interrupted run/dataset without re-collecting or re-charging listings already in it |
incrementalMode | boolean | false | Track this same search/URL setup run-to-run and only return NEW/UPDATED/REAPPEARED listings |
stateKey | string | - | Name an incremental-mode monitoring campaign (auto-derived from the search/filter/URL setup if left empty) |
emitUnchanged | boolean | false | Incremental mode: also return (and bill) listings unchanged since the last run |
emitExpired | boolean | false | Incremental mode: also return (and bill) listings no longer found, once a run fully scans the tracked search |
Note:
stateandsearchare mutually exclusive. If both are set,searchwins.property_typefilters via URL path; all other filters go in the query string and can be freely combined.
Resume & recurring updates
Two distinct workflows, both under the Resume & recurring updates input section:
- Resume (
resumeFromRunId) continues one specific interrupted crawl. Paste the run or dataset ID from the earlier run; this run skips every listing id already collected there instead of re-scraping and re-billing it. - Incremental mode (
incrementalMode) is for scheduling the same search/URL setup repeatedly (e.g. daily). The actor remembers what it saw last time (keyed by mode + search/state/listing_type/property_type/bedrooms/min_price/max_price/sort/sort_order/URLs, or your ownstateKey) and classifies every listing asNEW,UPDATED,UNCHANGED,REAPPEARED, orEXPIRED. OnlyNEW/UPDATED/REAPPEAREDare returned by default โ turn onemitUnchangedoremitExpiredif you also want those rows (both cost extra, billed dataset items).EXPIREDrows are only produced when a run reaches the natural end of the tracked search (not truncated bymax_properties/max_pages, a blocked page, orresumeFromRunId) โ otherwise the previous state for those listings is kept as-is and noEXPIREDrows are emitted that run. - Incremental-mode output rows add
changeType,changedFields,firstSeenAt, andlastSeenAt. These fields only appear whenincrementalModeis on; a normal run's output shape is unchanged.
Malaysian States & Federal Territories
| Slug | Name | Slug | Name |
|---|---|---|---|
kuala-lumpur | Kuala Lumpur (FT) | terengganu | Terengganu |
selangor | Selangor | kelantan | Kelantan |
penang | Penang (Pulau Pinang) | perlis | Perlis |
johor | Johor | melaka | Melaka (Malacca) |
perak | Perak | sabah | Sabah |
kedah | Kedah | sarawak | Sarawak |
pahang | Pahang | putrajaya | Putrajaya (FT) |
negeri-sembilan | Negeri Sembilan | labuan | Labuan (FT) |
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape โ the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record โ not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify โ Settings โ Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Output Fields
Each listing record contains 30+ fields:
| Category | Fields |
|---|---|
| Identity | id, title, address, url, status |
| Price | price, price_formatted, currency (MYR), price_psf |
| Features | bedrooms, bathrooms, floor_area, land_area, tenure |
| Property | property_type, property_type_group, badges |
| Location | state, region, city, nearby_mrt |
| Coordinates | latitude, longitude, location_source |
| Agent | agent_name, agent_id, agent_license, agency_name |
| Developer | developer, is_developer_listing |
| Media | images[], image_count |
| Dates | posted_date, posted_unix, recency |
Detail-page enrichment (when enable_detail_pages=true) adds: description, headline, latitude/longitude, project_name, total_units, tenure_detail, furnishing, floor_plans[], virtual_tour_url, nearby_schools[], agent_mobile, reference_number, and more.