# Lazada Reviews Scraper — Ratings, Media & Seller Intel (`actorforgehq/lazada-reviews-scraper`) Actor

Scrape Lazada product reviews as clean JSON: review text, per-aspect ratings, verified-purchase flags, buyer photos and videos, plus the product's full star histogram. All six Lazada marketplaces: .vn, .co.id, .com.my, .sg, .co.th, .com.ph. API-level, with honest documented limits.

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

## Pricing

from $6.00 / 1,000 review scrapeds

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/platform/actors/running/actors-in-store#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 Reviews Scraper — Ratings, Media & Seller Intel

Scrape **Lazada** product reviews as clean JSON: review text, per-aspect scores, verified-purchase
flags, buyer photos and videos — plus the complete rating breakdown of the product itself. Works on
all six Lazada marketplaces (`.vn`, `.co.id`, `.com.my`, `.sg`, `.co.th`, `.com.ph`). API-level, no
brittle browser automation.

### What you get

Give it Lazada product URLs. The dataset contains **two kinds of item**, tagged by a `type` field.
Products and reviews are separate rows, joined by `itemId`.

**Product** — emitted once per product, and it is not just an echo of the page:

```json
{
  "type": "product",
  "itemId": 246452966,
  "title": "Newborn nappy pads, 108 pcs",
  "priceRaw": "139.000 ₫",
  "sellerId": 100101649,
  "subSellerId": 1000001034,
  "categoryId": 10614,
  "categoryName": "Tã giấy",
  "average": 4.9,
  "rateCount": 1243,
  "reviewCount": 1243,
  "stars5": 1221,
  "stars4": 6,
  "stars3": 2,
  "stars2": 3,
  "stars1": 11,
  "negativeCount": 14,
  "hiddenCount": 864,
  "withImageCount": 151,
  "withVideoCount": 4,
  "withMediaCount": 154,
  "url": "https://www.lazada.vn/products/...-i246452966-s316699339.html"
}
```

The full star histogram (`stars5`…`stars1`), the count of unhappy buyers (`negativeCount` = 1★+2★)
and the media counts arrive in the same response as the reviews, so you get product-level sentiment
without paying for a second pass. `priceRaw` is deliberately a **string** in the marketplace's own
format (`"139.000 ₫"`) — we do not guess a decimal separator and hand you a wrong number.

**Review:**

```json
{
  "type": "review",
  "itemId": 246452966,
  "reviewId": "464679055652966",
  "rating": 5,
  "ratingProduct": 5,
  "ratingSeller": 5,
  "ratingLogistics": 5,
  "text": "Giao hàng nhanh, đóng gói cẩn thận",
  "author": "8***9",
  "isAnonymous": false,
  "verifiedPurchase": true,
  "skuInfo": "Kích thước tã:Trẻ sơ sinh (Tới 5kg), Kích thước gói tã:108",
  "skuId": "316699339",
  "reviewTimeRaw": "08 thg 6 2026",
  "reviewDate": "2026-06-08",
  "boughtDateRaw": "20 thg 6 2026",
  "images": ["https://lzd-u.slatic.net/....jpg"],
  "videoUrl": "https://lazvideo.lazcdn.com/....mp4",
  "likeCount": 0,
  "upVotes": 0,
  "downVotes": 0,
  "sellerId": 100101649,
  "url": "https://www.lazada.vn/products/...-i246452966.html"
}
```

Lazada splits a review into three separate scores — product, seller and delivery — and this scraper
keeps all three (`ratingProduct`, `ratingSeller`, `ratingLogistics`) alongside the overall `rating`.
`verifiedPurchase` is the flag Lazada's own front end uses to draw its "Verified Purchase" badge.
`sellerReply` and `followUpText` appear when the store answered the review or the buyer added a
follow-up. Photos come back as a flat list of URLs; `videoUrl` is a signed link and expires, so
download it promptly if you need the file.

### Use cases

- **Review mining & sentiment analysis** for brands selling in Southeast Asia. Lazada keeps three
  separate scores per review — product, seller, delivery — so you can tell a product complaint
  from a courier complaint instead of averaging them into mush.
- **Seller reputation monitoring.** The star histogram, the 1–2 star count and the seller's public
  replies (`sellerReply`) per product show how a store handles unhappy buyers over time.
- **Collecting buyer photos and videos** — real-world product shots for catalog QA or content
  research. Photo URLs come as a flat list; video links are signed and expire, so download promptly.
- **Competitor research before entering Lazada:** rating breakdowns, review volume and category
  data across competing listings on any of the six marketplaces.

