PropertyGuru SG & MY Listings Scraper avatar

PropertyGuru SG & MY Listings Scraper

Pricing

from $5.00 / 1,000 listing scrapeds

Go to Apify Store
PropertyGuru SG & MY Listings Scraper

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

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

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

FieldPurpose
marketSG or MY when building a search URL
listingTypesale or rent for built searches
startUrlsPropertyGuru search or listing URLs (SG or MY)
searchLocationOptional free-text location for built searches
propertyTypeall, condo, hdb, or landed
minPrice / maxPrice / bedroomsOptional filters for built searches
maxResultsHard cap on validated listings returned and billed
maxPagesSearch pagination cap (?page=N)
enrichDetailsFetch each listing detail page for richer fields
proxyConfigurationApify 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.

FieldMeaning
listingId / listingUrlStable ID and canonical PropertyGuru URL
market / listingType / propertyTypeSG or MY, sale/rent, condo/HDB/landed
title / price / currency / pricePerAreaAsking price and derived PSF when area is known
bedrooms / bathrooms / floorArea / tenurePresent when detail enrichment runs
locality / region / latitude / longitudeLocation + GPS when enriched
agentName / agencyNamePublic agent fields when enriched
amenities / imageUrlsPublic amenities and photo URLs
sourceUrl / sourceFetchedAtProvenance 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 (when enrichDetails merges 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:

  • market is SG or MY; listingType is sale or rent
  • sourceUrl and sourceFetchedAt provide provenance
  • The dataset is the primary result store; OUTPUT / RUN_SUMMARY hold terminal outcome and charge counts
  • maxResults and maxPages bound collection and cost
  • Cost guidance: one validated listing → one listing-scraped event; enrichment adds listing-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.