CommercialGuru SG Property Listings & Agent Contacts Scraper icon

CommercialGuru SG Property Listings & Agent Contacts Scraper

Scrape commercialguru.com.sg Singapore listings at scale. Extract prices, PSF, floor area, tenure, property type, images, agent contacts, coordinates,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

CommercialGuru SG Property Listings & Agent Contacts Scraper at a glance

CommercialGuru SG Property Listings & Agent Contacts Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, title, address, listing type and type, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Real Estate, Developer Tools, Lead Generation
Region
Asia
Pricing
$1.80 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
25 options
Run success
98.3% of completed public runs in the last 30 days

Scrape commercialguru.com.sg Singapore listings at scale. Extract prices, PSF, floor area, tenure, property type, images, agent contacts, coordinates, nearby MRT stations and more. Ideal for commercial real estate analytics, investment research and market intelligence.

What CommercialGuru SG Property Listings & Agent Contacts Scraper can do

  • Two ways to collect data. Build a search from filters (listing type, property type, district, price, floor area) or paste CommercialGuru search and listing URLs directly.
  • 11 commercial property types. Office, retail, shop/shophouse, warehouse, factory, industrial, land, food and beverage, business park and dormitory, both for sale and for rent.
  • Coordinates on demand. Turn on coordinate enrichment to add latitude and longitude from CommercialGuru's own map data, or fetch each listing's detail page for exact coordinates plus agent phone, postal code and more.
  • District-aware. Filter and read results by Singapore's D01-D28 district codes, each already mapped to a readable area name.
  • Built for monitoring. Incremental mode returns only new and changed listings on recurring runs, and a blocked run fails loudly instead of returning an empty dataset.
  • Resume large pulls. Point a new run at a previous run or dataset id and it skips everything already collected there.

Choose what to collect

These inputs let you configure CommercialGuru SG Property Listings & Agent Contacts Scraper. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestringScraping mode: 'search' builds search URLs from filters, 'url' uses provided URLs directly

Choices: search, url

listing_typestringType of listing to search for

Choices: sale, rent

property_typestringFilter by commercial property type

Choices: office, retail, shop, shophouse, warehouse, factory, industrial, land, food_beverage, business_park, dormitory

locationsarrayOne or more free-text locations to search (e.g. "Raffles Place", "Jurong", "CBD"). Each location is searched separately and the results are combined into one dataset. Takes priority over the single Location Search field.
searchstringFree-text location search (e.g. 'Raffles Place', 'Jurong', 'CBD'). Use this OR district code, not both.
districtstringSingapore district code (D01-D28). E.g. D01=Raffles Place/Marina, D09=Orchard, D22=Jurong/Tuas. Use this OR freetext search, not both.
min_priceintegerMinimum price in Singapore Dollars
Show 18 more inputs
More input fields
InputWhat it controls
max_priceintegerMaximum price in Singapore Dollars
min_floor_areaintegerMinimum floor area in square feet
max_floor_areaintegerMaximum floor area in square feet
sortstringSort results by date (newest), price, price per sqft, or floor area

Choices: date, price, psf, area

sort_orderstringSort direction

Choices: asc, desc

