Lazada Scraper - Products, Prices, Sellers & Reviews
Pricing
from $1.00 / 1,000 results
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.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
100
Total users
9
Monthly active users
3 days ago
Last modified
Categories
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 the run between Singapore, Malaysia, Thailand, Vietnam, the Philippines and Indonesia.
- 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,promoLabelandspecialsCategorykey 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
rawobject 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")
| Field | Example |
|---|---|
type | "product" (also "review") |
id / productId | "0000000001" |
url / productUrl | "https://www.lazada.sg/products/sample-i0000000001.html" |
productName | "Sample Product Title" |
currentPrice / originalPrice / discountPct | 49.9 / 99 / 50 |
isOnSpecial / discountAmount | true / 49.1 |
promoLabel / specialsCategory | "Flash Sale" / "flash-sale" |
currency / country | "SGD" / "SG" |
ratingScore / reviewCount | 4.6 / 1234 |
itemSold | "5K+ sold" |
inStock / isSponsored / freeShipping | true / false / true |
sellerName / sellerId | "Sample Store" / "0000000" |
sellerLocation | "Singapore" (detail page fetch only) |
brandName / brandId | "Sample Brand" / "0000" (detail page fetch only) |
primaryImage | "https://laz-img-cdn.alicdn.com/p/000000.jpg" |
skuCount | 4 (detail page fetch only) |
seedType / seedValue | "query" / "wireless earbuds" |
sourceUrl | the 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), 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 brandName, brandId, sellerLocation and skuCount, also populate with the detail page fetch. When Include reviews on each product is on, each product additionally carries an embeddedReviews array of its top reviews.
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, media (photo and video attachments), country, raw and fetchedAt. 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.
How to Use
- Pick a mode:
search(run one or more keyword queries) orurl(walk pasted search, category or product URLs). - Pick the country site (
sg,my,th,vn,phorid). URL mode detects it automatically from the first URL. - Set filters and enrichment: price range, minimum rating, free shipping, Flash Sale only, and whether to fetch detail pages and reviews.
- 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 ApifyClientclient = 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.
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 no fixed upper bound: leave it empty or at 0 to walk every result page Lazada serves for a query or URL, stopped only 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 classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEARED, orEXPIRED(only after a run that scanned the full tracked scope without a cap, and only withemitExpiredon).stateKeynames 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 produceEXPIREDrows, 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.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto 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
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search or url. |
country | string | sg | One of sg, my, th, vn, ph, id. URL mode auto-detects from the first URL. |
queries | array | none (prefilled ["laptop"]) | Search terms, one paginated walk per query. Search mode only. |
categoryId | string | none | Deprecated 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. |
minPrice | integer | none (no lower bound) | Minimum price in the country's local currency. |
maxPrice | integer | none (no upper bound) | Maximum price in the country's local currency. |
specialsOnly | boolean | false | Walk Lazada's real Flash Sale feed instead of the plain catalog (search mode). |
sortBy | string | popularity | popularity, 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. |
urls | array | none (prefilled with a sample search URL) | Search result, category or product URLs. URL mode only. |
minRating | integer | none | Drop products whose average rating is below this value (1 to 5), applied after the search fetch. |
freeShippingOnly | boolean | false | Keep only items carrying Lazada's own Free Shipping badge, in both search and URL mode. |
reviewsOnly | boolean | false | Emit one record per review (type: "review") instead of one per product. |
fetchReviews | boolean | false | Add an embeddedReviews array to each product record (only when reviewsOnly is off). |
maxReviewsPerProduct | integer | 100 | Hard cap on reviews fetched per product. |
fetchDetails | boolean | false | Fetch each product's detail page for the SKU table, vouchers, shipping, warranty, seller cluster and images. |
maxPages | integer | none (prefilled 0, meaning unlimited) | Bound on result pages walked per starting query or URL. 0 walks every page, still bounded by maxListings. |
maxListings | integer | 20 | Hard 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. |
resumeFromRunId | string | none | Paste a previous run or dataset id to continue a walk without returning or charging for products already collected there. |
incrementalMode | boolean | false | Turn on for scheduled runs to classify each product against the previous run's state. |
stateKey | string | none | Name or share an incremental-mode state; left empty, one is derived automatically from the search and filter configuration. |
emitUnchanged | boolean | false | Also return (and bill) products unchanged since the last incremental run. |
emitExpired | boolean | false | Also return (and bill) products no longer found after a complete incremental scan. |
proxy | object | none (prefilled to Apify Residential, pinned to the selected country) | Connection settings. Lazada requires the Residential group. If you omit this field the actor pins the connection to the selected country; if you set it, make sure its country matches the country site (the console prefill is SG). |
mcpConnectors | array | none | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | none | Notion connector only: page under which records are created. |
maxNotifyListings | integer | 50 | Cap 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 blocks non-residential connections, so this actor requires the Apify Residential proxy group, pinned to the same country as the country site you select. If you omit the Proxy field the actor sets this up for you; if you supply your own, make sure its country matches. Without the Residential group, the actor logs a warning at startup and a run typically returns no items, since the site rejects the connection outright. On a retry, the actor first 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.
Is it legal to scrape Lazada?
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... | 🧩 AliExpress Scraper Scrape AliExpress products: search by keyword or category, or process pasted search... |
| 🛒 GrabFood Restaurant Scraper Scrape GrabFood restaurants across Southeast Asia, including SG, MY, TH, VN, PH, ID, KH... | 🛒 Tokopedia Scraper Extract product data from Tokopedia, Indonesia’s largest marketplace. Search by keyword... |
| 🛒 Naver Shopping Scraper Scrape Naver Shopping products by Korean or English keyword, or by URL. Returns 190+... | 🛒 Mercari Japan Scraper From $0.80/1K. Scrape Mercari Japan listings, sellers and reviews at scale. Extract... |
💬 Support & custom scrapers
- 🐞 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 abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.