Rumah123 Scraper icon

Rumah123 Scraper

Pull structured property listings from Rumah123.com, Indonesia’s largest property portal. Search by location with advanced filters or paste Rumah123…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Rumah123 Scraper at a glance

Rumah123 Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, title, change type (incremental mode), type and property, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Real Estate, Developer Tools, Automation
Region
Asia
Pricing
$2.00 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
33 options

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.

What Rumah123 Scraper $1💰 Listings, Prices & Agent Data can do

  • 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, minimum floors, land size, building size, property type (single or multi-select), furnishing (single or multi-select), promotion filters (price reduced, no down payment, no fees, bank-owned, below tax value), and seven sort orders including oldest first.
  • 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 raw field carries every source field for the listing, plus the full agent, price, location and media objects, so future fields are never silently dropped.

Choose what to collect

These inputs let you configure Rumah123 Scraper $1💰 Listings, Prices & Agent Data. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredPick how to find listings: build searches from a location + filters, or paste listing/search URLs directly.

Choices: search, url

locationsarraySearch mode only. Location names as they appear in rumah123 URLs, e.g. 'dki-jakarta', 'jakarta-selatan', 'bandung', 'bali', 'surabaya'. Plain names ('Jakarta Selatan') are normalised to the site slug; 'Kota Bandung' becomes 'bandung', while a regency keeps its word ('Kabupaten Bandung' or 'Kab. Bandung' becomes 'kabupaten-bandung', a different place from the city). A location the site does not know is logged as a warning, and the run fails if none of them is found. One search runs per location.
listingTypestringSearch mode only. For sale (jual) or for rent (sewa).

Choices: sale, rent

propertyTypestringSearch mode only. 'residential' covers all residential listings; the rest narrow to a single category.

Choices: residential, house, apartment, land, shophouse, warehouse, office, villa, hotel, factory, commercial-space, boarding-house

minPriceintegerSearch mode only. Minimum price in Indonesian Rupiah.
maxPriceintegerSearch mode only. Maximum price in Indonesian Rupiah.
minBedroomsintegerSearch mode only. Minimum number of bedrooms.
Show 26 more inputs
More input fields
InputWhat it controls
minBathroomsintegerSearch mode only. Minimum number of bathrooms.
minLandSizeintegerSearch mode only. Minimum land area in square meters.
maxLandSizeintegerSearch mode only. Maximum land area in square meters.
minBuildingSizeintegerSearch mode only. Minimum building area in square meters.
maxBuildingSizeintegerSearch mode only. Maximum building area in square meters.
urlsarrayURL mode only. Paste rumah123 search-result URLs (/jual/... sale or /sewa/... rent, the English-locale twin /en/sale/... or /en/rent/..., or kost boarding-house searches /kost/jual/di-/ and /kost/sewa/di-/, with any filters?page=N or tracking parameters). Listing-detail URLs (/properti/...-hos/) are returned as one record each (search filters and sort do not apply to them); new-project and agent pages are skipped with a warning. Left untouched, URL mode scrapes the thirteen example URLs (one per distinct shape: sale, rent, filtered, paginated start page, sub-area, residential-all, villa rent, quick-label filter, near a landmark, nationwide, English-locale, kost, one listing-detail page). The search-mode filters are ignored, but Sort by and Furnishing still apply; pagination starts at the page in the URL and walks forward.
startUrlsarrayAlias of 'Direct URLs'; both lists are merged. Accepts plain strings or {"url": ...} objects.
sortBystringResult ordering, applied client-side over the listings collected. Applies in BOTH search mode and URL mode: it orders the listings collected from a pasted results URL as well.

Choices: recommended, latest, lowest-price, highest-price, largest-land, largest-building, oldest

