# iProperty Scraper (`shahidirfan/iproperty-scraper`) Actor

Effortlessly scrape Malaysian property listings from iProperty. Extract real estate data, prices, locations, and details automatically. Ideal for market analysis, lead generation, and property research. Fast, reliable, and perfect for Malaysian real estate web scraping.

- **URL**: https://apify.com/shahidirfan/iproperty-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 50 total users, 8 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.99 / 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.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does iProperty Malaysia Scraper do?

iProperty Malaysia Scraper extracts structured property listing data from iProperty Malaysia, one of the leading real estate platforms in Malaysia. Collect prices, addresses, bedrooms, bathrooms, property types, agent details, listing URLs, and photo counts from sale and rent search results. Provide a search URL or use the default, set how many listings you need, and receive a clean dataset for market research, lead generation, or property monitoring.

### Why use iProperty Malaysia Scraper?

- **Reliable dataset creation** - Collect structured property listings without manual copy-paste from iProperty search pages.
- **Automation-ready output** - Export results to JSON, CSV, Excel, XML, or connect them to Apify integrations.
- **Use-case fit** - Support real estate market research, pricing intelligence, lead generation, and property monitoring workflows.
- **Sale and rent coverage** - Scrape both for-sale and for-rent listings from the same Actor with a simple input change.
- **Pagination support** - Traverse multiple result pages to collect larger datasets in a single run.
- **Proxy-friendly** - Built-in proxy configuration for reliable collection on larger or scheduled runs.

### What data can you extract from iProperty Malaysia?

| Field | Description |
|-------|-------------|
| `listing_id` | iProperty listing identifier |
| `listing_url` | Direct URL to the property listing |
| `localized_title` | Listing title text |
| `full_address` | Full property address |
| `short_address` | Shortened address for quick reference |
| `price` | Numeric listing price |
| `price_display` | Formatted price string such as RM 3,980,000 |
| `currency` | Currency code such as MYR |
| `price_per_area` | Price per area value when available |
| `bedrooms` | Number of bedrooms |
| `bathrooms` | Number of bathrooms |
| `floor_area_sqft` | Floor area in square feet |
| `land_area_text` | Land area display text |
| `property_type` | Property type label such as Condominium, Terrace, or Bungalow |
| `property_subtype` | Property sub-type such as 2-storey Terraced House |
| `furnishing` | Furnishing status text |
| `tenure` | Tenure value such as Freehold or Leasehold |
| `area_name` | Area or neighborhood name |
| `district` | District name |
| `region` | State or region |
| `listing_type` | Listing type label such as For Sale or For Rent |
| `recency_text` | Listing recency text |
| `is_verified` | Verified listing flag |
| `is_official_listing` | Official listing flag |
| `is_prioritized` | Prioritized listing flag |
| `is_new_project` | New development project flag |
| `is_developer_listing` | Developer direct listing flag |
| `has_award` | Agent award flag |
| `developer` | Developer name or details |
| `posted_on` | Posted date information |
| `photo_count` | Number of listing photos |
| `thumbnail_url` | Main listing thumbnail image |
| `badge_text` | Special badge text such as New Launch |
| `agent_name` | Agent name |
| `agent_profile_url` | Agent profile URL |
| `agent_license` | Agent license number |
| `agency_name` | Agency name |
| `source_page` | Search results page number |
| `search_rank` | Rank of the listing in collected output |
| `scraped_at` | ISO timestamp when the record was collected |

### How to use iProperty Malaysia Scraper

1. Open the Actor on Apify Store.
2. Enter an iProperty Malaysia search URL or leave the default for sale listings.
3. Set the listing type to sale or rent.
4. Set the result limit and page depth.
5. Run the Actor.
6. Download the dataset or connect it to your workflow.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | String | No | `https://www.iproperty.com.my/property-for-sale/` | iProperty search URL to scrape |
| `listingType` | String | No | `sale` | Listing mode: `sale` or `rent` |
| `locale` | String | No | `en` | Locale parameter: `en` or `ms` |
| `isCommercial` | Boolean | No | `false` | Request commercial listings when available |
| `results_wanted` | Integer | No | `20` | Maximum number of listings to collect |
| `max_pages` | Integer | No | `10` | Maximum number of pages to fetch |
| `proxyConfiguration` | Object | No | Apify Proxy | Proxy settings for improved reliability |

### Output Data

