PropertyGuru Singapore Listings & Agent Leads Scraper
Pricing
Pay per event
PropertyGuru Singapore Listings & Agent Leads Scraper
Scrape PropertyGuru Singapore sale and rental listings with SGD prices, PSF, property facts, locations, images, floor plans, and public agent/agency details. Search by keyword or URL and monitor recently posted inventory.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Collect sale and rental listings from PropertyGuru Singapore as structured JSON, CSV, or Excel.
The Actor searches public propertyguru.com.sg result pages or enriches individual listing URLs.
It returns asking prices, PSF, property facts, dates, Singapore location fields, images, floor plans, and public professional agent and agency details.
Use it for daily inventory monitoring, valuation inputs, property research, and brokerage lead workflows. V1 is intentionally Singapore-only.
What this Actor does
- Searches PropertyGuru Singapore sale listings.
- Searches PropertyGuru Singapore rental listings.
- Accepts complete PropertyGuru search URLs with your existing filters.
- Accepts individual listing detail URLs.
- Generates searches from keywords, projects, addresses, neighborhoods, or MRT names.
- Paginates result pages up to a configurable safety limit.
- Optionally opens each detail page for richer records.
- Deduplicates listings by PropertyGuru listing ID.
- Filters by price, bedrooms, district, property type, and latest posted date.
- Saves one typed property record per accepted listing.
- Detects anti-bot and upstream payload changes instead of returning misleading empty success.
Who is it for
Property agents and brokerages
Refresh competing inventory, asking prices, and public professional contact details for prospecting or territory analysis.
PropTech and AVM teams
Feed current asking-price, PSF, size, tenure, location, and property attributes into market models.
Investors and acquisition teams
Monitor new sale or rental inventory in selected projects and districts.
Market researchers
Create repeatable snapshots of Singapore inventory without manually copying listing pages.
Data and automation teams
Schedule runs, send dataset items to a webhook, or connect the Actor to an ETL or CRM workflow.
Why use this scraper
PropertyGuru serves normal datacenter requests a Cloudflare challenge. This Actor uses lightweight HTTP with a browser-like TLS fingerprint and a coherent Singapore proxy session. It parses PropertyGuru's server-rendered structured state rather than running a full browser for every page.
That design provides:
- lower compute and memory than browser-heavy extraction;
- complete typed records instead of raw HTML;
- optional detail enrichment when card-level data is enough;
- explicit challenge and payload-shape errors;
- conservative sequential traffic and bounded retries;
- an incremental
sincemode for scheduled monitoring.
Data extracted
| Field group | Example fields |
|---|---|
| Identity | listingId, url, listingType, status |
| Marketing | title, headline, description |
| Pricing | currency, price, priceText, pricePerSqft |
| Unit facts | bedrooms, bathrooms, floorAreaSqft, landAreaSqft |
| Property | propertyType, propertyTypeCode, propertyName, tenure, developer |
| Flags | isNewProject, isVerified |
| Dates | firstPostedAt, lastPostedAt, updatedAt, availableAt |
| Location | address, streetName, districtCode, district, region, postcode |
| Coordinates | latitude, longitude |
| Transport | mrt station context when present |
| Media | imageUrls, floorPlanUrls |
| Agent | public id, name, jobTitle, ceaLicense, profileUrl, mobile, phone |
| Agency | id, name, ceaLicense |
| Provenance | sourceUrl, scrapedAt |
Some fields are optional because publishers can mask addresses, omit floor plans, or leave attributes blank. The Actor does not invent missing values.
Getting started
- Open the Actor input page.
- Keep the prefilled Tampines search or enter
keywords. - Choose
sale,rent, orboth. - Set
maxItemsto a small number for the first run. - Leave Enrich listing details enabled for descriptions, coordinates, media, and agent contacts.
- Leave the default Singapore residential proxy configuration enabled.
- Start the Actor.
- Open the default dataset to export JSON, CSV, Excel, XML, or RSS.
A small enriched search:
{"keywords": ["Tampines"],"searchType": "sale","scrapeDetails": true,"maxItems": 10}
Input parameters
| Parameter | Type | Default | Purpose |
|---|---|---|---|
startUrls | array | prefilled search | Sale/rent search URLs or listing detail URLs on propertyguru.com.sg |
searchType | string | sale | Generated keyword mode: sale, rent, or both |
keywords | string array | [] | Locations, projects, addresses, MRT names, or free-text terms |
districts | string array | [] | Post-filter by district code or name, such as D09 |
propertyTypes | string array | [] | Post-filter by type name/code, such as Condominium or CONDO |
minPrice | integer | unset | Minimum accepted asking price in SGD |
maxPrice | integer | unset | Maximum accepted asking price in SGD |
minBedrooms | integer | unset | Minimum accepted bedrooms |
since | ISO date/time | unset | Keep listings posted at or after this timestamp |
scrapeDetails | boolean | true | Fetch enriched listing detail pages |
maxItems | integer | 100 | Maximum accepted, deduplicated records |
maxPages | integer | 10 | Maximum pages per search |
requestDelayMs | integer | 500 | Delay between HTTP requests |
maxRequestRetries | integer | 2 | Retry limit for transient failures |
proxyConfiguration | object | SG residential | Apify proxy settings |
URL behavior
Only HTTPS URLs on propertyguru.com.sg are accepted.
Supported paths are:
/property-for-sale/property-for-rent/listing/for-sale-...-<listing ID>/listing/for-rent-...-<listing ID>
All Actor filters also apply to records discovered from explicit URLs. Unsupported countries and sister domains fail validation.
Incremental monitoring
Use since with a scheduled run to collect recently posted inventory:
{"keywords": ["Orchard", "River Valley"],"searchType": "rent","since": "2026-07-01T00:00:00+08:00","scrapeDetails": true,"maxItems": 100}
The filter uses each listing's latest posted timestamp. Set the value from your workflow state or scheduling window. The Actor does not keep a hidden cross-run global dataset, so each run remains isolated and predictable.
Output example
The following abbreviated record reflects current live extraction behavior:
{"listingId": "500156685","url": "https://www.propertyguru.com.sg/listing/for-sale-citylife-tampines-500156685","listingType": "SALE","status": "ACT","title": "CityLife @ Tampines","currency": "SGD","price": 2108888,"pricePerSqft": 1675.05,"bedrooms": 3,"bathrooms": 3,"floorAreaSqft": 1259,"propertyType": "Executive Condominium","propertyTypeCode": "EXCON","districtCode": "D18","district": "Pasir Ris / Tampines","latitude": 1.36083,"longitude": 103.94371,"imageUrls": ["https://sg1-cdn.pgimgs.com/listing/...jpg"],"agent": {"name": "Example agent","ceaLicense": "R000000A","mobile": "+65..."},"agency": {"name": "Example agency","ceaLicense": "L0000000A"},"sourceUrl": "https://www.propertyguru.com.sg/property-for-sale?freetext=Tampines&page=1","scrapedAt": "2026-07-25T03:11:53.688Z"}
The example redacts professional contact identity while preserving the output shape. Real dataset rows contain public source values when PropertyGuru exposes them.
Pricing
This Actor uses pay-per-event pricing:
- $0.005 start fee per run;
- $0.0010432 per saved listing on the Free tier;
- $0.00090714 per saved listing on Bronze;
- lower tier prices apply on Silver and above.
You are charged for accepted records saved to the dataset, not challenge pages, duplicates, rejected records, or failed detail parses. Platform compute and proxy use follow your Apify plan.
Illustrative Actor event charges on the Free tier:
| Saved listings | Event charge |
|---|---|
| 10 | about 0.0154 USD |
| 100 | about 0.1093 USD |
| 1,000 | about 1.0482 USD |
Actual totals shown by Apify can also include platform usage according to your plan.
Performance and cost tips
- Set
scrapeDetails: falsefor a fast listing-card feed. - Enable details when you need descriptions, precise coordinates, media, or contact fields.
- Start with
maxItems: 10before scaling a new search. - Use narrow PropertyGuru search URLs to avoid filtering many irrelevant cards.
- Use
sincefor frequent scheduled refreshes. - Keep the Singapore residential proxy enabled; ordinary datacenter access is challenged.
- Avoid setting retry counts above the default unless logs show transient failures.
Failure behavior and limitations
PropertyGuru can change its anti-bot controls or server-rendered payload.
The Actor treats a Cloudflare challenge, missing __NEXT_DATA__, or missing listing payload as an error.
It does not silently report those conditions as zero results.
A valid search with a recognized empty listingsData array succeeds with zero items.
An invalid URL, malformed date, inconsistent price range, or unsupported domain fails before scraping.
Other limitations:
- Singapore
propertyguru.com.sgonly; - no Malaysia, Thailand, or Vietnam claims;
- no login-only or private data;
- no guarantee that publishers expose exact addresses or contact numbers;
- result ordering follows PropertyGuru;
- media URLs can expire or change after extraction;
- upstream listing availability can change between search and detail requests.
Automation workflows
Daily inventory alert
Schedule a keyword search with since, then send dataset items to Slack, email, or a webhook.
Agent CRM enrichment
Run specific listing URLs, map agent.ceaLicense as a stable professional identifier, and deduplicate before CRM insertion.
Asking-price dataset
Run district searches periodically and store price, pricePerSqft, areas, tenure, and timestamps in a warehouse.
Competing-agent monitor
Group records by agency or public CEA license to observe active public inventory in a chosen project.
AVM feature feed
Use price, size, beds/baths, district, property type, coordinates, and posted dates as current listing-side model features.
API with cURL
Replace YOUR_APIFY_TOKEN with your token:
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~propertyguru-singapore-listings-agent-leads-scraper/runs?token=YOUR_APIFY_TOKEN&waitForFinish=120" \-H "Content-Type: application/json" \-d '{"keywords":["Tampines"],"searchType":"sale","maxItems":10}'
To receive dataset items directly:
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~propertyguru-singapore-listings-agent-leads-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls":[{"url":"https://www.propertyguru.com.sg/property-for-sale?freetext=Tampines"}],"maxItems":5}'
API with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/propertyguru-singapore-listings-agent-leads-scraper').call({keywords: ['Tampines'],searchType: 'sale',scrapeDetails: true,maxItems: 10,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
API with Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/propertyguru-singapore-listings-agent-leads-scraper').call(run_input={'keywords': ['Tampines'],'searchType': 'sale','scrapeDetails': True,'maxItems': 10,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Use with Apify MCP
Add the Actor to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/propertyguru-singapore-listings-agent-leads-scraper"
Claude Desktop, Cursor, and VS Code
Use this same MCP server configuration in Claude Desktop, Cursor, or VS Code. Add it to the client’s MCP settings file or MCP server UI:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/propertyguru-singapore-listings-agent-leads-scraper"}}}
Example prompts:
- “Find up to 10 current Tampines sale listings and show price, PSF, bedrooms, and agent CEA license.”
- “Extract this PropertyGuru Singapore listing URL and summarize its location, floor area, images, and public agency details.”
- “Collect rental listings posted since my last monitoring timestamp.”
Legality and responsible use
PropertyGuru pages and listing information may be protected by copyright, database rights, contract terms, and privacy laws. You are responsible for your inputs, purpose, retention, and downstream use.
Collect only public data you have a lawful reason to process. Respect applicable terms, robots guidance, rate limits, PDPA obligations, direct-marketing rules, and professional-contact preferences. Do not use public phone fields for spam, harassment, discrimination, or unlawful profiling. Avoid republishing copyrighted descriptions or images without permission.
This Actor is an extraction tool, not legal advice.
Troubleshooting
The run reports a Cloudflare challenge
Keep the default SG residential proxy enabled. Do not switch to a generic datacenter group. If failures are temporary, retry later with the default coherent session behavior rather than extreme concurrency.
A valid search returns zero records
Open the same public search URL and confirm it currently has results.
Check districts, propertyTypes, price, bedroom, and since filters.
A listing missing a field required by a filter is rejected rather than guessed.
A listing has no address or phone
The publisher or PropertyGuru may mask or omit it. The Actor emits only values present in public server-rendered data.
A URL is rejected
Use the Singapore HTTPS host and one of the supported search/detail paths. Sister-country domains are deliberately out of scope.
The run stops after an upstream change
Inspect the error and run log. Missing structured payloads fail explicitly so you can distinguish a source change from a genuine empty result.
FAQ
Can I scrape both sale and rental listings?
Yes. Set searchType to both for generated keyword searches, or provide both kinds of search URL.
Can I scrape a single listing?
Yes. Put the full public detail URL in startUrls.
Does it return agent phone numbers?
It returns public professional mobile/phone fields when PropertyGuru includes them in the listing payload.
Is a browser launched?
No. The Actor uses browser-fingerprinted HTTP and structured SSR data, reducing compute compared with a full browser.
Can I turn off enrichment?
Yes. Set scrapeDetails to false for card-level output.
Does maxItems count filtered or duplicate records?
It counts accepted, deduplicated dataset records.
Does it retain data between runs?
No hidden global dataset is used. Every run writes to its own default dataset.
Is PropertyGuru Malaysia supported?
No. This version is Singapore-only.
Related Automation Lab Actors
For equivalent property workflows in other markets:
- Realtor.com Scraper — United States listings.
- Rightmove Scraper — United Kingdom listings.
- PropertyFinder Scraper — Middle East property listings.
- Redfin Scraper — United States sale-market research.
Choose this Actor when your target source is specifically PropertyGuru Singapore and you need Singapore district, CEA, MRT, and SGD-oriented fields.
Support
If the target changes or a valid input fails, open an Actor issue with:
- the input with sensitive values removed;
- the run URL or run ID;
- whether card-only or detail enrichment was enabled;
- the expected listing or search behavior;
- the first relevant error from the log.
That evidence makes anti-bot and payload changes faster to diagnose.