Com APIcarousell.com.my ↗
Search used car listings on Carousell Malaysia and fetch detailed specs, pricing, mileage, and seller info via two structured endpoints.
What is the Com API?
The Carousell Malaysia API gives developers access to used vehicle listings across the platform through 2 endpoints. Use search_cars to query inventory by keyword or category and receive paginated results with pricing, seller details, and thumbnails, then call get_listing_details with a listing ID to retrieve full vehicle specifications including transmission type, body type, condition, mileage, and photo arrays.
curl -X POST 'https://api.parse.bot/scraper/9c353147-b7cb-4f76-b19c-d373236a0a2c/search_cars' \
-H 'X-API-Key: $PARSE_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"limit": "5",
"query": "Honda",
"category_id": "32"
}'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 carousell-com-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: Carousell Malaysia Cars SDK — search listings and drill into details."""
from parse_apis.carousell_malaysia_cars_api import Carousell, ListingNotFound
client = Carousell()
# Search for Honda cars — limit caps total items fetched.
for car in client.listingsummaries.search(query="Honda", limit=3):
print(car.title, car.price, car.location)
# Drill into the first result's full details via .details()
car = client.listingsummaries.search(query="Toyota Vios", limit=1).first()
if car:
listing = car.details()
print(listing.title, listing.price, listing.currency)
print(listing.transmission_enum, listing.body_type_enum, listing.manufactured_year)
print(listing.seller.username, listing.seller.feedback_score)
# Typed error handling for a missing listing
try:
bad = client.listingsummaries.search(query="nonexistent_xyz_999", limit=1).first()
if bad:
bad.details()
except ListingNotFound as exc:
print(f"Listing gone: {exc.listing_id}")
print("exercised: listingsummaries.search / ListingSummary.details / ListingNotFound")
Full-text search over used car listings on Carousell Malaysia. query matches title and description; results are sorted by recency/relevance. Each result includes seller info, pricing, thumbnail, and location. Paginates via count parameter; use limit to control batch size.
| Param | Type | Description |
|---|---|---|
| limit | integer | Number of results to return per request (tested up to 48). |
| query | string | Search keyword (e.g. 'Honda', 'Toyota Vios'). Empty string returns all listings in the category. |
| category_id | string | Collection/category filter ID. Use '32' for Cars for Sale. |
{
"type": "object",
"fields": {
"total": "string with formatted total count (e.g. '1,000+')",
"results": "array of listing summary objects with id, title, price, description, seller, photo_url, location, likes_count",
"has_more": "boolean indicating if more results are available"
},
"sample": {
"data": {
"total": "1,000+",
"results": [
{
"id": "1247731810",
"price": "RM32,800",
"title": "Honda City 1.5 auto E Spec GM2 2014",
"seller": {
"id": "26350114",
"name": "KSS ZCR",
"username": "keretasewaselangorzcr"
},
"location": "Klang",
"photo_url": "https://media.karousell.com/media/photos/products/2023/8/8/honda_city_15_auto_gm2_2014_1691464739_9ef26003_thumbnail.jpg",
"description": "Honda City GM2 1.5 Auto Last Production 2014.",
"likes_count": 20
}
],
"has_more": true
},
"status": "success"
}
}About the Com API
Search Used Car Listings
The search_cars endpoint accepts a query string (e.g. 'Honda Jazz', 'Toyota Vios'), an optional category_id (use '32' to scope results to Cars for Sale), and a limit parameter tested up to 48 results per call. Each result object in the results array includes id, title, price, description, seller, photo_url, location, and likes_count. The total field returns a formatted count string such as '1,000+', and has_more signals whether additional pages exist.
Retrieve Listing Details
Passing a listing_id (obtained from search_cars results) to get_listing_details returns a single data object with the full listing record. This includes price, currency, condition, description, time_created, likes_count, location_name, photos (an array of image URLs), and vehicle-specific attributes such as transmission and body_type. The seller profile is also embedded in this response.
Coverage and Pagination
Listings are sorted by recency in search_cars, making the endpoint suitable for monitoring newly posted inventory. Because the API returns a has_more boolean, callers can implement polling loops to page through large result sets. The listing_id field in search results maps directly to the listing_id input of get_listing_details, so enriching a result set with full specs requires one additional call per listing.
The Com API is a managed, monitored endpoint for carousell.com.my — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when carousell.com.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 carousell.com.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?+
- Build a price-tracking dashboard for specific makes and models using
pricefields from repeatedsearch_carscalls - Aggregate market data on used car availability in Malaysia by querying different keywords and recording
totalcounts over time - Display filtered used car listings in a consumer-facing app using
photo_url,title,price, andlocationfrom search results - Compare mileage and condition across listings by batch-fetching
get_listing_detailsfor IDs returned from a model-specific search - Alert users to newly posted listings by polling
search_carswithhas_moreand storing seenidvalues to detect new entries - Enrich a CRM or inventory tool with seller profile data and full vehicle specs pulled from
get_listing_details
| 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 Carousell have an official developer API?+
What vehicle attributes does `get_listing_details` return beyond price?+
get_listing_details returns transmission, body_type, condition, description, time_created, likes_count, location_name, and a photos array, in addition to price and currency. Seller profile information is also included in the same response object.Does `search_cars` support filtering by price range or mileage?+
search_cars endpoint accepts query, category_id, and limit as inputs. Filtering by price range, mileage, year, or other attributes is not currently exposed. You can fork this API on Parse and revise it to add those filter parameters.Are non-car categories on Carousell Malaysia accessible through this API?+
How should I paginate through a large result set from `search_cars`?+
has_more boolean in each response. When it is true, additional listings beyond the current limit are available. Implement offset or cursor logic in your calling code to continue fetching until has_more returns false.