# 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:** 2 total users, 1 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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.

### 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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "SRX Property Scraper - Singapore Listings & Agent Leads",
        "description": "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.",
        "version": "0.1",
        "x-build-id": "bsAnw8LOugxcrUcZr"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~srx-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-srx-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapesage~srx-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-srx-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapesage~srx-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-srx-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "listingType": {
                        "title": "Sale or rent",
                        "enum": [
                            "sale",
                            "rent",
                            "both"
                        ],
                        "type": "string",
                        "description": "Scrape properties for sale, for rent, or both.",
                        "default": "sale"
                    },
                    "propertyType": {
                        "title": "Property type",
                        "enum": [
                            "all",
                            "condo",
                            "hdb",
                            "landed",
                            "commercial"
                        ],
                        "type": "string",
                        "description": "Which SRX property category to scrape. 'All' covers every residential type; 'commercial' covers offices, retail, F&B and industrial.",
                        "default": "all"
                    },
                    "district": {
                        "title": "District(s)",
                        "type": "string",
                        "description": "Optional Singapore postal district filter, e.g. \"10\" or \"9,10,11\" (D01–D28). Leave blank for all Singapore."
                    },
                    "bedrooms": {
                        "title": "Bedrooms",
                        "type": "string",
                        "description": "Optional minimum number of bedrooms (SRX filter), e.g. \"2\"."
                    },
                    "minPrice": {
                        "title": "Min price (SGD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional minimum price (sale) or monthly rent (rent)."
                    },
                    "maxPrice": {
                        "title": "Max price (SGD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional maximum price (sale) or monthly rent (rent)."
                    },
                    "startUrls": {
                        "title": "Start URLs (optional)",
                        "type": "array",
                        "description": "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/...",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max listings",
                        "minimum": 1,
                        "maximum": 20000,
                        "type": "integer",
                        "description": "Maximum number of listings to scrape. Keep modest for quick runs; set higher for large exports.",
                        "default": 100
                    },
                    "maxPagesPerSearch": {
                        "title": "Max pages per search",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Safety cap on how many result pages (20 listings each) to crawl per search.",
                        "default": 60
                    },
                    "includeDetails": {
                        "title": "Include listing details",
                        "type": "boolean",
                        "description": "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.",
                        "default": false
                    },
                    "includeTransactedComparables": {
                        "title": "Include transacted comparables (valuation layer)",
                        "type": "boolean",
                        "description": "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).",
                        "default": false
                    },
                    "monitorMode": {
                        "title": "Monitor mode (only new / changed)",
                        "type": "boolean",
                        "description": "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.",
                        "default": false
                    },
                    "monitorStoreName": {
                        "title": "Monitor store name",
                        "type": "string",
                        "description": "Named key-value store for monitor-mode state. Use distinct names to track different searches separately.",
                        "default": "srx-scraper-monitor"
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many pages to fetch in parallel. Lower this if you see Cloudflare blocks.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "SRX blocks datacenter IPs — Apify RESIDENTIAL proxy with country SG is REQUIRED and pre-configured by default.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "SG"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
