Lazada Scraper - Products, Prices, Sellers & Reviews avatar

Lazada Scraper - Products, Prices, Sellers & Reviews

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Lazada Scraper - Products, Prices, Sellers & Reviews

Lazada Scraper - Products, Prices, Sellers & Reviews

Scrape Lazada products and reviews across SEA markets, including Malaysia, Singapore, Indonesia, Philippines, Thailand, and Vietnam. Extract structured data on pricing, inventory, ratings, sellers, media, and reviews. Ideal for cross-region analysis with consistent, analytics-ready output.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

117

Total users

17

Monthly active users

6 days ago

Last modified

Share

Lazada Scraper: Products, SKUs, Vouchers & Reviews Across 6 SE Asia Sites

Lazada Scraper turns Lazada into structured e-commerce data across all six Southeast Asia storefronts: Singapore, Malaysia, Thailand, Vietnam, the Philippines and Indonesia. Search by keyword or feed it search-result, category and product URLs to pull product listings with full SKU variant tables, vouchers, shipping and warranty terms, seller ratings, and customer reviews with photos and videos. Flip one switch to collect reviews only, walked page by page instead of just the first page. Export to JSON, CSV or Excel, or read results straight from the dataset through the API.

Why This Scraper?

  • Six Southeast Asia storefronts in one actor. One country field switches searches between Singapore, Malaysia, Thailand, Vietnam, the Philippines and Indonesia, and in URL mode (including reviews-only runs on product URLs) each URL's own host picks its storefront, so one run can mix them.
  • Two ways to find products. Run a keyword search with price, rating and free shipping filters, or feed it search result, category or product URLs directly.
  • Full product depth on demand. Turn on detail page enrichment for the complete SKU variant table (price, stock and attributes per variant), every active voucher and promotion, shipping fee and delivery window, warranty period, and the seller rating cluster.
  • Reviews at real depth. Reviews only mode walks every review page for a product, capped by a limit you set, not just the first page, and each review carries its rating, content, buyer handle and any photo or video media.
  • Real specials, never invented. isOnSpecial, discountAmount, promoLabel and specialsCategory key off Lazada's own strike-through price and badges, or its real Flash Sale campaign feed, never a synthesized markdown.
  • Built for monitoring. Resume one interrupted run without re-collecting what it already found, or turn on Incremental mode to schedule the same search and get only new, updated and expired products on every recurring run.
  • Every record keeps the source. Flat top-level fields sit alongside a nested raw object holding Lazada's own listing and detail-page payload, so downstream pipelines never lose a field.

Use Cases

  • Price and catalogue monitoring: track prices, stock and voucher changes across SG, MY, TH, VN, PH and ID with scheduled, incremental runs.
  • Marketplace research and competitor tracking: pull seller ratings, item sold counts and SKU-level pricing to benchmark sellers and brands.
  • Review mining and sentiment analysis: collect every review, with photos and videos, for a product line to spot quality issues or standout features.
  • Deal and Flash Sale tracking: walk the real Flash Sale feed for strike-through prices, discount amounts, and LazMall or Campaign badges.
  • Catalogue and content enrichment: feed product titles, images, descriptions and specifications into a PIM, comparison site or shopping assistant.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

Product record (type: "product")

FieldExample
type"product" (also "review")
id / productId"0000000001"
url / productUrl"https://www.lazada.sg/products/sample-i0000000001.html"
productName"Sample Product Title"
currentPrice / originalPrice / discountPct49.9 / 99 / 50
isOnSpecial / discountAmounttrue / 49.1
promoLabel / specialsCategory"Flash Sale" / "flash-sale"
currency / country"SGD" / "SG"
ratingScore / reviewCount4.6 / 1234
itemSold"5K+ sold"
inStock / isSponsored / freeShippingtrue / false / true
sellerName / sellerId"Sample Store" / "0000000"
sellerLocation"Singapore" (from the listing card on search and category rows; empty when a product URL is opened directly)
brandName / brandId"Sample Brand" / "0000" (from the listing card on search and category rows)
primaryImage"https://laz-img-cdn.alicdn.com/p/000000.jpg"
skuCount4 (detail page fetch only)
seedType / seedValue"query" / "wireless earbuds"
sourceUrlthe search or URL start that discovered this product
fetchedAt"2026-01-01T00:00:00.000Z"

