iProperty MY Scraper icon

iProperty MY Scraper

Scrape property listings from iProperty.com.my for sale or rent: price, PSF, bedrooms, bathrooms, floor area, tenure, property type, full address,…

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

iProperty MY Scraper at a glance

iProperty MY Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, title, type, price and price text, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 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, Automation, Developer Tools
Region
Asia
Pricing
$1.80 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
22 options

Scrape property listings from iProperty.com.my for sale or rent: price, PSF, bedrooms, bathrooms, floor area, tenure, property type, full address, agent (name, license, agency, contact numbers) and photo gallery. Search and URL modes, filters, 6 sort orders, and optional detail enrichment.

What iProperty MY Scraper can do

  • ~50 fields. ~50 fields on a search-mode listing: price type (e.g. Negotiable), price-per-square-foot, tenure, the full photo gallery, the region / district / area breakdown, and the agent / agency profile.
  • Two ways in. Two ways in: build a search from channel + location + filters, or paste iProperty.com.my search and listing URLs directly. Search filters are ignored in URL mode so pasted links are used as-is.
  • Sorts and filters. 6 sort orders (price, date, built-up size) and location, property-type, price and bedroom filters; the location box accepts plain text ("Petaling Jaya") or the site's own location slug pasted from your address bar.
  • Detail enrichment. Optional detail enrichment adds the full property description, map coordinates (latitude / longitude), and the listing agent's phone and WhatsApp numbers, billed only on the listings it actually runs for.
  • Built for schedules. Built for schedules: Incremental mode returns only new and changed listings on recurring runs, and unchanged rows are never billed unless you ask for them.
  • Export anywhere. Export results straight into Notion, Linear, Airtable or Apify via MCP connectors, without touching the dataset.

Choose what to collect

These inputs let you configure iProperty MY Scraper - Properties, Prices, Agents & Photos. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredHow to start the scrape. 'search' builds a search from the channel, location and filters below. 'url' walks the iProperty.com.my search or listing URLs you paste (search filters below are ignored in URL mode).

Choices: search, url

channelstringSearch properties for sale or for rent.

Choices: sale, rent

isCommercialbooleanSearch the commercial property routes (offices, shops, retail, industrial) for the chosen channel instead of residential listings.
locationstringOptional location to narrow the search: a state, city, district or neighbourhood name (e.g. 'Kuala Lumpur', 'Selangor', 'Petaling Jaya', 'Mont Kiara'). Hyphens work too ('petaling-jaya'). You can also paste an iProperty.com.my location slug straight from your browser's address bar (e.g. 'in-kuala-lumpur-58jok'). Leave empty to search the whole country.
propertyTypestringOptional property type filter. Leave empty for all types.

Choices: , bungalow, condo, semi_detached, terrace, land

priceMinintegerOnly return listings priced at or above this amount.
priceMaxintegerOnly return listings priced at or below this amount.
Show 15 more inputs
More input fields
InputWhat it controls
bedroomsintegerOnly return listings with at least this many bedrooms.
sortBystringOrder the results are returned in.

Choices: relevance, date_desc, date_asc, price_desc, price_asc, size_desc

urlsarrayPaste iProperty.com.my search, category or listing URLs (country-wide, location?page=N, filtered/sorted, keyword, property-type category, listing detail, new-project detail). Pasted filters and page numbers are applied; they win over the search fields. Agent profile pages are not supported and are skipped with a warning. Leave untouched in URL mode to scrape one example of each of the 13 supported shapes (raise Max items to reach all of them: the default cap of 20 is spent on the first search URLs).
fetchDetailsbooleanVisit each listing page to add the full property description and map coordinates (latitude / longitude). Slower and adds a small per-item charge; leave off for fast basic listings.
maxItemsintegerThe single cap on this run: stop after collecting this many listings (across all searches/URLs). Set 0 for unlimited.
maxPagesintegerOptional safety bound on how many result pages to include per search. Defaults to unlimited (leave empty or set 0) and does NOT cap the run; it defers to Max items, which is the single cap. The run stops at Max items, not here.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large crawl without returning or charging for listings already collected there. Use this after an interrupted run. For recurring 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 counts as UPDATED when any output field changes except the ignored ones (by default scrapedAt, searchMetadata, the relative ago-text in recency, recencyText and postedOn, thumbnail and image links; see Ignore fields below); changedFields names what moved. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately for each search/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 search/URL and detail 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 items 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 (or nested paths such as postedOn.unix) that must NOT make a listing count as UPDATED. They stay in the output. Already ignored by default: scrapedAt, searchMetadata, the relative "(… ago)" part of recency and recencyText, postedOn.text, thumbnail and images (image CDN links). Everything else is compared, so a change to price, bedrooms, bathrooms, floor area, title, tenure, agent, description, coordinates or image count marks the listing UPDATED and lists it in changedFields.
mcpConnectorsarrayOptionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. 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.