Each dataset item contains the following fields:

| Field | Type | Description |
|-------|------|-------------|
| `listing_id` | Number | iProperty listing ID |
| `listing_url` | String | Full URL of the property listing |
| `localized_title` | String | Listing title text |
| `full_address` | String | Property address location string |
| `short_address` | String | Shortened address |
| `price` | Number | Numeric listing price |
| `price_display` | String | Formatted listing price |
| `currency` | String | Currency code such as MYR |
| `price_per_area` | String | Displayed price per area |
| `bedrooms` | Number | Number of bedrooms |
| `bathrooms` | Number | Number of bathrooms |
| `floor_area_sqft` | Number | Floor area in sqft |
| `land_area_text` | String | Land area display text |
| `property_type` | String | Property type label |
| `property_subtype` | String | Property sub-type |
| `furnishing` | String | Furnishing status text |
| `tenure` | String | Tenure value |
| `area_name` | String | Area or neighborhood name |
| `district` | String | District |
| `region` | String | State or region |
| `listing_type` | String | Listing type label |
| `listing_type_code` | String | Listing type code |
| `recency_text` | String | Listing recency text |
| `is_verified` | Boolean | Verified listing flag |
| `is_official_listing` | Boolean | Official listing flag |
| `is_prioritized` | Boolean | Prioritized listing flag |
| `is_new_project` | Boolean | New development project flag |
| `is_developer_listing` | Boolean | Developer direct listing flag |
| `has_award` | Boolean | Agent award flag |
| `developer` | Mixed | Developer name or object |
| `posted_on` | Object | Posted date information |
| `photo_count` | Number | Number of listing photos |
| `thumbnail_url` | String | Main listing thumbnail image |
| `badge_text` | String | Special badge text |
| `agent_name` | String | Agent name |
| `agent_profile_url` | String | Agent profile URL |
| `agent_license` | String | Agent license value |
| `agency_name` | String | Agency name |
| `source_page` | Number | Search results page number |
| `search_rank` | Number | Rank of the listing in collected output |
| `scraped_at` | String | ISO timestamp when scraped |

### Usage Examples

#### Basic Sale Listings

Collect the first 20 sale listings from iProperty Malaysia:

```json
{
  "startUrl": "https://www.iproperty.com.my/property-for-sale/",
  "results_wanted": 20
}
```

#### Deeper Pagination

Collect up to 150 listings from more result pages:

```json
{
  "startUrl": "https://www.iproperty.com.my/property-for-sale/",
  "listingType": "sale",
  "results_wanted": 150,
  "max_pages": 10
}
```

#### Rent Listings with Locale Switch

Collect rent listings in Bahasa Melayu locale:

```json
{
  "startUrl": "https://www.iproperty.com.my/property-for-rent/",
  "listingType": "rent",
  "locale": "ms",
  "results_wanted": 50,
  "max_pages": 5
}
```

#### Commercial Listings

Collect commercial property listings:

```json
{
  "startUrl": "https://www.iproperty.com.my/property-for-sale/",
  "listingType": "sale",
  "isCommercial": true,
  "results_wanted": 30,
  "max_pages": 5
}
```

### Sample Output

```json
{
  "listing_id": 501264671,
  "listing_url": "https://www.iproperty.com.my/property/seri-kembangan/bukit-gita-bayu/sale-501264671/",
  "localized_title": "Bukit Gita Bayu, Seri Kembangan",
  "full_address": "Bukit Gita Bayu, Seri Kembangan, Selangor",
  "short_address": "Bukit Gita Bayu, Seri Kembangan, Selangor",
  "price": 3980000,
  "price_display": "RM 3,980,000",
  "currency": "MYR",
  "bedrooms": 7,
  "bathrooms": 6,
  "property_type": "Bungalow House",
  "property_subtype": "Bungalow House",
  "area_name": "Bukit Gita Bayu",
  "district": "Seri Kembangan",
  "region": "Selangor",
  "listing_type": "For Sale",
  "is_verified": false,
  "is_new_project": false,
  "is_developer_listing": false,
  "agent_name": "Alice Ng",
  "agency_name": "POLYGON PROPERTIES SDN BHD",
  "photo_count": 15,
  "source_page": 1,
  "search_rank": 1,
  "scraped_at": "2026-07-12T07:02:30.925Z"
}
```

### Tips for Best Results

