Mudah APImudah.my ↗
Search and retrieve used car and motorcycle listings from Mudah.my. Filter by make, price range, and region. Returns price, mileage, specs, seller info, and images.
What is the Mudah API?
The Mudah.my API provides access to used vehicle listings from Malaysia's largest online marketplace across 3 endpoints. Use search_cars to filter by brand and price range, search_motorcycles to browse two-wheeler listings, and get_listing_details to retrieve full listing data including seller contact, all attributes, and image URLs for any specific ad.
curl -X GET 'https://api.parse.bot/scraper/9512b984-45da-4cff-b5d1-bc813aff6aa7/search_cars?page=1&make_id=10&price_range=20000-80000' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace mudah-my-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Mudah.my Vehicle API — search cars, motorcycles, and drill into details."""
from parse_apis.mudah_my_vehicle_scraper_api import Mudah, ListingNotFound
client = Mudah()
# Search for Honda cars (make_id='10') with a budget cap, print top results.
for car in client.carlistings.search(make_id="10", price_range="20000-80000", limit=5):
print(car.title, car.price, car.condition, car.region)
# Drill into the first car listing's full details via sub-resource.
car = client.carlistings.search(make_id="3", limit=1).first()
if car:
detail = car.details.get()
print(detail.title, detail.price, detail.seller.name, len(detail.images))
# Search motorcycles above RM 25,000.
for moto in client.motorcyclelistings.search(price_min=25000, limit=3):
print(moto.title, moto.price, moto.year, moto.region)
# Typed error handling: catch a removed listing gracefully.
try:
removed_car = client.carlistings.search(limit=1).first()
if removed_car:
removed_car.details.get()
except ListingNotFound as exc:
print(f"Listing gone: {exc.url}")
print("exercised: carlistings.search / car.details.get / motorcyclelistings.search")
Search car listings on Mudah.my with optional brand and price filters. Returns up to 24 listings per page sorted by most recent. Pagination via integer page number. Each listing includes make, model, year, mileage range, condition, transmission, and a direct URL suitable for get_listing_details.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| make_id | string | Brand ID to filter by (e.g., '10' for Honda, '25' for Perodua, '3' for BMW, '28' for Toyota). |
| price_range | string | Price range filter in MYR, formatted as 'min-max' (e.g., '20000-50000') or 'min-' for open-ended (e.g., '50000-'). |
{
"type": "object",
"fields": {
"meta": "object with total-results count, total-showing per page, and took (search time in ms)",
"listings": "array of car listing objects with id, title, price, make, model, year, mileage, condition, engine_capacity, transmission, fuel_type, region, location, date, url, image"
},
"sample": {
"data": {
"meta": {
"took": 19,
"total-results": 85548,
"total-showing": 24
},
"listings": [
{
"id": 114933347,
"url": "https://www.mudah.my/2023-bmw-530e-2-0-m-sport-lci-a-reg-july-2023-114933347.htm",
"date": "2026-06-11 15:58:39",
"make": "BMW",
"year": "2023",
"ad_id": 134980171,
"image": "https://img.rnudah.com/images/29/2987431052962502365.jpg",
"model": "530e",
"price": 192800,
"title": "2023 Bmw 530e 2.0 M SPORT LCI (A) - REG JULY 2023",
"region": "Kedah",
"list_id": 114933347,
"mileage": "35000-39999",
"location": "Kedah - Alor Setar",
"condition": "Used",
"fuel_type": "petrol",
"price_label": "RM 192,800",
"transmission": "Auto",
"engine_capacity": "1998"
}
]
},
"status": "success"
}
}About the Mudah API
Searching Cars and Motorcycles
search_cars returns up to 24 listings per page sorted by most recent, with optional filters for make_id (e.g. '10' for Honda, '25' for Perodua, '28' for Toyota) and price_range formatted as 'min-max' in MYR (e.g. '20000-50000') or open-ended with '50000-'. Each result includes structured fields: make, model, year, mileage, condition, engine_capacity, transmission, fuel_type, price, and a direct listing url. The meta object returns total-results, total-showing, and search latency in milliseconds. search_motorcycles follows the same pagination pattern with an optional price_min integer filter, though motorcycle listings carry fewer structured attributes — make and model are often null — with most detail available in the free-text title.
Listing Detail Retrieval
get_listing_details takes a full listing URL from either search endpoint and returns the complete record for that ad. Response fields include id, title, price, description (HTML stripped), images (array of URLs), region, subarea, seller (name and phone), and an attributes object containing all raw key-value pairs from the listing page. This is the only endpoint that exposes seller contact details and the full ad description text.
Pagination and Coverage
All three endpoints paginate via an integer page parameter. Results are ordered by recency. The API covers listings across Malaysian regions and subareas as exposed on Mudah.my, restricted to the vehicles category — cars and motorcycles only.
The Mudah API is a managed, monitored endpoint for mudah.my — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when mudah.my changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official mudah.my API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track price trends for specific car makes using
make_idandprice_rangefilters across paginated search results. - Build a used car aggregator for the Malaysian market using
search_carsstructured fields liketransmission,fuel_type, andengine_capacity. - Alert users when new motorcycle listings appear below a target price using the
price_minfilter onsearch_motorcycles. - Extract seller phone numbers from
get_listing_detailsto build lead lists for vehicle inspection or financing services. - Compare mileage and condition across listings for a given model by combining
search_carsfilters withget_listing_detailsattribute data. - Display regional inventory distribution by parsing the
regionandsubareafields returned byget_listing_details. - Monitor listing freshness and availability by storing
idvalues from search results and detecting when URLs return changed data.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Mudah.my have an official developer API?+
What does `get_listing_details` return that the search endpoints don't?+
get_listing_details returns the full ad description text, all raw attributes key-value pairs from the listing page, an images array, subarea, and the seller object containing name and phone number. Search results include core structured fields like make, model, year, mileage, and price, but omit seller contact details and the complete attribute set.Are there limitations on how motorcycle listings are structured?+
make and model fields are frequently null in search_motorcycles results. The most reliable structured fields for motorcycles are title, price, year, condition, region, and url. Full attribute detail is available via get_listing_details.Can I filter car searches by model, transmission type, or fuel type?+
search_cars endpoint filters by make_id and price_range only. Transmission, fuel type, engine capacity, and model are returned as response fields but cannot be used as query filters. You can fork this API on Parse and revise it to add those filter parameters.Does the API cover non-vehicle categories on Mudah.my, such as property or electronics listings?+
search_cars and motorcycles via search_motorcycles only. Mudah.my lists many other categories including property, electronics, and jobs, but those are not exposed by the current endpoints. You can fork this API on Parse and revise it to add endpoints for other listing categories.