iProperty MY Scraper - Properties, Prices, Agents & Photos
Pricing
from $1.00 / 1,000 listing results
iProperty MY Scraper - Properties, Prices, Agents & Photos
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, 8 sort orders, and optional detail enrichment.
Pricing
from $1.00 / 1,000 listing results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
iProperty.com.my Scraper
Pull structured property listings from iProperty.com.my at scale. Search by channel (for sale or for rent), location and filters, or paste any iProperty.com.my search or listing URL, and get a clean record per property with price, price type, price-per-square-foot, bedrooms, bathrooms, floor area, tenure, property type, the full address with region / district / area, the photo gallery, the listing agent (name, license, verified status, profile) and agency, and the aggregate agent rating. Two modes (search and URL), 8 sort orders, and location, property-type, price and bedroom filters. An optional detail pass adds the full property description, map coordinates, and the listing agent's contact numbers.
Why This Scraper?
- ~50 fields per listing, including price type (e.g. Negotiable), price-per-square-foot, tenure, the full photo gallery and the agent / agency profile.
- Two ways in: build a search from channel + location + filters, or paste search and listing URLs directly. Filter fields are ignored in URL mode so pasted links are used as-is.
- 8 sort orders (price, date, bedrooms, built-up size) and location, property-type, price and bedroom filters.
- Optional detail enrichment adds the full property description, the map coordinates (latitude / longitude), and the listing agent's contact numbers.
- One simple cap: set Max items and the run stops there once enough results are collected.
- Export results straight into Notion, Linear, Airtable or Apify via MCP connectors, without touching the dataset.
A note on agent reviews
iProperty.com.my does not publish per-comment agent reviews on its public pages. There is no list of individual review texts to scrape. The only review signal the public site exposes is an aggregate agent rating, returned here as agentRating with reviewCount and ratingAverage (these are commonly 0). This scraper returns that aggregate and does not invent per-comment reviews.
The listing agent's direct phone number is gated behind an on-page verification step and is not present in the page data, so agent.phone is intentionally left out rather than guessed.
Data You Get
Sample shape - values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
| listingId | 501630772 |
| title | Taman Wawasan, Puchong |
| propertyType | 2-storey Terraced House |
| priceValue | 750000 |
| pricePretty | RM 750,000 |
| priceType | Negotiable |
| psf | RM 535.71 psf |
| bedrooms | 4 |
| bathrooms | 3 |
| floorArea | 1800 |
| tenure | Freehold |
| fullAddress | Jalan Wawasan, Taman Wawasan, Puchong, Selangor |
| agent.name | Example Agent |
| agent.license | REN 00000 |
| agency.name | Example Realty Sdn. Bhd. |
| agentRating | { reviewCount: 0, ratingAverage: 0 } |
| imageCount | 6 |
| thumbnail | https://example-cdn/listing/501630772/thumb.jpg |
| url | https://www.iproperty.com.my/property/puchong/taman-wawasan/sale-501630772/ |
Detail fields (when Fetch full details is on): description, latitude, longitude, agentPhone, agentContacts.
How to Use
Search for sale in a location:
{"mode": "search","channel": "sale","location": "kuala-lumpur","sortBy": "price_asc","maxItems": 50}
Filter by price and bedrooms:
{"mode": "search","channel": "sale","priceMin": 300000,"priceMax": 800000,"bedrooms": 3,"maxItems": 100}
Paste iProperty.com.my URLs (filters ignored):
{"mode": "url","urls": ["https://www.iproperty.com.my/property-for-rent"],"fetchDetails": true,"maxItems": 80}
Input Parameters
| Parameter | Type | Description |
|---|---|---|
| mode | string | search (build a search from channel + location + filters) or url (use pasted URLs). |
| channel | string | sale or rent. |
| location | string | Optional location slug to narrow the search. Empty = whole country. |
| propertyType | string | Optional property-type filter. |
| priceMin | integer | Minimum price (MYR). |
| priceMax | integer | Maximum price (MYR). |
| bedrooms | integer | Minimum number of bedrooms. |
| sortBy | string | One of 8 sort orders (price, date, bedrooms, built-up size). |
| urls | array | iProperty.com.my search or listing URLs (URL mode). |
| fetchDetails | boolean | Visit each listing page for the full description, map coordinates and agent contact numbers. |
| maxItems | integer | The single cap on the run. 0 = unlimited. Default 20. |
| maxPages | integer | Optional safety bound on pages per search. Empty = unlimited; the run stops at Max items. |
| proxy | object | Proxy configuration. Apify Residential recommended. |
| maxResidentialMB | integer | Residential traffic budget in MB. Caps how much residential traffic a run may use; the run keeps working as long as the site still serves results. 0 = unlimited. |
| resumeFromRunId | string | Continue one specific interrupted run — paste a previous run or dataset ID and this run skips listings already collected there. |
| incrementalMode | boolean | Turn this on for daily/recurring monitoring of the same search. The first run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. |
| stateKey | string | Optional. Name a monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty for an automatic key derived from the search/URL and detail settings. |
| emitUnchanged | boolean | Off by default. Also return UNCHANGED listings (incremental mode) — returns and bills extra rows you already have. |
| emitExpired | boolean | Off by default. Also return EXPIRED listings no longer found since the last run (incremental mode) — only produced after a complete, non-resumed, non-capped scan. Returns and bills extra synthetic rows. |
| mcpConnectors | array | Optional MCP connectors to pipe results into (Notion, Linear, Airtable, Apify). |
| notionParentPageUrl | string | Notion parent page URL/id for the Notion connector. |
| maxNotifyListings | integer | Cap on items written to each connector per run. |
Resume & recurring updates
Two different features, both optional:
- Resume (
resumeFromRunId) continues one specific interrupted crawl: paste a previous run or dataset ID and this run skips every listing already collected there. No state is kept between unrelated runs. - Incremental mode (
incrementalMode) is for scheduling this same search daily/weekly and getting only what changed. The actor remembers its own baseline for the search (keyed bystateKey, or an automatic key derived from the search/URL and detail settings) and classifies every listing asNEW,UPDATED,UNCHANGED,REAPPEARED, orEXPIRED. By default onlyNEW/UPDATED/REAPPEAREDlistings return; turn onemitUnchanged/emitExpiredto also get those (both return — and bill — extra rows).EXPIREDlistings are only produced after a run that scanned its full search with no cap hit and no Resume.
Output then carries changeType, changedFields, firstSeenAt, and lastSeenAt. Change detection ignores scrapedAt/scraped_at (per-run timestamps) and searchMetadata (search-relative), and it ignores fields that only exist once the optional detail fetch has run — description, latitude, longitude, agentContacts, agentPhone, and the full images/imageCount gallery — since none of those can be compared across runs where detail fetching was toggled on or off. recency (e.g. "Listed on Aug 05, 2026 (55s ago)") is normalised, not ignored: the trailing (... ago) relative-age clock is stripped before comparison so it never re-triggers UPDATED on its own, but a genuine change to the listed date still does. Price, bedrooms, bathrooms, floor area, address, and every other core field do trigger UPDATED when they change.
Send results into your apps (MCP connectors)
Optionally pipe each run's results into the tools you already use through Model Context Protocol (MCP) connectors. Authorize a connector under Apify, Settings, API & Integrations, then select it in mcpConnectors. Notion receives a rich page per listing (set notionParentPageUrl); Linear, Airtable and Apify get a best-effort write or digest. The MCP export never changes the dataset and never fails the run; maxNotifyListings caps how many items go to each connector.
Output Example
Sample shape - values are illustrative placeholders, not from a live listing.
{"listingId": 501630772,"url": "https://www.iproperty.com.my/property/puchong/taman-wawasan/sale-501630772/","title": "Taman Wawasan, Puchong","propertyType": "2-storey Terraced House","typeText": "For Sale","price": { "value": 750000, "pretty": "RM 750,000", "currency": "MYR", "type": "Negotiable" },"priceValue": 750000,"pricePerArea": "RM 416.67 psf","psf": "RM 535.71 psf","bedrooms": 4,"bathrooms": 3,"floorArea": 1800,"tenure": "Freehold","location": { "area": "Taman Wawasan", "district": "Puchong", "region": "Selangor" },"fullAddress": "Jalan Wawasan, Taman Wawasan, Puchong, Selangor","agent": { "id": 0, "name": "Example Agent", "license": "REN 00000", "isVerified": true, "profileUrl": "https://www.iproperty.com.my/property-agent/example-0/" },"agency": { "id": 0, "name": "Example Realty Sdn. Bhd." },"agentRating": { "reviewCount": 0, "ratingAverage": 0 },"images": ["https://example-cdn/listing/501630772/photo-1.jpg"],"imageCount": 6,"thumbnail": "https://example-cdn/listing/501630772/thumb.jpg","description": "Full property description (when Fetch full details is on).","latitude": 3.04,"longitude": 101.62,"source": "iproperty.com.my","scrapedAt": "2024-01-01T00:00:00+00:00"}
Plan Requirement
Runs on any Apify plan. This site serves best on residential connections, so set the proxy to Apify Residential for reliable results (Residential access is included on the Starter plan and higher). Datacenter and free-tier connections are commonly rejected and will return zero items; if you run on datacenter, a free tier or a non-residential connection the run logs a warning before spending compute.
Reliability
- Built for resilient, unattended runs: transient errors are recovered automatically so a run keeps working without manual intervention.
- Residential traffic budget: set
maxResidentialMBto cap residential spend. The run keeps returning results as long as the site still serves them, and will not silently drop to zero. 0 = unlimited.