### Input

| Field | Type | Description |
|---|---|---|
| `productUrls` | string\[] | Lazada product page URLs. The product id and the marketplace domain are read from the link itself. |
| `maxReviews` | integer | How many reviews to keep per product (default 50). |
| `sort` | integer | `0` relevance, `1` most recent (**default**), `2` rating high→low, `3` rating low→high. |
| `filter` | integer | `0` all reviews, or `1`–`5` for exactly that many stars. |
| `proxyConfiguration` | object | Proxy to route requests through. Defaults to residential Vietnam — see "Limits" below before changing it. |

**Why the default sort is "most recent", not Lazada's own default.** On a measured product,
relevance ordering put fifty 5-star reviews on page one and pushed every 1–2 star review to the
last page. An actor that grabs "the first N reviews" under that ordering quietly hands you a
positively biased sample. This one defaults to chronological order; set `sort: 0` if you
specifically want Lazada's relevance ranking.

### How to use it

1. Click **Try for free** / **Start** on this page.
2. Paste one or more Lazada product page URLs into **Product URLs**. Any of the six marketplaces
   works — the product id and the marketplace domain are read straight from the link, and you can
   mix domains in one run.
3. Optionally set **Max reviews per product**, the **Sort order** and the **Star filter** (for
   example, `1` to pull only 1-star reviews for complaint mining).
4. If your URLs are not from `lazada.vn`, change the country in **Proxy configuration** to match
   the marketplace (ID, MY, SG, TH, PH) — see "Limits" below for why this matters.
5. Run it. Watch the **Output** tab: the *Products* view shows one row per product with the full
   rating breakdown, the *Reviews* view shows the review rows. Export as JSON, CSV, Excel or pull
   the data over the API.

