Mudah.my New Listings & Price Alert (Malaysia) avatar

Mudah.my New Listings & Price Alert (Malaysia)

Pricing

from $1.26 / 1,000 listing scrapeds

Go to Apify Store
Mudah.my New Listings & Price Alert (Malaysia)

Mudah.my New Listings & Price Alert (Malaysia)

Newest Mudah.my listings for any category, one flat row each: title, price in MYR (null when none is stated), state, town, first-listed and last-bumped times, seller type, photos, make/model/size attributes, URL. Filter by state, keyword, seller type and price.

Pricing

from $1.26 / 1,000 listing scrapeds

Rating

0.0

(0)

Developer

Superslow Sloth

Superslow Sloth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 days ago

Last modified

Share

Mudah.my Listings Scraper: New Listings & Price Alert (Malaysia)

Read Mudah.my, Malaysia's biggest classifieds site, one category at a time and get one flat row per listing: title, price in ringgit (MYR), state and town, when it was first listed and last bumped, seller name and type, condition, photos, category-specific attributes (car make and mileage, phone model, bedrooms ...) and the listing URL. Newest first by default, so a scheduled run is a Mudah.my new-listing alert; price sorts, a price band, a keyword, a state and a private / business seller filter turn it into a bargain watch.

No account, no login, no browser. One request returns 39 to 40 listings.

Input

FieldNotes
categoriesOne or more categories, one per line. Required. A slug as it appears in mudah.my URLs (cars-for-sale, mobile-phones-and-gadgets-for-sale, motorcycles-for-sale, computers-and-accessories-for-sale, properties-for-rent; for-sale is every category), a short name (cars becomes cars-for-sale), or a full mudah.my category URL, which keeps its own state and any filter you set on the website. A listing two categories both show is returned once, under the first.
regionOne state or federal territory as written in Mudah URLs: selangor, kuala-lumpur, penang, johor, sabah ... Default malaysia (everywhere).
queryOptional keyword searched inside each category (myvi, iphone 15).
maxItemsListings to read per category (default 100, up to 10,000). Mudah stops serving a search after about 10,000 results however many it reports.
sortnewest (default), price-asc, price-desc.
sellerTypeall (default), private, company (business ads).
minPrice, maxPriceAsking-price band in whole ringgit, inclusive, either end optional.
proxyConfigurationApify proxy by default.

About "newest first"

This is Mudah's own default sort. It orders by when a listing was last placed at the top, not strictly when it was first posted: a seller who bumps an old listing sees it jump back. The actor does not re-sort. Every row carries first_listed_at, which is when the listing was originally posted, so filter on that to keep only genuinely new listings.

About the price sorts and the price band

Both are applied by Mudah. A price band also drops listings with no price. price-asc starts with RM 1 listings (9 of the first 12 rows on one measured sort), most of them placeholders for free or negotiable items; add a minPrice of 2 or more to skip them.

Output

FieldNotes
listing_id, urlMudah's listing id (the number at the end of the URL) and the absolute listing URL.
search_categoryThe category slug that found the row.
title, descriptionAs the seller wrote them. description is filled on the general category pages (phones, computers, motorcycles, furniture, fashion, pets ...) and is null on almost every car and property listing, where Mudah's page ships the text as a deferred reference this actor does not follow (an occasional listing carries it inline, and then it is returned).
price_myr, old_price_myr, price_suffixSee below.
category, category_id, parent_category, ad_typeMudah's category name and id, the group it sits under where Mudah sends one, and sell / let / want as Mudah words it.
region, region_id, area, area_idState and town.
listed_at, first_listed_at, bumped_atSee below.
seller_name, seller_type, seller_id, store_id, seller_verifiedThe display name, company or private, Mudah's user id and (for business sellers) shop id, and the shop's verified flag.
conditionNew, Used, Like New ... as Mudah words it; null for property and rentals.
image_url, image_urls, image_countThe main photo, every photo the page lists (absolute URLs, nothing is downloaded), and Mudah's own count.
attributesOne object of category-specific fields. Cars: make, model, body_type, year, transmission, fuel_type, engine_cc, mileage_km (a band such as 90000-94999), mudah_certified. Phones: brand, model, warranty. Motorcycles: make, model, year. Property: property_type, tenure, bedrooms, bathrooms, size, size_unit, building. Only keys the listing carries are present.
page, positionThe result page the row came from and Mudah's own rank on it (null on property pages, which carry none).

