# PropertyGuru Singapore Scraper — Listings & Agents (`hipersoft/propertyguru-scraper`) Actor

Scrape PropertyGuru Singapore property listings: price, beds, baths, size, address, property type, agent and URL. For property research and lead generation.

- **URL**: https://apify.com/hipersoft/propertyguru-scraper.md
- **Developed by:** [hiper soft](https://apify.com/hipersoft) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.004 / listing scraped

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## PropertyGuru Scraper — Listings, Prices, PSF & Agents

Scrape **PropertyGuru Singapore** property listings into clean JSON, CSV, Excel or XML. The **PropertyGuru scraper** extracts **title, address, price, price-per-sqft, bedrooms, bathrooms, floor area, property type, tenure, build year, nearest MRT, listing agent, agency and the listing URL** from for-sale and for-rent search results. Fast and reliable, and a cheaper alternative to collecting the data by hand.

![PropertyGuru Scraper input — listing type, search URLs and max listings in the Apify Console](https://api.apify.com/v2/key-value-stores/SUfvnaFLd9z9eBCtV/records/propertyguru-scraper-input.png?v=2)

### What does PropertyGuru Scraper do?

The PropertyGuru scraper crawls PropertyGuru Singapore for-sale and for-rent search pages and exports every property listing as a structured row. Point it at a listing type or paste your own filtered search URLs, set a limit, and get a clean dataset of prices, sizes, locations and agent details — ready for analysis or export to JSON, CSV, Excel or XML.

### What data can you scrape from PropertyGuru?

| Data point | Description |
|------------|-------------|
| 🏠 Listing basics | Title, address, property type, listing ID |
| 💲 Pricing | Price, formatted price text, price per sqft (PSF) |
| 📐 Property details | Bedrooms, bathrooms, floor area (sqft), tenure, build year |
| 🚇 Location | Address and nearest MRT station |
| 👤 Agent & agency | Marketing agent name and agency name |
| 🔗 Links | Direct listing URL and source search URL |
| 🕒 Freshness | Listing recency and collection timestamp |

### What you get

![PropertyGuru Scraper output example — property listings with price, PSF, beds, size and agent as structured JSON](https://api.apify.com/v2/key-value-stores/SUfvnaFLd9z9eBCtV/records/propertyguru-scraper-output.png?v=5)

Each listing is returned as a structured record like this:

```json
{
  "listingId": "18909402",
  "title": "Eight Riversuites",
  "address": "Whampoa East",
  "price": 1299999,
  "priceText": "S$ 1,299,999",
  "pricePsf": 1857.14,
  "bedrooms": 2,
  "bathrooms": 2,
  "sizeSqft": 700,
  "propertyType": "Condominium",
  "tenure": "99-year Leasehold",
  "buildYear": 2017,
  "nearestMrt": "Boon Keng MRT",
  "recency": "Listed 2 days ago",
  "agentName": "Kaeden Ong",
  "agencyName": "PropNex Realty",
  "listingUrl": "https://www.propertyguru.com.sg/listing/for-sale-eight-riversuites-18909402",
  "sourceUrl": "https://www.propertyguru.com.sg/property-for-sale",
  "collectedAt": "2026-07-30T09:29:00.000Z"
}
```

#### Output schema

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | Unique PropertyGuru listing identifier |
| `title` | string | Listing or development title |
| `address` | string | Listing address or locality |
| `price` | integer | Asking price as a number |
| `priceText` | string | Price as shown on the listing (formatted) |
| `pricePsf` | number | Price per square foot |
| `bedrooms` | integer | Number of bedrooms |
| `bathrooms` | integer | Number of bathrooms |
| `sizeSqft` | integer | Floor area in square feet |
| `propertyType` | string | Property type (e.g. Condominium, HDB, Landed) |
| `tenure` | string | Land tenure (e.g. 99-year Leasehold, Freehold) |
| `buildYear` | integer | Year the property was built |
| `nearestMrt` | string | Nearest MRT station |
| `recency` | string | How recently the listing was posted or updated |
| `agentName` | string | Name of the marketing agent |
| `agencyName` | string | Name of the agent's agency |
| `url` | string (URL) | Canonical listing URL |
| `listingUrl` | string (URL) | Direct link to the listing |
| `sourceUrl` | string (URL) | Search URL the listing was found on |
| `collectedAt` | string (ISO date) | Timestamp when the record was collected |

### Use cases

- **Price benchmarking** — compare asking prices and price-per-sqft across districts and property types.
- **Market monitoring** — track new listings, price changes and inventory over time.
- **Agent lead generation** — build lists of active agents and agencies by area.
- **Property research** — assemble datasets of condos, HDB and landed homes for analysis.
- **Investment screening** — filter by tenure, build year, size and PSF to shortlist deals.
- **Valuation models** — feed real listing data into pricing and comparables models.

### How to scrape PropertyGuru data

1. Add the **PropertyGuru Scraper** to your Apify account.
2. Choose a **listing type** (for sale or for rent), or paste your own filtered **search URLs**.
3. Optionally set a **property type** (e.g. `hdb`, `condo`) to narrow results.
4. Set **Max listings** to control how much data you collect.
5. Click **Run**, then export the results as JSON, CSV, Excel or XML — or pull them via the Apify API.

### Input

```json
{
  "listingType": "sale",
  "maxItems": 40
}
```

For more volume, pass several **filtered** search URLs (by district, price band or property type):

```json
{
  "searchUrls": [
    "https://www.propertyguru.com.sg/property-for-sale/district/D09",
    "https://www.propertyguru.com.sg/property-for-rent/hdb"
  ],
  "maxItems": 200
}
```

| Field | Type | Description |
|-------|------|-------------|
| `listingType` | string | `sale` or `rent`. |
| `propertyType` | string | Optional property-type path segment (e.g. `hdb`, `condo`). |
| `searchUrls` | array | Explicit PropertyGuru search URLs; overrides `listingType`/`propertyType`. |
| `maxItems` | integer | Maximum number of listings to collect. |

### Need more Singapore data?

- [99.co Property Scraper](https://apify.com/hipersoft/99co-scraper)
- [EdgeProp Singapore Scraper](https://apify.com/hipersoft/edgeprop-scraper)
- [SRX Property Scraper](https://apify.com/hipersoft/srx-scraper)
- [MyCareersFuture Jobs Scraper](https://apify.com/hipersoft/mycareersfuture-scraper)
- [Singapore Carpark Availability (Live)](https://apify.com/hipersoft/sg-carpark-scraper)

### FAQ

**How many listings can I scrape?**
As many as you like — set **Max listings**, or pass multiple search URLs to collect more per run.

**Do I need any setup or a login?**
No setup and no login. Just add the actor, choose a listing type or paste search URLs, and run.

**Which export formats are supported?**
JSON, CSV, Excel and XML, plus the Apify API and dataset views.

**How fresh is the data?**
Every run collects the listings live from PropertyGuru at that moment, with a `collectedAt` timestamp on each record.

**Can I filter by district, price or property type?**
Yes — paste PropertyGuru search URLs that already carry your filters, and the scraper follows them.

**How does billing work?**
You pay per listing you collect — no subscriptions and no minimums.

**Can I connect it to other tools?**
The PropertyGuru Scraper can be connected with almost any cloud service or web app thanks to [integrations on the Apify platform](https://apify.com/integrations). It works with [Make](https://apify.com/integrations/make), [Zapier](https://apify.com/integrations/zapier), [Slack](https://docs.apify.com/platform/integrations/slack), [Airbyte](https://docs.apify.com/platform/integrations/airbyte), [GitHub](https://docs.apify.com/platform/integrations/github), [Google Drive](https://docs.apify.com/platform/integrations/drive) and [many more](https://apify.com/integrations), plus the [Apify API](https://docs.apify.com/api/v2), JavaScript/Python clients and MCP. Or use [webhooks](https://docs.apify.com/platform/integrations/webhooks) to trigger an action whenever a run finishes.

**Is it legal?**
The scraper collects only publicly available listing data. You are responsible for how you use the data and for complying with PropertyGuru's terms.

### Related Actors

- [Google Maps Scraper](https://apify.com/hipersoft/google-maps-scraper)
- [Google Maps Reviews Scraper](https://apify.com/hipersoft/google-maps-reviews)
- [Website Contact Scraper](https://apify.com/hipersoft/website-contact-scraper)

### Notes

Original clean-room implementation. Returns only public data; you are responsible for compliance with PropertyGuru's terms. Not affiliated with or endorsed by PropertyGuru. </content> </invoke>

# Actor input Schema

## `listingType` (type: `string`):

Whether to scrape properties for sale or for rent.

## `propertyType` (type: `string`):

Optional property-type path segment, e.g. hdb or condo.

## `searchUrls` (type: `array`):

Explicit PropertyGuru search URLs; overrides listingType/propertyType.

## `maxItems` (type: `integer`):

Maximum listings to scrape.

## `debug` (type: `boolean`):

Log the discovered data structure to the key-value store.

## `proxyConfiguration` (type: `object`):

Proxy configuration. Leave the default — it is tuned for reliable results.

## Actor input object example

```json
{
  "listingType": "sale",
  "propertyType": "",
  "searchUrls": [],
  "maxItems": 60,
  "debug": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

The scraped results as dataset items.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("hipersoft/propertyguru-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("hipersoft/propertyguru-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call hipersoft/propertyguru-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hipersoft/propertyguru-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/p8NVS4PSgZGwRcEDp/builds/fbdSp1KXqqLq8D0X2/openapi.json
