# Rumah123 Scraper — Indonesia Property & Agent Data (`logiover/rumah123-scraper`) Actor

Scrape Rumah123, Indonesia's largest property portal: rupiah price parsed from Miliar/Juta wording, land and building area, bedrooms, bathrooms, carports, agent name and role, price drops and coordinates. Sale and rent. Keyless. JSON, CSV or Excel.

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

## Pricing

from $2.00 / 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 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 — Indonesia Property & Agent Data

Export listings from **Rumah123**, Indonesia's largest property portal — price in rupiah, land and building area, bedrooms, agent details and price drops — to JSON, CSV or Excel. Keyless, no login.

### What does Rumah123 Scraper do?

Rumah123 renders its results server-side, so this Actor reads them without a browser and stays cheap at volume. Two details of the site are handled explicitly, because both are where a careless export goes wrong.

**Rupiah prices are written in words.** "Rp 2,89 Miliar" means 2,890,000,000 — and a scraper that strips non-digits, which is the normal approach on European sites, returns 289. This Actor reads the magnitude word (Miliar, Juta, Ribu) and the Indonesian decimal comma, so `priceAmount` is a real number you can sort and filter on. The original label is kept alongside it.

**The attribute strip is icon-driven.** Bedrooms, bathrooms and carports sit in identically-classed spans that differ only by the icon they reference, and land area (LT) and building area (LB) are labelled inline. Reading them by position breaks the moment a listing omits carports. Here each value is matched to its own icon or label, so land area never lands in the bathroom column.

Price reductions are captured too: where a listing has been cut, you get the previous price, the new price and the site's own reduction label — a direct signal of which sellers are moving.

### Who is it for?

- **Property agencies** tracking competitor stock and pricing across Indonesian regions.
- **Investors** comparing price per m² of land versus building across sub-districts.
- **Portal and app builders** who need a structured Indonesian feed.
- **Analysts** measuring supply, price movement and discounting by area.
- **Lead generation** teams building lists of active listing agents.

### Use cases

- Pull every house for sale in Jakarta Selatan with land and building area.
- Find listings whose price has dropped and rank sellers by discount size.
- Compare rental yields by running sale and rent in the same region.
- Build an agent activity list — who is listing the most in a district.
- Track new supply weekly by sorting newest first on a schedule.

### Why use this Actor?

- **Correct rupiah parsing** — "Miliar" and "Juta" become real numbers.
- **Land and building area separately**, the two figures Indonesian buyers compare.
- **Price-drop data** — previous price, current price and the reduction label.
- **Agent name and role** on every row.
- **Coordinates** where the site publishes them in its structured data.
- **Keyless and browserless** — no login, no headless Chrome, low cost per row.

### What data can you extract?

Every row carries the listing ID, title and URL, location, price as label and number with currency and rental period, previous price and price-drop label where present, bedrooms, bathrooms and carports, land and building area in m², latitude and longitude where published, agent name and role, the freshness label, listing badges, cover image, and the country and source.

### How to use it

1. Choose **jual** (for sale) or **sewa** (for rent).
2. Enter a **region slug** from a Rumah123 search URL — `dki-jakarta`, `bali`, `jawa-barat`, `jakarta-selatan`.
3. Pick a property type, and optionally a price band and minimum bedrooms.
4. Set **Maximum results** and run, then export JSON, CSV or Excel.

### Input example

```json
{
  "listingType": "jual",
  "region": "jakarta-selatan",
  "propertyType": "rumah",
  "minPrice": 1000000000,
  "maxPrice": 5000000000,
  "minBedrooms": 3,
  "maxResults": 1000
}
```

### Notes and limits

- Rumah123 refuses datacenter traffic, so the Actor defaults to residential Indonesian proxy. Leave that setting alone; switching to datacenter returns nothing.
- Prices are asking prices set by agents and owners, not transaction prices.
- Coordinates come from the page's structured data, which covers part of each page rather than every card — the column is populated where the site publishes it.
- Agent phone numbers are masked on the search page by Rumah123 itself, so they are deliberately not exported; the agent name and the listing URL are.
- Rental listings quote a period ("/bulan" = per month); that period is its own column so monthly and yearly rents never mix.
- This Actor exports search results, not full property pages — open the listing URL for the complete description and photos.

### FAQ

**Do I need a Rumah123 account?**
No. Search results are public and the Actor needs nothing from you.

**Where do I get the region slug?**
Run a search on Rumah123 and copy the area segment from the URL, e.g. `.../jual/jakarta-selatan/rumah/`.

**Why is `priceAmount` so large?**
Indonesian property is priced in rupiah — a billion-rupiah house is roughly USD 60,000. The number is correct.

**Does it cover rentals?**
Yes — set the listing type to `sewa`. The rental period appears in its own column.

**How am I charged?**
Pay per result — you pay for the listings delivered.

# Actor input Schema

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

Properties for sale (jual) or for rent (sewa).

## `region` (type: `string`):

Rumah123 area slug from the search URL, e.g. dki-jakarta, jawa-barat, bali, jakarta-selatan.

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

Which kind of property to list.

## `minPrice` (type: `integer`):

Full rupiah amount, e.g. 1000000000 for one billion. 0 disables the filter.

## `maxPrice` (type: `integer`):

Full rupiah amount, e.g. 5000000000. 0 disables the filter.

## `minBedrooms` (type: `integer`):

Only return properties with at least this many bedrooms. 0 disables the filter.

## `sortBy` (type: `string`):

Result order. Newest first is best when monitoring a market.

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

Stop after this many listings. Rumah123 renders 20 per page and the Actor walks pages until the target is met.

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

Rumah123 blocks datacenter traffic, so residential Indonesian proxy is required and is preselected. Changing it away from residential will return no results.

## Actor input object example

```json
{
  "listingType": "jual",
  "region": "dki-jakarta",
  "propertyType": "rumah",
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "sortBy": "default",
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ID"
  }
}
```

# Actor output Schema

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

No description

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

No description

## `listingUrl` (type: `string`):

No description

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

No description

## `priceLabel` (type: `string`):

No description

## `priceAmount` (type: `string`):

No description

## `currency` (type: `string`):

No description

## `pricePeriod` (type: `string`):

No description

## `previousPriceLabel` (type: `string`):

No description

## `previousPriceAmount` (type: `string`):

No description

## `priceDropLabel` (type: `string`):

No description

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

No description

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

No description

## `carportsLabel` (type: `string`):

No description

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

No description

## `buildingAreaSqm` (type: `string`):

No description

## `latitude` (type: `string`):

No description

## `longitude` (type: `string`):

No description

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

No description

## `agentRole` (type: `string`):

No description

## `updatedLabel` (type: `string`):

No description

## `badges` (type: `string`):

No description

## `imageUrl` (type: `string`):

No description

## `country` (type: `string`):

No description

## `source` (type: `string`):

No description

## `scrapedAt` (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 = {
    "listingType": "jual",
    "region": "dki-jakarta",
    "propertyType": "rumah",
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "sortBy": "default",
    "maxResults": 500,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "ID"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/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 = {
    "listingType": "jual",
    "region": "dki-jakarta",
    "propertyType": "rumah",
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "sortBy": "default",
    "maxResults": 500,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "ID",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/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 '{
  "listingType": "jual",
  "region": "dki-jakarta",
  "propertyType": "rumah",
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "sortBy": "default",
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ID"
  }
}' |
apify call logiover/rumah123-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/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/50nqc93420JzhBaBp/builds/gSg3mOewChJMSUA74/openapi.json
