Lazada Search Scraper (6 SEA Markets)
Pricing
from $2.67 / 1,000 results
Lazada Search Scraper (6 SEA Markets)
Scrape Lazada product listings across Indonesia, Malaysia, Singapore, Thailand, Vietnam and the Philippines: price, discount, rating, units sold, seller and location. No login, no browser.
Pricing
from $2.67 / 1,000 results
Rating
0.0
(0)
Developer
Farhan Febrian Nauval
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 days ago
Last modified
Categories
Share
Lazada Search Scraper — Products, Prices & Sales Across 6 SEA Markets
Scrape Lazada product listings from Indonesia, Malaysia, Singapore, Thailand, Vietnam and the Philippines: price and original price, discount, rating, review and units-sold counts, seller, brand and shipping location. HTTP-only, no account, no browser.
Input
| Field | Type | Default | Description |
|---|---|---|---|
searchQueries | array | required | One search per entry, e.g. laptop |
market | string | ID | ID, MY, SG, TH, VN or PH |
maxItemsPerQuery | integer | 120 | 40 products per request |
Output
{"_input": "laptop","_source": "S1-catalog-ajax","_scrapedAt": "2026-09-09T11:31:07Z","itemId": "7743246861", "skuId": "…","name": "Lenovo ThinkPad T460 Business Laptop I5-6300U…","url": "https://www.lazada.co.id/products/pdp-i7743246861.html","image": "https://id-live-01.slatic.net/p/….jpg","price": 2722500.0,"originalPrice": 2750000.0,"currency": "IDR","priceDisplay": "Rp2.722.500", // the site's own localised string"discountLabel": "1% Off", // the site's own claim"discountPercent": 1.0, // computed from the two prices"ratingScore": 4.588235294117647,"reviewCount": 17,"soldDisplay": "46 sold", // rounded by Lazada before we see it"soldCount": 46,"brandName": "Lenovo", "brandId": "…","sellerName": "Marvel stores", "sellerId": "1000077365","location": "Kota Jakarta Barat","inStock": true, "isSponsored": false, "isAd": false,"market": "ID", "page": 1}
Three things worth knowing
The reported total is an estimate, and the index goes past it. mainInfo.totalResults drifted
between 3331, 3468, 3469 and 3501 for the same query seconds apart, and page 200 still returned 40
genuine laptops. So it is logged as "about N results" and never used as a stop condition. The actor
stops on an empty page or your own limit, and de-duplicates by itemId across the whole query
regardless — a crawl of ten sequential pages returned 400 products with zero repeats, but the
guard means a repeat could never reach your dataset anyway.
Prices come from the numeric field, not the pretty one. price is a bare number in every
market; priceShow is localised — Rp1.200.000, RM5,843.00, ₫1,000,000 — where the dot and
comma mean opposite things depending on the country. Parsing the display string is how a price ends
up wrong by three orders of magnitude, so this actor reads the numeric field and passes the display
string through untouched as priceDisplay.
soldCount is approximate by the time Lazada publishes it. The source is a display string like
1.2K sold, so 1200 here means "about 1200", not exactly. The original is kept as soldDisplay.
Scope
This is the search/listing surface. Every field above comes from one request per 40 products — there is no per-product page fetch, so a 120-product run costs 3 requests.
Errors
_error | Meaning |
|---|---|
invalid_input | Empty search query |
no_results | The search ran and Lazada returned nothing |
blocked | Every TLS profile was refused by the server |
network_error | The ladder never reached the server — DNS, timeout, reset |
unexpected_shape | 200 without the mods.listItems structure — the API changed |
If every query fails, the run itself fails rather than reporting success over an empty dataset.
Proxies
Residential is required, and leave the country unset. Lazada answers Apify's shared datacenter
pool with a JavaScript bounce page (sessionStorage.x5referer = …) carrying a 200 and a
text/html content type rather than JSON. Residential succeeds.
Counterintuitively, pinning the proxy country to the market's own country makes it worse: with
market: ID and residential exits in Indonesia, every request got the bounce page — reproduced
across two separate runs — while un-countried residential returned all 40 products.
How it works
The listing page has an AJAX twin that returns the whole result set as JSON:
https://www.lazada.<market>/catalog/?ajax=true&q=<query>&page=<n>
The same path without ajax=true serves an 82 KB HTML shell. An earlier sweep of this catalogue
recorded Lazada as unscrapeable after testing that shell — it was the route that was closed, not
the site.