Lazada Product & Review Scraper - 6 Country Sites by URL avatar

Lazada Product & Review Scraper - 6 Country Sites by URL

Pricing

from $0.64 / 1,000 products

Go to Apify Store
Lazada Product & Review Scraper - 6 Country Sites by URL

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

Lantern Lab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Security

Limited permissions

Share

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 rating from the star distribution. Lazada's own average field is unreliable — measured on a product with 54 five-star reviews, Lazada reported an average of 0, so this Actor reports 5 and keeps Lazada's figure beside it as ratingReported.
  • Keeps the source identifiers (itemId, reviewId), the platform's own review date (publishedAt, plus publishedAtRaw exactly as Lazada sent it) and our collection time (collectedAt) as separate fields. Every review row carries the itemId of 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 is found: null with a reason, never counted as one Lazada does not have; a review list cut short by a limit, a refusal or an error is partial: true with 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: maxUpstreamRequests is 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 sold figure. Lazada serves units-sold only through that browser-only gateway. sold is therefore always null with soldStatus: "not_published_server_side" — it is never estimated.
  • No pre-discount price: Lazada does not serve one on this endpoint, so originalPrice is null.
  • No seller name: only sellerId is 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

FieldDefaultMeaning
productUrlsrequiredOne Lazada product URL per line, from any country site. A bare numeric item id also works and is read on country.
countryMYWhich site a bare item id belongs to: MY, SG, TH, PH, VN, ID. Full URLs use their own country instead.
includeReviewstrueCollect one row per review. Off gives a product-only run at one request per product.
maxReviewsPerProduct100Upper bound on review rows per product. Lazada serves 20 per request, so this rounds up to whole pages.
residentialFallbacktrueRetry a refused request from a residential exit in the product's country. Off keeps a run strictly datacenter-only.
maxUpstreamRequestsderivedHard ceiling on requests to Lazada for the whole run. Leave empty and the Actor works one out from your input.
proxyConfigurationApify ProxyThe 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":

FieldMeaning
itemIdLazada's own product identifier. Only valid on its own country site.
countryThe Lazada country site this product was read from.
titleThe product title as Lazada publishes it.
priceThe 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.
priceRawThe price exactly as Lazada sent it, for example RM119.68. The authoritative value.
priceScopeAlways "sku": it names what kind of price the row carries, so a caller does not have to assume it is the page price.
priceSkuIdWhich 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.
currencyISO currency of the country site, for example MYR.
originalPriceAlways null — Lazada does not serve a pre-discount price here.
ratingAverage stars, computed from ratingBreakdown. null when nothing is rated.
ratingReportedThe average Lazada itself reports. Kept for comparison; known to be wrong.
ratingBreakdownHow many reviews gave 5, 4, 3, 2 and 1 star.
reviewCountHow many reviews Lazada says the product has.
soldAlways null; see soldStatus. Never estimated.
sellerIdThe seller's Lazada id. sellerName is null — this endpoint does not serve it.
categoryNameThe product's category, plus rootCategoryName for the top-level one.
livefalse when Lazada still knows the id but the listing is no longer live.
urlThe product page.
collectedAtWhen we read it. Lazada publishes no listing date, so publishedAt is null.

One row per review, recordType: "review":

FieldMeaning
reviewIdLazada's own review identifier. The dedupe key.
itemIdThe product this review is about — the parent relation.
ratingStars this review gave, 1–5.
textThe review text. null when the reviewer left only a rating.
publishedAtThe 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.
publishedAtRawThe 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.
boughtAtWhen the reviewer bought it, when shown.
buyerNameLazada'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.
buyerNameWithheldtrue when Lazada showed an unmasked personal name and this Actor withheld it.
skuInfoThe variant the reviewer bought, for example Color Family:Grey, Size:Int:3XL.
imagesReview photo URLs, or null.
likeCountHow many people marked the review helpful.
sellerReplyCountHow many seller replies the review has.
page / rankWhich 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:

FieldMeaning
foundtrue 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.
liveWhether the listing is still live.
reviewsReturnedReview rows this product wrote, and reviewsAvailable for what Lazada says it has.
duplicatesSkippedReviews Lazada repeated across pages, written once.
partial / partialReasontrue 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.
statusTextA 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. maxReviewsPerProduct rounds up to whole pages.
  • Lazada's own average is unreliable; use rating, not ratingReported.
  • SG, TH and VN need residential traffic, which costs more than the datacenter default. Turn residentialFallback off to avoid it and those products come back blocked.
  • price is 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 in skuInfo and identified by priceSkuId — and price is that variant's price. When the pinned variant is not the one the product page opens on, the two differ, sometimes by a lot: item 4537447207 returns RM8.12 for SKU 25627601319 (Color:Black, Size:EU:40) where the page's default variant shows RM83.22, and item 243168039 returns RM3.15 where the page shows RM3.08 — RM3.15 being one of the variant prices printed on that same page. The row's url ends in -s<priceSkuId>.html, so it opens the page on the variant the price belongs to. Use price as 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 it null with publishedAtRaw kept.
  • reviewCount can exceed the reviews Lazada actually serves. One measured product reported 17 reviews and served 10. The status row carries both reviewsReturned and reviewsAvailable so the gap is visible rather than hidden.
  • Only publicly visible page data is collected. No login, no cookies, no personal contact details.