To run it on a schedule, use Apify **Schedules**; to call it from your own code, use the
[Apify API](https://docs.apify.com/api/v2) or one of the official clients. Every field in the
output is described in this Actor's dataset schema, so AI agents calling it through the Apify
MCP server get typed field metadata rather than raw JSON.

### Limits (honest)

- **You cannot get every review of a product, and no scraper can.** Lazada's public review endpoint
  serves only about `rateCount − hiddenCount` reviews; the rest are withheld by Lazada itself and
  are unreachable at any page number. On the product we measured, that was **379 of 1243 reviews,
  i.e. roughly 30%**. Both numbers ship in the product row (`rateCount` and `hiddenCount`), so you
  can always see how much of the corpus you received rather than guessing.
- **Lazada's own page counter overstates the supply.** Its pagination metadata advertised 25 pages
  where only 8 held data. The scraper stops when the data actually runs out, not when Lazada claims
  it has.
- **Machine-readable review dates do not exist in this response.** Lazada returns localized strings
  that mix absolute dates (`"08 thg 6 2026"`) with relative ones (`"2 tuần trước"` — "2 weeks ago").
  The raw string is always preserved in `reviewTimeRaw` / `boughtDateRaw`. `reviewDate` is filled in
  **only** when the raw value parses unambiguously; when it does not, the field is simply absent. We
  do not substitute today's date for a value we could not read.
- **The seller's name is not in this endpoint.** Lazada returns `null` for it. You get numeric
  `sellerId` / `subSellerId` and the category, which is what is actually there.
- **Rate limits are strict, and the proxy country matters more than the pace.** Lazada answers with
  a challenge page when it does not like the caller, and it dislikes datacenter IPs in particular:
  from one, the endpoint served roughly a single clean response every five minutes. From residential
  IPs in the marketplace's own country it sustained about ninety times that. The default proxy
  setting is therefore residential Vietnam — **change the country if you scrape another
  marketplace**. The scraper fetches one page at a time, and treats a challenge as a failed task to
  be retried on a fresh IP, never as "the reviews ended".
- Public data only: no login, no captcha solving, no circumvention of access controls.

### Pricing

Pay-per-event: a charge per run start, a charge per scraped product, and a **separate, cheaper
charge per scraped review**, so a run over many products with few reviews is not billed as if it
were review-heavy. See the Store page for current rates.

### FAQ

**Do I need a Lazada account or an API key?**
No. The Actor reads only publicly available data, never logs in and does not solve captchas or
circumvent access controls.

**Which Lazada marketplaces are supported?**
All six: `lazada.vn`, `lazada.co.id`, `lazada.com.my`, `lazada.sg`, `lazada.co.th` and
`lazada.com.ph`. The marketplace is detected from each URL's domain, so one run can mix them.

**Why did I get fewer reviews than the product page shows?**
Because Lazada itself withholds part of the corpus. Its public review endpoint serves only about
`rateCount − hiddenCount` reviews — on the product we measured, 379 of 1243. Both numbers ship in
the product row, so you can always see exactly how much of the corpus you received. No scraper
can get past this; one that claims otherwise is counting duplicates.

**Why is the default proxy residential Vietnam?**
Because that is what the endpoint tolerates. Measured on the same code: a datacenter IP got
roughly one clean response every five minutes, while Vietnamese residential IPs sustained about
ninety times that. Vietnam is the default because `lazada.vn` is this Actor's primary market —
if you scrape another marketplace, switch the proxy country to match it.

**Why do some reviews have no `reviewDate`?**
Lazada returns localized date strings that mix absolute dates with relative ones ("2 weeks ago").
`reviewDate` is filled in only when the raw value parses unambiguously; the raw string is always
preserved in `reviewTimeRaw`. We do not substitute today's date for a value we could not read.

**Why does the review video link stop working?**
`videoUrl` is a signed link from Lazada's CDN and expires. Download the file promptly if you
need it; the review row itself stays in your dataset.

### Other Actors by ActorForge

- [Wildberries Scraper](https://apify.com/actorforgehq/wildberries-scraper) — products, prices
  and reviews from Wildberries as clean, schema-validated JSON.
- [Avito Real Estate Scraper](https://apify.com/actorforgehq/avito-real-estate-scraper) — full
  property inventory from Avito with freshness stamps, for new-listing alerts and comps.

Need another Lazada region, seller-level data, or a different marketplace? Open an issue from
the Actor's page and tell us what you need.

### Disclaimer

This is an **unofficial** scraper. It is not affiliated with, endorsed by, or connected to Lazada,
Lazada Group or Alibaba Group in any way. It collects only data that Lazada publishes publicly,
without logging in and without circumventing access controls. Review text and buyer media belong to
their authors; you are responsible for ensuring your use of the collected data complies with
applicable law and with Lazada's terms.

### Changelog

See the repository `CHANGELOG.md`.

# Actor input Schema

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

Lazada product page URLs, e.g. https://www.lazada.vn/products/some-product-i246452966.html — the product id and the marketplace domain are read straight from the link, so no extra request is spent on resolving them. All six Lazada marketplaces are supported: .vn, .co.id, .com.my, .sg, .co.th, .com.ph.

## `maxReviews` (type: `integer`):

How many reviews to keep per product. Note that Lazada itself publishes only a part of a product's reviews through this endpoint — roughly (total ratings minus hidden ratings). Once that supply is exhausted the run stops early, however high this number is.

## `sort` (type: `integer`):

0 = relevance (Lazada's own default), 1 = most recent, 2 = rating high to low, 3 = rating low to high. Defaults to 1. Relevance is deliberately NOT the default here: on a measured product it put fifty 5-star reviews on page 1 and pushed every 1-2 star review to the very last page, which would hand you a positively biased sample without saying so.

## `filter` (type: `integer`):

0 = all reviews, or 1..5 to keep only reviews with exactly that many stars.

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

Keep this on residential proxies in the marketplace's own country. Measured: a datacenter IP got roughly one clean response every five minutes from this endpoint, while Vietnamese residential IPs sustained about ninety times that. The default targets Vietnam (lazada.vn) — if you scrape another marketplace, change the country to match it (ID, MY, SG, TH, PH).

## Actor input object example

```json
{
  "productUrls": [
    "https://www.lazada.vn/products/x-i246452966.html",
    "https://www.lazada.co.th/products/y-i1234567890.html"
  ],
  "maxReviews": 100,
  "sort": 1,
  "filter": 1,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "VN"
  }
}
```

# Actor output Schema

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

One row per scraped product: price as shown, category, seller ids and the full rating breakdown, including how many reviews Lazada withholds from public view.

## `reviews` (type: `string`):

Individual reviews: text, overall and per-aspect scores, verified-purchase flag, buyer photos and videos. Join back to products by itemId.

# 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 = {
    "productUrls": [
        "https://www.lazada.vn/products/x-i246452966.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("actorforgehq/lazada-reviews-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 = { "productUrls": ["https://www.lazada.vn/products/x-i246452966.html"] }

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

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

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

```

## CLI example

```bash
echo '{
  "productUrls": [
    "https://www.lazada.vn/products/x-i246452966.html"
  ]
}' |
apify call actorforgehq/lazada-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=actorforgehq/lazada-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/9izqiXY9FeKOCvD4w/builds/aOMzuqBybV3sZeQkc/openapi.json
