# Mudah.my Scraper (`solidcode/mudah-my-scraper`) Actor

\[💰 $1.5 / 1K] Extract classified listings from Mudah.my, Malaysia's largest online marketplace — cars, property, phones, electronics, jobs and more. Get price, condition, seller, location, photos and category-specific specs. Search by category, region or keyword, or paste a Mudah.my URL.

- **URL**: https://apify.com/solidcode/mudah-my-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Mudah.my Scraper

Pull classified listings from Mudah.my — Malaysia's largest online marketplace — with prices, conditions, seller names, full contact numbers, photo galleries, and category-specific specs on every row. Search by keyword, filter by category and state, or paste any Mudah.my URL, and get one clean, flat record per listing. Built for used-car dealers, property agents, resellers, and market-research teams who need live Mudah inventory and seller leads without copy-pasting listings by hand.

### Why This Scraper?

- **15 top-level categories in one actor** — Cars, Motorcycles, Commercial Vehicles & Boats, Property, Mobile Phones & Gadgets, Computers, Home & Living, Fashion, Health & Beauty, Sports & Hobbies, Pets, Babies & Kids, Jobs, Services, and Business/Industrial.
- **Full seller phone numbers, not the masked display digits** — capture the complete call/WhatsApp number (e.g. `0169435980`) instead of the `012****207` version shown to browsers, so the numbers you get are real, dialable leads. Some sellers list chat-only and publish no number, so a listing without a phone is expected, not an error.
- **All 16 Malaysian states and federal territories** — from Kuala Lumpur, Selangor, and Penang to Johor, Sabah, Sarawak, and Labuan, or search nationwide in a single run.
- **For-sale vs for-rent arrangement filter** — split property and vehicle listings by arrangement so agents pull only rentals or only sales, never a mixed feed.
- **Urgent-only mode** — surface just the listings sellers have flagged as urgent, the freshest and most motivated inventory for fast-moving deals.
- **Category-aware specs in one `attributes` object** — car make/model/year/mileage/transmission/fuel, property bedrooms/bathrooms/size/tenure, phone storage and model, all normalized into a single field per row.
- **Full photo gallery per listing** — every image URL plus a total image count, often 15+ photos per ad, not just the cover shot.
- **Three ways to target** — paste any Mudah.my URL (category, search-results, or a single listing), run free-text keyword searches, or build a search from the category + region + listing-type filters.
- **Flat, one-row-per-listing output** — 26 ready-to-use columns (price, condition, seller name + type, region + area, posted date) that drop straight into Sheets or a CRM with no nested envelopes to unwrap.

### Use Cases

**Automotive Dealers & Traders**

- Track competitor pricing on specific makes, models, and years
- Build lead lists of private sellers with real contact numbers
- Monitor new used-car and motorcycle listings by state
- Spot urgent-flagged vehicles priced to move

**Real-Estate Lead Generation**

- Collect for-rent or for-sale property listings by state and area
- Capture landlord and agent contact numbers for outreach
- Compare asking rents and prices across Klang Valley and beyond
- Feed fresh property inventory into your CRM

**Price & Market Research**

- Benchmark second-hand prices across categories and regions
- Track how listing volumes shift by state over time
- Analyze condition (new / used / recon) mix per category
- Measure phone, computer, and gadget resale values

**Reseller & Sourcing Teams**

- Find underpriced electronics, fashion, and home items to flip
- Monitor pets, hobbies, and kids categories for niche stock
- Source inventory near a specific region for faster pickup
- Set up recurring runs to catch new listings first

**Recruitment & Services**

- Pull Jobs and Services listings by region
- Build directories of local service providers with contacts
- Track business, industrial, and agriculture equipment offers

### Getting Started

#### Simple Keyword Search

The quickest way to start — one keyword and a small cap to test:

```json
{
    "searchQueries": ["honda civic"],
    "maxResults": 50
}
```

#### Filter by Category, Region & Listing Type

Pull only for-rent property in Kuala Lumpur:

```json
{
    "category": "property",
    "region": "kuala-lumpur",
    "arrangementType": "for-rent",
    "maxResults": 200
}
```

#### Scrape a Mudah.my URL

Set your filters on mudah.my, copy the address bar, and paste it in:

```json
{
    "startUrls": ["https://www.mudah.my/malaysia/cars-for-sale"],
    "maxResults": 100
}
```

#### Full-Featured Example

