Rumah123 Scraper $1💰 Listings, Prices & Agent Data
Pricing
from $1.00 / 1,000 results
Rumah123 Scraper $1💰 Listings, Prices & Agent Data
Pull structured property listings from Rumah123.com, Indonesia’s largest property portal. Search by location with advanced filters or paste Rumah123 URLs directly. Returns pricing, specs, GPS, agent contacts, galleries, instalment estimates, and 50+ fields, plus the full raw listing record.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
27
Total users
5
Monthly active users
6 days ago
Last modified
Categories
Share
Rumah123 Scraper: Property Listings, Prices, Specs & Agent Contacts
Rumah123 Scraper turns Indonesia's largest property portal into structured listing data. Get price, full specifications, GPS coordinates, agent phone, WhatsApp and email, photo galleries, installment estimates and 70 or more fields per listing. Search by location with rich filters, or paste any rumah123 search or listing URL, then export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Two ways to find listings. Search by location with filters, or paste one or more rumah123 search or listing URLs directly.
- 70+ fields per listing, including agent phone, WhatsApp and email on every record, even without detail mode on.
- Verified filters: price, bedrooms, bathrooms, land size, building size, property type, sort order and furnishing.
- Deep pagination with no fixed ceiling. The default walk covers every result page the site serves; set an exact page limit only if you want one.
- Detail mode on demand. Turn it on for the full description, exact address, complete photo gallery and schema.org data; leave it off for the lighter listing-card fields.
- Complete data. A
rawfield carries every source field for the listing, plus the full agent, price, location and media objects, so future fields are never silently dropped. - Resume and recurring updates. Continue one interrupted crawl with
resumeFromRunId, or turn on Incremental mode to schedule this same search and get back only what is new or changed.
Use Cases
- Property portals and aggregators: mirror rumah123 inventory for a city, region or property type into your own catalog.
- Agencies and agents: monitor competitor listings, track price changes over time, and gather agent contact details for outreach.
- Market researchers and valuation teams: build historical pricing datasets by land size, building size, certificate and location.
- Lead generation teams: collect agent phone, WhatsApp and email on every listing in a target area.
- Map and geodata products: plot listings by latitude and longitude for territory or coverage analysis.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
id | "hos1000001" |
url | rumah123 link to the listing |
title | "Sample 3-Floor House in Kelapa Gading" |
listingType | "sale" (also "rent") |
propertyType | "Rumah" |
price / priceDisplay | 5700000000 / "Rp 5,7 Miliar" |
pricePerMeterDisplay | "Rp 37,2 Juta" |
bedrooms / bathrooms | 4 / 3 |
carports / floors | 2 / 3 |
landSize / buildingSize | 153 / 459 (square meters) |
certificate | "SHM" |
electricity | "6600 Watt" |
furnishing | "Furnished" (also "Unfurnished", "Semi Furnished") |
province / city / district | "DKI Jakarta" / "Jakarta Utara" / "Kelapa Gading" |
fullAddress | full street address (detail mode only) |
latitude / longitude | -6.16 / 106.90 |
agentName | "Sample Agent" |
agentPhone / agentWhatsapp | "+6281111111111" / "+6281111111111" |
agentEmail | "agent@example.com" |
marketerType | "Official Developer" |
coverImage / imagesCount | listing photo URL / 9 |
installmentMonthly | "Cicilan : Rp 25 Jutaan/bulan" |
quickLabels | ["Dekat Pusat Perbelanjaan", "Siap Huni"] |
postedAt | "2026-05-21T13:09:24+00:00" |
raw | the complete source listing object |
Every record also carries uuid, slug, listingTypeLabel, propertyTypeCode, priceMin / priceMax, isPriceDrop, garages, maidBedrooms / maidBathrooms, paymentMethod, isStudioType, locationText, agentId / agentUuid / agentUrl / agentPhotoUrl / agentTotalListing, the full images array, overview, subscriptionTierId, interestedNumber, project and deal fields (projectName, projectId, coBroke, auction, repost, propertyPartner, rentType, rentPrices, gtsLabel), and createdAt / updatedAt / expireAt, so nothing the source exposes is ever dropped. When detail mode is on, description and fullAddress are filled in with the full text and exact address, detailRaw carries the full detail-page object, and jsonLd carries the schema.org block when present. When Incremental mode is on, every returned record also carries changeType (NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED), changedFields (populated only for UPDATED), and firstSeenAt / lastSeenAt; an EXPIRED row is a tombstone built from the last known snapshot of a listing a complete scan no longer found, so it carries the same flattened business fields as a normal record but never raw, detailRaw or jsonLd.
How to Use
- Pick a mode:
search(location plus filters) orurl(paste one or more rumah123 search or listing links). - For search mode, set locations, listing type and property type, then narrow with the optional price, room and size filters. For url mode, paste the links directly; sort order and furnishing still apply.
- Turn on Fetch full details if you need the full description, exact address and complete photo gallery; leave it off for the listing-card fields (still includes agent phone, WhatsApp, email, price, specs and photos).
- Set Max listings (and optionally Max pages per search) to control run size and cost, then click Start.
Search a city for houses for sale:
{"mode": "search","locations": ["dki-jakarta"],"listingType": "sale","propertyType": "house","maxListings": 100}
Search with filters (price, bedrooms, land size, sort):
{"mode": "search","locations": ["bandung", "surabaya"],"listingType": "sale","propertyType": "house","minPrice": 1000000000,"maxPrice": 3000000000,"minBedrooms": 3,"minLandSize": 150,"sortBy": "lowest-price","maxListings": 200}
Rent search with furnishing filter and full details:
{"mode": "search","locations": ["dki-jakarta"],"listingType": "rent","propertyType": "apartment","furnishing": "furnished","fetchDetails": true,"maxListings": 50}
Direct URLs (search-mode-only filters are ignored, sort and furnishing still apply):
{"mode": "url","urls": ["https://www.rumah123.com/jual/bandung/rumah/","https://www.rumah123.com/sewa/dki-jakarta/apartemen/"],"maxPages": 3}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/rumah123-indonesia-property-scraper").call(run_input={"mode": "search", "locations": ["dki-jakarta"], "listingType": "sale", "propertyType": "house"})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["priceDisplay"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/rumah123-indonesia-property-scraper').call({mode: 'search', locations: ['dki-jakarta'], listingType: 'sale', propertyType: 'house',});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How Max pages and Max listings shape a run
Max listings caps the total number of listings returned across every location or URL in the run (0 means no cap, bounded only by Max pages). Max pages per search caps how many result pages are walked per location or URL (about 24 listings per page); left empty, the actor walks every page the site serves until it reports no more results. Without a sort order, the walk stops as soon as Max listings is met. With a sort order selected, the actor keeps paging to the configured depth first, so the ordering is drawn from a wider window, then applies the cap.
Resume and recurring updates
There are two different things here, pick the one that matches what you are doing.
| Need | Use |
|---|---|
| A crawl stopped and should continue | resumeFromRunId (or the automatic same-run checkpoint) |
| Run the same search on a schedule and receive only changes | incrementalMode |
| Keep separate campaigns for similar searches | distinct stateKey values |
| A normal one-off full snapshot | leave both off |
Resume (resumeFromRunId) continues one specific interrupted or previous large crawl: paste a run id or dataset id and this run skips listings already collected there, returning only the remaining new listings. An automatic same-run checkpoint also protects against a platform migration or restart with no input needed.
Incremental mode (incrementalMode) is for a schedule, for example daily or weekly: the actor remembers the previous run of the same search by itself, keyed on mode, location or URL, listing and property type, the Fetch full details setting, and filters, so you never paste a run id. The first run returns everything as NEW. Later runs return only NEW and UPDATED listings by default, plus REAPPEARED for listings that an earlier run with emitExpired on marked EXPIRED; unchanged listings are suppressed and not billed. Turn on emitUnchanged or emitExpired only when you also want those rows returned, and billed for. Set stateKey to name or deliberately share a monitoring campaign. EXPIRED rows are only produced once a run has fully scanned the tracked search, never when Max listings capped it or Resume was used. Turning on Incremental mode together with resumeFromRunId fails fast if that search already has saved incremental state; either drop resumeFromRunId or use a different stateKey to bootstrap a separate campaign.
For example, scheduling the same search input (locations, property type and filters unchanged, incrementalMode on) to run daily: the first run returns every listing as NEW. Each later run returns only listings that are new or changed; everything else is skipped and not billed.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you have not authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (location plus filters) or url (direct URLs). |
locations | array | none (prefill: ["dki-jakarta"]) | Location slugs as they appear in rumah123 URLs, e.g. dki-jakarta, jakarta-selatan, bandung, bali. Search mode only; an empty list falls back to dki-jakarta. |
listingType | string | sale | sale (jual) or rent (sewa). Search mode only. |
propertyType | string | residential | residential covers all residential listings; the rest narrow to a single category. Search mode only. |
minPrice | integer | none | Minimum price in Indonesian Rupiah. Search mode only. |
maxPrice | integer | none | Maximum price in Indonesian Rupiah. Search mode only. |
minBedrooms | integer | none | Minimum number of bedrooms. Search mode only. |
minBathrooms | integer | none | Minimum number of bathrooms. Search mode only. |
minLandSize | integer | none | Minimum land area in square meters. Search mode only. |
maxLandSize | integer | none | Maximum land area in square meters. Search mode only. |
minBuildingSize | integer | none | Minimum building area in square meters. Search mode only. |
maxBuildingSize | integer | none | Maximum building area in square meters. Search mode only. |
urls | array | none (prefill: ["https://www.rumah123.com/jual/bandung/rumah/"]) | Direct rumah123 search or listing URLs. URL mode only; multiple URLs supported. |
sortBy | string | recommended | recommended, latest, lowest-price, highest-price, largest-land, or largest-building. Applies in both search mode and to a pasted results URL. |
furnishing | string | any | any, furnished, semi-furnished, or unfurnished. Applies in both search mode and to a pasted results URL. |
fetchDetails | boolean | false | Visit each listing page for the full description, exact address and structured data. Billed at the detail rate; leave off for the listing-card fields (still includes agent phone, WhatsApp, email, price, specs and photos). |
maxPages | integer | none (prefill: 0) | Optional bound on result pages walked per location or URL (about 24 listings per page). Leave empty, or 0, to walk every result page. |
maxListings | integer | 20 | Maximum total listings across all searches. 0 means no cap, bounded only by maxPages. |
resumeFromRunId | string | none | Paste a previous run id or dataset id from this actor to continue a large crawl without returning or charging for listings already collected there. For recurring monitoring of the same search, use incrementalMode instead. |
incrementalMode | boolean | false | Turn on for scheduled, recurring monitoring. The first run returns everything as NEW; later runs return only NEW and UPDATED by default, plus REAPPEARED for listings a prior emitExpired run marked EXPIRED. |
stateKey | string | none | Optional name for a monitoring campaign, so its incremental state stays stable, or is deliberately shared. Auto-derived from mode, location or URL, listing and property type, the Fetch full details setting, and filter settings when left empty. |
emitUnchanged | boolean | false | Incremental mode only. Also return listings unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have. |
emitExpired | boolean | false | Incremental mode only. Also return listings from a previous run no longer found, marked EXPIRED, once a run has fully scanned the tracked search. Adds and bills extra synthetic rows. |
proxy | object | none (prefill: Residential proxy group, country ID) | Connection settings. rumah123.com only accepts Indonesia residential connections; omitting this field entirely falls back to Apify's plain default proxy and will very likely return 0 listings. |
mcpConnectors | array | none | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | none | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"id": "hos1000001","url": "https://www.rumah123.com/properti/sample-area/sample-listing-hos1000001/","title": "Sample 3-Floor House in Kelapa Gading","listingType": "sale","propertyType": "Rumah","price": 5700000000,"priceDisplay": "Rp 5,7 Miliar","pricePerMeterDisplay": "Rp 37,2 Juta","currency": "IDR","bedrooms": 4,"bathrooms": 3,"carports": 2,"floors": 3,"landSize": 153,"buildingSize": 459,"certificate": "SHM","electricity": "6600 Watt","furnishing": "Furnished","province": "DKI Jakarta","city": "Jakarta Utara","district": "Kelapa Gading","latitude": -6.16,"longitude": 106.90,"agentName": "Sample Agent","agentPhone": "+6281111111111","agentWhatsapp": "+6281111111111","agentEmail": "agent@example.com","marketerType": "Official Developer","coverImage": "https://picture.rumah123.com/sample/cover.jpg","imagesCount": 9,"installmentMonthly": "Cicilan : Rp 25 Jutaan/bulan","quickLabels": ["Dekat Pusat Perbelanjaan", "Siap Huni"],"postedAt": "2026-05-21T13:09:24+00:00","raw": {}}
Plan Requirement
rumah123.com only accepts requests from Indonesia residential connections. The Proxy field's prefill already selects the Residential group with country Indonesia; keep that setting under Connection. If your account does not have residential proxy access, the run stops at startup with a proxy connection error. If you switch the Proxy field to a non-residential group instead, the run will very likely return 0 listings and the run log explains how to fix it.
FAQ
How much does it cost?
You pay per listing returned. The detail-enrichment rate applies only to records where a detail page was actually fetched and reached the dataset; a listing suppressed as UNCHANGED under Incremental mode is never charged, even though its detail page was fetched to compare it. The Pricing tab shows the current rates. Use Max listings to cap the cost of any run.
Is it legal to scrape Rumah123?
This actor collects only publicly available listing data. You are responsible for how you use it: follow rumah123's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts such as price and specifications are generally public, but photos may be subject to third-party rights.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab with the same search input and turn on Incremental mode. Each run then returns only new and updated listings by default, and unchanged ones are not billed.
What is the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues one specific past run: paste its run or dataset id and this run returns only the listings it does not already hold there. Incremental mode is for running the exact same search again and again on a schedule: the actor keeps its own state per search and returns only what changed, without you ever pasting an id. Turning both on together only works to bootstrap a new incremental campaign from an existing crawl; if that search already has saved incremental state, the run fails with a message asking you to drop resumeFromRunId or set a different stateKey.
Why did my run return 0 listings instead of failing?
A soft rejection from the site (the results temporarily withheld on an otherwise valid page) is retried on a fresh connection several times before that search gives up and logs a warning; the run itself still completes. The strict location filter also drops listings rumah123 injects from a nearby or different area, and the furnishing filter narrows further, so a very specific search can legitimately return nothing. Missing residential proxy access (see Plan Requirement) is the most common cause of an unexpectedly empty run.
Why did my run fail instead of returning an empty dataset?
The run stops immediately, before any scraping, only for a configuration problem it cannot recover from: URL mode with no URLs provided, a resumeFromRunId that cannot be resolved to a run or dataset you have access to, turning on Incremental mode together with resumeFromRunId when that search already has saved incremental state, or a Residential proxy selected on an account without residential proxy access (the run stops with a proxy connection error). Otherwise, including a site that rejects most or all requests, the run ends as a completed run with an empty or partial dataset and a status message, not a failure. Using a non-residential proxy (see Plan Requirement) is the most common cause of an unexpectedly empty run.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
🔗 Want more real estate data?
Pair this actor with these related scrapers from the same team:
| 🚗 Dubizzle.com Scraper From $1/1K. Scrape dubizzle.com across the UAE for property, motors, and agent listings... | 🏠 Propertyfinder UAE From $0.8/1K. Extract property listings from propertyfinder.ae at scale. Get... |
| 🏠 Bayut.com Scraper From $0.80/1K. Scrape Bayut.com property listings with prices, beds, baths, area, GPS... | 🏠 Trulia Scraper Scrape Trulia.com property listings by location, filters, or URL. Extract prices, beds... |
| 🏠 Zonaprop Argentina Scrape Zonaprop.com.ar property listings across Argentina. Extract 140+ fields including... | 🏠 Domain.com.au Extract enriched Domain.com.au property listings across buy, rent, and sold, with... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.