# EdgeProp.sg Scraper — Singapore Real Estate Data (`logiover/edgeprop-sg-scraper`) Actor

Scrape EdgeProp.sg Singapore property listings (sale & rent): price, PSF, bedrooms, bathrooms, floor area, project, district, tenure, images plus the listing agent name, agency, agent ID and mobile. No login, no API key. Great for Singapore property data export and real-estate agent lead generation.

- **URL**: https://apify.com/logiover/edgeprop-sg-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

<div align="center">

<img src="https://cdn-icons-png.flaticon.com/128/619/619153.png" width="92" alt="EdgeProp.sg Scraper"/>

## 🏙️ EdgeProp Scraper — Singapore Property Data

#### Scrape **edgeprop.sg** Singapore property listings — price, PSF, bedrooms, floor area, project, district, tenure **and the property agent (name · CEA ID · agency · phone)**

<p>
<img src="https://img.shields.io/badge/✓_NO_LOGIN-no_API_key-2ea44f?style=for-the-badge&labelColor=0b3d2e"/>
<img src="https://img.shields.io/badge/🇸🇬_EDGEPROP.SG-sale_+_rent-ff5722?style=for-the-badge&labelColor=7a2410"/>
<img src="https://img.shields.io/badge/🏙️_ALL_OF-Singapore-1f6feb?style=for-the-badge&labelColor=0b2e6b"/>
</p>
<p>
<img src="https://img.shields.io/badge/Condo-+_Apartment-008060?style=flat-square"/>
<img src="https://img.shields.io/badge/HDB-resale_+_rent-e91e63?style=flat-square"/>
<img src="https://img.shields.io/badge/Landed-+_Cluster-9c27b0?style=flat-square"/>
<img src="https://img.shields.io/badge/PSF_+_tenure-floor_area-4caf50?style=flat-square"/>
<img src="https://img.shields.io/badge/Export-JSON·CSV·Excel·API-f59e0b?style=flat-square"/>
</p>

<br/>

</div>

## EdgeProp.sg Scraper — Singapore Real Estate Data Export

This **EdgeProp scraper** turns <a href="https://www.edgeprop.sg">edgeprop.sg</a>, one of Singapore's leading real-estate portals, into clean, structured **Singapore property data** — every condo, HDB flat and landed home for sale or rent, with **no login and no API key**. Pull asking price, PSF, floor area, bedrooms, project, district and tenure, plus the **property agent leads** (name, CEA registration number, agency and phone) behind each listing. It works as a practical **Singapore real estate API** and a ready-made **PropertyGuru alternative data** source, exporting straight to CSV, Excel or JSON.

---

### What does the EdgeProp.sg scraper do?

EdgeProp.sg is a major Singapore property portal listing condos, HDB flats and landed homes for sale and rent across the island. The site has **no public API**, so this **edgeprop.sg scraper** reads its own structured Next.js listing data directly and returns one clean row per property — no account, no token, no manual copy-pasting.

In one run it gives you two things at once:

> 🏙️ a **Singapore property listings** dataset — for market analysis, price/PSF tracking, comps, dashboards and ML — and
> 🎯 a **Singapore property agent leads** engine — every listing carries the agent's name, CEA ID, agency and phone, so a single run becomes a targeted broker outreach list.

---

### ✨ Features

- 🏙️ **All segments** — condo / apartment, **HDB** (resale + rent) and **landed**, for both **sale and rent**.
- 💰 **Full pricing** — asking price (SGD), raw price string and **PSF (price per sqft)** on every listing.
- 📐 **Size & layout** — floor area (sqft + sqm), land area (sqft + sqm), **bedrooms** and bathrooms.
- 📍 **Location detail** — project / development, street, postal code, postal district, planning region and market segment (CCR / RCR / OCR).
- 📜 **Tenure & age** — freehold / leasehold tenure and year completed.
- 🎯 **Agent leads** — agent name, **CEA registration number**, agency, **phone number** and agent profile URL.
- 🔓 **No login, no API key** — reads public listing data; works as an unofficial **EdgeProp API** alternative.
- 📤 **Export anywhere** — download as **CSV, Excel or JSON**, or pull from the Apify API / webhooks.
- 📈 **High-volume mode** — price-band sharding pulls thousands of unique listings per category (deduped by listing ID).

