# 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
- **Stats:** 2 total users, 1 monthly users, 100.0% 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

| Field | Type | Notes |
|---|---|---|
| `searchQueries` | string\[] | Keywords to search on the chosen storefront. |
| `country` | enum | `sg` (default), `my`, `th`, `vn`, `ph`, `id`. |
| `startUrls` | array | Lazada product, search or category URLs, any country. |
| `sortBy` | enum | `default` (popularity), `price_asc`, `price_desc`, `popularity`, `newest`. |
| `minPrice` / `maxPrice` | integer | Price bounds in the storefront currency. |
| `minRating` | integer | Drop products rated below this (0–5); a product with no rating is kept. |
| `scrapeDetails` | boolean | Also fetch each product's detail page for description, gallery and SKU variants. |
| `maxItems` | integer | Cap across the whole run. Free plan returns at most 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
{
    "itemId": "4652330018",
    "name": "Simplus 4L/6L Smart Touch Rice Cooker 24H Preset 6 Functions Cake & Yogurt Maker PFOA/PFOS Large Capacity Free Non-Stick Inner Pot",
    "productUrl": "https://www.lazada.com.ph/products/pdp-i4652330018.html",
    "image": "https://sg-test-11.slatic.net/p/72f2b6188c7a0c2e9c1539dc3bdfb119.jpg",
    "price": "₱1,249.00",
    "priceValue": 1249,
    "originalPrice": "2589",
    "discountPct": 52,
    "currency": "PHP",
    "ratingScore": 4.991304347826087,
    "reviewCount": 115,
    "soldCount": "1.2K sold",
    "sellerName": "Simplus Kitchen Appliance Store",
    "sellerId": "500340256406",
    "brandName": "Inssa",
    "brandId": "126010269",
    "location": "Laguna",
    "inStock": true,
    "isSponsored": true,
    "categories": "5235 > 5306 > 62551406 > 62551607 > 22353",
    "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` (variant id, label and stock).

### Key output fields

| Field | Description |
|---|---|
| `itemId` | Lazada product id (the digits after `-i` in the URL). |
| `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. |
| `ratingScore` / `reviewCount` | Average star rating and number of reviews. |
| `soldCount` | Units sold, as Lazada prints it, when present. |
| `sellerName` / `sellerId` | The seller/store and its id. |
| `brandName` / `brandId` | Brand and its id. |
| `location` | Seller/warehouse location, e.g. "Singapore", "Overseas". |
| `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`):

Keywords to search Lazada for. Each keyword is searched on the storefront chosen in "Country" below and returns matching products with price, rating, reviews, seller and brand.

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

Which Lazada country site to search. Pasted Start URLs keep their own country regardless of this.

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

Lazada product, search, or category URLs on any of the six country domains. A product URL returns one product (no price — Lazada loads price client-side on product pages; use a keyword search for price). A search or category URL is paginated.

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

Result order. Default is Lazada's own popularity ranking.

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

Only products at or above this price, in the storefront currency.

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

Only products at or below this price, in the storefront currency.

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

Drop products rated below this (0–5). A product with no rating is kept.

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

For every product, also fetch its detail page for the full description, image gallery, specifications and SKU variants. Adds one request per product, so the run is slower, and each enriched product is billed as one extra "Product detail" event on top of the row. Price, rating, sold count and seller already come from the listing. Default: off.

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

Maximum products to scrape across the whole run. On the Apify free plan a run returns at most 100 rows regardless of this value.

## Actor input object example

```json
{
  "searchQueries": [
    "laptop"
  ],
  "country": "sg",
  "startUrls": [],
  "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/mqIbsRnBE48fUOj1J/openapi.json