When Enrich each product with detail page data is on, product records also carry imageGallery, description, descriptionHtml, the full skuList (variant id, price, stock, attributes), skuProperties (the variant axes such as Color or Size, each with its values and which one is selected), minQuantity and maxQuantity (purchase limits), highlights (the product's bullet points), vouchers, promotions, shipping (fee, ETA, COD flag), warranty, specifications and breadcrumbs, plus raw.serp and raw.detail holding the complete source objects. The seller rating cluster fields sellerRatingPositivePct, sellerShippingSpeed, sellerChatResponseRate and sellerFollowerCount, plus skuCount, also populate with the detail page fetch. brandName, brandId and sellerLocation come from the listing card on search and category rows (so they are filled without detail enrichment); a product page opened directly by URL does not publish a seller location, so sellerLocation stays empty there. When Include reviews on each product is on, each product additionally carries an embeddedReviews array of its top reviews.

Every product record also carries skuId, language (the storefront language code), canonicalUrl (product URL without tracking parameters), stockStatus (in_stock or out_of_stock, when the listing says so), badges (the listing's readable badge labels, such as lazMall or a coin-saving banner; icons without a text label are skipped) and enrichmentStatus (listing-only, enriched or detail-unavailable). With detail enrichment on you also get categoryPath (same breadcrumbs as breadcrumbs) and descriptionImageUrls (images inside the description HTML). Review records add isMeLike and videoUrls when the review has a video.

Real specials, never invented: isOnSpecial, originalPrice and discountAmount key off Lazada's own strike-through price, populated only when it genuinely exceeds currentPrice. A full-price item gets isOnSpecial: false and no originalPrice or discountAmount field. specialsCategory and promoLabel surface Lazada's own classification, flash-sale when the record came from the Flash Sale campaign feed, lazmall or campaign when the card carries that exact badge, or empty when neither applies. Generic perks such as free shipping or coin and voucher cashback are not specials and are never mapped to these fields.

Review records (type: "review", emitted when Output reviews only is on) carry reviewId, productId, productUrl, buyerName, rating, reviewTime, reviewContent, skuInfo, likeCount (the review's helpful votes), media (photo and video attachments), country, raw and fetchedAt. The seller's reply to a review, when there is one, is kept in raw.reply rather than as its own column. Review text comes back in whatever language the buyer wrote it in, Thai on lazada.co.th, Vietnamese on lazada.vn, Bahasa Indonesia on lazada.co.id, and so on, since it is never translated.

Output views

The Output tab offers these views of the dataset: Results (product listing fields), All records (every field), Reviews (review records), Product detail (SKU table, vouchers, shipping, warranty, seller cluster), Changes (incremental) (change status and changedFields) and Product reviews (fetchReviews) (the embedded reviews of each product). A run summary is also saved under the OUTPUT key.

Pricing

You pay per record returned. The Pricing tab on the actor page shows the exact rates, including the per-run start charge and the optional detail-enrichment surcharge. Reviews fetched with Include reviews on each product add no separate charge; in Output reviews only mode each review record is a returned record. Unchanged and expired products in incremental mode are only returned and billed when you turn on Emit unchanged or Emit expired.

How to Use

  1. Pick a mode: search (run one or more keyword queries) or url (walk pasted search, category or product URLs).
  2. Pick the country site (sg, my, th, vn, ph or id). In URL mode every URL's own host decides its country site, so one run can mix lazada.sg and lazada.com.my URLs.
  3. Set filters and enrichment: price range, minimum rating, free shipping, Flash Sale only, and whether to fetch detail pages and reviews.
  4. Set Max products total to control run size and cost, then click Start. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search by query:

{
"mode": "search",
"country": "sg",
"queries": ["wireless earbuds"],
"minPrice": 20,
"maxPrice": 200,
"minRating": 4,
"sortBy": "priceDesc",
"maxPages": 5,
"maxListings": 100,
"fetchDetails": true
}

Walk search result URLs:

{
"mode": "url",
"urls": [
"https://www.lazada.com.my/catalog/?q=ipad",
"https://www.lazada.com.my/shop-laptops/"
],
"maxPages": 3,
"maxListings": 60,
"fetchDetails": true
}

Reviews only, from product URLs:

{
"mode": "url",
"country": "sg",
"urls": [
"https://www.lazada.sg/products/sample-i0000000001.html",
"https://www.lazada.sg/products/sample-i0000000002.html"
],
"reviewsOnly": true,
"maxReviewsPerProduct": 200
}

Products with embedded reviews:

{
"mode": "search",
"country": "ph",
"queries": ["coffee maker"],
"fetchReviews": true,
"maxReviewsPerProduct": 30,
"maxPages": 2,
"maxListings": 40
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/lazada-scraper").call(run_input={"mode": "search", "country": "sg", "queries": ["wireless earbuds"]})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["productName"], item["currentPrice"], item["currency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/lazada-scraper').call({ mode: 'search', country: 'sg', queries: ['wireless earbuds'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

URL mode and supported URL shapes

URL mode accepts the shapes below. Each URL's country site is detected from its own host. Behaviour change: the urls field now ships a default holding one example of each shape, so a URL-mode run with the field untouched scrapes one example of each shape (capped by Max products total) instead of nothing. Likewise queries now defaults to laptop, so a run that omits both fields scrapes the laptop search instead of finishing with 0 items. A run where no query or URL is usable now ends FAILED with a clear message.

ShapeExample
Keyword searchhttps://www.lazada.sg/catalog/?q=earbuds
Filtered, sorted, paginated searchhttps://www.lazada.sg/catalog/?q=iphone&price=100-500&sort=priceasc&page=2
Category pagehttps://www.lazada.sg/shop-laptops/
Paginated categoryhttps://www.lazada.sg/shop-laptops/?page=2
Flash Sale feedhttps://www.lazada.sg/tag/flash-sale/
Tag landing pagehttps://www.lazada.sg/tag/earbuds/?q=earbuds&catalog_redirect_tag=true
Product detailhttps://www.lazada.sg/products/la-gourmet-55l-crystalline-air-fryer-i3646864772.html
Other country sitehttps://www.lazada.com.my/catalog/?q=kopi

A product URL is matched on its numeric item id, so the slug part is irrelevant (an id-only /products/pdp-i<id>.html link works too). A store homepage such as https://www.lazada.sg/ is skipped with a warning because it has no product listing of its own; it is not in the example list. Max products total is shared across all URLs.

Flash Sale and full catalogue walks

Set Flash Sale only (specialsOnly) in search mode to walk Lazada's real Flash Sale campaign feed instead of the plain catalog, a genuinely different, curated product set rather than a client-side filter. Leave Search queries empty to browse the whole feed, or add queries to search within it. Pasting a Flash Sale URL in url mode reaches the same feed with no extra input. LazMall and Campaign badges are detected on any card regardless of specialsOnly, so a plain keyword search can already return specialsCategory: "lazmall" for LazMall-badged listings.

Max SERP pages per query/URL (maxPages) has a hard cap of 100 pages per query or URL: leave it empty or at 0 to walk up to that cap, stopped earlier by an empty page, Lazada's own end-of-results signal, and Max products total (maxListings).

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run, or splits a very large full-catalogue walk across several runs: paste a prior run or dataset id and the actor skips every product id already collected there, so you do not pay twice.
  • Incremental mode (incrementalMode) is for scheduling the same search or URL configuration again and again. Each product is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED, or EXPIRED (only after a run that scanned the full tracked scope without a cap, and only with emitExpired on; a pasted URL that starts at page 2 or later is a partial scope and never produces them). What is compared: every output field of the product record (price, discount, stock, rating, review count, sold count, seller, images, SKU list, vouchers and so on). What is excluded: fetchedAt and the raw card passthrough always, plus anything you list in ignoreFieldsForChanges (dotted paths such as skuList.stock reach inside lists; ignored fields stay in the output and are only left out of the comparison and changedFields). Changing the ignore list never causes a one-time wave of UPDATED rows. Fields added in newer versions of the actor (for example skuId, badges, categoryPath, skuProperties) are compared like every other field; a product stored by an older version simply does not hold them yet, so for that one product on the first run after the upgrade they are left out of the comparison and then stored, and a real change to them is reported from the next run on. stateKey names or shares the stored state; leave it empty and the actor derives one automatically from the search and filter configuration. With incremental mode off, output is exactly as before. Reviews only runs never produce EXPIRED rows, since there is no discoverable product universe to diff against. Combining Resume with Incremental mode on a search that already has saved incremental state fails the run immediately, to avoid mixing two different baselines; combining them on a brand new search bootstraps the incremental baseline from the resumed dataset instead.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape, the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify β†’ Settings β†’ Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch or url.
countrystringsgOne of sg, my, th, vn, ph, id. In search mode it is the one site searched. In URL mode each URL's own host decides its site (and its connection exit); this value is only the fallback for URLs on an unknown host.
queriesarraynone (prefilled ["laptop"])Search terms, one paginated walk per query. Search mode only.
categoryIdstringnoneDeprecated and hidden. Lazada has no numeric category id search facet; use mode: "url" with a pasted category page URL instead. Kept for backward compatibility with saved tasks and has no effect.
minPriceintegernone (no lower bound)Minimum price in the country's local currency.
maxPriceintegernone (no upper bound)Maximum price in the country's local currency.
specialsOnlybooleanfalseWalk Lazada's real Flash Sale feed instead of the plain catalog (search mode).
sortBystringpopularitypopularity, priceAsc or priceDesc, the only three sort options Lazada's own search page exposes. ratingDesc, newest and bestSelling are still accepted for saved tasks but run as popularity.
urlsarrayone example of each supported URL shape (see the URL shapes table)Search result, category, tag, Flash Sale or product URLs. URL mode only.
minRatingintegernoneDrop products whose average rating is below this value (1 to 5), applied after the search fetch.
freeShippingOnlybooleanfalseKeep only items carrying Lazada's own Free Shipping badge, in both search and URL mode.
reviewsOnlybooleanfalseEmit one record per review (type: "review") instead of one per product.
fetchReviewsbooleanfalseAdd an embeddedReviews array to each product record (only when reviewsOnly is off).
maxReviewsPerProductinteger20Hard cap on reviews fetched per product. The default was lowered from 100 to 20 to keep default runs cheap; raise it (up to 5000) for deeper review coverage.
fetchDetailsbooleanfalseFetch each product's detail page for the SKU table, vouchers, shipping, warranty, seller cluster and images.
maxPagesintegernone (prefilled 0, meaning unlimited)Bound on result pages walked per starting query or URL. 0 walks up to the hard cap of 100 pages, still bounded by maxListings.
maxListingsinteger20Hard cap on products across all queries or URLs. 0 means unlimited (still bounded by maxPages). In reviews-only mode this caps discovered products, not review records.
resumeFromRunIdstringnonePaste a previous run or dataset id to continue a walk without returning or charging for products already collected there.
incrementalModebooleanfalseTurn on for scheduled runs to classify each product against the previous run's state.
stateKeystringnoneName or share an incremental-mode state; left empty, one is derived automatically from the search and filter configuration.
emitUnchangedbooleanfalseAlso return (and bill) products unchanged since the last incremental run.
emitExpiredbooleanfalseAlso return (and bill) products no longer found after a complete incremental scan.
ignoreFieldsForChangesstring[][]Ignore fields when detecting changes (incremental mode only): field names (dotted paths allowed) that never make a product UPDATED.
proxyobjectnone (prefilled to Apify Residential)Connection settings. Residential is tried first, see Plan Requirement. The exit country always follows the Lazada site being fetched, in every mode: a lazada.com.my URL, or search with country my, is fetched through a Malaysian exit even when the prefill says SG. Your own proxy URLs are used as given.
mcpConnectorsarraynoneOptional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstringnoneNotion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"type": "product",
"id": "0000000001",
"url": "https://www.lazada.sg/products/sample-i0000000001.html",
"productName": "Sample Wireless Earbuds",
"productId": "0000000001",
"productUrl": "https://www.lazada.sg/products/sample-i0000000001.html",
"sourceUrl": "https://www.lazada.sg/catalog/?q=wireless+earbuds",
"seedType": "query",
"seedValue": "wireless earbuds",
"country": "SG",
"currency": "SGD",
"currentPrice": 49.9,
"originalPrice": 99,
"discountPct": 50,
"isOnSpecial": true,
"discountAmount": 49.1,
"promoLabel": "Flash Sale",
"specialsCategory": "flash-sale",
"ratingScore": 4.6,
"reviewCount": 1234,
"itemSold": "5K+ sold",
"inStock": true,
"isSponsored": false,
"freeShipping": true,
"sellerName": "Sample Store",
"sellerId": "0000000",
"sellerLocation": "Singapore",
"sellerRatingPositivePct": 98,
"sellerShippingSpeed": "Fast",
"sellerChatResponseRate": "95%",
"sellerFollowerCount": 1500,
"brandName": "Sample Brand",
"brandId": "0000",
"primaryImage": "https://laz-img-cdn.alicdn.com/p/000000.jpg",
"imageGallery": ["https://laz-img-cdn.alicdn.com/p/000001.jpg"],
"skuList": [{ "id": "0000", "price": 49.9, "stock": 10, "color": "Black" }],
"skuCount": 4,
"vouchers": [{ "amount": 5, "minSpend": 30, "code": "SAMPLE5" }],
"shipping": { "fee": 0, "eta": "2-3 days", "cod": true },
"warranty": { "type": "Manufacturer", "periodMonths": 12 },
"breadcrumbs": ["Electronics", "Audio", "Earphones"],
"raw": { "serp": {}, "detail": {} },
"fetchedAt": "2026-01-01T00:00:00.000Z"
}

Plan Requirement

Lazada's product listings and reviews load through a protected data route that challenges non-residential connections (measured: a datacenter connection gets a slider challenge on that route, a residential connection pinned to the storefront country returns results). Plain page routes such as category and product pages may load on other connection types, but the listing and review data this actor reads does not, so a paid Apify plan with Residential proxy access is recommended and is what the actor tries first, with its exit in the country of the Lazada site being fetched (the country pin in the Proxy field is overridden to match; your own proxy URLs are used as given, so make sure their country matches). If you omit the Proxy field the actor sets this up for you.

On Apify free plans, which do not include residential proxies, the actor logs "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable." and continues on a backup connection, logging "Served over the backup connection (the default connection was unavailable)." when it is used. If neither connection can load a page the run ends FAILED with one of these messages:

  • "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required: https://apify.com/pricing. If you entered your own proxy URLs, check that their credentials are valid."
  • "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested Lazada pages. Upgrade at https://apify.com/pricing or supply your own proxy URLs, then try again."
  • "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later."

When one run mixes storefronts (for example lazada.sg and lazada.com.my URLs) and one of them cannot be loaded, the actor logs "Storefront MY: no results page could be loaded for 1 start(s); continuing with the other storefronts.", keeps and bills the rows the other storefronts returned, and skips the expired-product check for that run. The run ends FAILED with one of the messages above only when no storefront returned a page.

If you explicitly choose a non-residential proxy group, the actor keeps your choice as its first connection. On a retry, the actor draws a fresh connection within the same target country before falling back to a neighboring Southeast Asia exit.

FAQ

How much does it cost?

You pay per record returned, with an optional detail-enrichment surcharge only when Enrich each product with detail page data is turned on. The Pricing tab on the actor page shows the current rates. Use Max products total to cap the cost of any run.

This actor collects only publicly available product and review data. You are responsible for how you use it: follow Lazada's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product photos, videos and seller content may be subject to third party rights even though prices and specifications are generally facts.

Can I monitor a search or URL and get only new or changed products on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared products, unchanged ones are not billed unless you turn on Emit unchanged, and expired products are only reported once a run has scanned the full tracked search without a cap.

What is the difference between Resume from a previous run and Incremental mode?

Resume (resumeFromRunId) continues one specific interrupted or very large run, skipping products a prior run already collected. Incremental mode remembers state itself across separate scheduled runs of the same search or URL configuration, classifying every product as new, updated, unchanged, reappeared or expired. Use Resume to finish or extend one walk, and Incremental mode for recurring monitoring.

Why did my run fail instead of returning an empty dataset?

A run fails when Resume from a previous run points at a run or dataset id this account cannot read, when Incremental mode conflicts with existing saved state for the same search, or when the site could not be reached at all on any connection. A run instead succeeds with an empty or smaller than expected dataset when no search queries or URLs were provided, when the country site and filters genuinely matched nothing, or when every page came back blocked after one retry, since a blocked page is treated as the end of that search rather than a fatal error. If detail enrichment is on but product pages are not reachable on the connection, the run still succeeds and returns listing-level fields only.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each result into Notion, Linear or Airtable.

πŸ”— Want more e-commerce data?

Pair this actor with these related scrapers from the same team:

🏨 Traveloka Hotel Scraper
Scrape Traveloka hotels across Singapore, Malaysia, Indonesia, Thailand, Vietnam and the...
πŸ›’ GrabFood Restaurant Scraper
Scrape GrabFood restaurants across Southeast Asia, including SG, MY, TH, VN, PH, ID, KH...
πŸ›’ Sephora Scraper
From $1/1K. Scrape Sephora products across 21+ storefronts (US, AU, NZ, SG, MY, ID, TH...
πŸ›’ Tokopedia Scraper
Extract product data from Tokopedia, Indonesia’s largest marketplace. Search by keyword...
πŸ“‡ JobStreet
From $1/1K. Pull JobStreet company profiles and employee reviews across Malaysia...
πŸ›’ SHEIN Scraper
Scrape SHEIN product listings by keyword or from any category, sale or search link...

πŸ‘‰ Browse all abotapi scrapers

πŸ’¬ Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • πŸ› οΈ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.