# Shopee Vietnam Scraper: 900+ Products per Search (`luzivanlt/shopee-products-scraper`) Actor

$3 per 1,000 products. Over 900 Shopee Vietnam products from one keyword or category link: price, discount, rating, Mall and Preferred badges, seller's province, link.

- **URL**: https://apify.com/luzivanlt/shopee-products-scraper.md
- **Developed by:** [Luzi](https://apify.com/luzivanlt) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.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

## Shopee Vietnam Scraper: 900+ Products per Search

Get over 900 Shopee Vietnam products from a single keyword or category link:
name, price, price before discount, discount, star rating, the shop's badges
(Mall, Yêu thích), the province the seller ships from, whether a voucher or a
video is offered, the image and the product link. One row per product. No
Shopee account, login or cookies needed.

Tested: 1,935 products from one keyword and one category (up to 1,000 each)
in under 2 minutes; a 50-product test run returns 47–48.

### What does this Actor do?

You give it keywords, or links to shopee.vn category pages or searches. For
each one it reads Shopee's listing and saves every product it finds, once,
until it reaches your limit or the listing gives no more. A category
link covers the category's subcategories too.

Each product comes with:

- its name, link and main image
- the price now, the price before discount and the discount, in VND
- its star rating and the province it ships from
- the shop's badges (Mall, Yêu thích, Yêu thích+), and the promotion labels
  the listing shows when it has any (bundle deals, gifts, new arrivals)
- the same badges and labels as yes/no columns, ready to filter on: Mall,
  Preferred, bundle deal, wholesale price, add-on deal, gift, new-buyer and
  ShopeeVIP prices and more, plus whether the product is on sale and whether
  it ships from abroad
- whether the listing shows a voucher, whether the product has a video, and
  which variant the listing showed
- the shop's id and a link to the shop
- the keyword or category it was found under, with the category's place in
  Shopee's menu

### Why use it?

- **Research a market.** See what sells under a keyword or in a category, at
  what prices and discounts.
- **Watch competitors' prices.** Run it daily on your keywords and compare.
- **Find sellers.** Every row carries the shop id and link, the shop's badges
  and the province it ships from. Keep only Mall shops, or only sellers
  abroad, with one filter.
- **Use the data anywhere.** Download as JSON, CSV or Excel, or send it to
  your own tools through Apify's API and integrations.

### How to use it

1. Type one or more **Keywords**, or paste **Category or search links**, or
   both.
2. Optionally, set **Max products per keyword or link**.
3. Click **Start**. When the run ends, open the **Output** tab to view the
   products or download them.

#### Links that work

| Link            | Looks like                                      |
| --------------- | ----------------------------------------------- |
| A category page | `https://shopee.vn/Thời-Trang-Nam-cat.11035567` |
| A subcategory   | `https://shopee.vn/Áo-cat.11035567.11035592`    |
| A search        | `https://shopee.vn/search?keyword=tai%20nghe`   |

Other Shopee pages (a product, a shop, the flash sale) and other Shopee
countries are not supported, and a link to them stops the run before anything
is read, naming the link.

### Input

| Field                                                         | What it does                                                    | Default          |
| ------------------------------------------------------------- | --------------------------------------------------------------- | ---------------- |
| **Keywords** (`keywords`)                                     | Words to search for, one search each                            | —                |
| **Category or search links** (`startUrls`)                    | shopee.vn category pages or searches                            | —                |
| **Max products per keyword or link** (`maxProductsPerSearch`) | Stop each keyword or link after this many products, 1 to 10,000 | `200`            |
| **Proxy** (`proxyConfiguration`)                              | Which proxy to use. Tested with Apify's datacenter proxy        | Apify datacenter |

Give at least one keyword or one link. Example input:

```json
{
  "keywords": ["tai nghe bluetooth"],
  "startUrls": [{ "url": "https://shopee.vn/Thời-Trang-Nam-cat.11035567" }],
  "maxProductsPerSearch": 200,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output

One row per product. An example, with made-up values:

```json
{
  "item_id": "52157713787",
  "shop_id": "1541796848",
  "shop_url": "https://shopee.vn/shop/1541796848",
  "name": "Wireless Bluetooth earbuds, touch control",
  "price": 135000,
  "original_price": 200000,
  "discount_percent": 33,
  "is_on_sale": true,
  "currency": "VND",
  "rating": 4.7,
  "location": "Thành phố Hà Nội",
  "is_overseas_seller": false,
  "has_voucher": true,
  "labels": ["Mua 3 & giảm 8%"],
  "has_bundle_deal": true,
  "has_wholesale": false,
  "has_add_on_deal": false,
  "has_gift_with_purchase": false,
  "has_new_user_price": false,
  "has_vip_price": false,
  "is_lowest_price": false,
  "is_new_arrival": false,
  "is_trending_shop": false,
  "badges": ["Mall"],
  "is_mall": true,
  "is_preferred": false,
  "is_preferred_plus": false,
  "is_shopee_handled": false,
  "badge_image_urls": ["https://down-vn.img.susercontent.com/file/…"],
  "has_video": true,
  "shown_variant_id": "395686498650",
  "v_item_id": null,
  "v_model_id": null,
  "v_shop_id": null,
  "image_url": "https://down-vn.img.susercontent.com/file/…",
  "overlay_image_url": "https://down-vn.img.susercontent.com/file/…",
  "url": "https://shopee.vn/Wireless-Bluetooth-earbuds-i.1541796848.52157713787",
  "keyword": null,
  "category_id": "11035592",
  "category_name": "Áo",
  "category_path": ["Thời Trang Nam", "Áo"],
  "category_path_ids": ["11035567", "11035592"],
  "category_image_url": "https://down-vn.img.susercontent.com/file/…"
}
```

| Field                    | What it holds                                                                                                              |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------- |
| `item_id`                | Shopee's id for the product                                                                                                |
| `shop_id`                | Shopee's id for the shop                                                                                                   |
| `shop_url`               | The shop's page on Shopee                                                                                                  |
| `name`                   | The product's name                                                                                                         |
| `price`                  | The price shown, in VND, as a number                                                                                       |
| `original_price`         | The price before discount. Empty when the product has no discount                                                          |
| `discount_percent`       | The discount, in percent. Empty when the product has no discount                                                           |
| `is_on_sale`             | `true` when the listing shows a price before discount                                                                      |
| `currency`               | Always `VND`                                                                                                               |
| `rating`                 | Average stars, 0 to 5. Empty for a product with no ratings yet                                                             |
| `location`               | The province the product ships from                                                                                        |
| `is_overseas_seller`     | `true` when the product ships from abroad (`location` is `Nước ngoài`). Empty when the listing names no place              |
| `has_voucher`            | `true` when the listing shows a voucher for the product                                                                    |
| `labels`                 | The promotion labels the listing shows (a bundle deal, a gift, …), on about half the products                              |
| `has_bundle_deal`        | `true` when a label offers a bundle deal (`Mua 2 & giảm 5%`: buy 2, save 5%); `labels` holds the quantity and discount     |
| `has_wholesale`          | `true` when a label offers a wholesale price (`Mua giá bán buôn/ bán sỉ`)                                                  |
| `has_add_on_deal`        | `true` when a label offers an add-on deal (`Mua Kèm Deal Sốc`)                                                             |
| `has_gift_with_purchase` | `true` when a label offers a gift with the purchase (`Mua để nhận quà`)                                                    |
| `has_new_user_price`     | `true` when a label offers a price for new buyers (`Giá dành riêng bạn mới`)                                               |
| `has_vip_price`          | `true` when a label offers a ShopeeVIP members' price (`Giá độc quyền dành cho Người dùng ShopeeVIP …`)                    |
| `is_lowest_price`        | `true` when the product carries the `Rẻ Vô Địch` (unbeatable price) label                                                  |
| `is_new_arrival`         | `true` when the product carries the `Hàng mới về` (new arrival) label                                                      |
| `is_trending_shop`       | `true` when the product carries the `#ShopThinhHanh` (trending shop) label                                                 |
| `badges`                 | The shop's badges: `Mall`, `Yêu thích`, `Yêu thích+` or `Shopee Xử lý`. An empty list when none                            |
| `is_mall`                | `true` when the shop has the `Mall` badge; `null` when it shows a badge we could not identify instead                      |
| `is_preferred`           | `true` when the shop has the `Yêu thích` (Preferred) badge; `null` when it shows a badge we could not identify instead     |
| `is_preferred_plus`      | `true` when the shop has the `Yêu thích+` (Preferred+) badge; `null` when it shows a badge we could not identify instead   |
| `is_shopee_handled`      | `true` when the product has the `Shopee Xử lý` badge; `null` when it shows a badge we could not identify instead           |
| `badge_image_urls`       | The badges' images, including any badge we could not identify (missing from `badges`)                                      |
| `has_video`              | `true` when the product has a video                                                                                        |
| `shown_variant_id`       | The variant (size, colour, …) the listing showed; the price and image are its own                                          |
| `image_url`              | The product's image                                                                                                        |
| `overlay_image_url`      | The campaign mark Shopee draws on the product's image. Empty when there is none                                            |
| `url`                    | The product's page                                                                                                         |
| `keyword`                | The keyword the product was found under. Empty for a category link                                                         |
| `category_id`            | The (sub)category the product was found under. Empty for a keyword                                                         |
| `category_name`          | That category's name                                                                                                       |
| `category_path`          | The category's place in Shopee's menu, top level first. Empty for a keyword                                                |
| `category_path_ids`      | The ids of those categories, in the same order                                                                             |
| `category_image_url`     | The subcategory's picture in Shopee's menu. Empty for a keyword and for products listed directly under the linked category |

A few products also carry `v_item_id`, `v_model_id` and `v_shop_id`: the ids
of another listing Shopee links the product to. Most rows leave them empty.

Not included: units sold, stock, the list of variants, the description, the
reviews and the shop's name.

### How much does it cost?

You pay for what you get:

- **$3 per 1,000 products** ($0.003 a product). Each product is charged once per run, even when two of your searches list it.
- No start fee, and nothing per search.

So 900 products from one keyword cost $2.70. If you set a maximum cost for a run, the Actor stops when it reaches it and keeps every product saved so far.

### How long does a run take?

About 50 products in under 20 seconds; 1,935 products from two searches in
under 2 minutes.

### Good to know

- **A listing is read as a large sample, not counted to the end.** Shopee
  publishes no total for a search, so no tool can prove it has every product.
  Tested up to 1,000 products per keyword or link; a narrow keyword gives
  fewer.
- **One product, one row.** A product found again later, or under another
  keyword or link, is not saved again, and the row keeps the keyword or
  category it was first found under.
- **The price is the shown variant's.** Shopee lists a product under one of
  its variants, which can change from visit to visit; `shown_variant_id`
  says which one the price, discount and image belong to.
- **A keyword with no products** is reported as not read in the run's status;
  the other keywords and links carry on. The run fails only when none could be
  read.
- **Running it daily?** Remove repeats by `item_id`.

### FAQ

**Do I need a Shopee account or cookies?**
No. The Actor reads what anyone can see on Shopee Vietnam.

**Does it work for Shopee in other countries?**
Not yet: only shopee.vn.

**Can I run it from my own code, on a schedule, or with other apps?**
Yes. Like any Apify Actor, you can start it through the Apify API, run it on a
schedule, and connect it to other apps with Apify's integrations and webhooks.

### Is it legal to scrape Shopee?

This Actor reads only public product listings and saves no personal data
about buyers. Check Shopee's terms and the laws that apply to you before you
use the data. If you are unsure, ask a lawyer.

### Support

Found a problem or missing a feature? Open an issue on the **Issues** tab and
include the run's link.

***

This Actor is not affiliated with, endorsed by or sponsored by Shopee or Sea
Limited.

# Actor input Schema

## `keywords` (type: `array`):

Words to search Shopee Vietnam for, one search per keyword (for example "tai nghe bluetooth").

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

Links to shopee.vn category pages (shopee.vn/…-cat.11035567) or to shopee.vn searches (shopee.vn/search?keyword=…). A category link covers its subcategories.

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

Stop each keyword or link after this many products.

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

Which proxy to use. Tested with Apify's datacenter proxy, the default.

## Actor input object example

```json
{
  "keywords": [
    "tai nghe bluetooth"
  ],
  "maxProductsPerSearch": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every product the run saved, one row per product.

# 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 = {
    "keywords": [
        "tai nghe bluetooth"
    ],
    "maxProductsPerSearch": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("luzivanlt/shopee-products-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 = {
    "keywords": ["tai nghe bluetooth"],
    "maxProductsPerSearch": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("luzivanlt/shopee-products-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 '{
  "keywords": [
    "tai nghe bluetooth"
  ],
  "maxProductsPerSearch": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call luzivanlt/shopee-products-scraper --silent --output-dataset

```

## MCP server setup

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