# Mudah.my Classifieds Scraper - Cars, Property & Marketplace (`confidential_gnat/mudah-classifieds-scraper`) Actor

Scrapes classified ads from Mudah.my, Malaysia's largest marketplace: cars, property for sale and rent, phones, electronics and more. Get title, price, description, photos, location, seller, specifications and WhatsApp numbers. Search by keyword, category, state or listing URL.

- **URL**: https://apify.com/confidential_gnat/mudah-classifieds-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Mudah.my Classifieds Scraper - Cars, Property & Marketplace Malaysia

**Scrape classified ads from Mudah.my (mudah.my)**, Malaysia's largest online marketplace: **used cars, property for sale and rent**, phones, electronics, furniture and every other category. Get the title, price, full description, HD photos, location, seller, all specifications and the seller's WhatsApp numbers, and export the **Mudah.my data** as **JSON, CSV or Excel** or call the actor as an **API**. Paste a Mudah.my listing URL or type a keyword, press Start, and repeat runs skip ads you already scraped.

**Target website:** [mudah.my](https://www.mudah.my)

### ✨ Features of this Mudah.my classifieds scraper

- **Classified ad extraction** — title, price, old price and price drop, description, category, condition, state and area, seller name and type, photos and posting, update and expiry dates.
- **Full ad details** — every specification (car make, model, variant, year, mileage, engine; property type, size, bedrooms, furnishing, facilities, building and address), HD photos, videos, store details, company registration number and WhatsApp numbers when the seller shows them.
- **Pagination support** — keeps paging through the results until Max items is reached.
- **Keyword, category, state, price, sort and seller filtering** — search any keyword in any of 45 categories and 16 states, for sale, for rent, new properties or auctions, with a price range and private or company sellers.
- **Any Mudah.my listing URL** — set filters on the site and paste the URL; single ad URLs work too.
- **Incremental runs, no repeat charges** — with a cache project name, ads you already scraped are skipped on every later run.
- **Proxy support** — optional Apify Proxy, off by default.
- **No browser required** — plain HTTP requests keep runs fast and cheap.

### 🚀 How to scrape Mudah.my listings in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (a keyword, category, listing URL or ad URL is required).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Mudah.my scraper pricing

This actor uses **pay-per-result** billing: you pay for each listing saved to the dataset.

- New Apify accounts include **$5 of free monthly credit**.
- The actor uses plain HTTP requests, so it costs significantly less to run than browser-based scrapers.
- The proxy is disabled by default; leaving it off keeps runs cheapest.
- Listings skipped by the cache are not charged, so scheduled runs cost only for genuinely new ads.

### 🔧 Mudah.my scraper input configuration

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| Listing or ad URLs (`startUrls`) | array | — | `https://www.mudah.my/malaysia/cars-for-sale` (prefill) | Mudah.my listing pages with any filters set on the site, or single ad pages. |
| Max items per search (`maxItems`) | integer | — | `5` | Maximum unique listings saved for each keyword or listing URL. |
| Scrape full ad details (`scrapeDetails`) | boolean | — | `true` | Open every ad for all specifications, HD photos, store details, address and WhatsApp numbers. Turn off for faster runs with the search data only. |
| Cache project name (`cacheProjectName`) | string | — | — | Use the same name on each run to get only new listings. Cached ads are skipped, not charged and not counted towards Max items. Records get `changeType: new`. |
| Search keywords (`keywords`) | array | — | — | Words to search for. Each keyword is searched separately with the filters below. |
| Category (`category`) | string | — | — | One of 45 categories, for example Cars, Apartment / Condominium, Mobile Phones & Gadgets. Empty = all categories. |
| State (`region`) | string | — | — | Malaysian state or federal territory. Empty = the whole of Malaysia. |
| Listing type (`listingType`) | string | — | `sell` | `sell` (for sale), `let` (for rent), `newprop` (new properties) or `auction`. |
| Minimum price (RM) (`minPrice`) | integer | — | — | Lowest price, or monthly rent for rentals. |
| Maximum price (RM) (`maxPrice`) | integer | — | — | Highest price, or monthly rent for rentals. |
| Sort by (`sortBy`) | string | — | `newest` | `newest`, `price_asc` or `price_desc`. |
| Seller type (`sellerType`) | string | — | `all` | `all`, `private` or `company`. |
| Proxy configuration (`proxyConfiguration`) | object | — | no proxy | Works without a proxy. Enable Apify Proxy only if you get blocked. |
| Max concurrency (`maxConcurrency`) | integer | — | `5` | How many requests run in parallel. |

The category, state, listing type, price, sort and seller filters apply to keyword searches. Pick a category or state without a keyword to browse it.

![Mudah.my classifieds scraper input form with the Listing or ad URLs, Max items per search, Scrape full ad details, and Cache project name fields marked 1 to 4](https://i.postimg.cc/nV116RWC/image.png)

The numbered markers in the screenshot show the fields most runs use:

1. **Listing or ad URLs**: paste a Mudah.my listing page with your filters set on the site, or a single ad URL.
2. **Max items per search**: how many ads to save for each URL or keyword.
3. **Scrape full ad details**: on by default; opens every ad for all specifications, HD photos, store details and WhatsApp numbers. Turn it off for faster, cheaper runs with the search data only.
4. **Cache project name**: optional; reuse the same name on every run so ads you already scraped are skipped and not charged.

Below the **Proxy configuration** (optional, the site works without a proxy) sits the collapsed **Search filters and more options** section. Expand it to search without a URL: it holds the keywords, category, state, listing type, price range, sorting and seller type. Each keyword is a separate search.

**How the cache saves money:**

With full ad details on, every ad costs one extra detail request on top of the search request. Without a cache, a daily run over the same search opens the same detail pages again and again and pays for them each time. With a **Cache project name**:

- The actor remembers every listing it has saved in a key-value store named after your project, and keeps it between runs.
- Each run still reads the search result pages, which are cheap and hold up to 50 ads each. Ads already in the cache are dropped right there, before a detail page is requested.
- Skipped ads cost no detail request, no proxy traffic and no result charge, and they do not count towards **Max items per search**. The limit is spent only on new ads.
- Ad URLs you paste are skipped the same way if the ad is already cached.

For example, a search with 500 matching ads that gets 20 new ads a day pays for 20 results and 20 detail pages on day 2 instead of 500 of each.

Use a different project name per search you track, because each name has its own memory. Pick a new name, or remove the stored record, to start from scratch. A cached ad is not scraped again, so later price changes on it are not picked up.

**Supported URL types:**

- Listing pages: `https://www.mudah.my/malaysia/cars-for-sale`, `https://www.mudah.my/selangor/cars-for-sale/toyota?price=20000-60000`, `https://www.mudah.my/kuala-lumpur/apartment-condominium-for-rent`, `https://www.mudah.my/malaysia/for-sale?q=iphone`, `https://www.mudah.my/johor/properties-for-auction`
- Ad pages: `https://www.mudah.my/2014-mercedes-benz-c200-1-8-cgi-blueefcy-w204-115289827.htm`

### 📦 Mudah.my scraper output data

Each listing is saved as one dataset item with the fields `id`, `listId`, `adId`, `url`, `title`, `description`, `price`, `priceLabel`, `priceSuffix`, `oldPrice`, `priceDropPercent`, `currency`, `category`, `categoryId`, `listingType`, `condition`, `region`, `subarea`, `location`, `address`, `sellerDetails` (an object with `name`, `type`, `profileUrl`, `avatarUrl`, `joined`, `phones`, `storeName`, `storeVerified`, `storeSince`, `companyRoc`), `make`, `model`, `manufacturedYear`, `mileage`, `transmission`, `engineCapacity`, `fuelType`, `bodyType`, `propertyType`, `size`, `sizeUnit`, `bedrooms`, `bathrooms`, `buildingName`, `furnishing`, `specs`, `badges`, `mudahCertified`, `hasVideo`, `videoUrls`, `imageCount`, `imageUrl`, `images`, `postedAt`, `modifiedAt`, `expiresAt`, `scrapedAt` and, when caching is on, `changeType`. Fields that do not apply to a category (for example `mileage` for a phone) are `null`. The dataset has **1 view**, **Overview**, a table with the photo, title, price, category, location, seller, posting date and ad URL.

**Output at a glance:**

| Listing | Price (RM) | Category | Location | Seller | Posted |
| ------- | ---------- | -------- | -------- | ------ | ------ |
| [2019 Toyota HARRIER 2.0 PREMIUM (A)](https://www.mudah.my/2019-toyota-harrier-2-0-premium-a-cashback-rebate-115721131.htm) | 93,888 | Cars | Kuala Lumpur - Salak Selatan | company | 2026-09-07 |
| [2023 Suzuki JIMNY Sierra JC (A)](https://www.mudah.my/2023-suzuki-jimny-sierra-jc-a-116041799.htm) | 118,000 | Cars | Selangor - Bangi | company | 2026-10-14 |
| [2015 Honda ACCORD 2.0 VTI-L (A)](https://www.mudah.my/2015-honda-accord-2-0-vti-l-a-115640109.htm) | 32,800 | Cars | Selangor - Petaling Jaya | company | 2026-08-27 |
| [iphone 15 pro](https://www.mudah.my/iphone-15-pro-116047931.htm) | 2,500 | Mobile Phones & Gadgets | Melaka - Bandar Hilir | private | 2026-10-14 |
| [Iphone 15](https://www.mudah.my/iphone-15-116047760.htm) | 1,900 | Mobile Phones & Gadgets | Melaka - Bukit Rambai | private | 2026-10-14 |

**Sample output (raw JSON):**

```json
[
    {
        "id": "115721131",
        "listId": 115721131,
        "adId": 135885187,
        "url": "https://www.mudah.my/2019-toyota-harrier-2-0-premium-a-cashback-rebate-115721131.htm",
        "title": "2019 Toyota HARRIER 2.0 PREMIUM (A)cashback rebate",
        "description": "🚙 TOYOTA HARRIER 2.0 PREMIUM (A) 2024 🚙\n✨ PREMIUM SUV|COMFORTABLE|HIGH SPEC ✨\n\n🎉 SPECIAL PROMOTION 🎉\n🎁 FREE 2YEARS WARRANTY\n💰 FULL LOAN/CASH BACK REBATE\n📉 LOW I...",
        "price": 93888,
        "priceLabel": "RM 93,888",
        "priceSuffix": null,
        "oldPrice": 96888,
        "priceDropPercent": 3,
        "currency": "MYR",
        "category": "Cars",
        "categoryId": 1020,
        "listingType": "sell",
        "condition": "Used",
        "region": "Kuala Lumpur",
        "subarea": "Salak Selatan",
        "location": "Kuala Lumpur - Salak Selatan",
        "address": null,
        "sellerDetails": {
            "name": "MS AUTOMOTIVE",
            "type": "company",
            "profileUrl": "https://www.mudah.my/ismailmah-ms-automotive-salak-selatan-salak-south",
            "avatarUrl": "https://img.rnudah.com/stores/logo_949178_pxm.jpg",
            "joined": null,
            "phones": ["+60198634865", "+60129419288"],
            "storeName": "SALAK SELATAN SALAK SOUTH",
            "storeVerified": true,
            "storeSince": "2019-07-05T00:00:00+08:00",
            "companyRoc": "002598691-W"
        },
        "make": "Toyota",
        "model": "Harrier",
        "manufacturedYear": 2019,
        "mileage": "70000-74999",
        "transmission": "Auto",
        "engineCapacity": 1998,
        "fuelType": "petrol",
        "bodyType": "SUVs",
        "propertyType": null,
        "size": null,
        "sizeUnit": null,
        "bedrooms": null,
        "bathrooms": null,
        "buildingName": null,
        "furnishing": null,
        "specs": {
            "Condition": "Used",
            "Brand": "Toyota",
            "Model": "Harrier",
            "Type": "SUVs",
            "Transmission": "Auto",
            "Engine Capacity": "1998 cc",
            "Mileage": "70 000 - 74 999",
            "Mfg. Year": "2019",
            "ROC/SSM No.": "002598691-W",
            "Variant": "PREMIUM"
        },
        "badges": [
            "Verified Dealer",
            "With Car Grant"
        ],
        "mudahCertified": false,
        "hasVideo": true,
        "videoUrls": [
            "https://customer-76ekbudsmzsbwunl.cloudflarestream.com/b5f7954222b7e7053683eb40f7f27999/manifest/video.m3u8"
        ],
        "imageCount": 24,
        "imageUrl": "https://cdn.rnudah.com/image_hd/plain/f2f167b8ff0f3ebd5e9a14bf62136744-3001038217882499483.jpg",
        "images": [
            "https://cdn.rnudah.com/image_hd/plain/f2f167b8ff0f3ebd5e9a14bf62136744-3001038217882499483.jpg",
            "https://cdn.rnudah.com/image_hd/plain/f5158651499786464ac876e3accecfae-3001038216396475456.jpg"
        ],
        "postedAt": "2026-09-07T13:41:34+08:00",
        "modifiedAt": "2026-10-15T01:16:23+08:00",
        "expiresAt": "2026-11-08T13:41:34+08:00",
        "scrapedAt": "2026-10-14T17:30:48.109Z"
    },
    {
        "id": "116047931",
        "listId": 116047931,
        "adId": 136276829,
        "url": "https://www.mudah.my/iphone-15-pro-116047931.htm",
        "title": "iphone 15 pro",
        "description": "LLA SET , 256gb , used E-sim",
        "price": 2500,
        "priceLabel": "RM 2,500",
        "priceSuffix": null,
        "oldPrice": null,
        "priceDropPercent": null,
        "currency": "MYR",
        "category": "Mobile Phones & Gadgets",
        "categoryId": 3020,
        "listingType": "sell",
        "condition": "Second-hand (Used)",
        "region": "Melaka",
        "subarea": "Bandar Hilir",
        "location": "Melaka - Bandar Hilir",
        "address": null,
        "sellerDetails": {
            "name": "Eittie Ty",
            "type": "private",
            "profileUrl": "https://www.mudah.my/u/seller-11476666",
            "avatarUrl": null,
            "joined": null,
            "phones": null,
            "storeName": null,
            "storeVerified": false,
            "storeSince": null,
            "companyRoc": null
        },
        "make": "Apple",
        "model": "iPhone 15 Pro",
        "manufacturedYear": null,
        "mileage": null,
        "transmission": null,
        "engineCapacity": null,
        "fuelType": null,
        "bodyType": null,
        "propertyType": null,
        "size": null,
        "sizeUnit": null,
        "bedrooms": null,
        "bathrooms": null,
        "buildingName": null,
        "furnishing": null,
        "specs": {
            "Subcategory": "Phones",
            "Brand": "Apple",
            "Model": "iPhone 15 Pro",
            "Storage": "256 GB",
            "Warranty": "No Warranty",
            "Condition": "Second-hand (Used)",
            "Deal Method": "Meet Up"
        },
        "badges": null,
        "mudahCertified": false,
        "hasVideo": false,
        "videoUrls": null,
        "imageCount": 4,
        "imageUrl": "https://cdn.rnudah.com/image_hd/plain/c89ab498cedc6c1e8eb1292c38dcb5a9-3006451621693636155.jpg",
        "images": [
            "https://cdn.rnudah.com/image_hd/plain/c89ab498cedc6c1e8eb1292c38dcb5a9-3006451621693636155.jpg",
            "https://cdn.rnudah.com/image_hd/plain/a25d7e958baa8e336d3a89d59ae5191c-3006451622611456415.jpg"
        ],
        "postedAt": "2026-10-14T21:36:09+08:00",
        "modifiedAt": "2026-10-14T21:36:09+08:00",
        "expiresAt": "2027-01-12T21:36:09+08:00",
        "scrapedAt": "2026-10-14T17:30:47.709Z"
    }
]
```

`specs` holds every specification shown on the ad, keyed by its label (the sample is trimmed). Dates are Malaysia time (+08:00).

### 🐍 How to scrape Mudah.my with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/mudah-classifieds-scraper").call(run_input={
    "keywords": ["honda city"],
    "category": "1020",
    "region": "8",
    "maxItems": 20,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('confidential_gnat/mudah-classifieds-scraper').call({
    keywords: ['honda city'],
    category: '1020',
    region: '8',
    maxItems: 20,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~mudah-classifieds-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"keywords": ["honda city"], "category": "1020", "region": "8", "maxItems": 20}'
```

### 💡 What you can use Mudah.my classifieds data for

- Used car price research: compare asking prices by make, model, year and mileage across Malaysian states
- Property rental and sale market analysis: rent per square foot, furnishing and facilities by building and area
- Dealer and agent lead generation with company names, registration numbers and WhatsApp contacts
- Price-drop and new-listing alerts for specific products, cars or neighbourhoods
- Marketplace and e-commerce research on second-hand phones, electronics and household goods

Car dealers, property agents and investors, resellers, market researchers and price-comparison sites in Malaysia typically use this data.

### ⚠️ Mudah.my scraper limitations and known issues

- **Search depth** — Mudah.my returns at most 10,000 results per search (about 5,000 for keyword searches). Split bigger searches by state or price range.
- **Phone numbers** — the number behind the "Show phone number" button is already in the ad data, so the actor returns it in `sellerDetails.phones` (international format, plus any WhatsApp numbers). It is `null` when the seller has no number or full ad details are off.
- **Price filter on rental URLs** — On rental pages Mudah.my itself filters by `monthly_rent`; a `price=` parameter in a rental URL returns no results on the site too. The price inputs of this actor use the right filter automatically.
- **Login-required pages** — The actor cannot access content behind authentication.

### ❓ Mudah.my scraper FAQ

#### Can I scrape Mudah.my legally?

The actor only collects ads that are already publicly visible on mudah.my, without logging in. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*), but you are responsible for complying with Mudah.my's Terms of Service and laws such as Malaysia's PDPA if you handle personal data like seller names and phone numbers.

#### What data does the Mudah.my scraper return?

Every listing has its title, price, description, photos, category, condition, location, seller name and type, key specifications and posting dates. With full ad details turned on, you also get every specification, HD photos, videos, store details, building address, company registration number and WhatsApp numbers when shown.

#### How many listings can I scrape from one Mudah.my search?

`maxItems` limits the number of listings **per keyword or listing URL**, not for the whole run. Mudah.my returns at most 10,000 results per search, so split very large categories by state or price range.

#### Do I need a proxy to scrape mudah.my?

No. The actor works without a proxy by default, which keeps runs cheapest. Turn on Apify Proxy only if you get blocked.

#### How do I scrape Mudah.my with Python?

Use the Python example above: call the actor with `ApifyClient`, then iterate over the dataset items of the finished run.

#### Can I run this Mudah.my scraper on a schedule and get only new ads?

Yes. Use Apify Schedules and set the same **Cache project name** on every run. The actor skips ads it already saved before opening their detail pages, so each run fetches, returns and charges for only new listings, marked with `changeType: new`. See **How the cache saves money** above.

#### What formats can I export Mudah.my data in?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### Does it return the seller's phone number?

Yes, with full ad details on. The phone number that Mudah.my shows after you click "Show phone number" is returned in `sellerDetails.phones`, together with any WhatsApp numbers on the ad.

### 🔗 Other actors you may find useful

| Scraper | Description |
| ------- | ----------- |
| [🛍️ Carousell Products Scraper](https://apify.com/confidential_gnat/carousell-products-scraper) | Marketplace listings from Carousell.sg by category, search or listing URL: title, price, seller rating, condition, photos and likes. |
| [📋 Craigslist Listings Scraper](https://apify.com/confidential_gnat/craigslist-listings-scraper) | Craigslist classified listings in any city and category: title, price, location, coordinates and photos. |
| [🛒 Tokopedia Product Scraper](https://apify.com/confidential_gnat/tokopedia-products-scraper) | Indonesian marketplace products from Tokopedia: title, shop, price in IDR, stock, category and images, with cross-run deduplication. |
| [🚗 Copart Search Scraper](https://apify.com/confidential_gnat/copart-search-scraper) | Salvage and used vehicle auction lots from Copart: damage, odometer, current bid, sale date, yard, photos and VIN decoding. |
| [🏁 Cheapest Cars & Bids Scraper](https://apify.com/confidential_gnat/cheapest-carsandbids-scraper) | The cheapest vehicle listings from Cars & Bids, to find the best-value auction deals. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/mudah-classifieds-scraper/issues/open).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

***

### 🇲🇾 Scraper iklan Mudah.my: panduan ringkas (Bahasa Melayu)

Actor ini mengambil iklan daripada **Mudah.my**, pasaran dalam talian terbesar di Malaysia, secara automatik. Anda boleh mendapatkan data **kereta terpakai, hartanah untuk dijual dan disewa**, telefon, elektronik, perabot dan semua kategori lain: tajuk, harga, penerangan, gambar HD, lokasi, penjual, spesifikasi penuh dan nombor WhatsApp penjual. Hasilnya boleh dimuat turun dalam format **JSON, CSV atau Excel**, atau digunakan melalui **API**.

**Cara guna:**

1. Masukkan URL senarai Mudah.my (dengan penapis yang anda tetapkan di laman web) atau URL satu iklan ke dalam **Listing or ad URLs**.
2. Jika tidak mahu guna URL, taip kata kunci dalam **Search keywords**, contohnya `honda city` atau `iphone 15`. Setiap kata kunci dicari secara berasingan.
3. Tetapkan **Max items per search** untuk had bilangan iklan bagi setiap URL atau kata kunci.
4. Buka **Search filters and more options** untuk memilih kategori, negeri, jenis senarai (jual, sewa, hartanah baharu atau lelongan), julat harga, susunan dan jenis penjual (persendirian atau syarikat).
5. Tekan **Start**, kemudian muat turun hasil daripada tab **Output**.

**Elakkan data berulang dengan cache:** isi **Cache project name** dengan nama yang sama pada setiap larian. Iklan yang telah diambil sebelum ini akan dilangkau dan tidak dicaj, jadi larian berjadual hanya memberi iklan baharu, ditandakan dengan `changeType: "new"`.

**Butiran penuh iklan:** pilihan **Scrape full ad details** (aktif secara lalai) membuka setiap iklan untuk spesifikasi penuh seperti jenama, model, tahun, jarak perjalanan, saiz, bilik tidur, kemudahan, gambar HD dan nombor WhatsApp penjual. Matikan pilihan ini untuk larian yang lebih pantas dan murah.

**Nota penting:**

- Mudah.my memulangkan paling banyak 10,000 keputusan bagi satu carian. Pecahkan carian besar mengikut negeri atau julat harga.
- Nombor telefon disembunyikan di sebalik captcha oleh Mudah.my. Actor ini memulangkan nombor WhatsApp yang dipaparkan oleh penjual; penjual persendirian biasanya tiada.
- Actor ini hanya mengambil maklumat awam yang boleh dilihat oleh semua pengunjung, tanpa log masuk. Anda bertanggungjawab mematuhi Terma Perkhidmatan Mudah.my dan undang-undang seperti Akta Perlindungan Data Peribadi (PDPA) 2010 jika anda mengendalikan data peribadi.

# Actor input Schema

## `startUrls` (type: `array`):

Mudah.my listing pages, with any filters set on the site (for example https://www.mudah.my/selangor/cars-for-sale/toyota?price=20000-60000 or https://www.mudah.my/kuala-lumpur/apartment-condominium-for-rent), or single ad pages (for example https://www.mudah.my/2018-toyota-alphard-115900606.htm).

## `maxItems` (type: `integer`):

Maximum unique listings saved for each keyword or listing URL. Mudah.my shows at most 10,000 results per search; use filters (state, price range) to split bigger searches.

## `scrapeDetails` (type: `boolean`):

Open every ad for all specifications, HD photos, store details, building address and the seller's WhatsApp numbers (when the seller shows them). Turn off for faster runs with the search data only (title, price, description, photos, location, seller and key specs). Ad URLs always include the details.

## `cacheProjectName` (type: `string`):

Use the same name on each scheduled run to get only new listings. Listings already scraped under this name are skipped and not charged, and they do not count towards Max items. Each record gets changeType: new.

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

This website works without a proxy. Enable Apify Proxy only if you get blocked.

## `keywords` (type: `array`):

Words to search for, for example iphone 15 or myvi. Each keyword is searched separately with the filters below. Leave empty and pick a category or state to browse without a keyword.

## `category` (type: `string`):

Category for keyword searches. Leave empty to search all categories.

## `region` (type: `string`):

Malaysian state or federal territory for keyword searches. Leave empty for the whole of Malaysia.

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

For sale, for rent, new properties or property auctions. Applies to keyword and category searches.

## `minPrice` (type: `integer`):

Lowest price in Malaysian ringgit (monthly rent for rentals).

## `maxPrice` (type: `integer`):

Highest price in Malaysian ringgit (monthly rent for rentals).

## `sortBy` (type: `string`):

Order of the results.

## `sellerType` (type: `string`):

Only private sellers, only companies and dealers, or both.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.mudah.my/malaysia/cars-for-sale"
    }
  ],
  "maxItems": 5,
  "scrapeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "keywords": [],
  "listingType": "sell",
  "sortBy": "newest",
  "sellerType": "all"
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.mudah.my/malaysia/cars-for-sale"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/mudah-classifieds-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 = { "startUrls": [{ "url": "https://www.mudah.my/malaysia/cars-for-sale" }] }

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/mudah-classifieds-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 '{
  "startUrls": [
    {
      "url": "https://www.mudah.my/malaysia/cars-for-sale"
    }
  ]
}' |
apify call confidential_gnat/mudah-classifieds-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,confidential_gnat/mudah-classifieds-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/Hyz0kQAYJbINvcz7r/builds/xi3RN5lt85opI7Ofd/openapi.json
