# Lazada Scraper (`lergassy/lazada-scraper`) Actor

Extract Lazada product data from all six Southeast Asian marketplaces without a browser: prices, discounts, ratings, units sold, brands, sellers, variants and customer reviews with photos. Export data, run via API, schedule runs, or integrate with AI workflows.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Scraper** extracts public **Lazada product data** from all **six Southeast Asian marketplaces** — Indonesia, Malaysia, Singapore, Philippines, Thailand and Vietnam — without the official API and **without running a browser**. Get product cards from any keyword search, category, brand or shop page, full product detail with description, image gallery and variants, and customer reviews with photos. No login, no API key, no seller account. Export to JSON, CSV or Excel, call it from the API, schedule runs, or plug it into n8n, Make, Zapier, Google Sheets or an AI agent through MCP.

> ### ⚠️ Status note — catalogue search is currently blocked (September 2026)
>
> Lazada moved its search results to a client-rendered app and now answers non-browser
> requests to the catalogue endpoint with an anti-bot page. This affects **🔍 Products
> from search** for every marketplace, and it is a change on Lazada's side, not a
> configuration you can fix with proxies — datacenter and in-country residential IPs are
> blocked alike.
>
> **What still works normally:** 📦 product details and ⭐ reviews from product URLs.
> Give the Actor `startUrls` with product pages (`.../products/pdp-i<id>.html`) and it
> returns the full record — description, gallery, variants, brand, category — and every
> review with rating, text, buyer, date, photos and the seller's reply.
>
> If you need keyword discovery, collect product URLs elsewhere and feed them here.

### What is Lazada Scraper?

Lazada is one of the two dominant marketplaces in Southeast Asia, with separate storefronts, currencies and catalogs in six countries. There is no public product API for buyers, and the product page renders in the browser, so most tooling either misses fields or pays for a headless browser on every request.

This Actor reads Lazada's own data endpoints directly over plain HTTP. Listing pages return a structured catalog record for every product — price, previous price, discount, rating, review count, units sold, brand, seller, warehouse location and LazMall status — and the product page carries the full description, the complete image gallery and every variant combination. That makes runs fast and cheap: a search of 40 products finishes in well under a minute.

| Mode | What you get | Input |
|---|---|---|
| 🔍 **Products from search** | Product cards: title, price, previous price, discount %, rating, review count, units sold, brand, seller, location, LazMall flag, badges, images, position | keywords, search, category, brand or shop URLs |
| 📦 **Product details** | Full product page: description, highlights, image gallery, every variant with its options, brand, category, availability | product URLs or item IDs |
| ⭐ **Reviews** | Customer reviews: rating, text, variant bought, buyer name, date, helpful votes, photos, seller reply | product URLs or item IDs |
| 📦+⭐ **Products with reviews** | Both of the above for each product in one run | product URLs |

Every row carries `country`, `marketplace`, `currency` and `itemId`, so one dataset can hold several countries at once.

### Supported Lazada marketplaces

| Country | Code | Domain | Currency |
|---|---|---|---|
| 🇮🇩 Indonesia | `ID` | lazada.co.id | IDR |
| 🇲🇾 Malaysia | `MY` | lazada.com.my | MYR |
| 🇸🇬 Singapore | `SG` | lazada.sg | SGD |
| 🇵🇭 Philippines | `PH` | lazada.com.ph | PHP |
| 🇹🇭 Thailand | `TH` | lazada.co.th | THB |
| 🇻🇳 Vietnam | `VN` | lazada.vn | VND |

Prices come back in the marketplace's own currency and are never converted.

### What data can Lazada Scraper extract?

#### 🔍 Product cards

