# 99.co Scraper | Singapore Indonesia Real Estate API (`lentic_clockss/ninetynine-co-sg-scraper`) Actor

Scrape 99.co Singapore & Indonesia — HDB, condo, landed, rooms, commercial, rumah, apartemen & ruko for sale or rent. Prices, MRT & images — 99.co API alternative.

- **URL**: https://apify.com/lentic\_clockss/ninetynine-co-sg-scraper.md
- **Developed by:** [kane liu](https://apify.com/lentic_clockss) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

### What does 99.co Scraper do?

**99.co Scraper** extracts Southeast Asia real estate listings from [99.co Singapore](https://www.99.co/singapore) and [99.co Indonesia](https://www.99.co/id). Cover **HDB**, **condo**, **landed houses**, **executive condo**, **room rentals**, and **commercial** (office, retail, industrial, warehouse, shophouse) in Singapore — plus Indonesian **rumah**, **apartemen**, **ruko**, **tanah**, **kost**, **vila**, and more — for **sale** and **rent**.

Pick a market (`SG` / `ID`), choose property types, or paste search/listing URLs, then download structured results as **JSON, CSV, Excel, or HTML**.

This Actor is a practical **99.co API alternative**: it opens live 99.co pages with Camoufox (browser anti-bot), reads **DOM cards + JSON-LD** (Singapore) or **`#__NEXT_DATA__`** (Indonesia), and normalizes prices, beds, baths, area, MRT / location, tags, and listing URLs for proptech, research, and CRM pipelines.

### What can this 99.co scraper extract?

| Data point | Description |
|---|---|
| Listing ID & URL | Stable ID / slug and canonical 99.co listing link |
| Market | `SG` or `ID` (+ currency `SGD` / `IDR`) |
| Channel | `BUY` (sale / jual) or `RENT` (rent / sewa) |
| Category / type | e.g. `condos-apartments`, `hdb`, `rooms`, `apartemen`, `rumah` |
| Title & project | Headline / project name when shown |
| Price | Amount + formatted price / PSF (SG) when available |
| Size & rooms | Floor area (sqft / sqm), bedrooms, bathrooms |
| Location | Address locality, region, MRT walk times (SG), geo when present |
| Tenure & year | Freehold / leasehold and built year when shown (SG) |
| Tags & badges | e.g. Top Pick, Verified, Fully Furnished |
| Contact controls | Call / WhatsApp button presence (numbers are not clicked) |
| Source layer | `dom_card`, `next_data`, `srp+ldp`, etc. |

### Why scrape 99.co?

- **Singapore market research** — track asking prices and inventory for HDB, condo, EC, and landed homes  
- **Indonesia property intelligence** — pull jual/sewa listings for rumah, apartemen, ruko, and commercial types  
- **Investment & proptech** — feed CRM, pricing models, or dashboards with fresh sale/rent data  
- **Competitive monitoring** — watch tags, PSF, and inventory shifts across categories  
- **Export & automation** — pull 99.co property data into Sheets, warehouses, or your own API  

### How to scrape 99.co

1. Open **99.co Scraper** in Apify Console.  
2. Set **market** (`SG` / `ID` / `all`), **channel** (`BUY` or `RENT`), and **property type(s)**, *or* paste 99.co **start URLs**.  
3. Choose **max listings** / **max pages** and whether to open **detail pages**.  
4. Keep **Apify Proxy → RESIDENTIAL** enabled (country defaults to **SG** or **ID** by market).  
5. Click **Start**, then export results from the **Dataset** tab.

#### Markets covered

| Code | Site | Typical proxy |
|---|---|---|
| `SG` | [99.co/singapore](https://www.99.co/singapore) | RESIDENTIAL + SG |
| `ID` | [99.co/id](https://www.99.co/id) | RESIDENTIAL + ID |

Not included: sister brands on different domains — **Rumah123.com**, **SRX**, **iProperty.com.sg**.

#### Property categories

| Market | Categories |
|---|---|
| Singapore (`SG`) | `hdb`, `condos-apartments`, `houses`, `executive-condominiums`, `rooms` (RENT), `commercial`, `shophouse`, `retail`, `offices`, `industrial`, `warehouse` |
| Indonesia (`ID`) | `rumah`, `apartemen`, `ruko`, `tanah`, `kost`, `gudang`, `vila`, `ruang-kantor`, `komersial`, `hotel`, `pabrik`, `gedung-bertingkat`, `toko`, `kios` (RENT) |

- `propertyType` — single category  
- `propertyTypes` — multi-select; overrides `propertyType` when non-empty  
- `all` expands each market’s primary navigation categories  

#### Example input — scrape Singapore condos, HDB, and houses for sale

```json
{
  "market": "SG",
  "channel": "BUY",
  "propertyTypes": ["condo", "hdb", "houses"],
  "maxItems": 30,
  "maxPages": 1,
  "scrapeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "SG"
  }
}
````

#### Example input — scrape Indonesia apartemen for sale

```json
{
  "market": "ID",
  "channel": "BUY",
  "propertyType": "apartemen",
  "maxItems": 20,
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "ID"
  }
}
```

#### Example input — scrape Singapore room rentals

```json
{
  "market": "SG",
  "channel": "RENT",
  "propertyType": "rooms",
  "maxItems": 20,
  "maxPages": 1
}
```

#### Example input — 99.co search URL

```json
{
  "startUrls": [
    {
      "url": "https://www.99.co/singapore/sale/condos-apartments"
    }
  ],
  "maxItems": 15,
  "maxPages": 1
}
```

#### Supported URL patterns

- Singapore sale/rent: `https://www.99.co/singapore/sale`, `/sale/hdb`, `/rent/rooms`, `/sale/commercial/offices`, …
- Singapore detail: `/singapore/{sale\|rent}/property/{slug}`
- Indonesia jual/sewa: `https://www.99.co/id/jual/apartemen`, `/id/sewa/rumah`, …
- Indonesia detail: `/id/properti/{slug}-cp-{id}`
- Pagination: SG `?page_num=2` · ID `?hlmn=2`

### How much does it cost to scrape 99.co?

This Actor uses **Pay per event** pricing. You pay for:

| Event | Price |
|---|---|
| **Actor Start** (`apify-actor-start`) | **$0.005** per start (scaled by run memory: one event per GB, minimum one) |
| **result** (`apify-default-dataset-item`) | **$2.50 / 1,000** results (**$0.0025** per listing in the default dataset) |

**Platform usage** (compute, residential proxy, etc.) is **also billed to the user** on top of event charges.

Example (illustrative): 1 start + 1,000 listings ≈ **$0.005 + $2.50** in event fees, plus platform usage for the run.

Tip: set a **max total charge** on the run if you want a hard spending cap. Start with `maxItems` 5–20 while validating fields and proxy.

### Input

Open the **Input** tab for the full schema. Main fields:

| Field | Purpose |
|---|---|
| `startUrls` | 99.co SG / ID search or listing URLs |
| `market` / `markets` | `SG`, `ID`, or `all` |
| `channel` | `BUY` or `RENT` |
| `propertyType` / `propertyTypes` | Category or multi-select (`all` expands primary cats) |
| `maxItems` / `maxPages` | Caps (fair-shared across categories) |
| `scrapeDetails` | Enrich each card from the listing detail page |
| `requestDelayMillis` | Delay between navigations |
| `proxyConfiguration` | Prefer Apify **RESIDENTIAL**; country matched to market when omitted |

### Output example

You can download the dataset extracted by 99.co Scraper in JSON, HTML, CSV, or Excel.

```json
{
  "id": "balmoral-tower-condo-7T4xvri2E4dJWdoFwmWVFz",
  "url": "https://www.99.co/singapore/sale/property/balmoral-tower-condo-7T4xvri2E4dJWdoFwmWVFz",
  "source": "99.co",
  "market": "SG",
  "sourceCountry": "SG",
  "channel": "BUY",
  "operationType": "sale",
  "propertyType": "condos-apartments",
  "title": "Balmoral Tower",
  "price": 12380000,
  "priceCurrency": "SGD",
  "priceFormatted": "S$ 12,380,000",
  "pricePsf": 2474,
  "bedrooms": "6+1",
  "floorAreaSqft": 5005,
  "mrt": {
    "name": "Newton MRT",
    "walkMinutes": 8,
    "distanceM": 587
  },
  "scrapedAt": "2026-07-18T14:03:14.875380+00:00"
}
```

Indonesia example (`IDR`):

```json
{
  "id": "1013025068",
  "url": "https://www.99.co/id/properti/apartemen-dijual-600jt-tangerang-cp-1013025068",
  "source": "99.co",
  "market": "ID",
  "channel": "BUY",
  "propertyType": "apartemen",
  "title": "Dijual Segera Apartemen 1 KT & 1 KM di Tangerang, Tangerang",
  "price": 600000000,
  "priceCurrency": "IDR",
  "priceFormatted": "Rp 600 Juta",
  "bedrooms": 1,
  "sourceLayer": "next_data",
  "scrapedAt": "2026-07-18T14:32:56.000000+00:00"
}
```

### Is it legal to scrape 99.co?

Our scrapers are ethical and do not extract private user data that is not shown on public listing pages. They only extract what 99.co has chosen to display publicly.

**Contact policy:** Call / WhatsApp / Show phone controls are detected as presence flags only (`callButtonPresent`, `whatsappButtonPresent`). Phone numbers are **never clicked, revealed, or stored** (`contact.phoneNumber` is always `null`).

You should still comply with site terms, applicable Singapore / Indonesia and international laws (including personal-data rules for agent contacts), and only scrape when you have a legitimate purpose. If unsure, consult your lawyers.

### Actor name note

The platform Actor slug remains `ninetynine-co-sg-scraper` for continuity (historical SG-first publish). The Store **title/description** cover **Singapore + Indonesia**. Functionally this Actor scrapes both markets on `www.99.co`.

### FAQ

#### How do I scrape 99.co Singapore condos for sale?

Set `market` to `SG`, `channel` to `BUY`, and `propertyType` to `condo` (or `condos-apartments`). Keep **RESIDENTIAL + SG** proxy enabled.

#### How do I scrape 99.co Indonesia apartemen or rumah?

Set `market` to `ID`, `channel` to `BUY` or `RENT`, and `propertyType` to `apartemen` or `rumah`. Use `apifyProxyCountry: "ID"`.

#### How do I scrape HDB listings on 99.co?

Use `market: "SG"` and `propertyType: "hdb"` (sale or rent). HDB is Singapore-only.

#### How do I scrape 99.co room rentals?

Set `channel` to `RENT` and `propertyType` to `rooms`. The Actor uses `/singapore/rent/rooms`.

#### How do I scrape commercial offices or shops on 99.co?

Set `market` to `SG` and `propertyType` to `offices`, `retail`, `industrial`, `warehouse`, `shophouse`, or `commercial`.

#### Do I need a 99.co API key?

No. This Actor scrapes the public 99.co websites and returns structured property data — useful when you need a **99.co data API** without an official partnership.

#### Can I export 99.co listings to Google Sheets or Excel?

Yes. Download the Dataset as Excel/CSV, or use Apify **integrations** and the Dataset API to push results into Sheets, webhooks, or your backend.

#### Why is a residential proxy required?

99.co uses Cloudflare. Plain HTTP often returns **403** / “Just a moment…”. Cloud runs should use Apify **RESIDENTIAL** with country **SG** or **ID**.

#### What if a 99.co scrape returns zero results?

Confirm market / category URL, keep the matching residential proxy on, try a smaller `maxItems`, and inspect Key-Value Store `ERROR_SUMMARY` / `OUTPUT` / `DEBUG_*` records.

### Tips for better 99.co scraping

- Prefer **`propertyTypes`** for multi-category runs; use `all` to expand primary categories.
- Enable **`scrapeDetails`** when you need richer LDP fields (description, geo, sections).
- Keep **`requestDelayMillis`** around 1500–2500 for stable sessions.
- Start with small `maxItems` to validate price / category tags before scaling.
- Match proxy country to market (`SG` vs `ID`) for higher success rates.

### Support

Questions or feature requests? Open an issue on the Actor page or contact the developer through Apify. Feedback on additional filters, districts, or export formats is welcome.

# Actor input Schema

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

99.co SG (/singapore/...) or ID (/id/...) search/listing URLs. Overrides market-built searches when provided.

## `market` (type: `string`):

Primary market: SG (Singapore), ID (Indonesia), or all.

## `markets` (type: `array`):

Optional multi-select. When set, overrides single market (except startUrls).

## `channel` (type: `string`):

BUY (sale/jual) or RENT (rent/sewa).

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

Single category. Use all to expand each market's primary categories. Ignored when propertyTypes is non-empty.

## `propertyTypes` (type: `array`):

Multi-select categories. Takes precedence over propertyType when non-empty.

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

Maximum listing records to emit (fair-shared across markets/categories).

## `maxPages` (type: `integer`):

Maximum search-result pages per start URL (SG: page\_num, ID: hlmn).

## `scrapeDetails` (type: `boolean`):

When true, open each listing LDP and merge detail fields.

## `requestDelayMillis` (type: `integer`):

Delay before each navigation to reduce Cloudflare challenge rate.

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

Use Apify RESIDENTIAL proxies. Country defaults to market (SG or ID) when omitted.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.99.co/singapore/sale/condos-apartments"
    }
  ],
  "market": "SG",
  "channel": "BUY",
  "propertyType": "all",
  "maxItems": 20,
  "maxPages": 1,
  "scrapeDetails": false,
  "requestDelayMillis": 2000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Normalized 99.co listing records from SRP and optional LDP enrichment.

## `runSummary` (type: `string`):

Counts, engine, warnings, and timestamps for the run.

# 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": [
        {
            "url": "https://www.99.co/singapore/sale/condos-apartments"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lentic_clockss/ninetynine-co-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": [{ "url": "https://www.99.co/singapore/sale/condos-apartments" }] }

# Run the Actor and wait for it to finish
run = client.actor("lentic_clockss/ninetynine-co-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": [
    {
      "url": "https://www.99.co/singapore/sale/condos-apartments"
    }
  ]
}' |
apify call lentic_clockss/ninetynine-co-sg-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "99.co Scraper | Singapore Indonesia Real Estate API",
        "description": "Scrape 99.co Singapore & Indonesia — HDB, condo, landed, rooms, commercial, rumah, apartemen & ruko for sale or rent. Prices, MRT & images — 99.co API alternative.",
        "version": "0.3",
        "x-build-id": "WiYecWosyDsrlryUK"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lentic_clockss~ninetynine-co-sg-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lentic_clockss-ninetynine-co-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/lentic_clockss~ninetynine-co-sg-scraper/runs": {
            "post": {
                "operationId": "runs-sync-lentic_clockss-ninetynine-co-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/lentic_clockss~ninetynine-co-sg-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-lentic_clockss-ninetynine-co-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": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "99.co SG (/singapore/...) or ID (/id/...) search/listing URLs. Overrides market-built searches when provided.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "market": {
                        "title": "Market",
                        "enum": [
                            "SG",
                            "ID",
                            "all"
                        ],
                        "type": "string",
                        "description": "Primary market: SG (Singapore), ID (Indonesia), or all.",
                        "default": "SG"
                    },
                    "markets": {
                        "title": "Markets (multi)",
                        "type": "array",
                        "description": "Optional multi-select. When set, overrides single market (except startUrls).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "SG",
                                "ID",
                                "all"
                            ]
                        }
                    },
                    "channel": {
                        "title": "Channel",
                        "enum": [
                            "BUY",
                            "RENT"
                        ],
                        "type": "string",
                        "description": "BUY (sale/jual) or RENT (rent/sewa).",
                        "default": "BUY"
                    },
                    "propertyType": {
                        "title": "Property type (single)",
                        "enum": [
                            "all",
                            "apartemen",
                            "apartment",
                            "commercial",
                            "condo",
                            "condos-apartments",
                            "executive-condo",
                            "executive-condominiums",
                            "gedung-bertingkat",
                            "gudang",
                            "hdb",
                            "hotel",
                            "houses",
                            "industrial",
                            "kios",
                            "komersial",
                            "kost",
                            "landed",
                            "office",
                            "offices",
                            "pabrik",
                            "retail",
                            "room",
                            "rooms",
                            "ruang-kantor",
                            "ruko",
                            "rumah",
                            "shophouse",
                            "tanah",
                            "toko",
                            "vila",
                            "villa",
                            "warehouse"
                        ],
                        "type": "string",
                        "description": "Single category. Use all to expand each market's primary categories. Ignored when propertyTypes is non-empty.",
                        "default": "all"
                    },
                    "propertyTypes": {
                        "title": "Property types (multi)",
                        "type": "array",
                        "description": "Multi-select categories. Takes precedence over propertyType when non-empty.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "all",
                                "apartemen",
                                "apartment",
                                "commercial",
                                "condo",
                                "condos-apartments",
                                "executive-condo",
                                "executive-condominiums",
                                "gedung-bertingkat",
                                "gudang",
                                "hdb",
                                "hotel",
                                "houses",
                                "industrial",
                                "kios",
                                "komersial",
                                "kost",
                                "landed",
                                "office",
                                "offices",
                                "pabrik",
                                "retail",
                                "room",
                                "rooms",
                                "ruang-kantor",
                                "ruko",
                                "rumah",
                                "shophouse",
                                "tanah",
                                "toko",
                                "vila",
                                "villa",
                                "warehouse"
                            ]
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum listing records to emit (fair-shared across markets/categories).",
                        "default": 20
                    },
                    "maxPages": {
                        "title": "Max SRP pages",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum search-result pages per start URL (SG: page_num, ID: hlmn).",
                        "default": 1
                    },
                    "scrapeDetails": {
                        "title": "Scrape detail pages",
                        "type": "boolean",
                        "description": "When true, open each listing LDP and merge detail fields.",
                        "default": false
                    },
                    "requestDelayMillis": {
                        "title": "Request delay (ms)",
                        "minimum": 0,
                        "maximum": 20000,
                        "type": "integer",
                        "description": "Delay before each navigation to reduce Cloudflare challenge rate.",
                        "default": 2000
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Use Apify RESIDENTIAL proxies. Country defaults to market (SG or ID) when omitted.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