- Start with `results_wanted` between 20 and 50 for validation runs, then increase after confirming output quality.
- Use `max_pages` as a safety guard for predictable run duration.
- Set `listingType` to `sale` or `rent` to separate datasets by transaction type.
- Use `locale` set to `ms` for Bahasa Melayu content when needed.
- Enable `proxyConfiguration` with residential proxy groups for larger or scheduled runs.
- Some fields may be empty when iProperty does not publish that information for a listing.
- Use complete, public iProperty search URLs for best results.

### Integrations

- **Google Sheets** - Send scraped listing data to spreadsheets for analysis.
- **Airtable** - Build searchable property databases.
- **Make** - Trigger automated property data workflows.
- **Zapier** - Connect listing events with your business tools.
- **Webhooks** - Push fresh data into custom endpoints.
- **Apify API** - Programmatically consume datasets in your apps.

#### Export Formats

- **JSON** - Best for APIs and custom applications.
- **CSV** - Best for spreadsheet workflows.
- **Excel** - Best for reporting and stakeholder sharing.
- **XML** - Best for legacy or structured integrations.

### Frequently Asked Questions

#### How many listings can I collect per run?

You can collect as many listings as available on iProperty, controlled by `results_wanted` and `max_pages`. Start with smaller batches and increase after validation.

#### Can I scrape both sale and rent listings?

Yes. Set `listingType` to `sale` or `rent` and use the matching search URL for each transaction type.

#### Why are some fields empty on certain records?

Some listings may not publish all attributes such as furnishing, land area, or agent details. Empty fields reflect missing source data, not extraction errors.

#### Can I scrape commercial properties?

Yes. Set `isCommercial` to `true` to request commercial listings when available on iProperty.

#### Can I switch between English and Bahasa Melayu?

Yes. Set `locale` to `en` for English or `ms` for Bahasa Melayu.

#### Is proxy required?

Proxy is not always mandatory for small runs, but it is recommended for better stability and consistency on larger or repeated runs.

#### Can I schedule this Actor?

Yes. You can schedule recurring runs in Apify Console to monitor listing changes, track pricing, or refresh property datasets on a regular interval.

#### Is it legal to scrape iProperty Malaysia?

Scraping public web data can be legal, but you are responsible for complying with applicable laws, website terms, and privacy rules.

### Related Actors

- [Zillow Property Scraper](https://apify.com/shahidirfan/zillow-property-scraper) - Extract US property listings with prices, addresses, photos, and details from Zillow.
- [Realtor.com Scraper](https://apify.com/shahidirfan/realtor-com-scraper) - Collect for-sale and ready-to-build property listings from Realtor.com.
- [Redfin Property Scraper](https://apify.com/shahidirfan/redfin-property-scraper) - Scrape Redfin property listings with prices, addresses, beds, baths, and market data.
- [Trulia Property Scraper](https://apify.com/shahidirfan/trulia-property-scraper) - Extract for-sale and rental listings from Trulia with pricing, features, and neighborhood data.

### Support

For issues, feature requests, or custom Actor work, use the Issues tab on the Actor page or contact the developer through Apify.

### Legal Notice

This Actor is designed for legitimate data collection from publicly available sources. Users are responsible for using the data responsibly and complying with applicable laws and website terms.

# Actor input Schema

## `startUrl` (type: `string`):

Listing search page URL. Example: https://www.iproperty.com.my/property-for-sale/

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

Listing type used when the start URL is a generic sale or rent search page.

## `locale` (type: `string`):

Locale used for the search page.

## `isCommercial` (type: `boolean`):

Set true to use commercial property search pages for generic start URLs.

## `results_wanted` (type: `integer`):

Maximum number of property records to collect.

## `max_pages` (type: `integer`):

Safety cap for how many result pages to fetch.

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

Proxy settings used for all page requests. Defaults to Apify residential proxy.

## Actor input object example

```json
{
  "startUrl": "https://www.iproperty.com.my/property-for-sale/",
  "listingType": "sale",
  "locale": "en",
  "isCommercial": false,
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.iproperty.com.my/property-for-sale/"
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/iproperty-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 = { "startUrl": "https://www.iproperty.com.my/property-for-sale/" }

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/iproperty-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 '{
  "startUrl": "https://www.iproperty.com.my/property-for-sale/"
}' |
apify call shahidirfan/iproperty-scraper --silent --output-dataset

```

## MCP server setup

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