# Indonesia Property Listings Scraper - Rumah123 (`jungle_synthesizer/rumah123-indonesia-property-listings-agents-scraper`) Actor

Scrape property listings from Rumah123, Indonesia's largest real estate portal. Get sale and rental listings nationwide across houses, apartments, land, and commercial property, with certificate type, electrical capacity, facing direction, agent contacts, and normalised IDR pricing.

- **URL**: https://apify.com/jungle\_synthesizer/rumah123-indonesia-property-listings-agents-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Real estate, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 record scrapeds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Indonesia Property Listings Scraper - Rumah123

Scrape property listings from [Rumah123](https://www.rumah123.com), Indonesia's largest real estate portal. Returns sale and rental listings nationwide — houses, apartments, land, and commercial property — with price, specs, location, and agent contact details for over a million active listings.

***

### Rumah123 Scraper Features

- Covers **all 38 Indonesian provinces** by default — no need to paste search URLs one city at a time.
- Filters by **deal type** (sale/jual or rent/sewa) and **property type** (house, apartment, land, shophouse, warehouse, office, villa, and more) — 12 categories drawn straight from Rumah123's own listing taxonomy.
- Normalises Indonesian pricing. "Rp 2,5 Miliar" and "Rp 850 Juta" come back as a clean integer in `price_idr`, alongside the original display string. Rental listings are tagged with their billing period, because "per year" and "per month" are off by 12x if you get it wrong.
- Returns the fields that actually decide an Indonesian property deal — certificate type (SHM, HGB, Strata, PPJB, and more), electrical capacity, and facing direction — not just bedrooms and a price tag.
- Includes agent and agency contact info, listing photos, facilities, and geographic coordinates down to the district level.
- Resumable — a run that stops partway through can pick up exactly where it left off, at no extra charge for records you already have.

***

### Who Uses Rumah123 Property Data?

- **Real estate platforms** — mirror or supplement Indonesian listings for a regional property aggregator.
- **Market researchers** — track pricing trends by province, city, or property type across the country's largest market.
- **Property investors** — screen listings by certificate type and price per square meter before a site visit is worth the trip.
- **Lead generation teams** — build contact lists of active agents and agencies by region or specialty.
- **Proptech developers** — feed a normalized, structured feed of Indonesian listings into an app instead of parsing HTML by hand.

***

### How Rumah123 Scraper Works

1. Pick which deal types and property types you want — or leave both empty for the full national catalog.
2. The scraper walks Rumah123's own listing index for those categories, discovering every matching listing across every province, city, and district.
3. Each listing page is visited and parsed for the full field set — specs, pricing, location, agent details, and photos.
4. Records land in your dataset as they're found. A long run can be resumed later without re-paying for what it already delivered.

***

### Input

```json
{
  "maxItems": 500,
  "dealTypes": ["jual"],
  "propertyTypes": ["rumah", "apartemen"]
}
```

| Field           | Type    | Default | Description                                                                          |
|-----------------|---------|---------|---------------------------------------------------------------------------------------|
| `maxItems`      | integer | 10      | Maximum number of listings to return. Required.                                       |
| `dealTypes`     | array   | (all)   | Sale (`jual`) or rent (`sewa`). Leave empty for both.                                  |
| `propertyTypes` | array   | (all)   | House, apartment, land, shophouse, warehouse, office, villa, boarding house, hotel, factory, or commercial space. Leave empty for all. |
| `resumeCursor`  | string  | (none)  | Cursor from a previous run's Output, used to continue a stopped crawl.                |

Renting out apartments in Bali only? Set `dealTypes: ["sewa"]` and `propertyTypes: ["apartemen"]`.

***

### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a large crawl stops before it finishes — because it hit `maxItems`, your spend cap (`maxTotalChargeUsd`), or was aborted — start a new run with **the same input** plus that `resumeCursor` to continue from where it left off. The crawl resumes from the queued work the previous run didn't reach.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly your 10 most recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque — supply it unmodified.

***

### Rumah123 Scraper Output Fields

```json
{
  "listing_id": "aps7297281",
  "listing_url": "https://www.rumah123.com/properti/makassar-makassar/the-appartemen-full-furnish-view-city-makassar-aps7297281/",
  "title": "The Appartemen Full Furnish View City Makassar",
  "deal_type": "jual",
  "property_type": "apartemen",
  "price_idr": 720000000,
  "price_raw": "Rp 720 Juta",
  "price_period": "sale",
  "price_per_sqm_idr": 21176471,
  "bedrooms": 2,
  "bathrooms": 1,
  "building_area_sqm": 34,
  "certificate_type": "HGB",
  "furnishing": "Furnished",
  "electricity_va": 2200,
  "condition": "Bagus",
  "province": "Sulawesi Selatan",
  "city": "Makassar",
  "district": "Makassar",
  "latitude": -5.144379,
  "longitude": 119.426635,
  "agent_name": "RITA (LIGB)",
  "agent_url": "https://www.rumah123.com/agen-properti/brighton-solid-balikpapan-kalimantan-timur/rita-ligb-1655652/",
  "agency_name": "Brighton Solid Balikpapan, Kalimantan Timur",
  "image_urls": ["https://picture.rumah123.com/r123-images/1080x720-fit/customer/1655652/b9558595a4073e2f1ecc9b25fe8f6536.jpg"],
  "images_count": 5,
  "last_updated_at": "2026-09-07T23:58:17.000Z"
}
```

| Field                    | Type    | Description                                                                 |
|--------------------------|---------|-------------------------------------------------------------------------------|
| `listing_id`             | string  | Rumah123's own listing identifier.                                            |
| `listing_url`            | string  | Canonical URL of the listing.                                                 |
| `title`                  | string  | Listing headline as written by the agent.                                     |
| `deal_type`              | string  | `jual` (sale) or `sewa` (rent).                                               |
| `property_type`          | string  | House, apartment, land, and so on — Rumah123's own category.                  |
| `price_idr`              | number  | Price in Indonesian Rupiah, normalized to a plain integer.                    |
| `price_raw`              | string  | Original display string, e.g. "Rp 2,5 Miliar".                               |
| `price_period`           | string  | `sale`, `year`, or `month` — rentals default to per-year unless stated.       |
| `price_per_sqm_idr`      | number  | Price divided by building area, where both are known.                        |
| `installment_idr_month`  | number  | Advertised monthly installment estimate, where the listing states one.       |
| `bedrooms`               | number  | Bedroom count.                                                                |
| `bathrooms`              | number  | Bathroom count.                                                              |
| `carports`               | number  | Carport count, where listed.                                                 |
| `building_area_sqm`      | number  | Building or unit floor area in square meters.                                |
| `land_area_sqm`          | number  | Land area in square meters, for house/land/villa listings.                   |
| `floors`                 | number  | Number of floors, where listed.                                              |
| `certificate_type`       | string  | Indonesian land-title class — SHM, HGB, Strata, PPJB, and others.             |
| `furnishing`             | string  | Furnished, semi-furnished, or unfurnished.                                    |
| `electricity_va`         | number  | Electrical capacity in watts/VA.                                              |
| `facing_direction`       | string  | Compass direction the property faces, where listed.                          |
| `condition`              | string  | Property condition as described by the agent.                                |
| `province`               | string  | Indonesian province.                                                         |
| `city`                   | string  | City or regency.                                                             |
| `district`               | string  | Kecamatan (sub-district).                                                    |
| `area_name`              | string  | Named neighborhood or area.                                                  |
| `address`                | string  | Listing's stated address text.                                               |
| `latitude` / `longitude` | number  | District-level coordinates.                                                  |
| `description`            | string  | Full listing description text.                                               |
| `facilities`             | array   | Building or complex amenities, where listed.                                 |
| `agent_name`             | string  | Listing agent's name.                                                        |
| `agent_url`              | string  | Agent's Rumah123 profile URL.                                                |
| `agent_phone`            | string  | Agent's contact number, as published on the listing.                         |
| `agency_name`            | string  | Agency name, where the agent belongs to one.                                 |
| `agency_url`             | string  | Agency's Rumah123 profile URL.                                               |
| `is_premier_agent`       | boolean | Whether the agent carries a premier badge.                                   |
| `is_developer_project`   | boolean | Whether the listing is a new-development project rather than a resale.       |
| `developer_name`         | string  | Developer name, for new-development listings.                                |
| `image_urls`             | array   | Listing photo URLs.                                                          |
| `images_count`           | number  | Number of photos on the listing.                                             |
| `last_updated_at`        | string  | ISO-8601 timestamp of the listing's last update on Rumah123.                 |

***

### FAQ

#### How do I scrape Rumah123?

Run this actor with a `maxItems` value and, optionally, the deal and property types you want. It returns structured JSON — no account or API key needed on your end.

#### What data can I get from Rumah123?

Everything on a listing page: price, specs (bedrooms, bathrooms, land and building area), certificate type, electrical capacity, location down to the district, agent and agency contact info, and photos. Sale and rental listings both work.

#### Can I filter by property type or deal type?

Yes. Set `dealTypes` to `jual`, `sewa`, or both, and `propertyTypes` to any combination of Rumah123's 12 categories — houses, apartments, land, shophouses, warehouses, offices, villas, and more.

#### Does this cover the whole country, or just Jakarta?

The whole country by default. Rumah123 lists property across all 38 Indonesian provinces, and this actor walks the full catalog unless you narrow it with `propertyTypes` or `dealTypes`.

#### How much does this actor cost to run?

Pricing is pay-per-result — you're charged per listing returned, not per page crawled. Check the Pricing tab on this actor's page for the current rate.

***

### Need More Features?

Need custom fields, filters, or a different target site? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use This Rumah123 Scraper?

- **Indonesia-specific fields, not a generic template** — certificate type, electrical capacity, and facing direction are on the listing page and on every record this actor returns, which decides who can legally hold the property and what it's actually worth locally.
- **Price parsing that doesn't lie by a factor of 1,000** — "Rp 2,5 Miliar" and "Rp 850 Juta" both resolve to a correct integer, and rental listings carry an explicit billing period instead of assuming monthly.
- **National by default** — no need to paste one search URL per province. Point it at the whole country, or narrow it with two filters.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

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

Maximum number of records to scrape

## `dealTypes` (type: `array`):

Sale (jual) or rent (sewa) listings to include. Leave empty for both.

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

Property types to include, per Rumah123's own listing taxonomy. Leave empty for all.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "dealTypes": [],
  "propertyTypes": []
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10,
    "dealTypes": [],
    "propertyTypes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/rumah123-indonesia-property-listings-agents-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10,
    "dealTypes": [],
    "propertyTypes": [],
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/rumah123-indonesia-property-listings-agents-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "dealTypes": [],
  "propertyTypes": []
}' |
apify call jungle_synthesizer/rumah123-indonesia-property-listings-agents-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/rumah123-indonesia-property-listings-agents-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/uHcYfsAyycjaBQtmI/builds/GNyLckdmNCRuv1opQ/openapi.json
