# Lazada Product, Review & Seller Scraper (`mrdoe/lazada-scraper`) Actor

Extracts real Lazada products, reviews, and seller profiles across Malaysia, Singapore, Indonesia, Philippines, Vietnam, and Thailand.

- **URL**: https://apify.com/mrdoe/lazada-scraper.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

![Lazada Product, Review & Seller Scraper hero](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/lazada-scraper--hero.png)

## Lazada Product, Review & Seller Scraper

**Scrape real Lazada products, reviews, and seller profiles** - no coding, no manual copy-pasting. Get product **name, price, discount, rating, and stock**, real customer **reviews with star ratings and seller replies**, and **seller trust stats** (ratings, sold-by-store count, follower count), across every live Lazada market: **Malaysia, Singapore, Indonesia, Philippines, Vietnam, and Thailand**.

### What does this Lazada scraper do?

This Actor searches Lazada directly - by keyword or specific product URLs - and pulls three kinds of data in one run:

- **Products** - name, price, original price, discount %, rating, review count, seller, brand, stock status, sold count, full description, category, and images.
- **Reviews** - star rating, review text, photos, purchase/review dates, the (masked) buyer name, and any seller replies.
- **Sellers** - shop name and URL, seller rating %, "sold by store" count, and follower count.

Run it across all 6 countries at once, or narrow it to specific markets. Run it on-demand, on a schedule, or trigger it via the Apify API - full run monitoring built in, with optional Discord/Slack notifications when a run finishes.

### Why scrape Lazada?

- **Price monitoring** - track prices, discounts, and stock across products and sellers over time.
- **Reputation & review analysis** - see what customers actually say, star ratings, and how sellers respond.
- **Competitive & market research** - compare pricing and seller trust signals across all 6 Southeast Asian markets.
- **Lead generation** - build a structured dataset of active sellers (name, ratings, follower count) for outreach or market mapping.

### How to use this Lazada scraper

![How Lazada Product, Review & Seller Scraper works](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/lazada-scraper--how-it-works.png)

1. Go to the **Input** tab.
2. Leave **Countries** as "All countries" and **Search queries** as the default (`laptop`) for a fast, cheap first run across every market.
3. Choose which **Data types** you want - Products, Reviews, Sellers, or any combination. All three by default.
4. Click **Start**, then open the **Dataset** tab for your results - each row's `type` field tells you whether it's a product, review, or seller.

For specific products you already know, set **Product URLs** instead - it replaces search entirely and each URL's own domain determines its country.

### Input

![Lazada Product, Review & Seller Scraper input options](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/lazada-scraper--input.png)

| Field                    | Type    | Description                                                                                               |
| ------------------------ | ------- | --------------------------------------------------------------------------------------------------------- |
| `countries`              | Array   | Which Lazada countries to search (default: all 6). Ignored when `productUrls` is set.                     |
| `searchQueries`          | Array   | Search terms to look up (default: `["laptop"]`). Ignored when `productUrls` is set.                       |
| `productUrls`            | Array   | Specific product URLs to scrape directly - replaces search entirely.                                      |
| `dataTypes`              | Array   | Which record types to collect: `products`, `reviews`, `sellers` (default: all three).                     |
| `maxItemsPerQuery`       | Integer | Max products per search query per country (default: `2`, for a fast preview; `0` = unlimited).            |
| `maxReviewsPerProduct`   | Integer | Max reviews saved per product (default: `2`; `0` = unlimited).                                            |
| `enableCache`            | Boolean | Reuse product/review/seller data fetched in a previous run instead of re-fetching. On by default.         |
| `cacheTtlHours`          | Integer | How long a cached entry stays valid (default: `24`).                                                      |
| `notificationWebhookUrl` | String  | Optional Discord or Slack incoming webhook URL. Posts a one-line run summary there when the run finishes. |

Example input - quick preview across all 6 countries:

```json
{}
```

