Lazada Product & Review Scraper - 6 Country Sites by URL
Pricing
from $0.64 / 1,000 products
Lazada Product & Review Scraper - 6 Country Sites by URL
Give it Lazada product URLs and get the public product and its reviews back, on all six Lazada country sites. No login and no cookies.
Pricing
from $0.64 / 1,000 products
Rating
0.0
(0)
Developer
Lantern Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
Lazada Product & Review Scraper — 6 Country Sites by URL
A Lantern Lab Actor. Give it Lazada product URLs and get the public product back — title, SKU price, star rating, review count, category, seller id — together with that product's reviews: the stars, the review text, the review date, the SKU the reviewer bought and any review photos. Works on all six Lazada country sites, mixed freely in one run. No Lazada login, no cookies, no account of your own.
Priced per row: USD 0.64 per 1,000 products and USD 1.19 per 1,000 reviews, no run-start fee. Empty results, status rows and the run summary are free — a run that Lazada refuses costs you nothing.
What it does
- Reads products from Malaysia, Singapore, Thailand, the Philippines, Vietnam and Indonesia. The country site is taken from each URL, so one run can mix them.
- Returns the product and its reviews from the same request, so a product's rating and review count come back even with reviews turned off.
- Computes
ratingfrom the star distribution. Lazada's own average field is unreliable — measured on a product with 54 five-star reviews, Lazada reported an average of0, so this Actor reports5and keeps Lazada's figure beside it asratingReported. - Keeps the source identifiers (
itemId,reviewId), the platform's own review date (publishedAt, pluspublishedAtRawexactly as Lazada sent it) and our collection time (collectedAt) as separate fields. Every review row carries theitemIdof its product, so the parent relation survives any export. - Deduplicates across the whole run: a review Lazada repeats across pages is written once and charged once.
- Says what happened per product. Four outcomes are four different records and are never confused: a product Lazada answered with no reviews is an empty result; an item id Lazada answered for and does not carry is
found: false; a product we never got an answer for isfound: nullwith a reason, never counted as one Lazada does not have; a review list cut short by a limit, a refusal or an error ispartial: truewith the reason. - Retries a refused request once from a residential exit in the product's own country, and from a different exit than the one that refused it. Lazada's Malaysian and Philippine sites answer the cheap datacenter proxy; the Singapore, Thai and Vietnamese sites refuse it, so those start on residential.
- Caps itself:
maxUpstreamRequestsis a hard ceiling on requests to Lazada for the whole run, including every retry, derived from your input when you leave it empty, so a run is never unbounded.
What it does not do
- No keyword search. Lazada's catalogue is rendered in the browser from Alibaba's signed gateway and answers both datacenter and residential IPs with a bot check or a sliding captcha. This Actor takes product URLs, not search terms.
- No
soldfigure. Lazada serves units-sold only through that browser-only gateway.soldis therefore alwaysnullwithsoldStatus: "not_published_server_side"— it is never estimated. - No pre-discount price: Lazada does not serve one on this endpoint, so
originalPriceisnull. - No seller name: only
sellerIdis served here. No seller pages, no shop catalogues. - No product description, specifications, variant list or images beyond the main one.
- No login-only, app-only or checkout data, and no buyer identity: only Lazada's own masked handle is returned, and a reviewer Lazada names in full is withheld.
- No scheduling or monitoring built in; use Apify schedules.
Input
| Field | Default | Meaning |
|---|---|---|
productUrls | required | One Lazada product URL per line, from any country site. A bare numeric item id also works and is read on country. |
country | MY | Which site a bare item id belongs to: MY, SG, TH, PH, VN, ID. Full URLs use their own country instead. |
includeReviews | true | Collect one row per review. Off gives a product-only run at one request per product. |
maxReviewsPerProduct | 100 | Upper bound on review rows per product. Lazada serves 20 per request, so this rounds up to whole pages. |
residentialFallback | true | Retry a refused request from a residential exit in the product's country. Off keeps a run strictly datacenter-only. |
maxUpstreamRequests | derived | Hard ceiling on requests to Lazada for the whole run. Leave empty and the Actor works one out from your input. |
proxyConfiguration | Apify Proxy | The proxy the requests go through. The datacenter default is what this Actor is measured on for MY and PH. |
{"productUrls": ["https://www.lazada.com.my/products/hanlu-mens-hoodies-i3718725294.html","https://www.lazada.co.th/products/some-product-i2490024288.html"],"includeReviews": true,"maxReviewsPerProduct": 100}
Output
One row per product, recordType: "product":
| Field | Meaning |
|---|---|
itemId | Lazada's own product identifier. Only valid on its own country site. |
country | The Lazada country site this product was read from. |
title | The product title as Lazada publishes it. |
price | The price of one SKU as a number, read out of priceRaw — the variant Lazada pins the product to, not the product page's headline price. See priceScope, priceSkuId and the limits below. |
priceRaw | The price exactly as Lazada sent it, for example RM119.68. The authoritative value. |
priceScope | Always "sku": it names what kind of price the row carries, so a caller does not have to assume it is the page price. |
priceSkuId | Which SKU price belongs to. The row's url opens the product page on exactly that SKU, so the figure can be checked in one click. |
currency | ISO currency of the country site, for example MYR. |
originalPrice | Always null — Lazada does not serve a pre-discount price here. |
rating | Average stars, computed from ratingBreakdown. null when nothing is rated. |
ratingReported | The average Lazada itself reports. Kept for comparison; known to be wrong. |
ratingBreakdown | How many reviews gave 5, 4, 3, 2 and 1 star. |
reviewCount | How many reviews Lazada says the product has. |
sold | Always null; see soldStatus. Never estimated. |
sellerId | The seller's Lazada id. sellerName is null — this endpoint does not serve it. |
categoryName | The product's category, plus rootCategoryName for the top-level one. |
live | false when Lazada still knows the id but the listing is no longer live. |
url | The product page. |
collectedAt | When we read it. Lazada publishes no listing date, so publishedAt is null. |
One row per review, recordType: "review":
| Field | Meaning |
|---|---|
reviewId | Lazada's own review identifier. The dedupe key. |
itemId | The product this review is about — the parent relation. |
rating | Stars this review gave, 1–5. |
text | The review text. null when the reviewer left only a rating. |
publishedAt | The platform's review date as YYYY-MM-DD. Lazada publishes the day only, which publishedAtPrecision states — no time of day is invented. null when Lazada sent a relative date instead (1 week ago, about 6% of reviews measured): publishedAtRaw keeps it rather than turning it into a guessed day. |
publishedAtRaw | The same date exactly as Lazada sent it. Lazada localises it per site, so this is 08 May 2025 on MY/SG/PH, 19 มี.ค. 2022 on TH and 31 thg 3 2025 on VN — all three are parsed into publishedAt. |
boughtAt | When the reviewer bought it, when shown. |
buyerName | Lazada's own masked handle, for example S***y. When Lazada shows an unmasked personal name instead, this is null and buyerNameWithheld is true — this Actor does not republish a reviewer's personal name. |
buyerNameWithheld | true when Lazada showed an unmasked personal name and this Actor withheld it. |
skuInfo | The variant the reviewer bought, for example Color Family:Grey, Size:Int:3XL. |
images | Review photo URLs, or null. |
likeCount | How many people marked the review helpful. |
sellerReplyCount | How many seller replies the review has. |
page / rank | Which review page it came from, and its position in this run's collection for the product. |
One row per requested product, recordType: "product_status" — never charged:
| Field | Meaning |
|---|---|
found | true when Lazada carried a product for that item id, false when Lazada answered and carried none (a wrong id or a removed listing), and null when we never got an answer at all — refused, failed or never reached. "We could not read it" is never reported as "Lazada does not have it", and the run summary counts the three apart as productsFound, productsNotFound and productsNotCollected. |
live | Whether the listing is still live. |
reviewsReturned | Review rows this product wrote, and reviewsAvailable for what Lazada says it has. |
duplicatesSkipped | Reviews Lazada repeated across pages, written once. |
partial / partialReason | true means the review list is incomplete — never that there are no reviews. Reasons: review_limit_reached, upstream_request_cap, charge_limit_reached, blocked, upstream_error, not_collected. |
statusText | A sentence saying what happened, so the dataset explains itself without the log. |
The last row is recordType: "RUN_SUMMARY", also stored under the RUN_SUMMARY key: totals, how many products Lazada did not carry (productsNotFound) kept apart from how many we could not read (productsNotCollected), how many review lists are incomplete and why, how often Lazada's bot check refused us and how often the residential retry rescued it, and why collection stopped.
Limits worth knowing
- Item ids are per country. The same number on another site is a different product or none at all.
- A removed listing still answers. Lazada echoes the id back with every other field null; that is
found: false, not an error. - 20 reviews per request.
maxReviewsPerProductrounds up to whole pages. - Lazada's own average is unreliable; use
rating, notratingReported. - SG, TH and VN need residential traffic, which costs more than the datacenter default. Turn
residentialFallbackoff to avoid it and those products come backblocked. priceis one SKU's price (priceScope: "sku"), not the product page's headline price. Lazada pins every product it returns to a single variant — the one named inskuInfoand identified bypriceSkuId— andpriceis that variant's price. When the pinned variant is not the one the product page opens on, the two differ, sometimes by a lot: item4537447207returnsRM8.12for SKU25627601319(Color:Black, Size:EU:40) where the page's default variant showsRM83.22, and item243168039returnsRM3.15where the page showsRM3.08—RM3.15being one of the variant prices printed on that same page. The row'surlends in-s<priceSkuId>.html, so it opens the page on the variant the price belongs to. Usepriceas that SKU's price, not as "the product's price".- Review dates are localised by Lazada, not by the language you ask for. English, Thai, Vietnamese and Indonesian month forms are all read into
publishedAt; a form that cannot be read leaves itnullwithpublishedAtRawkept. reviewCountcan exceed the reviews Lazada actually serves. One measured product reported 17 reviews and served 10. The status row carries bothreviewsReturnedandreviewsAvailableso the gap is visible rather than hidden.- Only publicly visible page data is collected. No login, no cookies, no personal contact details.