The three timestamps

Mudah sends three times and they mean different things. All are Malaysia time (+08:00) in ISO 8601.

FieldMeaning
listed_atMudah's origListTime. Sent only for a listing Mudah has re-listed or bumped; null for most rows (measured: null on 358 of 400 listings across ten general-category pages and on 5 of 39 on a cars page, and absent on many property listings). It is never filled in from another field.
first_listed_atMudah's origDate: when the listing was first placed. It equals listed_at whenever that is set and equals bumped_at when it is not, on all 838 listings measured across 23 category pages (225 with listed_at, 613 without), so it is the posting time either way. Use this one for a new-listing alert.
bumped_atWhen Mudah last placed the listing at the top: its date, the time the website shows and the time it sorts by. Moves when the seller bumps. It is not the last edit (modifiedAt ran later than date on 34 of 743 measured listings), and it is not returned.

The price, honestly

price_myr is the asking price in ringgit as a number, always a float. For a rental it is the monthly rent (Mudah sends it in a different field) and price_suffix says per month. It is null when a listing carries no positive amount. old_price_myr is the earlier price Mudah shows struck through, otherwise null; it is usually above the current price but not always (one of five measured motorcycles had a lower one), so it is not a guaranteed markdown. Listings priced RM 1 are returned as RM 1, not hidden or turned into null.

Honest nulls

A field Mudah did not send is null, never 0 or "": description on most car and property listings, condition on property, seller_verified and store_id for private sellers without a shop, position on property pages, parent_category on car and property pages. image_urls is an empty list when the listing has no photo, and attributes an empty object when the category sends none.

What is not a row

Mudah pins paid "featured" listings above the results. They are a separate list in the page and are not returned, so every row is an organic result in Mudah's own order.

Personal data

Listing text and display names are written by private individuals and businesses and can hold names or contact details. They are carried as Mudah publishes them, because they are the listing; nothing is extracted from them. The actor does not read or return phone numbers. You are responsible for handling what you store under Malaysia's PDPA.

Pricing

Pay per event:

  • $0.002 per run (actor-start), charged only after your input is validated - a run that fails on bad input costs nothing.
  • $0.00126 per listing row written (listing-scraped), i.e. $1.26 per 1,000 listings.

How it fetches

It requests the same category pages the website shows (www.mudah.my/<state>/<category>?o=<page>) and reads the listing data Mudah embeds in them. Two page families exist and both are read: the general categories carry a __NEXT_DATA__ JSON, and cars and property carry a React Server Components stream. Measured 2026-10-10: HTTP 200 from Apify datacenter and residential exits and from a plain connection. Apify datacenter proxy is the default.

Things worth knowing, all measured:

  • Cloudflare challenge. After roughly 40 page requests in a few minutes from one address Mudah answers 200 with Cloudflare's "Just a moment" page and no listings (it cleared within minutes). The actor treats a 200 without listing data, and 403, 429 and 5xx, as a refusal: it rotates to a fresh proxy address and retries.
  • Result cap. Mudah serves at most about 10,000 results per search (the last answered page was 250 for the general categories and 256 for cars) and answers beyond it with an empty page; the run logs when a category was cut off that way.
  • A misspelt category is not an error on Mudah's side. It redirects an unknown category slug to a keyword search of every category. The actor notices that the page is not the category you asked for and reports a failure instead of returning unrelated listings. An unknown state is answered with an empty "no ads" page and is reported the same way.
  • Keyword and filters are applied by Mudah, on both page families: query, sort, sellerType and the price band were each checked against live pages.