# Rumah123 Scraper With Agents | Fast & Reliable (`fatihtahta/rumah123-scraper`) Actor

Extract structured Indonesian property listings from Rumah123 with agent data, pricing, locations, and property details. Built for enterprise-grade real estate intelligence, lead generation, and automated CRM or analytics pipelines across Indonesia markets.

- **URL**: https://apify.com/fatihtahta/rumah123-scraper.md
- **Developed by:** [Fatih Tahta](https://apify.com/fatihtahta) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 22 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

## Rumah123 Scraper

**Slug:** fatihtahta/rumah123-scraper

### Overview

Rumah123 Scraper collects structured property listing data from Rumah123, including titles, prices, property types, listing status, locations, room counts, sizes, facilities, media, and agent or agency details when available. It is designed for teams that need consistent listing data from search pages or specific listing URLs without manual copy-paste. [Rumah123](https://www.rumah123.com) is one of Indonesia's major real estate marketplaces, making it a useful source for property market analysis, inventory tracking, lead enrichment, and localized research. The actor automates repetitive collection workflows and returns standardized JSON records you can use directly in reports, pipelines, and operational systems. This helps reduce manual effort, improve consistency across runs, and save time when working at scale.

### Why Use This Actor

- **Market researchers and analysts:** Track listing supply, pricing, property mix, and geographic trends across cities, districts, and listing types.
- **Product and content teams:** Build property directories, landing pages, market snapshots, and neighborhood content with structured listing data.
- **Developers and data engineers:** Feed ETL jobs, dashboards, warehouses, and APIs with JSON records that are easy to store, transform, and join.
- **Lead generation and enrichment teams:** Identify listings, agents, agencies, and location-level inventory for outreach, enrichment, or qualification workflows.
- **Monitoring and competitive tracking:** Watch changes in price ranges, promotions, furnishing mix, and available inventory for selected markets or URL sets.

### Input Parameters

Provide any combination of URLs, queries, and filters to define the listings you want to collect.

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `listingType` | `string` | Listing category to collect. Allowed values: `sale` (for sale), `rent` (for rent). | `sale` |
| `sortOrder` | `string` | Sort order for results. Allowed values: `recommended`, `price-asc`, `price-desc`, `posted-desc`, `posted-asc`, `land-size-desc`, `building-size-desc`. | `recommended` |
| `location` | `string` | Location keyword such as a city, district, neighborhood, street, or landmark. Example: `Jakarta Selatan`, `Bandung`, `Nusa Dua`. | – |
| `promotions` | `string[]` | Promotional filters to include. Allowed values: `promotion`, `price-reduced`, `free-fees`, `zero-dp`, `bank-owned`, `njop`. | `[]` |
| `property-type` | `string[]` | Property categories to include. Allowed values: `house`, `apartment`, `land`, `shophouse`, `factory`, `office`, `commercial-space`, `warehouse`, `villa`, `boarding-house`, `hotel`. | `[]` |
| `min_price` | `integer` | Minimum listing price in IDR. Leave empty to avoid a lower price bound. | – |
| `max_price` | `integer` | Maximum listing price in IDR. Leave empty to avoid an upper price bound. | – |
| `min_bedrooms` | `string` | Minimum bedroom count. Allowed values: `1`, `2`, `3`, `4`. | – |
| `min_bathrooms` | `string` | Minimum bathroom count. Allowed values: `1`, `2`, `3`, `4`. | – |
| `min_floors` | `string` | Minimum number of floors. Allowed values: `1`, `2`, `3`, `4`. | – |
| `furninshing_condition` | `string[]` | Furnishing preferences to include. Allowed values: `fully-furnished`, `partially-furnished`, `unfurnished`. | `[]` |
| `property_facilities` | `string[]` | Facilities the listing should mention. Allowed values: `air-conditioning`, `parking`, `cctv`, `security`, `wifi`. | `[]` |
| `min_land_size` | `integer` | Minimum land size in square meters. | – |
| `max_land_size` | `integer` | Maximum land size in square meters. | – |
| `min_building_size` | `integer` | Minimum building size in square meters. | – |
| `max_building_size` | `integer` | Maximum building size in square meters. | – |
| `startUrls` | `string[]` | One or more direct Rumah123 URLs. You can provide search result pages or individual listing URLs. When present, these URLs are used instead of the search filters above. | – |
| `limit` | `integer` | Maximum number of listings to collect per search or start URL. Leave empty to collect all available results. | – |

### Example Inputs

#### Scenario: Search by location and price band

```json
{
  "listingType": "sale",
  "sortOrder": "price-desc",
  "location": "Jakarta Selatan",
  "property-type": ["house"],
  "min_price": 1500000000,
  "max_price": 5000000000,
  "min_bedrooms": "3",
  "limit": 150
}
```

#### Scenario: Direct URL collection

```json
{
  "startUrls": [
    "https://www.rumah123.com/jual/cari/?location=bali",
    "https://www.rumah123.com/properti/badung/hos40272095/"
  ],
  "limit": 100
}
```

#### Scenario: Filtered rental search

```json
{
  "listingType": "rent",
  "location": "Bandung",
  "property-type": ["apartment"],
  "max_price": 120000000,
  "min_bathrooms": "1",
  "furninshing_condition": ["fully-furnished"],
  "property_facilities": ["parking", "security", "wifi"],
  "limit": 80
}
```

### Output

#### 6.1 Output destination

The actor writes results to an Apify dataset as JSON records. And the dataset is designed for direct consumption by analytics tools, ETL pipelines, and downstream APIs without post-processing.

#### 6.2 Record envelope

Every normal listing row uses the shared real estate shape:

- **record\_type** *(string, required)*: Current value is `property_listing`.
- **record\_id** *(string, required)*: Stable Rumah123 listing identifier when available.
- **source\_context** *(object, required)*: Source name, source URLs, seed metadata, page index, and external IDs.
- **entity** *(object, optional)*: Human-readable listing title, description, and public URL.
- **listing** *(object, optional)*: Listing ID, sale/rent label, status dates, auction data, and listing flags.
- **pricing** *(object, optional)*: Display price, numeric price, currency, price range, installments, and rent variants.
- **location** *(object, optional)*: Address text, district, city, province, postal code, country, and coordinates.
- **property** *(object, optional)*: Property type, rooms, parking, areas, furnishing, condition, certificates, and amenities.
- **media** *(object, optional)*: Main image, image URLs, and media count.
- **contact\_details** *(object, optional)*: Direct phone, WhatsApp, email, website, and contact records when available.
- **relationships** *(object, optional)*: Embedded agent, agency, developer, project, and source profile URLs.
- **attributes** *(object, optional)*: Rumah123 tags, badges, flags, preserved detail payloads, and source-specific metadata.

Recommended idempotency key: `record_type + ":" + record_id`.

#### 6.3 Example

```json
{
  "record_type": "property_listing",
  "record_id": "hos41615716",
  "source_context": {
    "source_name": "Rumah123",
    "source_domain": "rumah123.com",
    "source_url": "https://www.rumah123.com/jual/cari/?q=hos41615716",
    "listing_url": "https://www.rumah123.com/properti/jakarta-selatan/hos41615716/",
    "seed_id": "b34d3e147863",
    "seed_type": "url",
    "seed_value": "https://www.rumah123.com/properti/jakarta-selatan-pejaten/brand-new-luxury-american-classic-pejaten-barat-jakarta-selatan-hos41615716/",
    "seed_url": "https://www.rumah123.com/jual/cari/?q=hos41615716",
    "page_index": 1,
    "external_ids": {
      "listing_id": "hos41615716",
      "fingerprint": "c2bb14da0a46208bfbf3"
    }
  },
  "entity": {
    "title": "Brand New Luxury American Classic Pejaten Barat Jakarta Selatan",
    "description": "Luxury American Classic Pejaten Barat Detail : SHM LT 360 m2 LB 1.100 m2...",
    "short_description": "Luxury American Classic Pejaten Barat Detail : SHM LT 360 m2 LB 1.100 m2...",
    "url": "https://www.rumah123.com/properti/jakarta-selatan/hos41615716/"
  },
  "listing": {
    "listing_id": "hos41615716",
    "listing_type": "Dijual",
    "listing_type_code": "0",
    "posted_at": "2026-05-24T11:38:22+00:00",
    "created_at": "2026-05-23T07:17:45+00:00",
    "updated_at": "2026-05-23T07:17:46+00:00",
    "is_primary_project": false,
    "rent_type": -1
  },
  "pricing": {
    "price_text": "Rp 17,7 Miliar",
    "price_numeric": 17700000000,
    "currency": "IDR",
    "price_min": 17700000000,
    "price_max": 17700000000,
    "price_per_land_meter_numeric": 0,
    "price_tag": "Rp 17,7 Miliar",
    "advertised_installment": "Cicilan : Rp 80 Jutaan/bulan",
    "installments": [
      {
        "amount": 86965970,
        "tenor": 20,
        "formattedAmount": "Rp 86 Jutaan",
        "formattedTenor": "Tenor 20 Tahun"
      }
    ]
  },
  "location": {
    "address": "Pejaten, Jakarta Selatan",
    "full_address": "Pejaten, Jakarta Selatan",
    "district": "Pejaten",
    "city": "Jakarta Selatan",
    "province": "DKI Jakarta",
    "latitude": -6.27799,
    "longitude": 106.842484,
    "coordinates": {
      "latitude": -6.27799,
      "longitude": 106.842484
    }
  },
  "property": {
    "property_type": "Rumah",
    "property_taxonomy": {
      "property_type_code": "0",
      "listing_type_code": "0"
    },
    "bedrooms": 6,
    "bathrooms": 7,
    "parking_spaces": 2,
    "carports": 2,
    "garages": 2,
    "floors": 4,
    "land_area_sqm": 360,
    "floor_area_sqm": 1100,
    "furnishing": "Semi Furnished",
    "condition": "Bagus",
    "certificate": "SHM",
    "electricity": "Lainnya",
    "payment_method": "Cash Keras, KPR",
    "amenities": ["Tempat Jemuran", "Kolam Renang", "Teras", "AC"],
    "features": ["Bisa Nego", "Cash Keras/KPR", "Perumahan/Komplek"]
  },
  "media": {
    "main_image_url": "https://picture.rumah123.com/r123-images/1080x720-fit/customer/1417790/listing/hos41615716/enhanced/fda97a62a647173e059640cf50d269d7.jpg",
    "image_urls": [
      "https://picture.rumah123.com/r123-images/1080x720-fit/customer/1417790/listing/hos41615716/enhanced/fda97a62a647173e059640cf50d269d7.jpg"
    ],
    "media_count": 25
  },
  "contact_details": {
    "name": "Farah Maulina",
    "phone": "+6282297811004",
    "whatsapp": "+6282297811004",
    "email": "maulinafarah@gmail.com",
    "website": "https://www.rumah123.com/agen-properti/magna-selaras/farah-maulina-1417790/"
  },
  "relationships": {
    "agent": {
      "id": "1417790",
      "uuid": "9adfb9c3-6455-4da9-9b02-6383b52c62f3",
      "name": "Farah Maulina",
      "profile_url": "https://www.rumah123.com/agen-properti/magna-selaras/farah-maulina-1417790/",
      "agency_name": "Magna Selaras"
    },
    "agency": {
      "name": "Magna Selaras",
      "url": "https://www.rumah123.com/agen-properti/magna-selaras-385238/"
    }
  },
  "attributes": {
    "tags": ["Bisa Nego", "Cash Keras/KPR", "Perumahan/Komplek"],
    "badges": [
      {
        "label": "Dekat Sekolah",
        "active": true,
        "sequence": 19,
        "category": "Quick Label"
      }
    ],
    "flags": {
      "isUnderNjop": false,
      "isFavorite": false,
      "isNpl": false,
      "isPrimaryProject": false
    },
    "source_specific": {
      "slug": "/properti/jakarta-selatan-pejaten/brand-new-luxury-american-classic-pejaten-barat-jakarta-selatan-hos41615716/",
      "detail": {
        "listingId": "hos41615716",
        "listingStatus": 1
      }
    }
  }
}
```

#### 6.4 Field preservation

The previous flat fields are preserved in nested groups:

- `id`, `url`, `sourceUrl`, `seedId`, `seedType`, `seedValue`, `seedUrl`, `pageIndex`, `domain`, and `fingerprint` moved to `record_id`, `source_context`, and `entity`; source slugs remain under `attributes.source_specific.slug`.
- Price fields such as `price`, `priceNumeric`, `priceMin`, `priceMax`, `priceTotal`, `priceTag`, `priceDrop`, `installments`, `rentType`, and `rentPrices` moved to `pricing` and `listing`.
- Address, city, province, district, postal code, country, latitude, and longitude moved to `location`.
- Property facts such as `propertyType`, `bedrooms`, `bathrooms`, `carports`, `garages`, `landSize`, `buildingSize`, `furnishing`, `condition`, `certificate`, `electricity`, `paymentMethod`, `facilities`, and `overview` moved to `property`.
- Media URLs moved to `media.image_urls`, with the first image also exposed as `media.main_image_url`.
- Agent, agency, developer, and project fields moved to `contact_details` and `relationships`.
- Rumah123-specific badges, flags, codes, partner fields, project labels, and the rich `detail` payload are preserved under `attributes`.

### Data guarantees & handling

- **Best-effort extraction:** fields may vary by region, session, listing availability, or UI experiments on the source site.
- **Optional fields:** null-check in downstream code.
- **Deduplication:** recommend `record_type + ":" + record_id`.

### How to Run on Apify

1. Open the actor in Apify Console.
2. Configure your search parameters, such as listing type, location, property type, price range, and optional filters.
3. Set the maximum number of outputs to collect.
4. Click **Start** and wait for the run to finish.
5. Download results in JSON, CSV, Excel, or other supported formats.

### Scheduling & Automation

#### Scheduling

**Automated Data Collection**

You can schedule recurring runs to keep your property dataset fresh without starting each run manually. This is useful for tracking inventory, price changes, and market activity over time.

- Navigate to **Schedules** in Apify Console
- Create a new schedule (daily, weekly, or custom cron)
- Configure input parameters
- Enable notifications for run completion
- Optional: add webhooks for automated processing

#### Integration Options

- **Webhooks:** Trigger downstream actions when a run completes
- **Zapier:** Connect to 5,000+ apps without coding
- **Make (Integromat):** Build multi-step automation workflows
- **Google Sheets:** Export results to a spreadsheet
- **Slack/Discord:** Receive notifications and summaries
- **Email:** Send automated reports via email

### Performance

Estimated run times:

- **Small runs (< 1,000 outputs):** ~2–3 minutes
- **Medium runs (1,000–5,000 outputs):** ~5–15 minutes
- **Large runs (5,000+ outputs):** ~15–30 minutes

Execution time varies based on filters, result volume, and how much information is returned per record.

### Compliance & Ethics

#### Responsible Data Collection

This actor collects publicly available property listing information from <https://www.rumah123.com> for legitimate business purposes, including:

- **Real estate** research and market analysis
- **Lead enrichment and inventory monitoring**
- **Competitive benchmarking and reporting**

Users are responsible for ensuring their use of collected data complies with applicable laws, regulations, and the source website's terms. This section is informational and not legal advice.

#### Best Practices

- Use collected data in accordance with applicable laws, regulations, and the target site's terms
- Respect individual privacy and personal information
- Use data responsibly and avoid disruptive or excessive collection
- Do not use this actor for spamming, harassment, or other harmful purposes
- Follow relevant data protection requirements where applicable (e.g., GDPR, CCPA)

### Support

For help, use the actor page discussion area or open an issue with the run details. Include the input used with sensitive values redacted, the run ID, the expected versus actual behavior, and, if helpful, a small output sample.

# Actor input Schema

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

Select whether the run should collect properties listed for sale or properties listed for rent.

## `sortOrder` (type: `string`):

Pick the order used for the collected listings. Use the recommended order for a balanced default, or choose a price, recency, or size order for a more targeted review.

## `location` (type: `string`):

Enter a Rumah123 location keyword such as `Jakarta Selatan`, `Bandung`, or a street or area name. Leave blank when you want a broader market-wide search.

## `promotions` (type: `array`):

Select one or more promotion tags to narrow the run to matching listings. Leave empty to include listings regardless of promotion status.

## `property-type` (type: `array`):

Select one or more property types to narrow the result set. Leave empty to include all supported property categories for the selected listing market.

## `min_price` (type: `integer`):

Enter the lowest listing price to include. Leave blank when there is no minimum budget requirement.

## `max_price` (type: `integer`):

Enter the highest listing price to include. Leave blank when there is no upper budget limit.

## `min_bedrooms` (type: `string`):

Choose the minimum bedroom count required for a listing to be included.

## `min_bathrooms` (type: `string`):

Choose the minimum bathroom count required for a listing to be included.

## `min_floors` (type: `string`):

Choose the minimum floor count required for a listing to be included.

## `furninshing_condition` (type: `array`):

Select one or more furnishing conditions to include. Leave empty to include listings regardless of furnishing status.

## `property_facilities` (type: `array`):

Select one or more facilities to narrow results to listings that mention those features. Leave empty to avoid filtering by amenities.

## `min_land_size` (type: `integer`):

Enter the smallest land area to include. Leave blank when there is no minimum land size requirement.

## `max_land_size` (type: `integer`):

Enter the largest land area to include. Leave blank when there is no upper land size limit.

## `min_building_size` (type: `integer`):

Enter the smallest building area to include. Leave blank when there is no minimum building size requirement.

## `max_building_size` (type: `integer`):

Enter the largest building area to include. Leave blank when there is no upper building size limit.

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

Paste one or more Rumah123 search result pages or listing URLs. Use this for precise collection from known pages, saved searches, or specific listings.

## `limit` (type: `integer`):

Enter the maximum number of listings to collect from each search or direct URL. Increase this for broader coverage, or keep it smaller for faster test runs.

## Actor input object example

```json
{
  "listingType": "sale",
  "sortOrder": "recommended",
  "promotions": [],
  "property-type": [],
  "furninshing_condition": [],
  "property_facilities": [],
  "limit": 100
}
```

# Actor output Schema

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

No description

# 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 = {
    "limit": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("fatihtahta/rumah123-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 = { "limit": 100 }

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

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

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

```

## CLI example

```bash
echo '{
  "limit": 100
}' |
apify call fatihtahta/rumah123-scraper --silent --output-dataset

```

## MCP server setup

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

```

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

## OpenAPI specification

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