furnishingstringFilter by furnishing status (applied to the listing's stated furnishing). Applies in BOTH search mode and URL mode: it narrows the listings collected from a pasted results URL as well.

Choices: any, furnished, semi-furnished, unfurnished

propertyTypesarraySearch mode only. Scrape several property types in one run (one search per location and type). When set it replaces 'Property type'.
furnishingsarrayKeep listings whose stated furnishing matches ANY selected value (client-side, both modes). Combined with 'Furnishing' when both are set.
promotionsarrayKeep only listings carrying ANY of the selected promotion flags (client-side, both modes). Price reduced = the site's price-drop flag; the others are the flags on the listing card (no down payment, no fees, bank-owned, below tax value, promotion).
minFloorsintegerKeep listings with at least this many floors (client-side, both modes; listings with no stated floor count are dropped).
fetchDetailsbooleanVisit each listing page for the full description, address, and structured data. Slower and billed at the detail rate. Leave off for the fast listing-card data (still includes agent phone, WhatsApp, email, price, specs, and photos).
maxPagesintegerOptional bound on result pages walked per location/URL (~24 listings per page). Leave empty to walk every result page.
maxListingsintegerMaximum total listings across all searches (up to 100000). 0 means up to 100000 listings per run in total, with no per-search split (also bounded by maxPages).
limitintegerAlias of 'Max listings'. When set it takes precedence over 'Max listings' left at its default of 20; a 'Max listings' you changed from the default wins over it.
resumeFromRunIdstringPaste a previous run ID (or dataset ID) from this actor to continue a large crawl without returning or charging for listings already collected there. Use this after an interrupted run, or when continuing a location pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. A listing is UPDATED when any flattened field changes (price, specs, title, agent, location, dates, images and so on; the changed names are listed in changedFields); the bulky raw, detailRaw and jsonLd passthrough blocks and the informational recordType, badges, promotions, sourceUrl, pageIndex, pricePerMeter, listingStatus, listingStatusCode and facilities fields are NOT compared. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately for each location/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the location/URL, listing/property type, and filter settings - different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns - and bills - extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search - not when Max listings capped it or when Resume was used. This returns - and bills - extra synthetic rows, so leave it off unless you need expiry tracking.
ignoreFieldsForChangesarrayIncremental mode only. Field names that must not count as a change: they stay in the output but never turn a listing into UPDATED and never appear in changedFields. Use a top-level name such as interestedNumber, or a dotted nested path such as agent.name (a path through a list applies to every element). Editing this list never causes a wave of UPDATED rows: unchanged is decided by re-checking the stored baseline against the current list.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON - the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idID (text)
titleTitle (text)
changeTypeChange type (incremental mode) (text)
listingTypeType (text)
propertyTypeProperty (text)
priceDisplayPrice (text)
bedroomsBeds (number)
bathroomsBaths (number)
landSizeLand m2 (number)
buildingSizeBuilding m2 (number)
cityCity (text)
districtDistrict (text)
Show 16 more fields
agentNameAgent (text)
agentPhonePhone (text)
urlURL (link)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
agentWhatsappWhatsApp (text)
agentEmailEmail (text)
marketerTypeMarketer (text)
agentUrlProfile (link)
descriptionDescription (text)
fullAddressFull address (text)
interestedNumberInterested (text)
facilitiesFacilities (array)
imagesImages (array)
jsonLdJSON-LD (object)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "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.9,
  "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": {}
}

Ways to use this data

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

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Rumah123 Scraper return?

The documented output for Rumah123 Scraper includes id, title, change type (incremental mode), type, property, price, beds and baths. Availability of each field depends on the source page and the selected mode.

How much does Rumah123 Scraper cost?

It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

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. Listings you were already tracking before the full agent contacts were restored come back once as UPDATED, with agentPhone, agentWhatsapp or agentEmail in changedFields, because the contact changed from the shortened to the complete value.

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.

Are the agent phone and WhatsApp numbers complete?

Yes. Rumah123 shows agent phone, WhatsApp and email shortened in its listing data (for example +628120...) and fills in the full public contact when the listing is viewed. The actor reads that same full contact for every listing, in both modes, with no login or extra setting, and at no extra charge. If the site does not return the full contact for a listing, that record keeps the shortened value and the run log says how many listings could not be completed.

Why did my run return 0 listings?

The strict location filter drops listings rumah123 injects from a nearby area, and the furnishing, floors and promotion filters narrow further, so a very specific search can legitimately return nothing. A soft rejection from the site is retried on a fresh connection several times before that search gives up with a warning. A run that could not load any page at all does not return a quiet empty dataset: it ends as failed with one of the messages in Plan Requirement.

Ready to collect with Rumah123 Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.