---

### 📤 What data you get

One clean row per property listing:

| Field | Description |
|---|---|
| `listingId` | Unique EdgeProp listing ID |
| `url` | Canonical listing URL on edgeprop.sg |
| `listingType` | `sale` or `rent` |
| `propertyType` | Property type (e.g. Apartment / Condo) |
| `propertySubType` | Sub-type (e.g. Condominium, Executive Condominium) |
| `title` | Listing / project title |
| `project` | Project or development name |
| `street` | Street name |
| `postalCode` | Singapore postal code |
| `district` | Postal district (e.g. 11) |
| `planningRegion` | Planning region (e.g. Central Region) |
| `projectRegion` | Market segment — CCR / RCR / OCR |
| `price` | Asking price (numeric) |
| `priceRaw` | Raw price string as shown on the site |
| `priceCurrency` | Currency (SGD) |
| `psf` | Price per square foot |
| `bedrooms` | Number of bedrooms |
| `bathrooms` | Number of bathrooms |
| `floorAreaSqft` | Floor / built-up area in sqft |
| `floorAreaSqm` | Floor / built-up area in sqm |
| `landAreaSqft` | Land area in sqft (landed) |
| `landAreaSqm` | Land area in sqm (landed) |
| `tenure` | Tenure (Freehold / 99-year leasehold, etc.) |
| `yearCompleted` | Year the development was completed |
| `assetId` | EdgeProp internal asset / project ID |
| `agentName` | Listing agent's name |
| `agentId` | Agent's **CEA registration number** |
| `agency` | Agency / brokerage name |
| `agentPhone` | Agent's phone number |
| `agentUrl` | Agent's public profile URL |
| `image` | Main listing photo URL |
| `scrapedAt` | ISO timestamp of when the row was scraped |

---

### ⚙️ How to use

Pick a segment with the simple selectors, or paste EdgeProp category URLs straight from your browser.

<table>
<thead><tr><th align="left">Field</th><th align="left">What it does</th></tr></thead>
<tbody>
<tr><td><code>propertyType</code></td><td><code>condo</code>, <code>hdb</code>, <code>landed</code> or <code>any</code>. Picks the EdgeProp category.</td></tr>
<tr><td><code>listingType</code></td><td><code>sale</code> or <code>rent</code> (also <code>room</code> for room rentals).</td></tr>
<tr><td><code>startUrls</code></td><td>Optional. Paste edgeprop.sg listing / category URLs from the site — these override the selectors above.</td></tr>
<tr><td><code>maxResults</code></td><td>Global cap across all categories. <code>0</code> = no limit.</td></tr>
<tr><td><code>maxResultsPerSearch</code></td><td>Per-category cap. <code>0</code> = no cap.</td></tr>
<tr><td><code>priceShardSharding</code></td><td><b>High-volume mode.</b> Slices each category into asking-price bands to pull thousands of unique listings. Off = top 20 per category.</td></tr>
<tr><td><code>useProxy</code> / <code>proxyConfiguration</code></td><td>Apify Proxy — datacenter (default) is enough for edgeprop.sg.</td></tr>
</tbody>
</table>

#### Example 1 — Condos for sale

