# Lazada Scraper: Products, Prices & Price Changes (`quanta1810/lazada-scraper`) Actor

Lazada scraper for all 6 storefronts (VN, ID, MY, PH, TH, SG): price, discount, rating, sold count, seller, stock and search rank per product. Daily price monitoring: unchanged products are free. Anti-bot handled, proxy included. $2 per 1,000 products; blocked searches are free.

- **URL**: https://apify.com/quanta1810/lazada-scraper.md
- **Developed by:** [Quan Ta](https://apify.com/quanta1810) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Stats:** 1 total users, 0 monthly users, 85.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$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 & Price Changes

Scrape **Lazada search and category results** in all six storefronts — **Vietnam, Indonesia, Malaysia, the Philippines, Thailand and Singapore** — and get **one row per product**: price, original price, discount, rating, number of ratings, sold count, shop, brand, stock and search position. Turn on **price-change monitoring** to get only the products whose price or stock changed since the last run.

No login, no browser, no Lazada account. Unofficial tool — not affiliated with or endorsed by Lazada.

### Quick links

[What you get](#what-you-get) · [How to use](#how-to-use) · [Price-change monitoring](#price-change-monitoring) · [For AI agents](#for-ai-agents-mcp-x402) · [Pricing](#pricing) · [Use with n8n, Make, Zapier, Sheets](#use-it-with-n8n-make-zapier-or-google-sheets) · [FAQ](#faq) · [Known limits](#known-limits)

### What you get

| Column | What it is |
|---|---|
| `name`, `url`, `itemId`, `skuId`, `imageUrl` | The product |
| `price`, `originalPrice`, `discountPercent`, `priceText`, `currency` | Current price, price before discount (null when not discounted), discount in %, the price exactly as Lazada shows it, and the currency (VND, IDR, MYR, PHP, THB, SGD) |
| `ratingScore`, `reviewCount` | Average rating 0–5 (null = no ratings yet) and number of ratings |
| `soldText`, `soldApprox` | Sold count as Lazada shows it ("2.3K sold") and as a number (2300 — approximate, Lazada rounds) |
| `sellerName`, `sellerId`, `brandName`, `location` | Shop, brand (null for "No Brand") and where it ships from |
| `inStock`, `isSponsored`, `freeShipping` | Stock, whether the listing is an ad, free-shipping badge |
| `country`, `searchQuery`, `sourceUrl`, `page`, `position` | Which search found it and its **rank in the results** (1 = first) — handy for tracking where your products rank for a keyword |
| `change`, `changes` | Monitoring mode only: `new` / `changed` / `unchanged` and what changed |
| `status`, `charged`, `errorCode`, `error` | `ok` for products; a search that failed gets one row with the reason, and a search that stopped midway gets one `partial` row — never charged |

#### Output example (real run, October 2026)

```json
{
  "status": "ok",
  "country": "my",
  "currency": "MYR",
  "searchQuery": "phone case",
  "position": 2,
  "itemId": "14985602354",
  "name": "The Cat with the Fan Space Phone Case Clear TPU Phone Case For iPhone For 18 Pro Max 18 Pro 17 16 15 14",
  "url": "https://www.lazada.com.my/products/pdp-i14985602354.html",
  "price": 9.9,
  "originalPrice": 20,
  "discountPercent": 51,
  "priceText": "RM9.90",
  "ratingScore": 4.2,
  "reviewCount": 5,
  "soldText": "10 sold",
  "soldApprox": 10,
  "sellerName": "Evershine Lifestyle store",
  "brandName": null,
  "location": "Wp Kuala Lumpur",
  "inStock": true,
  "isSponsored": false,
  "freeShipping": false,
  "charged": true
}
```

### Who is it for?

- **Sellers and brands on Lazada** — watch competitors' prices and discounts, see who ranks above you for your keywords, spot products that sell (sold count) before you stock them.
- **E-commerce agencies and analysts** — compare the same product category across six Southeast Asian markets in one run.
- **Price-comparison and deal sites** — a daily feed of prices with the discount already computed.
- **Researchers** — structured, repeatable snapshots of what Lazada shows for a query.

### How to use

1. Type your **search keywords** (one per line), exactly as you would in the Lazada search box.
2. Pick the **countries**. Each keyword is searched in each country you pick (2 keywords × 3 countries = 6 searches).
3. Set **Max products per search** (40 per page; Lazada shows at most 4,080 per search).
4. Optional: sort by price, a min / max price (in the storefront's currency), or turn off sponsored listings.
5. Click **Start** and download the results as **CSV, Excel, JSON**, or read them through the API.

Already filtered something on the Lazada website (category, rating, brand…)? Paste that page's URL into **Lazada search / category URLs** instead — the country is taken from the URL.

#### Input example

```json
{
  "searchQueries": ["phone case", "wireless earbuds"],
  "countries": ["my", "sg", "vn"],
  "maxProductsPerSearch": 200,
  "sort": "popularity"
}
```

### Price-change monitoring

Turn on **Price-change monitoring** and schedule the Actor (for example daily). Every run remembers each product's price, original price and stock, and the next run returns only:

- **new** products (not seen before in this monitor), and
- **changed** products, with a plain-English `changes` list — `"price: 12 → 9.9 (-17.5%)"`, `"sale started (original 15)"`, `"sale ended (was 15)"`, `"out of stock"`, `"back in stock"`.

**Unchanged products are not charged** and not listed (turn on *List unchanged products too* to see them with `status: "unchanged"`, still free). Lazada keeps the first results page fairly stable but reshuffles later pages between visits (measured: page 2 of the same keyword showed 40 different products an hour later), so products that newly enter your top N count — and are charged — as **new**. For a tight watch list, use a small **Max products per search**, sort by price, or paste the category / shop URLs you care about. Use a different **Monitor name** for each list you track. The memory lives in a key-value store named `lazada-scraper-monitor` in **your own** Apify account.

### For AI agents (MCP, x402)

This Actor works from AI agents through the [Apify MCP server](https://mcp.apify.com) and can be paid per call with x402 (it runs with limited permissions and only reads public Lazada search pages).

- **Minimal input:** `{"searchQueries": ["phone case"], "countries": ["my"], "maxProductsPerSearch": 40}`
- **Cost:** $0.002 per product; searches that fail are free. 40 products ≈ $0.08.
- **Speed:** measured in October 2026 with the default proxy: one 40-product search usually takes 10–40 s and almost always under 3 minutes (longer only when Lazada's anti-bot check needs several retries); 12 searches across 6 countries took 3–5 minutes. For more than a few searches, start a normal run and read the dataset instead of the synchronous `run-sync-get-dataset-items` endpoint (it stops after 300 s).
- **Read first:** `name`, `price`, `currency`, `discountPercent`, `ratingScore`, `soldApprox`, `sellerName`, `url`, `position`; a row whose `status` is not `ok` explains why a search returned nothing.

### Pricing

**$0.002 per product** ($2 per 1,000 products). There is no start fee.

- A search that Lazada blocks, that finds nothing, or that fails is listed with the reason and **not charged**.
- In monitoring mode, **unchanged products are free** — you pay only for new and changed ones.
- Set **Max cost per run** in the run options to cap your spend; searches that no longer fit are listed as `skipped` (not charged).
- On the Apify Free plan, the $5 monthly credit covers about **2,500 products** — trying it is effectively free.

### Use it with n8n, Make, Zapier or Google Sheets

- **n8n** — Apify node: *Run an Actor* → *Get dataset items* → Google Sheets / Airtable / Slack.
- **Make / Zapier** — Apify app (Make: *Run an Actor*; Zapier: action *Run Actor*, trigger *Finished Actor Run*), then map `name`, `price`, `discountPercent`, `changes`, `url`.
- **Daily price alerts** — save your keywords as a **task** with monitoring on, add an Apify **Schedule**, and send the (short) result to Slack or email — only changes arrive.
- **API** — `POST https://api.apify.com/v2/acts/quanta1810~lazada-scraper/runs?token=YOUR_TOKEN`, then read the run's dataset.

### FAQ

**Is this a Lazada API alternative?** For search and category results, yes: you get the same product list the Lazada website shows, as clean JSON / CSV, without a Lazada Open Platform account. It does not place orders or read seller-centre data.

**Is it a Lazada price tracker / price monitor?** Yes — turn on *Price-change monitoring* and schedule it. Each run lists only new products and products whose price, original price or stock changed.

**Which countries?** All six Lazada storefronts: `vn` lazada.vn, `id` lazada.co.id, `my` lazada.com.my, `ph` lazada.com.ph, `th` lazada.co.th, `sg` lazada.sg.

**Why is `soldApprox` rounded?** Lazada itself shows "1.1K sold" in results; the exact number is not public. `soldText` keeps Lazada's wording.

**Does it get product descriptions, variants or reviews?** No — this Actor reads search / category results (fast and cheap). Open the `url` for the full product page.

**Found a bug or need another field?** Open an issue on the **Issues** tab.

### Known limits

- **Search results only** — no product descriptions, variants, specifications or reviews.
- Lazada shows at most **4,080 products per search** (102 pages × 40). Split broad keywords, or use price ranges, to cover more.
- **Lazada's anti-bot check.** Lazada often answers automated visits with an anti-bot page. By default the Actor goes through **Apify Proxy (UNBLOCKER group)**, which clears that check: in our 8-hour test (October 2026, 48 runs, all 6 storefronts) **174 of 178 searches (97.8%) returned products**. The proxy is included in the price - you are not billed extra for it. If a search still cannot get through after several retries, it gets one `blocked` row (errorCode `BOT_CHALLENGE`) and is **not charged**; run it again later. If Lazada blocks a search after some pages, you keep the products already delivered and get one `partial` row saying where it stopped. Turning the proxy off is possible but most searches will then hit the check.
- One request at a time per country, with a short pause, to stay polite.
- Min / max price are whole numbers in the storefront's currency.
- Prices are what Lazada shows to a visitor without an account (no member-only vouchers).
- Other row reasons (`errorCode`): `NO_RESULTS`, `ACCESS_REFUSED`, `HTTP_5XX`, `NOT_FOUND`, `NOT_JSON` (the URL is not a search / category page), `NO_SEARCH_DATA`, `TIMEOUT`, `NETWORK`, `BUDGET`, `INVALID_INPUT`, `INTERNAL_ERROR`.

### Support & changelog

- **0.1** (October 2026) — first release: 6 storefronts, keywords or start URLs, sorting and price range, sponsored filter, price-change monitoring.

# Actor input Schema

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

What you would type in the Lazada search box — one keyword per line. Each keyword is searched in every country you pick below.

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

Lazada storefronts to search. Each keyword × country is one search.

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

Optional: paste Lazada search or category page URLs (with your filters already applied on the website). The country is taken from the URL.

## `maxProductsPerSearch` (type: `integer`):

Stop each search after this many products (40 per page; Lazada shows at most 4,080 per search). Cost: $0.002 per product, so 100 products ≈ $0.20.

## `sort` (type: `string`):

Order of the search results, as on the Lazada website.

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

Optional, in the storefront's currency (VND, IDR, MYR, PHP, THB, SGD).

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

Optional, in the storefront's currency.

## `includeSponsored` (type: `boolean`):

Ads shown in the results (marked isSponsored). Turn off to keep only organic results.

## `monitorMode` (type: `boolean`):

Remember every product's price and stock, and on the next run return only NEW products and products whose price, original price or stock CHANGED. Unchanged products are not charged. Schedule the Actor (e.g. daily) to track competitors.

## `monitorName` (type: `string`):

Use a different name for each product list you track. Stored in a key-value store named lazada-scraper-monitor in your own account.

## `includeUnchanged` (type: `boolean`):

Also add a row for unchanged products (status "unchanged", not charged).

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

Keep the default (Apify Proxy, group UNBLOCKER): it clears Lazada's anti-bot check, measured at 97.8% of searches returning products over 178 searches in October 2026. Proxy cost is included in the per-product price - you are not billed extra for it. Turning the proxy off makes most searches hit the anti-bot check. If the UNBLOCKER group is not available on your Apify plan, the run continues without proxy.

## Actor input object example

```json
{
  "searchQueries": [
    "phone case"
  ],
  "countries": [
    "my"
  ],
  "maxProductsPerSearch": 40,
  "sort": "popularity",
  "includeSponsored": true,
  "monitorMode": false,
  "monitorName": "default",
  "includeUnchanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `results` (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": [
        "phone case"
    ],
    "countries": [
        "my"
    ],
    "maxProductsPerSearch": 40,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("quanta1810/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": ["phone case"],
    "countries": ["my"],
    "maxProductsPerSearch": 40,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("quanta1810/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": [
    "phone case"
  ],
  "countries": [
    "my"
  ],
  "maxProductsPerSearch": 40,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call quanta1810/lazada-scraper --silent --output-dataset

```

## MCP server setup

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