urlsarrayURLs to scrape (url mode only): search/listing pages (sale or rent, with filters, sort or ?page=N), property-type category pages such as /office-for-sale, and single /listing/ detail pages. Agent profile pages are skipped with a warning.
enable_coordinatesbooleanAdd lat/lng coordinates to listings via Map API. Disabled by default as it significantly slows down the run (~30-60s extra).
max_propertiesintegerMaximum number of properties to scrape (0=unlimited)
max_pagesintegerMaximum number of search result pages to scrape (20 listings per page)
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large crawl without returning or charging for listings already collected there. Use this after an interrupted run, or when continuing a big pull across another run. For recurring monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching properties as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED properties. Turn on "Emit unchanged" or "Emit expired" only when you also want those properties returned (and billed). State is kept separately for each search/URL and filter setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL and filter settings, different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return properties that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return properties that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max properties capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.
ignoreFieldsForChangesarrayField names that must NOT count as a change when incremental mode compares a property with its last saved copy. They are still returned in the output. Use dotted paths for nested fields, for example images.url ignores that key inside every element of the images list. Leave empty to compare every field except the built-in exclusions (recency and the additive convenience fields, see README).
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idID (text)
titleTitle (text)
addressAddress (text)
listing_typeListing Type (text)
property_typeType (text)
pricePrice (SGD) (number)
price_formattedPrice (text)
price_psfPSF (text)
floor_areaArea (sqft) (number)
tenureTenure (text)
districtDistrict (text)
nearby_mrtMRT (text)
Show 41 more fields
statusStatus (text)
image_countImages (number)
posted_dateposted_date
changeTypeChange (incremental) (text)
changedFieldsChanged Fields (array)
firstSeenAtFirst Seen (date)
lastSeenAtLast Seen (date)
urlURL (link)
latitudeLat (number)
longitudeLng (number)
location_sourcelocation_source
district_codedistrict_code
regionregion
agent_nameagent_name
agent_titleagent_title
agent_idagent_id
agent_licenseagent_license
agency_nameagency_name
developerdeveloper
is_developer_listingis_developer_listing
property_type_groupproperty_type_group
currencycurrency
land_arealand_area
description_headlinedescription_headline
descriptiondescription
agent_phoneagent_phone
postal_codepostal_code
floor_levelfloor_level
rental_typerental_type
unit_conditionunit_condition
unit_featuresunit_features
lease_termlease_term
amenitiesamenities
nearby_mrt_stationsnearby_mrt_stations
nearby_schoolsnearby_schools
available_dateavailable_date
badgesbadges
imagesimages
posted_unixposted_unix
recencyrecency
detail_fetcheddetail_fetched

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "id": 500073292,
  "title": "Novena Medical Center",
  "address": "10 Sample Drive",
  "listing_type": "sale",
  "property_type": "Office",
  "property_type_group": "O",
  "price": 3800000,
  "price_formatted": "S$ 3,800,000",
  "currency": "SGD",
  "price_psf": "S$ 4,973.82 psf",
  "floor_area": 764,
  "tenure": "99-year Leasehold",
  "agent_name": "Sample",
  "agent_id": 1758000,
  "agent_license": "R0123000",
  "agency_name": "Sample PTE LTD",
  "district": "Newton / Novena",
  "district_code": "D11",
  "region": "Central (D09-11)",
  "nearby_mrt": "2 min (170 m) from NS20 Novena MRT Station",
  "latitude": 1.3,
  "longitude": 103,
  "location_source": "map_api",
  "badges": [
    "Office",
    "99-year Leasehold"
  ],
  "posted_date": "2 Apr 2026",
  "posted_unix": 177508000,
  "recency": "Listed on Apr 02, 2026 (30m ago)",
  "images": [
    "https://sg1-cdn.pgimgs.com/listing/500073292/UPHO.123456.V800/Novena-Sample.jpg"
  ],
  "image_count": 1,
  "url": "https://www.commercialguru.com.sg/listing/for-sale-novena-medical-center-Sample",
  "status": "ACT"
}

Ways to use this data

  • Commercial property investment research: collect prices, PSF and tenure across districts to compare deal quality and spot underpriced listings.
  • Market intelligence and reporting: build a dataset of active office, retail and industrial supply by district for market reports.
  • Lead generation for agents and brokers: pull agent names, agency and CEA license numbers alongside the listings they represent.
  • Site selection and location analysis: filter warehouses and factories by floor area and proximity to MRT stations.
  • Portfolio and competitor monitoring: schedule the actor with incremental mode to track new listings and price changes on a search over time.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does CommercialGuru SG Property Listings & Agent Contacts Scraper return?

The documented output for CommercialGuru SG Property Listings & Agent Contacts Scraper includes id, title, address, listing type, type, price (sgd), price and psf. Availability of each field depends on the source page and the selected mode.

How much does CommercialGuru SG Property Listings & Agent Contacts Scraper cost?

It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated listings by default, and unchanged ones are not billed. Turn on Emit expired as well if you also want listings that disappeared, and want later reappearances tracked as REAPPEARED rather than a plain UPDATED or UNCHANGED.

Why did my run return fewer listings than expected?

Check Max properties and Max pages first; a capped run stops once either limit is reached. If detail-page fetching is on and one listing's detail page could not be fetched, that listing is still returned with its search-card fields; only its detail-only fields are missing. In Incremental mode the last known detail fields are carried forward instead, so the listing is not falsely reported as changed.

Why did my run fail instead of returning an empty dataset?

The actor fails loudly, instead of returning zero listings, when it could not read a single result page: that means every connection attempt was refused, which is a connection problem, not an empty search. It also fails if the run's time limit is reached before any page can be read, if url mode is used with no URLs, or if a resumeFromRunId cannot be resolved to a readable run or dataset. If some pages were read successfully but others were not, you still get what was found, and the run does not fail. Simply run it again in a few minutes if it fails on a connection problem.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with CommercialGuru SG Property Listings & Agent Contacts Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.