PropertyGuru SG & MY Listings Scraper
Pricing
from $5.00 / 1,000 listing scrapeds
PropertyGuru SG & MY Listings Scraper
Scrape public PropertyGuru Singapore and Malaysia sale/rent listings from search or listing URLs. Returns price, type, beds/baths when enriched, area, tenure, GPS, amenities, and agent. MCP-ready.
Pricing
from $5.00 / 1,000 listing scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
This Apify Actor helps proptech teams, agencies, investors, and AI agents collect public residential listings from PropertyGuru Singapore and PropertyGuru Malaysia. Paste a search URL, a listing URL, or build a search with market, sale/rent, location, and filters. Each dataset row is one listing with price, currency, property type, images, and optional enriched beds, baths, floor area, tenure, GPS, amenities, and agent fields. The Actor runs over HTTP (JSON-LD), works through Apify API/MCP, and uses Pay per event plus platform usage.
Best fit and connected workflows
Use this Actor when your workflow is centered on SG or MY residential PropertyGuru inventory:
- Singapore condo/HDB/landed for-sale comps from search pages or listing URLs
- Singapore for-rent discovery with price and property type from search cards
- Malaysia residential sale or rent pulls from PropertyGuru Malaysia
- Detail enrichment when you need beds, baths, floor area, tenure, GPS, amenities, and agent
- MCP/API batch jobs that need honest COMPLETE / VALID_EMPTY / INVALID_INPUT outcomes
Connect the workflow
- For UK BUY/RENT/SOLD and agent branches, start with Rightmove All-in-One Scraper when your market is the UK, then return here for SEA PropertyGuru listings.
- For US property cards, continue with Zillow All-in-One Scraper after you finish SG/MY comps when you also need Zillow listings.
PropertyGuru SG & MY Listings Scraper is designed as a focused standalone workflow for SEA residential public listings (CommercialGuru, DDProperty Thailand, and login-gated CRM data sit outside this contract).
Practical scenario
Priya is pricing a 3-bed condo brief in Singapore. She keeps the prefill SG condo search, sets maxResults to 20, and leaves enrichDetails off for a fast discovery pass. The dataset returns listingId, listingUrl, title, price, currency, propertyType, and imageUrls. She shortlists five URLs, then re-runs those listing URLs with enrichDetails: true to add bedrooms, bathrooms, floor area, tenure, GPS, and the listing agent before sending the pack to her client.
Input
Use the Input tab. Supply startUrls and/or build a search with market + listingType (and optional filters).
| Field | Purpose |
|---|---|
market | SG or MY when building a search URL |
listingType | sale or rent for built searches |
startUrls | PropertyGuru search or listing URLs (SG or MY) |
searchLocation | Optional free-text location for built searches |
propertyType | all, condo, hdb, or landed |
minPrice / maxPrice / bedrooms | Optional filters for built searches |
maxResults | Hard cap on validated listings returned and billed |
maxPages | Search pagination cap (?page=N) |
enrichDetails | Fetch each listing detail page for richer fields |
proxyConfiguration | Apify proxy; Unblocker or Residential SG/MY recommended |
Valid focused JSON example:
{"market": "SG","listingType": "sale","startUrls": ["https://www.propertyguru.com.sg/property-for-sale?market=residential&property_type=N"],"maxResults": 5,"maxPages": 1,"enrichDetails": false,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["UNBLOCKER"]}}
Output
One dataset row per listing. Download JSON, CSV, HTML, or Excel from the run dataset.
| Field | Meaning |
|---|---|
listingId / listingUrl | Stable ID and canonical PropertyGuru URL |
market / listingType / propertyType | SG or MY, sale/rent, condo/HDB/landed |
title / price / currency / pricePerArea | Asking price and derived PSF when area is known |
bedrooms / bathrooms / floorArea / tenure | Present when detail enrichment runs |
locality / region / latitude / longitude | Location + GPS when enriched |
agentName / agencyName | Public agent fields when enriched |
amenities / imageUrls | Public amenities and photo URLs |
sourceUrl / sourceFetchedAt | Provenance of the fetch |
Illustrative search-card JSON:
{"listingId": "500237065","listingUrl": "https://www.propertyguru.com.sg/listing/for-sale-the-sail-marina-bay-500237065","market": "SG","title": "The Sail @ Marina Bay","listingType": "sale","propertyType": "Condominium","price": 2750000,"currency": "SGD","imageUrls": ["https://sg1-cdn.pgimgs.com/listing/500237065/UPHO.161141806.V550/example.jpg"],"enriched": false,"sourceUrl": "https://www.propertyguru.com.sg/property-for-sale?market=residential","sourceFetchedAt": "2026-09-22T09:51:01.377Z"}
How it works
The Actor classifies each start URL as search or detail, then parses PropertyGuru schema.org JSON-LD (ItemList on search pages; Apartment / Offer / RealEstateAgent on detail pages). Prefer ?market=residential style search URLs. Malaysia listing paths use /property-listing/... (and project cards may use #listingId). When Residential returns HTTP 403 or an empty parse, the Actor retries once with Apify Unblocker. Every run writes OUTPUT and RUN_SUMMARY with an honest outcome.
Pricing
This Actor uses Apify Pay per event plus standard platform usage (compute, proxy, storage). Charged events:
- Actor start —
$0.00005 - Listing scraped —
$0.005(primary; one per validated listing row) - Listing detail enriched —
$0.008(whenenrichDetailsmerges a detail page)
Open the live Pricing tab in Apify Console for current event prices. Example: five search listings charge the start event once and listing-scraped five times (about $0.025 in listing events), plus usage.
Use with AI agents (MCP)
Exact Actor identity: khadinakbar/propertyguru-all-in-one-scraper
Tool description: scrapes public PropertyGuru SG/MY residential search or listing URLs into structured listing rows with optional detail enrichment for beds, baths, area, tenure, GPS, and agent.
Scrape PropertyGuru Singapore condo listings for sale, return listingUrl, price, currency, propertyType, and when enrichDetails is true also bedrooms, bathrooms, floorArea, tenure, and agentName. Cap at 10 rows. Summarize the dataset and note the RUN_SUMMARY outcome.
Output interpretation for agents:
marketisSGorMY;listingTypeissaleorrentsourceUrlandsourceFetchedAtprovide provenance- The dataset is the primary result store;
OUTPUT/RUN_SUMMARYhold terminal outcome and charge counts maxResultsandmaxPagesbound collection and cost- Cost guidance: one validated listing → one
listing-scrapedevent; enrichment addslisting-enriched— see the live Pricing tab plus platform usage
Apify API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('khadinakbar/propertyguru-all-in-one-scraper').call({market: 'MY',listingType: 'sale',maxResults: 10,maxPages: 1,enrichDetails: false,proxyConfiguration: {useApifyProxy: true,apifyProxyGroups: ['UNBLOCKER'],},});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Best results
Use Unblocker or Residential pinned to SG or MY. Start with maxResults: 5 for a quality sample, then raise caps. Enable enrichDetails when you need beds, baths, GPS, and agent. Prefer search URLs that include market=residential. Segment large jobs by district, property type, or price band. Empty matches finish as VALID_EMPTY, non-PropertyGuru hosts finish as INVALID_INPUT, and sustained upstream blocks finish as UPSTREAM_FAILED.
Design note
In my testing, PropertyGuru public pages already expose schema.org JSON-LD, so Cheerio over HTTP was enough once Cloudflare cleared — I found no need for a full browser session. I learned Malaysia uses /property-listing/ paths and project cards often put the real ID in the URL hash, which is why listing-id extraction prefers the fragment before trailing path digits. I also found Residential can still return 403, so the Actor retries once with Unblocker after a primary empty pass.
Responsible use
Use public listing data for research, comps, and your own market analysis. Respect PropertyGuru terms of service and applicable law. This Actor is for public residential listing pages only. PropertyGuru is a trademark of its owner. This independent Actor is not affiliated with, associated with, or endorsed by PropertyGuru.