| Field | Example |
|---|---|
| `title` | `iPhone 17 Pro` |
| `price` / `originalPrice` / `discountPercent` | `22414000` / `32000000` / `30` |
| `currency` / `priceText` | `IDR` / `Rp22.414.000` |
| `rating` / `reviewCount` | `4.87` / `62` |
| `soldQuantity` / `soldText` | `220` / `220 sold` |
| `brand` / `brandId` | `Apple` / `127197227` |
| `sellerName` / `sellerId` | `Apple Authorised Reseller` / `402540720932` |
| `location` | `Kota Depok` |
| `isLazMall` / `isSponsored` | `true` / `false` |
| `badges` | `["Voucher save 30%", "Trade In"]` |
| `itemId` / `skuId` | `8737698858` / `16177996790` |
| `inStock` | `true` |
| `url` / `imageUrl` / `images` | product link, main picture, thumbnails |
| `position` / `page` / `keyword` / `totalResults` | `1` / `1` / `iphone 15` / `4080` |

#### 📦 Product details

`description` (the seller's full description as plain text), `descriptionHtml`, `highlights` (the bullet list from the page), `images` (full gallery), `imageCount`, `variants` with every option combination (`{"skuId": "16177996790", "values": [{"name": "Warna", "value": "Silver"}, {"name": "Kapasitas Penyimpanan", "value": "256 GB"}]}`), `variantCount`, `brand`, `brandUrl`, `category`, `categoryId`, `availability`, `sku` and `sellerId`.

#### ⭐ Reviews

`rating`, `text`, `variant` (the exact option the buyer purchased), `reviewer`, `reviewTime`, `boughtDate`, `verifiedPurchase`, `likes`, `images` (buyer photos), `sellerReply`, plus `reviewId`, `itemId` and `productUrl`.

### How much does it cost to scrape Lazada?

The Actor uses Apify's **pay-per-event** pricing, so you pay for results, not for pages or proxy traffic.

| Event | Price | Per 1,000 |
|---|---|---|
| Product (search card) | $0.002 | **$2** |
| Product detail (full product page) | $0.004 | **$4** |
| Review | $0.001 | **$1** |

No browser is involved, so platform usage per run is a fraction of a cent. The **Apify Free plan** ($5 monthly credit) covers roughly 2,500 product cards, 1,250 full product records or 5,000 reviews every month.

### How to scrape Lazada

1. Open **Lazada Scraper** on Apify and click **Try for free**.
2. Choose **What to scrape** — for example *Products from search*.
3. Pick the **Country** (Indonesia by default).
4. Type **Search keywords**, or paste **Lazada URLs**: product links, search results, category, brand or shop pages. Links from different countries can be mixed in one run.
5. Set **Max products**, optionally turn on **Fetch full product details**, then click **Start**.
6. When the run finishes, open the **Output** tab and download JSON, CSV, Excel or XML, or read the dataset through the API.

### ⬇️ Input

![Lazada Scraper input form: mode, country, search keywords, Lazada URLs, max products, reviews and sorting](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/lazada/lazada-scraper-input-form.png)

Search Indonesia for two keywords, cheapest first:

```json
{
  "mode": "search",
  "country": "ID",
  "searchTerms": ["iphone 15", "samsung s24"],
  "sortBy": "price_asc",
  "maxItems": 200
}
```

Full detail for specific products, from any marketplace:

```json
{
  "mode": "product",
  "startUrls": [
    "https://www.lazada.co.id/products/iphone-17-pro-i8737698858.html",
    "https://www.lazada.com.my/products/x-i4567890123.html"
  ]
}
```

All reviews of a product, 5-star only:

```json
{
  "mode": "reviews",
  "startUrls": ["https://www.lazada.co.id/products/iphone-17-pro-i8737698858.html"],
  "maxReviewsPerProduct": 1000,
  "reviewsRating": "5"
}
```

A category page in Thailand and a brand page in Vietnam in one run:

```json
{
  "startUrls": [
    "https://www.lazada.co.th/shop-mobiles/",
    "https://www.lazada.vn/apple/"
  ],
  "maxItems": 100
}
```

#### Search filters

`sortBy` (`relevance`, `price_asc`, `price_desc`, `newest`, `rating`), `minPrice` and `maxPrice` in the marketplace currency. Turn on **Fetch full product details** to open every result's page and merge description, gallery and variants into the row.

### ⬆️ Output

![Lazada Scraper output table: product, price, previous price, discount, rating, units sold, brand, seller, shipping location](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/lazada/lazada-scraper-output-table.png)

One product card:

```json
{
  "type": "product",
  "title": "iPhone 17 Pro",
  "url": "https://www.lazada.co.id/products/pdp-i8737698858.html",
  "itemId": "8737698858",
  "skuId": "16177996790",
  "country": "ID",
  "marketplace": "Indonesia",
  "currency": "IDR",
  "price": 22414000,
  "originalPrice": 32000000,
  "discountPercent": 30,
  "priceText": "Rp22.414.000",
  "rating": 4.87,
  "reviewCount": 62,
  "soldQuantity": 220,
  "brand": "Apple",
  "sellerName": "Apple Authorised Reseller",
  "sellerId": "402540720932",
  "location": "Kota Depok",
  "isLazMall": true,
  "badges": ["Voucher save 30%", "Trade In"],
  "inStock": true,
  "position": 1,
  "keyword": "iphone 15",
  "totalResults": 4080,
  "scrapedAt": "2026-09-03T07:46:24.903Z"
}
```

One product detail (description shortened here):

```json
{
  "type": "product_detail",
  "itemId": "8737698858",
  "title": "iPhone 17 Pro",
  "brand": "Apple",
  "category": "Handphone & Tablet",
  "availability": "InStock",
  "description": "iPhone 17 Pro. Poin-poin fitur utama. DESAIN UNIBODY …",
  "highlights": ["iPhone 17 Pro.", "Layar 6,3 inci yang cemerlang", "Chip A19 Pro"],
  "imageCount": 24,
  "variantCount": 6,
  "variants": [
    { "skuId": "16177996790", "values": [{ "name": "Warna", "value": "Silver" }, { "name": "Kapasitas Penyimpanan", "value": "256 GB" }] }
  ],
  "url": "https://www.lazada.co.id/products/iphone-17-pro-i8737698858.html"
}
```

Rows carry a `type` (`product`, `product_detail`, `review`, `error`), so one dataset can be filtered in a spreadsheet or in code. Pages that fail after the retries are written as `error` rows with the URL and reason instead of disappearing.

### Use cases for Lazada data

#### Price monitoring and repricing

Track `price`, `originalPrice`, `discountPercent` and `soldQuantity` for your listings and competitors on a schedule, and push the dataset to Sheets or your pricing tool.

#### Cross-border market research

Search the same category in Indonesia, Vietnam, Thailand and the Philippines in one run and compare price levels, discount depth and demand between markets.

#### Product research and sourcing

Units sold, ratings and review counts show what actually moves. Product details add the description and every variant, so you can size an assortment before contacting suppliers.

#### Seller and brand intelligence

Cards carry the seller name and ID, the brand and the LazMall flag, so you can map who dominates a category and which brands run the deepest discounts.

#### Review mining

Pull thousands of reviews with star ratings, the exact variant bought, buyer photos and seller replies, then run sentiment analysis or feed them to an LLM for recurring complaints.

#### AI agents and RAG

Flat rows, literal field names and no required inputs make the Actor easy to call from an agent through the Apify MCP server.

### Integrations

- **API** — start a run and read the dataset with any HTTP client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("lergassy/lazada-scraper").call(run_input={
    "country": "ID", "searchTerms": ["air fryer"], "maxItems": 100
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"], item["currency"])
```

- **JavaScript** — `npm i apify-client`, then `client.actor('lergassy/lazada-scraper').call(input)`.
- **n8n, Make, Zapier, Google Sheets, Airtable, Slack, webhooks** — through the standard Apify integrations.
- **MCP** — add the Apify MCP server to Claude, ChatGPT or Cursor and let the agent call `lergassy/lazada-scraper` with a keyword and a country.

### Errors and troubleshooting

| What you see | What it means | Fix |
|---|---|---|
| `error` rows with an anti-bot message | Lazada throttled that IP for the listing endpoint | Re-run; the Actor rotates proxy sessions and warms each one before requesting data |
| Fewer results than **Max products** | The keyword ran out of pages | Use broader or several keywords, or a category URL |
| `soldQuantity` is null | Lazada hides the counter on some listings | Use `soldText` when present, or product details |
| Reviews return nothing | The product has no written reviews yet | Check `reviewCount` on the product card first |
| Product detail without a price | Prices live on the card, not on the page markup | Run search mode, or enable **Fetch full product details** so both are merged |

### 🤖 For AI Agents & LLM Apps

Compact reference for agents calling this Actor through the [Apify MCP server](https://mcp.apify.com) or the Apify API (`lergassy/lazada-scraper`).

**Purpose:** returns Lazada listings and buyer reviews across six South-East Asian
marketplaces — by search term or by product URL — with price, discount, rating,
units sold, seller and LazMall status. Use it to answer "what does this cost in
Malaysia today", "which sellers dominate this query" and "what do buyers complain
about in these reviews".

**Minimal input:**

```json
{ "searchTerms": ["iphone 15"], "country": "ID", "maxItems": 40 }
```

**Output:** one row per listing — `type`, `itemId`, `title`, `url`, `country`,
`marketplace`, `currency`, `price`, `originalPrice`, `discountPercent`, `rating`,
`reviewCount`, `soldQuantity`, `brand`, `sellerName`, `isLazMall`, `location`,
`imageUrl`, `scrapedAt`. Enriched rows add `category`, `description`, `highlights`,
`variants` and `variantCount`. Review rows carry `rating`, `text`, `variant`,
`reviewer`, `reviewTime`, `likes`, `images` and `sellerReply`. Unreadable pages
arrive as `type: "error"` rows with `error` and `kind`.

**Behaviors an agent should know:**

- `mode` defaults to `auto`: search terms run search mode, product URLs run product
  mode. Set `reviews` or `product_reviews` explicitly when you want review rows.
- `country` selects the marketplace and the currency. Prices are in the
  marketplace's own currency; never compare across countries without converting.
- `maxItems` (default 40) caps listings; `maxReviewsPerProduct` (default 100) caps
  reviews separately, so a review run's size is the product of the two.
- `reviewsRating` narrows reviews to one star value — use it instead of pulling
  everything and filtering afterwards.
- `enrichProducts` costs an extra page fetch per product; leave it off when listing
  fields suffice.
- Review text is mostly Indonesian, Malay, Thai or Vietnamese depending on the
  marketplace. Translate before sentiment scoring, and expect masked buyer names.
- `isLazMall` marks Lazada's verified-brand tier — a useful proxy for whether a
  listing is from an official store or a marketplace reseller.

### ❓ FAQ

#### Is it legal to scrape Lazada?

The Actor reads only pages and endpoints that any visitor can open without logging in: listings, product pages and public reviews. It does not authenticate, does not touch buyer accounts and collects no private data. You are responsible for using the data in line with local law and Lazada's terms; consult a lawyer for your case.

#### Do I need a Lazada API key or a seller account?

No. Lazada's open API is for sellers and partners. This Actor never authenticates.

#### Does it use a browser?

No. Everything is plain HTTP, which is why runs cost a fraction of a cent.

#### Can I scrape several countries in one run?

Yes. Keyword searches use the selected country, and each URL keeps its own marketplace. Rows record `country`, `marketplace` and `currency`.

#### How many products can one keyword return?

Lazada pages listings in blocks of about 40 and reports the total in `totalResults`. Deep paging on a broad keyword drifts into loosely related items, so several narrow keywords beat one broad one.

#### Can I get per-variant prices and stock?

Product details return every variant with its option values and SKU ID. Lazada does not publish per-variant stock to visitors, and the card price is the one shown to shoppers.

#### Does it collect buyer questions?

No. Only reviews, which include the variant bought, photos and seller replies where present.

#### Can I use it with the Apify API, MCP or n8n?

Yes, see Integrations. The input is plain JSON and `startUrls` accepts product, search, category, brand and shop links.

### Your feedback

Missing a field, a country or a page type? Open an issue in the **Issues** tab or leave a review — user requests decide what ships next.

### You might also like

| Actor | What it does |
|---|---|
| [Shopee Scraper](https://apify.com/lergassy/shopee-scraper) | Products, prices and sellers across 11 Shopee marketplaces |
| [Tokopedia Reviews Scraper](https://apify.com/lergassy/tokopedia-reviews-scraper) | Shop reviews from Indonesia's Tokopedia |
| [Mercado Libre Scraper](https://apify.com/lergassy/mercadolibre-scraper) | Products, prices, reviews and deals across 18 Latin American marketplaces |
| [Google Flights Scraper](https://apify.com/lergassy/google-flights-scraper) | Flight prices, airlines and price insights |
| [Email & Phone Verifier](https://apify.com/lergassy/email-phone-verifier) | Checks e-mails and phone numbers in bulk: deliverability, throwaway and role flags, numbering plan, US state and time zone |

# Actor input Schema

## `mode` (type: `string`):

What to scrape. **Note:** Lazada gated catalogue search against non-browser clients in September 2026, so 🔍 search currently returns an anti-bot error. Product details and reviews work normally — give this Actor product URLs.

## `country` (type: `string`):

Lazada marketplace for keyword searches. URLs keep their own country.

## `searchTerms` (type: `array`):

Keywords to search. ⚠️ Lazada currently blocks catalogue search for non-browser clients, so these will return an error. Use 🏷️ Product URLs instead.

## `startUrls` (type: `array`):

Any Lazada links: product pages (<code>.../products/...-i123456.html</code>), search results, category, brand or shop pages. Bare item IDs also work. Product page URLs (`.../products/pdp-i<id>.html`) are the reliable input right now.

## `maxItems` (type: `integer`):

Stop after this many products per keyword or listing URL.

## `enrichProducts` (type: `boolean`):

Open each product page for description, image gallery, variants, highlights and brand. Slower and billed per product detail.

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

Reviews mode: how many reviews to collect for each product.

## `reviewsRating` (type: `string`):

Reviews mode: keep only reviews with this star rating.

## `sortBy` (type: `string`):

Order of search results.

## `minPrice` (type: `integer`):

Minimum price in the marketplace's own currency.

## `maxPrice` (type: `integer`):

Maximum price in the marketplace's own currency.

## `proxyConfiguration` (type: `object`):

Lazada blocks datacenter IP ranges on most of its marketplaces. The Actor starts on the proxy you pick here and automatically switches to a residential IP in the marketplace's own country if it keeps hitting anti-bot pages.

## Actor input object example

```json
{
  "mode": "auto",
  "country": "ID",
  "searchTerms": [
    "iphone 15"
  ],
  "startUrls": [
    {
      "url": "https://www.lazada.co.id/products/pdp-i5504928451.html"
    }
  ],
  "maxItems": 40,
  "enrichProducts": false,
  "maxReviewsPerProduct": 100,
  "reviewsRating": "all",
  "sortBy": "relevance",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `products` (type: `string`):

One row per Lazada listing with price, discount, rating, units sold, brand, seller and LazMall status; enriched rows add description, highlights and variants; review rows carry the buyer's stars, text, photos and the seller's reply.

## `csv` (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 = {
    "searchTerms": [
        "iphone 15"
    ],
    "startUrls": [
        {
            "url": "https://www.lazada.co.id/products/pdp-i5504928451.html"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/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 = {
    "searchTerms": ["iphone 15"],
    "startUrls": [{ "url": "https://www.lazada.co.id/products/pdp-i5504928451.html" }],
}

# Run the Actor and wait for it to finish
run = client.actor("lergassy/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 '{
  "searchTerms": [
    "iphone 15"
  ],
  "startUrls": [
    {
      "url": "https://www.lazada.co.id/products/pdp-i5504928451.html"
    }
  ]
}' |
apify call lergassy/lazada-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lergassy/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/KkvT2eVLM0KFa9Bgn/builds/na9PECffHgW7M4Ycz/openapi.json
