# SRX Property Scraper - Singapore Listings & Agent Leads (`scrapesage/srx-property-scraper`) Actor

Scrape SRX.com.sg Singapore property: HDB, condo, landed & commercial listings for sale/rent with price, PSF, size, tenure, district, market segment, agent leads (name, mobile, agency) and transacted comparables.

- **URL**: https://apify.com/scrapesage/srx-property-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 5 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 listing scrapeds

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/platform/actors/running/actors-in-store#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

## SRX Property Scraper — Singapore Listings, Agent Leads & Transacted Comparables

Extract **complete property data from [SRX.com.sg](https://www.srx.com.sg)** — Singapore's top-tier property portal and home of the widely-cited **X-Value** automated valuation. Scrape **HDB, condo, landed and commercial** listings **for sale or rent**, each with the full property record, the **agent as a ready-to-use B2B lead** (name, mobile, agency, profile, WhatsApp), and — uniquely — the project's **recent transacted prices** (the gated comparable/valuation layer).

No login, no API key, no browser — this actor reads SRX's own server-rendered data directly, so the output is first-party and reliable.

### Why this SRX scraper?

Portals show **asking** prices. The high-value data is the **transacted** price — what units actually sold or rented for — and the contactable agent behind each listing. This actor ships **both** in one clean dataset, plus the richest listing record in the category:

| Data | Typical scrapers | This actor |
|---|---|---|
| Title, property type, sale/rent | ✅ | ✅ |
| Price (asking) | ✅ | ✅ |
| **PSF (built / land)** | partial | ✅ |
| Built / land size (sqft) | partial | ✅ |
| Beds, baths | partial | ✅ |
| Project, full address, block, **postal code** | ❌ | ✅ |
| **District + URA market segment (CCR/RCR/OCR)** | ❌ | ✅ |
| **Latitude / longitude** | ❌ | ✅ |
| **Tenure + lease years**, built year, floor band | ❌ | ✅ |
| Listed date, expiry, days-on-market, recency | ❌ | ✅ |
| **Agent name + mobile + agency + profile + WhatsApp** | ❌ | ✅ on every card |
| Description, facilities, all photos | ❌ | ✅ opt-in (detail) |
| **Nearby amenities — MRT, schools, malls + distances & coords** | ❌ | ✅ opt-in (detail) |
| **Transacted comparables — recent sold & rented prices, PSF, dates** | ❌ | ✅ opt-in (valuation layer) |
| Lead score (0–100) per listing | ❌ | ✅ |
| One clean dataset, no empty columns | ❌ | ✅ |

### Use cases

- **Lead generation** — every SRX listing exposes its agent with a **full mobile number, agency, profile and WhatsApp link**, right on the search card. Score them (`leadScore`), filter, and export straight to your CRM — no detail crawl required.
- **Asking-vs-transacted analysis** — pair a listing's asking price with the project's **recent transacted prices and PSF** to spot over/under-priced units. This is the data SRX's X-Value is built on.
- **Property market research** — map supply by district, **market segment (CCR/RCR/OCR)**, property type, size band, PSF and tenure; benchmark asking prices and track new listings over time.
- **Agent & agency prospecting** — surface the most active agents and agencies by segment and listing volume.
- **Proptech & valuation enrichment** — power dashboards and AVMs with standardized listings, geo context (district, postal, lat/long, MRT), images and transacted comparables.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **SRX Property Scraper**, choose **For sale / rent**, a **Property type** (e.g. `Condo`), optionally a **District**, and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

> **Proxy note:** SRX is Cloudflare-protected, so this actor uses **Apify Residential proxy in Singapore** by default. Leave the proxy setting as-is for reliable runs.

### Input

```json
{
    "listingType": "sale",
    "propertyType": "condo",
    "district": "9,10,11",
    "minPrice": 1000000,
    "maxPrice": 3000000,
    "maxItems": 100,
    "includeDetails": false,
    "includeTransactedComparables": false,
    "monitorMode": false
}
```

- **listingType** — `sale`, `rent`, or `both`.
- **propertyType** — `all` (every residential type), `condo`, `hdb`, `landed`, or `commercial`.
- **district** — optional Singapore postal district filter, e.g. `"10"` or `"9,10,11"` (D01–D28). Blank = all Singapore.
- **bedrooms / minPrice / maxPrice** — optional SRX search filters.
- **startUrls** — paste any SRX **search**, **listing** or **project** URL (e.g. a filtered search you built in the browser). Overrides the simple filters.
- **maxItems** *(default 100)* — cap on listings for the whole run.
- **includeDetails** *(default false)* — open each listing's detail page to add the full **description**, **facilities**, **nearby amenities** (MRT, schools, malls with distances), **all photos** and the exact price. One extra request per listing.
- **includeTransactedComparables** *(default false, needs `includeDetails`)* — attach the project's **recent transacted sale & rental prices** (unit, price, PSF, size, date) — the gated valuation layer. De-duplicated per project across listings.
- **monitorMode** *(default false)* — emit only **new or price-changed** listings vs previous runs (see below).

### Output

One record per listing. The **agent lead is included on every card** — no detail crawl needed:

```json
{
    "listingId": "110775541",
    "url": "https://www.srx.com.sg/listings/110775541/for-sale-cheng-san-view-...",
    "listingType": "sale",
    "title": "Blk 538 Cheng San View",
    "priceText": "$420,000",
    "price": 420000,
    "propertyType": "3 Room",
    "propertyCategory": "HDB",
    "projectName": "Cheng San View",
    "address": "Ang Mo Kio Avenue 5",
    "block": "538",
    "postalCode": "560538",
    "districtTown": "Ang Mo Kio",
    "district": 20,
    "districtCode": "D20",
    "marketSegment": "RCR",
    "latitude": 1.37559, "longitude": 103.85335,
    "tenure": "Leasehold",
    "tenureYears": 99,
    "builtYear": 1980,
    "floorCategory": "MID",
    "bedrooms": 2,
    "bathrooms": 2,
    "builtSize": 732,
    "builtPsf": 573.77,
    "listedDate": "17-Mar-2026",
    "datePostedTimestamp": 1782129650,
    "photoUrl": "https://static.srx.com.sg/Listing%20Photos/.../mobile.jpg",
    "agent": {
        "name": "Nancy Wong",
        "mobile": "97339190",
        "mobilePretty": "9733 9190",
        "agencyId": "3",
        "profileUrl": "https://www.srx.com.sg/wongnancy168",
        "whatsappUrl": "https://api.whatsapp.com/send?phone=6597339190...",
        "callUrl": "tel:97339190"
    },
    "leadScore": 100,
    "scrapedAt": "2026-06-26T04:30:00.000Z"
}
```

With **includeDetails**, the record also gains `description`, `facilities`, `nearbyAmenities` (MRT/schools/malls with distances & coordinates), `photoUrls`, `exactPrice`, `sizeSqft`, `psf`, `projectUrl`, `hasXValue` and `xValueUrl`. With **includeTransactedComparables**, it gains `transactedComparables.sale[]` and `transactedComparables.rental[]` — recent transacted prices for the project.

Use the **Listings** and **Agent leads** dataset views to switch between column sets.

#### What to expect (field coverage)

| Field | Coverage |
|---|---|
| listingId, url, title, price, propertyType, district, market segment, postal, lat/long, tenure, size, PSF, beds/baths, photo, **agent name + mobile + agency + profile + WhatsApp** | ~100% |
| project name, built year | ~85–95% (landed / some HDB have no named project or declared TOP) |
| floor band, days-on-market, developer | source-gated — published only for some listings (see below) |
| description, facilities, nearby amenities, all photos, exact price | `includeDetails`, as published |
| transacted comparables | `includeTransactedComparables` (+`includeDetails`) |

A blank field means SRX doesn't publish that value for that listing — not that scraping failed. Nothing is dropped, so you always get the richest record available.

### Monitoring mode — only new / changed listings

Turn on **monitorMode** to make the actor remember which listings it has already returned (and their price) and emit **only listings that are new or whose price changed** — perfect for tracking a district or segment. It stores state in a named key-value store (`monitorStoreName`, one per tracked search).

This **complements [Apify Schedules](https://docs.apify.com/platform/schedules)** and does not conflict with them: Schedules decide *when* the actor runs (e.g. every morning), and monitoring mode decides *what is new* in each run. Use both together for a daily feed of just-listed or just-repriced properties.

### Automate & schedule

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run daily/weekly to monitor new listings or refresh prices and agents.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/srx-property-scraper').call({
    listingType: 'sale',
    propertyType: 'condo',
    district: '9,10,11',
    maxItems: 200,
    includeDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} listings`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new agent leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored segment adds new listings.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find every condo for sale in District 9 on SRX with the agent's mobile and the project's last transacted prices" and let it run the scraper.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **Singapore property & lead-gen stack**:

- **[99.co Property Scraper](https://apify.com/scrapesage/99-co-property-scraper)** — Singapore residential listings and agent leads.
- **[EdgeProp.sg Scraper](https://apify.com/scrapesage/edgeprop-singapore-scraper)** — Singapore property listings and agent leads.
- **[CommercialGuru Scraper](https://apify.com/scrapesage/commercialguru-scraper)** — Singapore commercial & industrial property and agent leads.
- **[Singapore Company Scraper](https://apify.com/scrapesage/singapore-company-scraper)** — UEN, registry and business leads.
- **[StreetDirectory Scraper](https://apify.com/scrapesage/streetdirectory-business-scraper)** — Singapore business leads.
- **[SGCarMart Used Car Scraper](https://apify.com/scrapesage/sgcarmart-used-car-scraper)** — Singapore used cars, prices and dealer leads.
- **[MyCareersFuture Scraper](https://apify.com/scrapesage/mycareersfuture-scraper)** — Singapore jobs, salaries and leads.
- **[Google Maps Scraper](https://apify.com/scrapesage/google-maps-scraper)** — local businesses with phone, website and reviews.
- **[Website Contact Scraper](https://apify.com/scrapesage/website-contact-scraper)** — emails, phones and socials from any website.

### Tips

- **Whole-market coverage**: set `propertyType` to `all` and `listingType` to `both` to sweep an entire segment.
- **Best leads first**: sort the dataset by `leadScore` to surface contactable, premium listings at the top.
- **Cost control**: leave `includeDetails` off for a fast, cheap pass with the rich card (price, PSF, size, district, segment, **agent name + mobile + agency**); turn it on to add description, amenities and all photos; add `includeTransactedComparables` for the valuation layer.
- **Asking-vs-transacted**: enable `includeDetails` + `includeTransactedComparables` and compare each listing's `price`/`builtPsf` against `transactedComparables.sale[].psf`.

### FAQ

**Does it need an SRX account or API key?** No. This actor reads SRX's own server-rendered data — the same data the website shows — with no login, cookie or key.

**Where does the agent's mobile come from?** From the listing card itself — SRX publishes the agent's name, mobile, agency and WhatsApp on each listing, and this actor reads them directly. (No detail crawl needed for the lead.)

**What are "transacted comparables"?** SRX publishes each project's recent **transacted** sale and rental prices (the prices units actually changed hands at, from URA caveats) on the project page. With `includeTransactedComparables` the actor attaches them per listing — the gated data behind valuation tools like X-Value.

**Why is a residential Singapore proxy required?** SRX is Cloudflare-protected and blocks datacenter IPs. The actor defaults to Apify Residential proxy, country SG, which loads pages reliably.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**Is scraping SRX legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (e.g. PDPA/GDPR for personal data) and SRX's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

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

Scrape properties for sale, for rent, or both.

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

Which SRX property category to scrape. 'All' covers every residential type; 'commercial' covers offices, retail, F\&B and industrial.

## `district` (type: `string`):

Optional Singapore postal district filter, e.g. "10" or "9,10,11" (D01–D28). Leave blank for all Singapore.

## `bedrooms` (type: `string`):

Optional minimum number of bedrooms (SRX filter), e.g. "2".

## `minPrice` (type: `integer`):

Optional minimum price (sale) or monthly rent (rent).

## `maxPrice` (type: `integer`):

Optional maximum price (sale) or monthly rent (rent).

## `startUrls` (type: `array`):

Paste any SRX search, listing or project URL (e.g. a filtered search you built in the browser). Overrides the simple filters above. Examples: https://www.srx.com.sg/singapore-property-listings/condo-for-sale?districtIds=9 , https://www.srx.com.sg/listings/123456789/...

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

Maximum number of listings to scrape. Keep modest for quick runs; set higher for large exports.

## `maxPagesPerSearch` (type: `integer`):

Safety cap on how many result pages (20 listings each) to crawl per search.

## `includeDetails` (type: `boolean`):

Open each listing's detail page to add the full description, facilities, nearby amenities (MRT, schools, malls with distances), all photos and the exact price. Slower and adds a charge per enriched listing.

## `includeTransactedComparables` (type: `boolean`):

Attach recent TRANSACTED sale & rental prices for each listing's project (unit, price, PSF, size, date) — the gated comparable/valuation data. Requires 'Include listing details'. Adds a charge per project table fetched (de-duplicated across listings).

## `monitorMode` (type: `boolean`):

Remember listings across runs and only output NEW or price-CHANGED listings. Pair with an Apify Schedule to track a market segment. Uses a key-value store, independent of the scheduler.

## `monitorStoreName` (type: `string`):

Named key-value store for monitor-mode state. Use distinct names to track different searches separately.

## `maxConcurrency` (type: `integer`):

How many pages to fetch in parallel. Lower this if you see Cloudflare blocks.

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

SRX blocks datacenter IPs — Apify RESIDENTIAL proxy with country SG is REQUIRED and pre-configured by default.

## Actor input object example

```json
{
  "listingType": "sale",
  "propertyType": "all",
  "district": "10,11",
  "startUrls": [],
  "maxItems": 100,
  "maxPagesPerSearch": 60,
  "includeDetails": false,
  "includeTransactedComparables": false,
  "monitorMode": false,
  "monitorStoreName": "srx-scraper-monitor",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "SG"
  }
}
```

# Actor output Schema

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

All scraped listing records in the default dataset. Use the Listings / Agent leads views to switch columns.

# 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 = {
    "startUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/srx-property-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 = { "startUrls": [] }

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": []
}' |
apify call scrapesage/srx-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/srx-property-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6vLYILeklKSRDqokP/builds/lhGN1C4HzxLlNAleF/openapi.json