Example input - full catalog search in one country, products only (fastest, cheapest):

```json
{ "countries": ["MY"], "searchQueries": ["running shoes"], "maxItemsPerQuery": 0, "dataTypes": ["products"] }
```

Example input - deep-dive on specific products:

```json
{
    "productUrls": ["https://www.lazada.com.my/products/example-i123456.html"],
    "dataTypes": ["products", "reviews", "sellers"]
}
```

### Output

![Lazada Product, Review & Seller Scraper dataset output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/lazada-scraper--output.png)

![Lazada Product, Review & Seller Scraper data fields](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/lazada-scraper--fields.png)

Each record is saved as one dataset item, tagged by `type`. A product:

```json
{
    "type": "product",
    "itemId": "4268808386",
    "name": "HP G3-G4 Windows 10 Laptop 4GB RAM 16GB SSD",
    "price": 162,
    "originalPrice": 210,
    "discount": "23% Off",
    "currency": "MYR",
    "ratingScore": 4.86,
    "reviewCount": 102,
    "sellerId": "300348544839",
    "sellerName": "MEGA MALAYSIA",
    "brandName": "HP",
    "image": "https://filebroker-cdn.lazada.com.my/kf/S2f35885657334de3a9cfdb506a243b710.jpg",
    "itemUrl": "https://www.lazada.com.my/products/pdp-i4268808386.html",
    "inStock": false,
    "location": "Selangor",
    "country": "MY",
    "description": "HP G3-G4 Windows 10 Laptop with 16GB SSD and Intel Celeron N2840 processor...",
    "scrapedAt": "2026-08-15"
}
```

a review:

```json
{
    "type": "review",
    "reviewId": "424765098108386",
    "itemId": "4321105022",
    "rating": 5,
    "content": "Great value for money, Solid...",
    "buyerName": "g***t",
    "boughtDate": "27 Jan 2025",
    "sellerReplies": [{ "author": "Seller Response", "content": "THANK YOU", "time": "2024-11-29" }],
    "country": "MY",
    "scrapedAt": "2026-08-15"
}
```

and a seller:

```json
{
    "type": "seller",
    "sellerId": "300348544839",
    "sellerName": "Excellent Future Squad",
    "shopUrl": "https://www.lazada.com.my/shop/excellent-future-squad/",
    "ratingPercent": 95,
    "soldByStore": 1300,
    "followersCount": 87,
    "country": "MY",
    "scrapedAt": "2026-08-15"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data table

| Field           | Description                                                                               |
| --------------- | ----------------------------------------------------------------------------------------- |
| `sku`/`itemId`  | Lazada's own item ID for the product.                                                     |
| `name`          | Product name.                                                                             |
| `price`         | Current price - the sale price when the product is discounted.                            |
| `originalPrice` | The pre-discount price, only set when the product is actually on sale (`null` otherwise). |
| `currency`      | Local currency code for the store's country (e.g. `MYR`, `SGD`, `THB`).                   |
| `sellerId`      | Which seller this product/review/seller record belongs to.                                |
| `country`       | Which of the 6 live Lazada markets this record came from.                                 |
| `scrapedAt`     | Date (`YYYY-MM-DD`) this Actor captured the item.                                         |

### Pricing / Cost estimation

Lazada's product-search API has no bot protection (verified live: a plain, unauthenticated request returns full JSON), so the products stage is fast and cheap. Reviews and sellers are pricier: Lazada's reviews endpoint is guarded by Alibaba's own "TMD" risk-control system and only responds inside an already-loaded product page's browser session (not to a standalone request, verified live), and seller trust stats/follower counts are only ever rendered client-side - so both stages need one real, country-matched Residential-proxied browser page-load per product. Cost scales with how many products you scrape, not how many reviews they have. **Enable cache** to avoid paying that cost again for anything already scraped in a recent run.

### Tips for better runs

- Leave the defaults (`maxItemsPerQuery: 2`, all countries, all data types) for a cheap first look at what this Actor returns.
- Set **Data types** to just `products` for the fastest, cheapest runs - it's the only stage that doesn't need a browser.
- Use `productUrls` for repeat/scheduled checks on specific listings you already track.
- Use the Apify **Schedule** feature to re-run this Actor periodically and track price, review, or seller-rating changes over time.

### FAQ

**Is this legal?** This Actor only collects publicly visible product, review, and seller data. You are responsible for using the data in accordance with Lazada's Terms of Service and any applicable laws in your jurisdiction.

**Why do Reviews and Sellers need a browser but Products doesn't?** Lazada's product-search API is open and unsigned, but its reviews endpoint sits behind Alibaba's own bot-risk system and only responds from inside a real browser session that already loaded that product's page - and seller trust stats simply aren't in any API response at all, only rendered client-side. Products alone stays a fast, browser-free scrape.

**Why is `originalPrice` `null` for most products?** It's only set when Lazada is actually running a discount on that item - full-price products report `null` rather than repeating the regular price.

**Found a bug or have a feature request?** Please use the Issues tab on this Actor's page - feedback directly shapes future updates.

# Actor input Schema

## `countries` (type: `array`):

Which Lazada country site(s) to search. Defaults to all 6 live markets. Ignored when <b>Product URLs</b> is set - each URL already names its own country.

## `searchQueries` (type: `array`):

Search terms to look up on each country's Lazada, e.g. <code>laptop</code> or <code>running shoes</code>. Ignored when <b>Product URLs</b> is set.

## `productUrls` (type: `array`):

Specific Lazada product page URLs to scrape directly, one per line - copy these straight from the site. When set, this replaces search entirely (<b>Countries</b> and <b>Search queries</b> are ignored) - each URL's own domain determines its country.

## `dataTypes` (type: `array`):

Which kinds of records to collect. Products come from Lazada's own JSON search API (fast, cheap). Reviews and sellers both need a real browser render of each product's page - Lazada's rendered pages need a Residential proxy matched to the product's own country plus an English locale to show anything beyond a stripped-down shell.

## `maxItemsPerQuery` (type: `integer`):

Maximum number of products to pull per search query, per country (default: 2, for a fast/cheap preview across every data type you selected). Set to 0 for unlimited.

## `maxReviewsPerProduct` (type: `integer`):

Only used when <b>Data types</b> includes Reviews. Caps how many reviews are saved per product (default: 2). Set to 0 for unlimited.

## `enableCache` (type: `boolean`):

Reuse product/review/seller data already fetched in a previous run (within <b>Cache TTL</b>) instead of re-fetching it. Saves the most on the reviews/sellers stages, which need a full browser render per product/seller. On by default.

## `cacheTtlHours` (type: `integer`):

Only used when <b>Enable cache</b> is on. How long a cached product/review/seller entry stays valid before this Actor re-fetches it (default: 24 hours).

## `notificationWebhookUrl` (type: `string`):

Optional. A Discord or Slack incoming webhook URL - when set, this Actor posts a one-line summary (products/reviews/sellers found) to it after the run finishes. Leave empty to skip notifications.

## Actor input object example

```json
{
  "countries": [
    "ALL"
  ],
  "searchQueries": [
    "laptop"
  ],
  "productUrls": [],
  "dataTypes": [
    "products",
    "reviews",
    "sellers"
  ],
  "maxItemsPerQuery": 2,
  "maxReviewsPerProduct": 2,
  "enableCache": true,
  "cacheTtlHours": 24,
  "notificationWebhookUrl": ""
}
```

# Actor output Schema

## `items` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "laptop"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/lazada-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searchQueries": ["laptop"] }

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/lazada-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "laptop"
  ]
}' |
apify call mrdoe/lazada-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/lazada-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/OKkZjqnCmcEEWdTX3/builds/LZVANGd3rXmt7O4Oy/openapi.json
