Lazada Search Scraper (6 SEA Markets) avatar

Lazada Search Scraper (6 SEA Markets)

Pricing

from $2.67 / 1,000 results

Go to Apify Store
Lazada Search Scraper (6 SEA Markets)

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

Farhan Febrian Nauval

Maintained by Community

Actor 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

FieldTypeDefaultDescription
searchQueriesarrayrequiredOne search per entry, e.g. laptop
marketstringIDID, MY, SG, TH, VN or PH
maxItemsPerQueryinteger12040 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

_errorMeaning
invalid_inputEmpty search query
no_resultsThe search ran and Lazada returned nothing
blockedEvery TLS profile was refused by the server
network_errorThe ladder never reached the server — DNS, timeout, reset
unexpected_shape200 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.