```json
{
  "propertyType": "condo",
  "listingType": "sale",
  "maxResults": 1000
}
````

#### Example 2 — HDB flats for rent

```json
{
  "propertyType": "hdb",
  "listingType": "rent",
  "maxResults": 500
}
```

#### Example 3 — Paste a specific EdgeProp search URL

```json
{
  "startUrls": [
    "https://www.edgeprop.sg/condo-apartment-for-sale",
    "https://www.edgeprop.sg/hdb-for-rent"
  ],
  "maxResults": 2000
}
```

***

### 📦 Example output

```json
{
  "listingId": "m_1980317",
  "url": "https://www.edgeprop.sg/listing/apartment-condo/condominium/26-NEWTON/m_1980317",
  "listingType": "sale",
  "propertyType": "Apartment / Condo",
  "propertySubType": "Condominium",
  "title": "26 NEWTON",
  "project": "26 NEWTON",
  "street": "Newton Road",
  "postalCode": "307957",
  "district": "11",
  "planningRegion": "Central Region",
  "projectRegion": "CCR",
  "price": 2110900,
  "priceRaw": "S$ 2,110,900",
  "priceCurrency": "SGD",
  "psf": 1886,
  "bedrooms": 2,
  "bathrooms": 2,
  "floorAreaSqft": 1119,
  "floorAreaSqm": 103.96,
  "landAreaSqft": null,
  "landAreaSqm": null,
  "tenure": "Freehold",
  "yearCompleted": "2016",
  "assetId": "13245",
  "agentName": "Martin Goh",
  "agentId": "R001839F",
  "agency": "REALSTAR PREMIER GROUP PRIVATE LIMITED",
  "agentPhone": "93202020",
  "agentUrl": "https://www.edgeprop.sg/property-agents/Martin-Goh-93202020",
  "image": "https://img.tepcdn.com/.../e8bcdf6e.jpg",
  "scrapedAt": "2026-06-07T10:31:24.950Z"
}
```

***

### 🎯 Use cases

| | Use case | How |
|---|---|---|
| 📊 | **Singapore property market analysis** | Track asking prices, PSF, inventory and sale-vs-rent across districts and CCR / RCR / OCR. |
| 🎯 | **Agent & brokerage lead generation** | Build outreach lists of Singapore property agents (name · CEA ID · agency · phone) by area, price band or property type. |
| 🧮 | **Rental yield & PSF research** | Compare rents against sale prices and PSF per project to compute gross yield. |
| 💹 | **Investment screening** | Filter condo / HDB / landed by tenure, year completed, size and price to shortlist deals. |
| 🗂️ | **Portals & dashboards** | Power a Singapore property feed or BI dashboard from a scheduled run. |

***

### ❓ FAQ

#### Is there an EdgeProp API?

No. EdgeProp.sg does not offer a public API for its listings. This actor works as an unofficial **EdgeProp API** alternative — it reads the site's own structured listing data and returns clean, machine-readable rows (JSON / CSV / Excel) with no API key.

#### Can I scrape Singapore property listings without login?

Yes. The scraper reads public edgeprop.sg listing data **without any login or account**. Just pick a segment or paste EdgeProp category URLs and run it — no credentials needed.

#### Does it include the property agent's phone number?

For most listings, yes. The `agentPhone` is parsed from the agent's public CEA profile URL, alongside the agent name, **CEA registration number** (`agentId`), agency and profile link. A small share of listings expose no agent phone, in which case the field is empty.

#### How do I export Singapore property data to Excel?

Run the actor on any segment or EdgeProp URL, then open the **Output** tab and download the dataset as **Excel (XLSX), CSV or JSON** — or pull it straight from the Apify API. Every property and agent field listed above is included.

#### Is scraping edgeprop.sg legal?

The actor collects only **publicly available** listing data — the same information any visitor can see without logging in. You are responsible for complying with EdgeProp's terms of use and your local regulations, including Singapore's PDPA when handling property-agent contact details.

***

### 📝 Coverage & honest notes

- **Agent phone:** `agentPhone` is available for **most** listings, parsed from each agent's CEA profile URL. Where EdgeProp does not expose it, the field is empty.
- **Property coverage:** the scraper covers **condo / HDB / landed for both sale and rent**. Because EdgeProp renders only the first page (≈20 listings) for a bare category URL, **high-volume mode (price-band sharding)** slices each category into asking-price bands to maximize coverage and pull thousands of unique, deduplicated listings.
- **Fair use:** this tool accesses public listing data for research, analytics and lead generation. Respect edgeprop.sg's terms, use reasonable rates, and handle any personal data (agent details) lawfully under the PDPA and your local rules.

***

<div align="center">

#### ▶️ Ready to run

<img src="https://img.shields.io/badge/Click_Start-and_scrape_edgeprop.sg-ff5722?style=for-the-badge&labelColor=7a2410"/>

<sub>No login · No API key · JSON · CSV · Excel · API</sub>

</div>

# Actor input Schema

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

Which Singapore property segment to scrape. Ignored when you supply your own Start URLs below.

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

For sale, for rent, or room rental. Ignored when you supply your own Start URLs below.

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

Optional: paste EdgeProp.sg category URLs straight from the site, e.g. https://www.edgeprop.sg/condo-apartment-for-sale or https://www.edgeprop.sg/hdb-for-rent . When set, these override the Property type / Listing type selectors above. Any '/all' suffix and query string are normalized automatically.

## `maxResults` (type: `integer`):

Stop after this many listings across all categories. 0 = no limit. Singapore inventory spans tens of thousands of listings.

## `maxResultsPerSearch` (type: `integer`):

Cap listings per individual category. 0 = no per-category cap.

## `priceShardSharding` (type: `boolean`):

EdgeProp renders only the first page (20 listings) for a bare category URL. With this ON the scraper slices each category into asking-price bands so it can pull thousands of unique listings (deduplicated by listing ID). Turn OFF to grab just the top 20 recommended listings per category.

## `useProxy` (type: `boolean`):

Route requests through Apify Proxy. EdgeProp.sg works well over the default datacenter proxy.

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

Apify Proxy settings. Datacenter (the default) is sufficient for EdgeProp.sg. Switch to RESIDENTIAL only if you hit persistent challenges.

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

How many price-band requests to fetch in parallel per category.

## Actor input object example

```json
{
  "propertyType": "condo",
  "listingType": "sale",
  "startUrls": [],
  "maxResults": 200,
  "maxResultsPerSearch": 0,
  "priceShardSharding": true,
  "useProxy": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 4
}
```

# Actor output Schema

## `listingId` (type: `string`):

EdgeProp listing ID

## `url` (type: `string`):

Listing URL

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

sale, rent or room

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

Property type (e.g. Apartment / Condo, HDB, Landed)

## `propertySubType` (type: `string`):

Sub-type (e.g. Condominium, 5I (Improved), Cluster House)

## `title` (type: `string`):

Listing title

## `project` (type: `string`):

Project or development name

## `street` (type: `string`):

Street name

## `postalCode` (type: `string`):

Singapore postal code

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

Singapore postal district

## `planningRegion` (type: `string`):

Planning region (e.g. Central Region)

## `projectRegion` (type: `string`):

Market segment (CCR / RCR / OCR)

## `price` (type: `string`):

Asking price in SGD (number)

## `priceRaw` (type: `string`):

Raw asking price value

## `priceCurrency` (type: `string`):

Currency (SGD)

## `psf` (type: `string`):

Asking price per square foot

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

Number of bedrooms

## `bathrooms` (type: `string`):

Number of bathrooms

## `floorAreaSqft` (type: `string`):

Floor area in square feet

## `floorAreaSqm` (type: `string`):

Floor area in square metres

## `landAreaSqft` (type: `string`):

Land area in square feet (landed)

## `landAreaSqm` (type: `string`):

Land area in square metres (landed)

## `tenure` (type: `string`):

Tenure (e.g. Freehold, 99 years)

## `yearCompleted` (type: `string`):

Year the project was completed

## `assetId` (type: `string`):

EdgeProp project/asset ID

## `agentName` (type: `string`):

Listing agent name (B2B lead)

## `agentId` (type: `string`):

Agent CEA registration number

## `agentPhone` (type: `string`):

Agent mobile number (Singapore), parsed from the agent profile URL

## `agentUrl` (type: `string`):

Agent profile URL on EdgeProp

## `agentPhoto` (type: `string`):

Agent photo URL

## `agency` (type: `string`):

Agency / brokerage name

## `developerListing` (type: `string`):

Whether this is a developer listing

## `isNewLaunch` (type: `string`):

Whether the project is a new launch

## `imageCount` (type: `string`):

Number of listing images

## `image` (type: `string`):

Main image URL

## `insights` (type: `string`):

EdgeProp neighbourhood / valuation insight tags

## `updatedAt` (type: `string`):

Listing last-updated timestamp

## `scrapedAt` (type: `string`):

Scraped at

# 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("logiover/edgeprop-sg-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("logiover/edgeprop-sg-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 logiover/edgeprop-sg-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "EdgeProp.sg Scraper — Singapore Real Estate Data",
        "description": "Scrape EdgeProp.sg Singapore property listings (sale & rent): price, PSF, bedrooms, bathrooms, floor area, project, district, tenure, images plus the listing agent name, agency, agent ID and mobile. No login, no API key. Great for Singapore property data export and real-estate agent lead generation.",
        "version": "1.0",
        "x-build-id": "7x5upFoGm26axolG5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~edgeprop-sg-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-edgeprop-sg-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/logiover~edgeprop-sg-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-edgeprop-sg-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/logiover~edgeprop-sg-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-edgeprop-sg-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": {
                    "propertyType": {
                        "title": "Property type",
                        "enum": [
                            "condo",
                            "hdb",
                            "landed",
                            "any"
                        ],
                        "type": "string",
                        "description": "Which Singapore property segment to scrape. Ignored when you supply your own Start URLs below.",
                        "default": "condo"
                    },
                    "listingType": {
                        "title": "Listing type",
                        "enum": [
                            "sale",
                            "rent",
                            "room"
                        ],
                        "type": "string",
                        "description": "For sale, for rent, or room rental. Ignored when you supply your own Start URLs below.",
                        "default": "sale"
                    },
                    "startUrls": {
                        "title": "Start URLs (optional)",
                        "type": "array",
                        "description": "Optional: paste EdgeProp.sg category URLs straight from the site, e.g. https://www.edgeprop.sg/condo-apartment-for-sale or https://www.edgeprop.sg/hdb-for-rent . When set, these override the Property type / Listing type selectors above. Any '/all' suffix and query string are normalized automatically.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max results (total)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after this many listings across all categories. 0 = no limit. Singapore inventory spans tens of thousands of listings.",
                        "default": 200
                    },
                    "maxResultsPerSearch": {
                        "title": "Max results per category",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap listings per individual category. 0 = no per-category cap.",
                        "default": 0
                    },
                    "priceShardSharding": {
                        "title": "High-volume mode (price-band sharding)",
                        "type": "boolean",
                        "description": "EdgeProp renders only the first page (20 listings) for a bare category URL. With this ON the scraper slices each category into asking-price bands so it can pull thousands of unique listings (deduplicated by listing ID). Turn OFF to grab just the top 20 recommended listings per category.",
                        "default": true
                    },
                    "useProxy": {
                        "title": "Use Apify Proxy",
                        "type": "boolean",
                        "description": "Route requests through Apify Proxy. EdgeProp.sg works well over the default datacenter proxy.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy settings. Datacenter (the default) is sufficient for EdgeProp.sg. Switch to RESIDENTIAL only if you hit persistent challenges.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 6,
                        "type": "integer",
                        "description": "How many price-band requests to fetch in parallel per category.",
                        "default": 4
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
