# Lazada Product Scraper (`shahidirfan/lazada-product-scraper`) Actor

Scrape Lazada product listings, prices, discounts, ratings, reviews, seller details, images, stock availability, and product URLs. Extract eCommerce data for price tracking, competitor analysis, market research, product trends, and retail intelligence across Southeast Asia.

- **URL**: https://apify.com/shahidirfan/lazada-product-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **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?

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

### What does Lazada Product Scraper do?

Lazada Product Scraper collects product listings from six Lazada storefronts: Malaysia, Singapore, Thailand, Indonesia, the Philippines, and Vietnam. Enter a keyword and pick a market, or paste any Lazada search, tag, shop, or product URL. The Actor returns one dataset record per product with its current price, discount, rating, review count, seller, stock status, and product link.

The output is ready for price monitoring, assortment research, competitor tracking, seller analysis, and product feeds.

### Why use Lazada Product Scraper?

- Search terms and storefront URLs produce the same dataset shape, so downstream sheets and databases do not need per-URL handling.
- Each record carries the local currency code, so MYR, SGD, THB, IDR, PHP, and VND results never mix.
- Discounts, ratings, reviews, and sold counts arrive with the product link, which is what price history work needs.
- Scheduled runs refresh a keyword, category, or shop and let you compare results over time.
- Results export to JSON, CSV, Excel, or XML, or come through the Apify API.

### What data can you extract from Lazada?

| Field | Description |
|-------|-------------|
| `item_id` | Lazada product identifier |
| `title` | Product name |
| `url` | Clean product page URL |
| `image_url` | Main product image |
| `price` | Current price as a number |
| `price_text` | Price exactly as shown on the storefront |
| `currency` | ISO currency code for the market |
| `original_price` | Price before discount, when shown |
| `discount_percent` | Discount percentage, when shown |
| `rating` | Average rating |
| `review_count` | Number of reviews |
| `sold_count` | Units sold, when the storefront publishes it |
| `in_stock` | Availability flag |
| `location` | Seller or warehouse location |
| `seller_name` | Shop name |
| `seller_id` | Lazada seller identifier |
| `brand_name` | Brand name |
| `sku` | Market-specific SKU |
| `sku_id` | Lazada SKU identifier |
| `category_ids` | Lazada category identifiers |
| `is_sponsored` | Whether the listing is a promoted result |
| `market` | Market code such as `MY` or `SG` |
| `source` | Source storefront name |
| `scraped_at` | ISO timestamp for the run |

Fields the storefront does not publish for a product are left out of that record instead of being written as null.

### How to use Lazada Product Scraper

1. Open the Actor on Apify Store.
2. Enter a keyword and choose a market, or paste a Lazada URL.
3. Set the result limit and, if needed, a maximum page count.
4. Choose a sort order.
5. Run the Actor and open the dataset.

A keyword always wins over the URL field. When the keyword is empty, the URL is used, and the market comes from the URL host. When a keyword is used, the market comes from the market selector.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `start_url` | String | No | Malaysia shirt tag page | Any Lazada search, tag, shop, or product URL |
| `keyword` | String | No | - | Search term; takes priority over `start_url` |
| `country` | String | No | `MY` | Market for keyword searches: `MY`, `SG`, `TH`, `ID`, `PH`, `VN` |
| `sort_by` | String | No | `relevance` | `relevance`, `priceasc`, or `pricedesc` |
| `results_wanted` | Integer | No | `20` | Maximum number of products to save |
| `max_pages` | Integer | No | `10` | Page cap; each page holds up to 40 products |
| `proxyConfiguration` | Object | No | Apify Residential | Proxy used for storefront requests |

A residential proxy in the target market is required. Lazada does not serve catalogue data to datacenter addresses, so the default configuration uses Apify Residential proxy and matches the proxy country to the selected market.

### Usage Examples

#### Keyword search in Malaysia

Collect the first 50 results for a product category:

```json
{
  "keyword": "air fryer",
  "country": "MY",
  "results_wanted": 50,
  "max_pages": 3
}
```

#### Lowest prices in Singapore

Sort by price and collect a short comparison set:

```json
{
  "keyword": "mechanical keyboard",
  "country": "SG",
  "sort_by": "priceasc",
  "results_wanted": 20
}
```

#### Existing storefront URL

Reuse a search or tag URL that already contains filters:

```json
{
  "start_url": "https://www.lazada.com.my/tag/shirt/?q=shirt&catalog_redirect_tag=true",
  "results_wanted": 100,
  "max_pages": 5
}
```

#### Shop catalogue

Collect a seller catalogue through its shop URL:

```json
{
  "start_url": "https://www.lazada.com.my/shop/guardian/",
  "results_wanted": 40,
  "max_pages": 2
}
```

#### Single product

Paste a product URL to get that product with its current price:

```json
{
  "start_url": "https://www.lazada.com.my/products/2026-summer-mens-short-sleeves-i14897252902.html"
}
```