listingIdID (text)
titleTitle (text)
propertyTypeType (text)
priceValuePrice (number)
pricePrettyPrice text (text)
priceTypePrice type (text)
bedroomsBeds (number)
bathroomsBaths (number)
floorAreaFloor area (number)
tenureTenure (text)
fullAddressAddress (text)
urlURL (link)
Show 11 more fields
thumbnailImage (image)
changeTypeChange type (incremental mode) (text)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
descriptionDescription (text)
latitudeLatitude (number)
longitudeLongitude (number)
agentPhoneAgent phone (text)
agentContactsAgent contacts (array)
imagesImages (array)

Example output

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

{
  "listingId": 900000001,
  "url": "https://www.iproperty.com.my/property/sample-area/sample-project/sale-900000001/",
  "title": "Sample Listing, Sample Area",
  "propertyType": "Condominium",
  "typeText": "For Sale",
  "price": {
    "value": 650000,
    "pretty": "RM 650,000",
    "currency": "MYR",
    "type": "Negotiable"
  },
  "priceValue": 650000,
  "pricePretty": "RM 650,000",
  "priceType": "Negotiable",
  "pricePerArea": "RM 480.00 psf",
  "psf": "RM 480.00 psf",
  "bedrooms": 3,
  "bathrooms": 2,
  "floorArea": 1100,
  "tenure": "Freehold",
  "location": {
    "area": "Sample Area",
    "district": "Sample District",
    "region": "Selangor"
  },
  "fullAddress": "Jalan Contoh, Sample Area, Sample District, Selangor",
  "agent": {
    "id": 1,
    "name": "Sample Agent",
    "license": "REN 00001",
    "isVerified": true,
    "profileUrl": "https://www.iproperty.com.my/property-agent/sample-agent-1/"
  },
  "agency": {
    "id": 1,
    "name": "Sample Realty Sdn. Bhd."
  },
  "agentRating": {
    "reviewCount": 0,
    "ratingAverage": 0
  },
  "images": [
    "https://cdn.example.com/listing/900000001/photo-1.jpg"
  ],
  "imageCount": 1,
  "thumbnail": "https://cdn.example.com/listing/900000001/thumb.jpg",
  "recency": "Listed on Jan 05, 2026 (2h ago)",
  "description": "Full property description (Fetch full details on).",
  "latitude": 3.05,
  "longitude": 101.7,
  "agentContacts": [
    {
      "type": "mobile",
      "value": "+60123456789"
    }
  ],
  "agentPhone": "+60123456789",
  "reviews": null,
  "source": "iproperty.com.my",
  "scrapedAt": "2026-01-05T00:00:00+00:00"
}

Ways to use this data

  • Property portals and lead generation: build a searchable inventory of for-sale or for-rent listings with price, address and agent contact for outreach.
  • Market research and pricing analysis: track price-per-square-foot and asking prices across regions and property types over time.
  • Listing monitoring: watch a specific location or price band on a schedule and get only the new and changed listings, without re-collecting everything.
  • Investment screening: filter by price range, bedrooms and property type to shortlist properties matching an investment thesis.
  • App and CRM feeds: pipe structured listings into your own site, CRM or spreadsheet through the API or MCP connectors.

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 iProperty MY Scraper return?

The documented output for iProperty MY Scraper includes id, title, type, price, price text, price type, beds and baths. Availability of each field depends on the source page and the selected mode.

How much does iProperty MY Scraper cost?

It costs $1.80 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 and turn on Incremental mode. Each run then returns only new, updated and (once a prior complete scan has run with Emit expired on) reappeared listings; unchanged ones are not billed unless you turn on Emit unchanged.

Does this include individual agent review comments?

No. iProperty.com.my does not publish per-comment agent reviews on its public pages, so there is nothing to scrape there. The only review signal the site exposes is an aggregate agentRating (reviewCount / ratingAverage), which is commonly 0.

What does a pasted single listing URL return?

Less than a search-mode record. A pasted listing detail URL never goes through a search results card, so price, bedrooms, bathrooms, tenure, address, agent and agency come back null or empty; you still get the listing id, URL and (with Fetch full details on) the description, coordinates and agent contact numbers. To get the full ~50-field record, use Search mode or paste a search URL instead of an individual listing URL.

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.

Ready to collect with iProperty MY Scraper?

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