Mudah.my Cars, Property, Jobs & Marketplace Scraper at a glance
Mudah.my Cars, Property, Jobs & Marketplace Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes id, title, price, price (num) and previous price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 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
- Ecommerce, Jobs, Real Estate
- Region
- Asia
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 21 options
Scrape Mudah.my listings across every category: cars, motorcycles, property, mobiles, electronics, home, hobbies, jobs and services. Search by keyword, filter by category, state and price, or paste URLs. Rich records with seller, store verification, images and category-specific specs.
What Mudah.my Cars, Property, Jobs & Marketplace Scraper can do
- All categories in one Actor. Cars, motorcycles, property, apartments and condos, computers, mobiles and gadgets, home and furniture, hobbies and collectibles, business equipment, jobs, and services.
- Two ways to start. Keyword and filter search, or paste Mudah.my listing, category, or keyword-search links directly.
- Narrow results your way. Filter by category, Malaysian state and listing type in search mode; price range also narrows category and search-style pasted links.
- Category-aware specs extracted automatically. Vehicle make, model, manufacturing year, mileage, transmission, fuel type, and loan estimates for cars; property type, rooms, bathrooms, size, and (for listings for sale) title type for property.
- Rich seller and store data. Seller name and account type, store id and verification status, seller badges such as Verified Dealer, primary image, image counts, and full listing timestamps.
- Built for monitoring. Incremental mode tracks a saved search across scheduled runs and classifies every listing as NEW, UPDATED or UNCHANGED by default (EXPIRED and REAPPEARED need Emit expired), or resume one specific interrupted crawl instead with resumeFromRunId.
Choose what to collect
These inputs let you configure Mudah.my Cars, Property, Jobs & Marketplace Scraper. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to start: run a keyword/category search, or scrape specific pasted URLs. |
queriesarray | One or more keywords to search across Mudah.my (e.g. iphone, honda civic, condo). Leave empty to browse a whole category or state. |
categorystring | Restrict results to a category. Choose All to search across every category. |
statestring | Restrict results to a Malaysian state. Choose All for the whole country. |
listingTypestring | All listings, only items offered for sale, or only items offered for rent (rentals, rooms, property for rent). Search mode; in URL mode a ...-for-rent page already implies rent. |
startUrlsarray | Mudah.my URLs to scrape. Supports individual listing pages (…-.htm), category pages (including state pages such as /selangor/cars-for-sale and rentals such as /malaysia/properties-for-rent), keyword-search pages (?q=) and page links (?o=2, mapped to an approximate start position). Multiple URLs supported. Left untouched, URL mode scrapes the ten example links (one per URL shape). |
minPriceinteger | Only listings priced at or above this amount in Malaysian Ringgit. |
Show 14 more inputs
| Input | What it controls |
|---|---|
maxPriceinteger | Only listings priced at or below this amount in Malaysian Ringgit. |
onlyUrgentboolean | Only listings the seller has flagged URGENT (a paid boost on Mudah.my). Applies to search mode and to category/keyword links in URL mode. |
maxItemsinteger | Maximum number of listings to return across all searches / URLs (up to 100000). Set 0 for the highest allowed limit (100000); the run stops earlier when results are exhausted. |
maxPagesinteger | Optional bound on result pages walked per search/URL. Leave empty to walk result pages up to a hard limit of 500 pages per search/URL; the run stops earlier at Max items or when a search's results are exhausted. |
includeDetailsboolean | Also open each listing's own page to add the full description, the whole photo gallery and the seller and contact flags (chat and WhatsApp available, advertiser online, agent and firm numbers where shown). Costs one extra page request per listing, so runs are slower; the number of rows and the price per row stay the same. Phone numbers are never collected. If a page cannot be read, that row is still returned without these fields. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Listings already collected there (matched by listing id) are skipped, so this run only saves the new ones. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead. Leave empty for a normal fresh run. |
incrementalModeboolean | Turn 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, unchanged ones are suppressed (and not billed). A listing is UPDATED when any of its scraped fields changed (price, title, description, images, seller, highlights, timestamps such as modifiedAt, and the raw attributes); the changed names are listed in changedFields. scrapedAt and the per-search rank are always excluded (at any depth) because they change on every fetch, and any field you list in Ignore fields never triggers UPDATED, though it stays in the output. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately for each mode/keyword/category/state/listing type/price/urgent-only filter/URL 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. |
stateKeystring | Optional. 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 mode/keyword/category/state/price/URL setup, different searches then never mix state with each other. |
emitUnchangedboolean | Off 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. |
emitExpiredboolean | Off 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, so not when Max items/Max pages capped it, not when Resume was used, and not on a URL-mode run that only looked up individual listing URLs (such a run never walks the tracked search, so it cannot prove anything is gone). This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Field names that must NOT make a listing UPDATED, one per entry. Use dots for nested fields, for example "timestamps.modifiedAt" or "seller.storeId"; array items are covered automatically. Ignored fields stay in the output, they just never count as a change. Only applies when Incremental changes is on. |
mcpConnectorsarray | Optionally 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 page-per-item export; other connectors get a best-effort write. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap 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.
idIDtitleTitlepriceLabelPricepricePrice (num)previousPricePrevious pricediscountPercentDiscount %urgentUrgentcategoryCategorylistingTypeTypeconditionConditionlocationLocationsellerSellerShow 25 more fields
sellerVerifiedVerifiedimagesImagestimestampsDatesurlURLscrapedAtScraped atchangeTypeChange (incremental mode)changedFieldsChanged fieldsfirstSeenAtFirst seen (incremental mode)lastSeenAtLast seen (incremental mode)car.make.nameMakecar.model.nameModelcar.yearYearcar.mileageMileagecar.transmissionTransmissioncar.fuelTypeFuelcar.carLoan.eligibleLoan eligibleproperty.type.nameTypeproperty.roomsRoomsproperty.bathroomsBathroomsproperty.size.valueSizeproperty.size.suffixSize unitproperty.titleType.nameTitle typedescriptionDescriptiongalleryImageUrlsGallerydetailsSeller & contact flagsExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "100000001",
"adId": "100000002",
"url": "https://www.mudah.my/sample-listing-100000001.htm",
"title": "Sample Listing Title",
"price": 65000,
"priceLabel": "RM 65,000",
"priceAlias": null,
"currency": "MYR",
"categoryId": "1000",
"categoryName": "Cars",
"categoryLevel1Name": null,
"category": {
"id": "1000",
"name": "Cars",
"level1Id": null,
"level1Name": null
},
"listingType": "sell",
"condition": {
"id": "1",
"name": "Second-hand (Used)"
},
"regionId": "8",
"regionName": "Selangor",
"location": {
"regionId": "8",
"region": "Selangor",
"subareaId": "301",
"subarea": "Sample Subarea",
"raw": null
},
"sellerName": "Sample Seller",
"seller": {
"userId": "10000000",
"name": "Sample Seller",
"accountType": 1,
"companyAd": false,
"storeId": "100000",
"storeVerified": true,
"badges": [
"Verified Dealer"
]
},
"sellerVerified": true,
"images": {
"primaryUrl": "https://img.example.com/images/00/000000000000000000.jpg",
"count": 5,
"mediaCount": 5
},
"timestamps": {
"listedAt": "2026-01-01T00:00:00.000Z",
"modifiedAt": "2026-01-01T00:00:00.000Z",
"origDate": "2026-01-01T00:00:00.000Z",
"expiresAt": "2026-02-01T00:00:00.000Z",
"listTs": 1767225600
},
"car": {
"make": {
"id": "10",
"name": "Sample Make"
},
"model": {
"id": "20",
"name": "Sample Model"
},
"year": 2020,
"mileage": 50000,
"transmission": "Automatic",
"fuelType": "Petrol"
},
"highlights": [],
"bundle": null,
"raw": {
"...": "the complete upstream attribute passthrough"
},
"reviews": [],
"scrapedAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- Car and property buyers: track new listings matching a price range, state, and category as soon as they're posted.
- Classifieds resellers: monitor Mobiles & Gadgets or Home & Furniture listings across every state for pricing and arbitrage opportunities.
- Market and pricing researchers: build price datasets across categories to track trends in Malaysia's secondhand market.
- Real estate and rental platforms: aggregate property and apartment/condo listings for a comparison or aggregator site.
- Recruiters and job boards: pull the Jobs category to cross-post listings or analyze hiring volume by state.
- Lead generation tools: watch for new for-sale listings from verified dealers and stores in a specific category.
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 Mudah.my Cars, Property, Jobs & Marketplace Scraper return?
The documented output for Mudah.my Cars, Property, Jobs & Marketplace Scraper includes id, title, price, price (num), previous price, discount %, urgent and category. Availability of each field depends on the source page and the selected mode.
How much does Mudah.my Cars, Property, Jobs & Marketplace Scraper cost?
It costs $2.00 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 and updated listings (plus reappeared ones if you also use Emit expired), and unchanged ones are not billed unless you turn on Emit unchanged.
What's the difference between Resume and Incremental mode?
They solve different problems. Resume (resumeFromRunId) continues one specific interrupted or oversized crawl so you don't re-scrape and re-pay for listings already saved. Incremental mode is for running the same search again and again on a schedule and getting only what changed; it remembers state itself, so you never paste a run ID. Use Resume for a one-off continuation, Incremental mode for recurring monitoring.
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.