```json
{
    "searchQueries": ["iphone 15"],
    "category": "mobile-phones",
    "region": "selangor",
    "arrangementType": "any",
    "onlyUrgent": true,
    "maxResults": 500
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | `[]` | One or more Mudah.my URLs — a category page, a search-results page, or a single listing. When provided, these are used directly and the search-builder fields below are ignored. |
| `searchQueries` | string\[] | `[]` | Free-text keywords, e.g. "honda civic" or "condo mont kiara". Each keyword runs its own search, combined with the filters below. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `category` | select | `All categories` | Limit to one of 15 top-level categories (Cars, Property, Mobile Phones & Gadgets, Jobs, and more), or search across everything. |
| `region` | select | `All Malaysia` | Limit to one of Malaysia's 16 states and federal territories, or search nationwide. |
| `arrangementType` | select | `Any` | Keep only "For sale" or "For rent" listings. Applies to property and some vehicles; other categories are unaffected. |
| `onlyUrgent` | boolean | `false` | When on, keep only listings the seller flagged as urgent. |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum listings per URL or search. Set to 0 for unlimited. Results come in pages and the last page is always returned in full, so you may receive a few more than this number. |

### Output

Each listing is one flat record. Here is a representative car result:

```json
{
    "id": "114587065",
    "url": "https://www.mudah.my/2023-perodua-ativa-1-0-av-a-114587065.htm",
    "title": "2023 Perodua ATIVA 1.0 AV (A)",
    "description": "Original paint, well kept, accident-free, full service record with Perodua and still under warranty. Careful owner, ready to view.",
    "price": 49800,
    "priceDisplay": "RM 49,800",
    "currency": "MYR",
    "category": "Cars",
    "subcategory": "SUVs",
    "transactionType": "for sale",
    "condition": "Used",
    "region": "Selangor",
    "area": "Bandar Bukit Tinggi",
    "locationLabel": "Selangor - Bandar Bukit Tinggi",
    "isUrgent": false,
    "isHighlighted": false,
    "isCompanyAd": true,
    "sellerName": "LM AUTO MART SDN BHD",
    "sellerType": "store",
    "sellerId": "112857",
    "phone": "60123668207",
    "postedAt": "2026-07-12T12:37:52+00:00",
    "imageUrl": "https://img.rnudah.com/images/29/2981486408002324139.jpg",
    "images": [
        "https://img.rnudah.com/images/29/2981486408002324139.jpg",
        "https://img.rnudah.com/images/29/2981486412700272299.jpg"
    ],
    "imageCount": 7,
    "attributes": {
        "make": "Perodua",
        "model": "Ativa",
        "manufactured_date": "2023",
        "mileage": "75 000 - 79 999",
        "transmission": "Auto",
        "engine_capacity": "1000 cc",
        "car_type": "SUVs"
    }
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Unique Mudah.my listing ID |
| `url` | string | Direct listing URL |
| `title` | string | Listing title |
| `description` | string | Full listing description |
| `category` | string | Top-level category (e.g. "Cars") |
| `subcategory` | string | Sub-category where available (e.g. "Sedan") |
| `postedAt` | string | ISO 8601 timestamp of when the listing was posted |

#### Pricing & Condition

| Field | Type | Description |
|-------|------|-------------|
| `price` | number | Numeric price in Malaysian Ringgit |
| `priceDisplay` | string | Price as shown, e.g. "RM 88,800" |
| `currency` | string | Always "MYR" |
| `transactionType` | string | "for sale", "for rent", or "wanted" where applicable |
| `condition` | string | new / used / recon where the category provides it |

#### Seller & Contact

| Field | Type | Description |
|-------|------|-------------|
| `sellerName` | string | Seller or store display name |
| `sellerType` | string | private / store / dealer |
| `sellerId` | string | Seller or store identifier |
| `phone` | string | Full contact number where the seller published one |
| `isCompanyAd` | boolean | Whether the listing was posted by a company or store |

#### Location

| Field | Type | Description |
|-------|------|-------------|
| `region` | string | Malaysian state or federal territory |
| `area` | string | City or sub-area within the region |
| `locationLabel` | string | Full display location string |

#### Media & Flags

| Field | Type | Description |
|-------|------|-------------|
| `imageUrl` | string | Primary / cover image URL |
| `images` | string\[] | Full gallery image URLs |
| `imageCount` | integer | Number of images on the listing |
| `isUrgent` | boolean | Seller-flagged urgent listing |
| `isHighlighted` | boolean | Highlighted or promoted listing |

#### Category Attributes

| Field | Type | Description |
|-------|------|-------------|
| `attributes` | object | Category-specific specs, normalized into one object — cars: make, model, manufactured\_date, mileage, transmission, engine\_capacity, car\_type; property: property type, rooms, bathrooms, size, title type; phones: brand, model, storage; and so on per category. |

### Tips for Best Results

- **Start small** — set `maxResults` to 20–50 on your first run to confirm the data fits your needs, then scale up.
- **Go past the depth ceiling by partitioning** — any single search returns up to its first 10,000 listings. To pull more from a huge category, split the job by region (run each state separately) or by a narrower sub-category, then combine the results.
- **Paste a filtered category URL for precise sub-categories** — set every filter you want on mudah.my (specific brand, price band, sub-category), copy the address bar into `startUrls`, and the run mirrors that exact on-site search — handy for filters the dropdowns don't expose.
- **URLs win over the search builder** — when `startUrls` is set, the category, region, keyword, and listing-type fields are ignored. Use one approach per run to avoid surprises.
- **Use urgent-only for hot leads** — turn on `onlyUrgent` to keep just the listings sellers marked as urgent, typically the freshest and most negotiable inventory.
- **Contact numbers depend on the seller** — `phone` is filled whenever the seller published a number; some listings are chat-only and will have no phone, which is expected, not an error.
- **Sweep small searches fully** — set `maxResults` to 0 on a tight category-plus-region search to capture every matching listing in one pass.

### Pricing

**From $1.50 per 1,000 results** — competitively priced for high-volume Malaysian marketplace monitoring. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.18 | $0.17 | $0.16 | $0.15 |
| 1,000 | $1.80 | $1.70 | $1.60 | $1.50 |
| 10,000 | $18.00 | $17.00 | $16.00 | $15.00 |
| 100,000 | $180.00 | $170.00 | $160.00 | $150.00 |

A "result" is any listing row in your output dataset. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate market research, competitive analysis, and lead generation from publicly available Mudah.my listings. You are responsible for complying with applicable laws and Mudah.my's Terms of Service. Handle any personal data, including seller contact numbers, in line with Malaysia's Personal Data Protection Act and relevant regulations, and do not use extracted data for spam, harassment, or any unlawful purpose. </content> </invoke>

# Actor input Schema

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

Paste one or more Mudah.my URLs — a category page, a search-results page, or a single listing. Go to mudah.my, set your filters in the browser, and copy the URL from the address bar. When provided, these are used directly and the search-builder fields below are ignored.

## `searchQueries` (type: `array`):

Free-text keywords, e.g. 'iphone 15', 'honda civic', 'condo mont kiara'. Each keyword runs its own search, combined with the category, region, and listing-type filters below. Leave empty to browse a whole category instead. Ignored when Mudah.my URLs are provided above.

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

Limit the search to one top-level Mudah.my category. Choose 'All categories' to search across everything. For finer sub-categories, paste a category URL under 'Mudah.my URLs' instead.

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

Limit the search to one Malaysian state or federal territory. Choose 'All Malaysia' to search nationwide.

## `arrangementType` (type: `string`):

For categories that support it (property, and some vehicles), keep only 'For sale' or 'For rent' listings. 'Any' keeps both. Has no effect on categories without a sale/rent split.

## `onlyUrgent` (type: `boolean`):

When on, keep only listings the seller has flagged as urgent. Leave off to include every listing.

## `maxResults` (type: `integer`):

Maximum number of listings to extract per URL or search. Set to 0 for unlimited. Note: any single search can reach at most its first 10,000 listings (a marketplace depth limit) — to pull more from a very large category, split the run by region or by a narrower sub-category. Results come in pages, and the last page is always returned in full, so you may receive a few more than this number.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.mudah.my/malaysia/cars-for-sale"
  ],
  "searchQueries": [],
  "category": "any",
  "region": "any",
  "arrangementType": "any",
  "onlyUrgent": false,
  "maxResults": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of listings with title, category, price, condition, and location.

## `seller` (type: `string`):

Seller name, type, phone, and location for each listing.

# 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": [
        "https://www.mudah.my/malaysia/cars-for-sale"
    ],
    "searchQueries": [],
    "category": "any",
    "region": "any",
    "arrangementType": "any",
    "onlyUrgent": false,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/mudah-my-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": ["https://www.mudah.my/malaysia/cars-for-sale"],
    "searchQueries": [],
    "category": "any",
    "region": "any",
    "arrangementType": "any",
    "onlyUrgent": False,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/mudah-my-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "https://www.mudah.my/malaysia/cars-for-sale"
  ],
  "searchQueries": [],
  "category": "any",
  "region": "any",
  "arrangementType": "any",
  "onlyUrgent": false,
  "maxResults": 100
}' |
apify call solidcode/mudah-my-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/mudah-my-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GLiI2eGajZhROUKWC/builds/JrXKrIWwuGCRuL3by/openapi.json
