# Shopee Product & Review Scraper — SG MY TH ID PH VN (`technicaldost/shopee-product-scraper`) Actor

Scrape Shopee product search, live prices, sold counts, ratings and reviews across Singapore, Malaysia, Thailand, Indonesia, Philippines and Vietnam. Pay-per-event JSON API for competitor price monitoring.

- **URL**: https://apify.com/technicaldost/shopee-product-scraper.md
- **Developed by:** [Technical Dost Solutions](https://apify.com/technicaldost) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 0.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/platform/actors/running/actors-in-store#pay-per-usage

## 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

## Shopee Product & Review Scraper — SG MY TH ID PH VN

Scrape Shopee product search results, live item details and customer reviews across all major Southeast Asian marketplaces — Singapore, Malaysia, Thailand, Indonesia, the Philippines and Vietnam — with a single pay-per-event API call.

Built for SEA sellers doing competitor price monitoring and cross-border (跨境) sellers sourcing and benchmarking products.

### Features

- **Product search** — full-text keyword search on any of 6 Shopee regional sites, up to 1,000 products per keyword.
- **Rich item details** — price, price range, sold count, stock, star rating, rating count, brand, categories, images, shop name and shop location.
- **Reviews** — optionally pull up-to-date customer reviews (username, rating, comment, time) for the top products of each search.
- **Multi-region** — one run can cover several Shopee regions at once; prices are normalized to real currency units.
- **Pay-per-event pricing** — you only pay for what you actually scrape. No monthly subscription, no start fee.

### Supported regions

| Code | Marketplace |
|------|-------------|
| `sg` | shopee.sg (Singapore) |
| `my` | shopee.com.my (Malaysia) |
| `th` | shopee.co.th (Thailand) |
| `id` | shopee.co.id (Indonesia) |
| `ph` | shopee.ph (Philippines) |
| `vn` | shopee.vn (Vietnam) |

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `keywords` | array of strings | `["wireless earbuds"]` | Search keywords, one search per keyword per region. |
| `regions` | array of strings | `["sg"]` | Region codes to search: `sg`, `my`, `th`, `id`, `ph`, `vn`. |
| `maxProductsPerKeyword` | integer | `30` | Max products per keyword and region (1–1000). |
| `maxReviewsPerProduct` | integer | `0` | `0` = skip reviews. If > 0, fetches up to this many reviews for each of the top 5 products per keyword. |
| `proxyConfiguration` | object | — | Optional Apify proxy. See proxy advice below. |

#### Example input

```json
{
    "keywords": ["wireless earbuds", "phone case"],
    "regions": ["sg", "my"],
    "maxProductsPerKeyword": 30,
    "maxReviewsPerProduct": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["UNBLOCKER"]
    }
}
```

### Output

One dataset item per product:

| Field | Type | Description |
|-------|------|-------------|
| `keyword` | string | Search keyword that produced this product. |
| `region` | string | Region code (`sg`, `my`, …). |
| `productId` | number | Shopee item ID. |
| `shopId` | number | Shopee shop ID. |
| `url` | string | Canonical product URL. |
| `name` | string | Product title. |
| `brand` | string/null | Brand name. |
| `price` | number/null | Current price (real currency units). |
| `priceMin` / `priceMax` | number/null | Variant price range. |
| `currency` | string | ISO currency code (`SGD`, `MYR`, …). |
| `sold` | number/null | Total historical sold count. |
| `stock` | number/null | Available stock. |
| `rating` | number/null | Average star rating (0–5). |
| `ratingCount` | number/null | Total number of ratings. |
| `shopName` | string/null | Seller shop name. |
| `shopLocation` | string/null | Shop location as listed by Shopee. |
| `images` | array of strings | Full-size product image URLs. |
| `categories` | array of strings | Category breadcrumb names. |
| `reviews` | array | `[{username, rating, comment, time}]` — empty unless `maxReviewsPerProduct` > 0. |
| `scrapedAt` | string | ISO 8601 timestamp. |

### Pricing

Pay-per-event, no start fee:

- **$1.50 per 1,000 products** scraped
- **$2.00 per 1,000 reviews** scraped

A run scraping 1,000 products with 20 reviews on 5 products each (100 reviews) costs **$1.70**.

### How it works

Shopee protects its API with aggressive anti-bot (TLS/JA3 fingerprinting + signed request headers), so plain HTTP clients are rejected outright. This actor drives **real Chromium** (Playwright), warms a session on the marketplace homepage, then navigates search and product pages while capturing the JSON responses fired by Shopee's own frontend — correctly signed by Shopee's own JavaScript. On an anti-bot wall the actor automatically relaunches the browser with a fresh proxy session (up to 3 relaunches per step).

### Proxy advice

**A proxy is effectively required.** Shopee blocks datacenter IPs and flags heavily-used shared proxy pools.

- **Best:** `apifyProxyGroups: ["UNBLOCKER"]` — Apify's anti-bot-solving proxy; in our platform tests it was the only option that loaded search pages without a verification wall.
- **Also try:** `RESIDENTIAL` with `apifyProxyCountry` set to the marketplace country (e.g. `SG`).
- Shared residential pools are sometimes pre-flagged by Shopee; if a run returns 0 products or a `90309999` error, switch groups or use dedicated/ISP proxies via `proxyConfiguration.proxyUrls`.

Honest status: the full pipeline (search → details → reviews → schema) is end-to-end tested; live extraction depends on proxy quality, and Shopee's anti-bot is one of the toughest in e-commerce. Runs that get blocked fail loudly with a clear error instead of silently returning partial data.

### Notes

- Prices returned by Shopee's API are scaled internally; this actor normalizes them to real units (e.g. `15.90` SGD).
- Review comments are returned in the buyer's original language.
- The actor runs a real browser — use at least 2 GB memory per run.

# Actor input Schema

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

Search keywords to look up on Shopee, one search per keyword per region.

## `regions` (type: `array`):

Shopee regions to search. Valid codes: sg (shopee.sg), my (shopee.com.my), th (shopee.co.th), id (shopee.co.id), ph (shopee.ph), vn (shopee.vn).

## `maxProductsPerKeyword` (type: `integer`):

Maximum number of products to scrape per keyword and region (search pages of up to 60 items).

## `maxReviewsPerProduct` (type: `integer`):

0 = skip reviews. If > 0, fetches up to this many reviews for each of the top 5 products per keyword.

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

Optional Apify proxy. Strongly recommended: Shopee blocks most datacenter IPs, so use RESIDENTIAL proxy groups for reliable results.

## Actor input object example

```json
{
  "keywords": [
    "wireless earbuds"
  ],
  "regions": [
    "sg"
  ],
  "maxProductsPerKeyword": 30,
  "maxReviewsPerProduct": 0
}
```

# Actor output Schema

## `productsDatasetUrl` (type: `string`):

Dataset containing one item per scraped 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": [
        "wireless earbuds"
    ],
    "regions": [
        "sg"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("technicaldost/shopee-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 = {
    "keywords": ["wireless earbuds"],
    "regions": ["sg"],
}

# Run the Actor and wait for it to finish
run = client.actor("technicaldost/shopee-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 '{
  "keywords": [
    "wireless earbuds"
  ],
  "regions": [
    "sg"
  ]
}' |
apify call technicaldost/shopee-product-scraper --silent --output-dataset

```

## MCP server setup

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