### Sample Output

```json
{
  "item_id": "14897252902",
  "title": "2026 Summer Men's Short Sleeves",
  "url": "https://www.lazada.com.my/products/pdp-i14897252902.html",
  "image_url": "https://sg-test-11.slatic.net/p/83ff312acd49f0ba41f6f7074b5452a0.jpg",
  "price": 12,
  "price_text": "RM12.00",
  "currency": "MYR",
  "original_price": 49,
  "discount_percent": 76,
  "rating": 4.55,
  "review_count": 20,
  "sold_count": 77,
  "in_stock": true,
  "location": "China",
  "seller_name": "TSUKI store",
  "seller_id": "300143949218",
  "sku": "14897252902_MY",
  "sku_id": "128204635249",
  "category_ids": [62541004, 62540605, 4213],
  "is_sponsored": false,
  "market": "MY",
  "source": "Lazada",
  "scraped_at": "2026-10-27T08:11:20.260Z"
}
```

### Tips for Best Results

- Start with a small `results_wanted` value to confirm the keyword returns the right products.
- Use a specific keyword. Broad terms return sponsored placements and unrelated accessories.
- Keep `max_pages` close to what the result limit needs. Each page supplies up to 40 products.
- A keyword overrides `start_url`. Clear the keyword field when you want a URL with its own filters to run.
- Product URLs return one record. Use a keyword or a tag URL when you need a full result set.
- Prices are numbers in the local currency. Use `currency` and `price_text` when you need the exact storefront display.
- Storefront layouts and category structures change over time. Report regressions through the Issues tab.

### Integrations

- Google Sheets: send product rows to a live sheet for price tracking.
- Webhooks: start downstream processing when a run finishes.
- Make or Zapier: move results into inventory, repricing, or reporting tools.
- Apify API: read datasets from your own services and dashboards.
- CSV and Excel: download the dataset for spreadsheet analysis.

### Frequently Asked Questions

#### Can I scrape Lazada by keyword and by URL?

Yes. Enter a keyword and pick a market, or paste a Lazada search, tag, shop, or product URL. A keyword always takes priority over the URL field.

#### Which Lazada markets are supported?

Malaysia, Singapore, Thailand, Indonesia, the Philippines, and Vietnam. The market is read from the URL host, or from the market selector when you use a keyword.

#### Why does the Actor need a residential proxy?

Lazada restricts catalogue access to residential addresses in the target market. The default configuration uses Apify Residential proxy and matches the proxy country to the selected market.

#### Can I export Lazada product data to CSV or Excel?

Yes. Apify datasets can be downloaded as CSV, Excel, JSON, XML, and other supported formats.

#### Can I run this Actor on a schedule?

Yes. Schedule it in Apify Console to refresh prices and availability hourly, daily, or weekly.

#### Why are some fields missing from a record?

Some storefront listings do not publish a discount, brand, sold count, or similar value. Empty fields are omitted from that record instead of being written as null.

#### How many products can one run collect?

Up to 10,000 products, limited by `results_wanted` and by how many pages the storefront serves for that search.

#### Is it legal to scrape Lazada?

Scraping public web data can be legal, but you are responsible for complying with applicable laws, website terms, and privacy rules in the markets you collect from.

### Support

For issues, feature requests, or custom Actor work, use the Issues tab on the Actor page or contact the developer through Apify.

### Legal Notice

This Actor is designed for legitimate collection of publicly available product data. Users are responsible for how they use the data and for complying with applicable laws and Lazada's terms of service.

# Actor input Schema

## `start_url` (type: `string`):

Any Lazada search, tag, shop, or product URL. Ignored when a keyword is entered.

## `keyword` (type: `string`):

Search term, for example 'shirt', 'air fryer', or 'wireless earbuds'. Takes priority over the URL.

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

Lazada storefront used for keyword searches. A URL always keeps its own market.

## `sort_by` (type: `string`):

Result order requested from the storefront.

## `results_wanted` (type: `integer`):

Maximum number of products to save.

## `max_pages` (type: `integer`):

Safety cap on listing pages. Each page holds up to 40 products.

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

Lazada only serves catalogue data to requests from a residential address in the target market. Apify Residential proxy is used by default.

## Actor input object example

```json
{
  "start_url": "https://www.lazada.com.my/tag/shirt/?q=shirt&catalog_redirect_tag=true",
  "country": "MY",
  "sort_by": "relevance",
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "start_url": "https://www.lazada.com.my/tag/shirt/?q=shirt&catalog_redirect_tag=true"
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/lazada-product-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 = { "start_url": "https://www.lazada.com.my/tag/shirt/?q=shirt&catalog_redirect_tag=true" }

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/lazada-product-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 '{
  "start_url": "https://www.lazada.com.my/tag/shirt/?q=shirt&catalog_redirect_tag=true"
}' |
apify call shahidirfan/lazada-product-scraper --silent --output-dataset

```

## MCP server setup

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