# Lazada Scraper — Products, Prices, Ratings & Sellers (`memo23/lazada-scraper`) Actor

Scrape Lazada products by keyword or URL across Malaysia, Singapore, Thailand, Vietnam, Philippines & Indonesia. Get price, discount, rating, reviews, sold count, seller, brand, location & image as clean JSON or CSV. Opt-in detail adds description, gallery & SKU variants. No login.

- **URL**: https://apify.com/memo23/lazada-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 97.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Lazada Scraper — Products, Prices, Ratings & Sellers

Extract structured product data from **Lazada** across all six South-East-Asian storefronts — Malaysia, Singapore, Thailand, Vietnam, Philippines and Indonesia — by keyword or URL. Price, discount, rating, review count, sold count, seller, brand, location and image on every row. No login, no cookies, no browser. Clean JSON or CSV out.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-lazada.png)

### Why use this Lazada Scraper?

- **One actor, six countries.** Search `lazada.sg`, `lazada.com.my`, `lazada.co.th`, `lazada.vn`, `lazada.com.ph` or `lazada.co.id` — pick a storefront, or paste a URL from any of them. Prices come back in that country's own currency.
- **Rich data straight from search.** Price, original price, discount %, rating, review count, sold count, seller name, seller id, brand, warehouse location and image on every row — no detail fetch required.
- **Optional deep detail.** Turn on `scrapeDetails` to add each product's full description, image gallery and SKU variants from its product page.
- **No proxy to set up.** Lazada's anti-bot answers most direct requests with a slider challenge. The actor reads every page through a managed unblocker from an exit in that storefront's own country, with retries built in.
- **Built for scale.** 40 products per page, deep pagination up to `maxItems`, and product pages fetched in parallel when you want details.
- **One clean row per product.** You pay per result, never for padding.

### Supported inputs

| Input type | Example |
|---|---|
| Keyword search | `laptop`, `หูฟัง`, `smartphone` (searched on the chosen country storefront) |
| Search / category URL | `https://www.lazada.sg/catalog/?q=laptop` or a category page |
| Product URL | `https://www.lazada.sg/products/...-i13816329353.html` |

Set **Country** to choose which storefront keyword searches run on. Pasted URLs keep their own country.

### How it works

Lazada serves its catalog as JSON: add `ajax=true` to any search or category URL and it returns the product list — price, rating, reviews, seller and brand already attached — 40 at a time, paginated by `page`. This actor reads that JSON directly, so there is no browser and no HTML parsing for the listing.

Lazada's Baxia anti-bot answers that JSON with a slider challenge for most requests, including from residential and home connections. The actor fetches every page through a managed unblocker, from an exit in the storefront's own country, and retries a page that still comes back blocked. You do not need a proxy or cookies.

With `scrapeDetails` on, each product's detail page is fetched (several at once) and its embedded data islands parsed for the full description, image gallery and SKU variants.

### Use cases

| Who | What they do with it |
|---|---|
| Price-monitoring tools | Scheduled snapshots of price, original price and discount per item id, per country |
| Brands and distributors | Find resellers of their brand, compare prices and locations across the six markets |
| Marketplace sellers | Research competitors' prices, ratings, review counts and units sold before listing |
| Dropshipping and sourcing | Spot best-selling products by sold count and rating in a category |
| Analysts | Category structure, sponsored placement and price distribution across South-East Asia |

### Input configuration

In the order of the input form:

| Field | Type | Notes |
|---|---|---|
| `searchQueries` | string\[] | Words to search for on the chosen Lazada site. |
| `startUrls` | array | Lazada product, search or category links from any of the six sites. |
| `country` | enum | `sg` (default), `my`, `th`, `vn`, `ph`, `id`; used by `searchQueries`. |
| `sortBy` | enum | `default` (Lazada's ranking), `price_asc`, `price_desc`, `popularity`. `newest` sorts by price, high to low: Lazada has no newest-first order. |
| `minRating` | integer | 0–5. Lower-rated products are dropped and not billed; unrated ones stay. |
| `minPrice` / `maxPrice` | integer | Price range in the site's own money; Lazada applies it. |
| `scrapeDetails` | boolean | Opens each product page for description, gallery and variants (billed per product). |
| `maxItems` | integer | Products in the whole run. The free plan stops at 100. |

#### Example input

```json
{
    "searchQueries": ["gaming laptop"],
    "country": "sg",
    "sortBy": "price_desc",
    "maxItems": 200
}
```

### Output

Every row is one product. A real row from a `rice cooker` search on `lazada.com.ph`:

```json
{
    "name": "Simplus 4L/6L Smart Touch Rice Cooker 24H Preset 6 Functions Cake & Yogurt Maker PFOA/PFOS Large Capacity Free Non-Stick Inner Pot",
    "image": "https://sg-test-11.slatic.net/p/72f2b6188c7a0c2e9c1539dc3bdfb119.jpg",
    "categories": "5235 > 5306 > 62551406 > 62551607 > 22353",
    "brandName": "Inssa",
    "brandId": "126010269",
    "sellerName": "Simplus Kitchen Appliance Store",
    "sellerId": "500340256406",
    "location": "Laguna",
    "isSponsored": true,
    "inStock": true,
    "soldCount": "1.2K sold",
    "reviewCount": 115,
    "ratingScore": 4.991304347826087,
    "currency": "PHP",
    "price": "₱1,249.00",
    "priceValue": 1249,
    "originalPrice": "2589",
    "discountPct": 52,
    "itemId": "4652330018",
    "productUrl": "https://www.lazada.com.ph/products/pdp-i4652330018.html",
    "country": "ph",
    "sourceQuery": "rice cooker",
    "scrapedAt": "2026-10-14T08:46:50.754Z"
}
```

With `scrapeDetails: true`, each row also carries `description` (plain text), `images` (full gallery), `brandName`, and `skus` (one entry per variant: its id, its label such as "Color Family: Black", and whether it can be added to cart). A product whose page has nothing to add, such as one Lazada shows only in its mobile app, keeps its search row and is not billed for detail.

### Key output fields

| Field | Description |
|---|---|
| `brandName` / `brandId` | Brand and its id. |
| `sellerName` / `sellerId` | The seller/store and its id. |
| `location` | Seller/warehouse location, e.g. "Singapore", "Overseas". |
| `soldCount` | Units sold, as Lazada prints it, when present. |
| `ratingScore` / `reviewCount` | Average star rating and number of reviews. |
| `price` / `priceValue` | Localised price string and its numeric value in the storefront currency. |
| `originalPrice` / `discountPct` | Pre-discount price and percent off, when Lazada reports a discount. |
| `itemId` | Lazada product id (the digits after `-i` in the URL). |
| `country` | Which storefront the row came from. |
| `description` / `images` / `skus` | Detail-page fields — only with `scrapeDetails: true`. |

### Pricing

Pay per event, no subscription:

| Event | When | Price |
|---|---|---|
| Actor start | Once per run (per GB of memory) | $0.005 |
| Product | Each product row in the dataset | $2.00 per 1,000 |
| Product detail | Each product enriched from its detail page (`scrapeDetails`) | $2.00 per 1,000 |

A search without details costs $2 per 1,000 products; with details, $4 per 1,000. The Apify free plan returns up to 100 products a run.

### FAQ

#### Can I get prices in a specific currency?

Prices come back in the currency of the storefront you search. Set `country` to the market you want.

#### Why does a direct product URL have no price?

Lazada loads price, rating and stock on product pages with a client-side request, so they are not in the product page's HTML — a product URL returns name, description, images and SKU variants, but no price. Use a keyword or category search to get price, rating, sold count and seller. The product page's price is always available through a search that surfaces it.

#### Does it need a login or cookies?

No. Everything is read from Lazada's own public catalog JSON and public product pages.

#### Why did a run return fewer rows than `maxItems`?

Either the search has fewer results than you asked for, or a page could not be read past Lazada's anti-bot after the retries. A run that returns nothing at all is reported as FAILED with the reason, never as an empty success. Re-run after a moment.

### ⚠️ Disclaimer

This Actor collects only publicly available product data from Lazada's own public catalog and product pages. It does not log in, does not bypass any login wall, and does not access private or personal data. You are responsible for using the data in line with Lazada's Terms of Service, applicable data-protection law (GDPR/CCPA where relevant), and any restrictions in your jurisdiction.

### Support

Issues or feature requests: the Issues tab of this Actor in Apify Console. Custom needs: <muhamed.didovic@gmail.com>

### Explore more scrapers

- [Shopee Scraper](https://apify.com/memo23/shopee-scraper): search, product and shop data across 11 Shopee markets
- [AliExpress Scraper](https://apify.com/memo23/aliexpress-scraper): products, prices and reviews at $0.8 per 1,000
- [Amazon Search & Product Scraper](https://apify.com/memo23/amazon-search): prices, BSR and buy box across 21 markets
- [Walmart Scraper](https://apify.com/memo23/walmart-scraper): products, prices, sellers and reviews

### 🤖 For AI Agents & LLM Apps

**Purpose.** Reads public Lazada catalog data across all six South-East-Asian storefronts: products by keyword, category or URL, with price, rating, reviews, seller, brand and location. Optional per-product detail (description, gallery, SKUs). No authentication.

**Minimal tested input.**

```json
{ "searchQueries": ["laptop"], "country": "sg", "maxItems": 50 }
```

**Output fields (flat).** `itemId`, `name`, `productUrl`, `image`, `price`, `priceValue`, `originalPrice`, `discountPct`, `currency`, `ratingScore`, `reviewCount`, `soldCount`, `sellerName`, `sellerId`, `brandName`, `brandId`, `location`, `inStock`, `isSponsored`, `categories`, `country`, `description`, `images`, `skus`, `sourceQuery`, `scrapedAt`.

**Behaviours an agent should plan for.**

- One storefront per `country`; pasted `startUrls` keep their own country (read `country` on each row).
- A direct product URL returns no price (Lazada loads it client-side) — use a search for price.
- Billing: $0.005 per run start, $0.002 per product row, plus $0.002 per product when `scrapeDetails` is on. Bound cost with `maxItems`.
- A run that returns no products ends FAILED with the reason; a short run logs why it stopped.

### SEO Keywords

lazada scraper, lazada api, lazada product scraper, lazada price scraper, scrape lazada without login, lazada malaysia scraper, lazada singapore scraper, lazada thailand scraper, lazada vietnam scraper, lazada philippines scraper, lazada indonesia scraper, lazada seller scraper, lazada product data, south east asia ecommerce scraper, lazada catalog scraper, lazada search scraper, lazada reviews, lazada competitor monitoring, lazada dropshipping research

# Actor input Schema

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

Words you would type into Lazada's search box, one per line, e.g. laptop or air fryer. Each one runs on the Lazada site chosen below and is paged through. If this field and the links field are both empty, the run searches for laptop.

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

Links from any of the six Lazada sites. A search or category page is paged through and gets the order and price range below. A product page gives that one product without its price, since Lazada fills prices in on the page itself; search by keyword when you need prices.

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

The site your search words run on. Pasted links stay on the site they point to.

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

How Lazada orders the results of keyword searches and pasted search or category pages. Lazada offers no newest-first order: the "Newest" option sorts by price, high to low, and stays in the list so saved inputs keep working.

## `minRating` (type: `integer`):

0 to 5. Products rated below it are dropped and not billed; products with no rating yet stay in. 0 (default) keeps everything.

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

Lowest price to include, in the money of the Lazada site searched (SGD on lazada.sg, THB on lazada.co.th). Empty or 0: no lower limit.

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

Highest price to include, in the same money. Empty or 0: no upper limit.

## `scrapeDetails` (type: `boolean`):

Off (default): each row carries what the search results show, including price, rating, sold count and seller. On: the run also opens every product's page for its full description, photo gallery and variant list. That is one more request per product, so runs take longer, and each product enriched this way is billed as an extra "Product detail" event.

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

The run stops after this many products. It also stops early at your spending limit, and on the free Apify plan at 100.

## Actor input object example

```json
{
  "searchQueries": [
    "laptop"
  ],
  "startUrls": [],
  "country": "sg",
  "sortBy": "default",
  "minRating": 0,
  "scrapeDetails": false,
  "maxItems": 50
}
```

# Actor output Schema

## `overview` (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"
    ],
    "startUrls": [],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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"],
    "startUrls": [],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/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"
  ],
  "startUrls": [],
  "maxItems": 50
}' |
apify call memo23/lazada-scraper --silent --output-dataset

```

## MCP server setup

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