PropertyGuru Singapore Scraper avatar

PropertyGuru Singapore Scraper

Pricing

from $5.00 / 1,000 results

Go to Apify Store
PropertyGuru Singapore Scraper

PropertyGuru Singapore Scraper

Scrape sale and rental listings from propertyguru.com.sg — price, size, bedrooms, location, agent contact, photos, MRT distances, and more. Returns clean structured JSON / CSV / Excel.

Pricing

from $5.00 / 1,000 results

Rating

0.0

(0)

Developer

Always Prime

Always Prime

Maintained by Community

Actor stats

1

Bookmarked

9

Total users

5

Monthly active users

7 days ago

Last modified

Share

🏠 PropertyGuru Singapore Scraper

Get every public listing on propertyguru.com.sg as clean structured data — price, size, bedrooms, location, agent contact, photos, MRT distances, descriptions, more. Returns JSON, CSV, or Excel.

Apify Python Output

⚡️ ~0.7 s per listing, 256 MB RAM, no browser. Built on PropertyGuru's own __NEXT_DATA__ payload — same data the site renders to itself.


✨ Why this scraper

  • 🎯 Every monetizable field — price, PSF, bedrooms, floor & land area, tenure, district, lat/lon, agent name + CEA license + mobile, agency, 19+ photos, floor plans, MRT walk times, full description.
  • 🚀 Fast and cheap — pure HTTP with browser TLS fingerprinting. 5× the throughput of a Playwright-based scraper at 1/8th the memory.
  • 🔁 Incremental friendly — pass a since timestamp and the actor skips listings posted before it, so daily refresh runs only pay for what's new.
  • 🧩 No glue code needed — push the output straight into BigQuery, Postgres, Notion, Make, n8n, Sheets — every field is typed and the dataset table view is pre-configured.

🚀 Quick start

  1. Click Try for free above.
  2. Pick searchType: sale or rent, optionally narrow by district / price / bedrooms.
  3. Hit Start.
  4. Download as JSON, CSV, or Excel from the Output tab.

That's it. No accounts, no proxies, no anti-bot tinkering.


🎛️ Input

FieldTypeWhat it does
searchTypesale | rentChoose properties for sale or for rent. Default: sale.
freetextstringSearch by project / street / area name (e.g. "Tanjong Pagar").
districtsstring listRestrict to specific SG districts (D09, D10, …).
propertyTypeCodesstring listRestrict by type — APT, CONDO, HDB, SEMI, TERR, BUNG, EXEC, LAND.
minPrice / maxPriceintPrice bounds in SGD. For rentals, monthly rent.
bedroomsstring listBedroom counts to include ("2", "3"; use "0" for studio).
sortByenumdefault (relevance), price_low, price_high.
sincedatetimeOnly listings posted after this moment — for incremental refreshes.
scrapeDetailsboolOff = URL-only mode (~10× cheaper, fast diff runs). On (default) = full record.
maxItemsintCap on records. 0 = unlimited. Default: 50.
concurrencyintParallel detail fetches. Default: 5. Max: 25.
startUrlsURL listAdvanced override: feed your own already-built PG search URLs.

📦 Sample output (one listing)

{
"url": "https://www.propertyguru.com.sg/listing/for-sale-the-lakeshore-500140099",
"id": "500140099",
"scraped_at": "2026-05-15T08:34:46+00:00",
"listingType": "SALE",
"propertyType": "Condominium",
"propertyTypeCode": "CONDO",
"propertyTypeGroup": "N",
"title": "The Lakeshore",
"headline": "Lakeshore 3-Bedroom · Pool View · Vacant",
"description": "Spacious 1,109 sqft 3-bedroom unit with unobstructed pool views...",
"price": 1688000,
"pricePretty": "S$ 1,688,000",
"currency": "SGD",
"bedrooms": 3,
"bathrooms": 2,
"floorArea": 1109,
"floorAreaPsf": 1522.09,
"landArea": null,
"landAreaPsf": null,
"tenure": "L99",
"tenureText": "99-year Leasehold",
"isVerified": true,
"qualityScore": 98,
"statusCode": "ACT",
"datePosted": "2026-05-13T09:21:04",
"dateCreated": "2026-04-22T11:08:30",
"dateExpires": "2026-07-21T23:59:59",
"address": {
"streetName": "Lakeshore Drive",
"fullAddress": "1 Lakeshore Drive",
"postcode": "648292",
"districtCode": "D22",
"districtText": "Boon Lay / Jurong / Tuas",
"lat": 1.3411,
"lon": 103.7129
},
"agent": {
"id": 88012,
"name": "Keith Low",
"license": "R047251D",
"mobile": "+6593690168",
"jobTitle": "Senior Marketing Director",
"profileUrl": "https://www.propertyguru.com.sg/agent/keith-low-88012",
"avatar": "https://sg1-cdn.pgimgs.com/agent/88012/APHO.../V120B.png"
},
"agency": {
"id": 4619,
"name": "ERA REALTY NETWORK PTE LTD",
"license": "L3002382K"
},
"images": [
{"src": "https://sg1-cdn.pgimgs.com/listing/500140099/.../V800/...jpg",
"caption": "Living Room"}
],
"floorPlans": [],
"virtualTours": [],
"mainImage": "https://sg1-cdn.pgimgs.com/listing/500140099/.../V800/...jpg",
"poiMrt": [
{"name": "EW27 Boon Lay MRT Station", "distanceKm": 0.41,
"walkingDistanceKm": 0.45, "walkingDurationMins": 6}
],
"poiSchool": []
}

💼 Use cases

WhoWhat they do with it
🏢 Investors & buyersBuild a daily refresh feed of new listings in target districts; flag underpriced units by PSF percentile.
🤝 Property agentsTrack competitor listings, monitor agent activity, scout co-broking opportunities.
🏗️ PropTech & analyticsPower dashboards, AVMs (automated valuation models), heat maps, market reports.
🧠 ML / data scienceTrain pricing models, location-embedding models, agent-fraud classifiers on real SG transaction data.
📊 Market researchQuarterly reports on price/PSF trends by district, by property type, by tenure.

💡 Tips & tricks

  • Daily refresh: set since to yesterday's date — the actor short-circuits at the search page and you only pay for genuinely new listings.
  • Index mode: scrapeDetails: false returns just URLs + IDs — perfect for diff-only runs to detect what's been added or de-listed.
  • Pricing buckets: run 3 separate runs with different minPrice/maxPrice windows in parallel for faster total scrape times.
  • Districts D09 / D10 / D11 (Orchard, Tanglin, Newton) account for ~40% of all luxury SG sale listings — narrow there for premium segments.

❓ FAQ

How fresh is the data? Live. Each request hits PropertyGuru's production servers at the moment of your run.

Will my dataset have duplicates? No. The actor de-dupes by listing ID at queue time and again at push time.

What about listings posted in multiple districts? PropertyGuru issues one ID per listing — you'll see it exactly once.

Can I scrape rentals too? Yes — set searchType: rent. All the same fields populate (price = monthly rent).

Will big runs fail halfway? No. The actor tracks a failure budget (>30% failed → stop and report) so a broken site never quietly drains your CU.

What happens if PropertyGuru changes its layout? The actor's parser runs against captured HTML fixtures in CI — site redesigns surface as test failures within hours, not weeks of silently broken data.


🛟 Support

Found a bug or missing field? Open an issue or message the actor maintainer from the Apify Store page. Bug reports with the run ID get fastest turnaround.