# Shopee Scraper (`dami_studio/shopee-product-scraper`) Actor

Shopee scraper API (虾皮) for products, prices and best sellers in 9 markets: search by keyword, or paste shop and product links. Each row has the name, price, price before discount, discount, rating, ships-from place, picture and link. Sort by top sales, latest or price. $0.235 per 1,000 products.

- **URL**: https://apify.com/dami_studio/shopee-product-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** E-commerce, Automation
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.24 / 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 scraper: search Shopee or paste shop and product links, and get one row per product**, with the name, price, price before discount, discount, rating, ships-from place, picture and link.

You give it search words, or Shopee search, shop and product links, on nine Shopee sites. You get the products as rows, in Shopee's own order for the sort you pick: relevance, top sales, latest, or price.

It reads public product listings only. A search or link Shopee does not serve to the run comes back as a free row saying so, and you pay only for products that come back.

| | |
|---|---|
| **Input** | Search words, or Shopee search, shop and product links |
| **Output** | One row per product: name, price, price before discount, discount, rating, ships-from place, labels, picture, links; descriptions on request |
| **Ceiling** | 200 searches or links per run, 1,000 products each |
| **Account needed** | None from you |
| **Price** | $0.235 per 1,000 products, the same rate on every plan. The free plan's $5 a month covers about 21,000 |

| Using an AI agent? | |
|---|---|
| Actor | `dami_studio/shopee-product-scraper` |
| Set one field | `searchQueries`, labelled "Search words" in the Console |
| Cap the bill | `maxTotalChargeUsd` on the run, for example `0.10`: it never charges past that |
| MCP, one link | `https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/shopee-product-scraper` |
| How often | Daily, to follow prices and discounts on a set of searches or shops |

### 🌏 中文说明

输入搜索词，或虾皮（Shopee）的搜索、店铺和商品链接，每个商品一行：名称、价格、折扣前价格、折扣、评分、发货地、图片和链接，也可以加上商品描述。支持新加坡、马来西亚、菲律宾、泰国、越南、印度尼西亚、台湾、巴西和墨西哥站点。

只需填写"Search words"（搜索词）或"Shopee links"。按商品条数收费，价格见上方表格。不需要账号。本工具不是虾皮的官方产品。

### 🔍 What Shopee Product Scraper does

It runs your searches on the Shopee site you pick and turns each product card into a row: what it is, what it costs now, what it cost before the discount, its rating and where it ships from, with Shopee's promotion labels such as a flash sale or a bundle deal. A search keeps going page after page, up to the number of products you ask for, and each product comes back once.

Shop links bring that shop's products. Product links bring that one product, with its description and its current price.

Two settings shape a run:

- **Sort by** asks Shopee for top sales, the latest products, or the lowest or highest price first.
- **Add product descriptions** opens each product's page for the seller's description. Slower, same price.

### 📋 What data you get from each Shopee product

| What you get | Field |
|---|---|
| The product | `itemId`, `shopId`, `title`, `url`, `productPageUrl`, `imageUrl` |
| Price | `price`, `priceOriginal`, `currency`, `discountPercent` |
| Rating and place | `rating`, `location` |
| Shopee's labels | `labels` (flash sales, bundle deals, vouchers and similar) |
| Description (optional) | `description` |
| Where it came from | `market`, `input`, `searchQuery`, `sortBy`, `position`, `resultPage`, `shopName`, `shopUrl`, `scrapedAt` |

### ▶️ How to scrape Shopee products

1. Open [Shopee Product Scraper](https://apify.com/dami_studio/shopee-product-scraper) and click **Try for free**.
2. Type what you are looking for into **Search words**, one search per line, and pick the **Shopee site**.
3. Or paste search, shop or product links into **Shopee links**.
4. Set **Most products per search or shop** and **Sort by**, then click **Start**.
5. Download the rows as JSON, CSV or Excel, or read them from the API.

Leave both lists empty and you get one free sample row showing the shape of the output, with nothing read.

### 💰 How much does it cost to scrape Shopee products?

**$0.235 per 1,000 products**, which is $0.000235 each, the same rate on every plan, with or without descriptions. On the free plan, the $5 Apify gives you each month covers about 21,000 products.

Free rows are never charged: a search or link that was not served, a search with no product, an entry that is not a Shopee link, the sample row, and the row that says the run stopped at your time or cost limit.

### 📥 What you give it

```json
{
  "searchQueries": ["wireless earbuds"],
  "market": "sg",
  "startUrls": ["https://shopee.sg/shop/1103391312"],
  "maxItems": 40,
  "sortBy": "sales",
  "includeDescription": false
}
```

| Field | Default | What it is |
|---|---|---|
| `searchQueries` | none, the form starts with one example | Up to 200 searches, run on the site in `market`. |
| `market` | `sg` | `sg`, `my`, `ph`, `th`, `vn`, `id`, `tw`, `br` or `mx`. |
| `startUrls` | none | Up to 200 search, shop or product links; each keeps its own site. Anything else is refused with a free row. |
| `maxItems` | `40` | 1 to 1,000 products per search or shop. |
| `sortBy` | `relevance` | `relevance`, `sales`, `latest`, `price_asc` or `price_desc`. A pasted search link keeps its own order unless you pick another here. |
| `includeDescription` | `false` | Adds each product's description. Slower, same price. |

### 📤 What you get back

A real row from a run on 7 November 2026 (a search on the Indonesian site):

```json
{
  "ok": true,
  "recordType": "product",
  "market": "id",
  "itemId": "26575108470",
  "shopId": "1435587833",
  "url": "https://shopee.co.id/product/1435587833/26575108470",
  "title": "ByteNerd Headset Bluetooth TWS Wireless Earphones Bluetooth 5.4 In Ear Noise Cancelling Mini Waterproof Sports Music Earbuds With Charging Box",
  "price": 50900,
  "priceOriginal": 120000,
  "currency": "IDR",
  "discountPercent": 58,
  "rating": 4.7,
  "location": "Jakarta Barat",
  "labels": ["Pilih 3, diskon 1%"],
  "imageUrl": "https://down-id.img.susercontent.com/file/id-11134207-822wl-mlh9daly4mbl5c",
  "position": 1,
  "searchQuery": "earbuds",
  "sortBy": "relevance",
  "resultPage": 1,
  "scrapedAt": "2026-11-07T23:03:21.297Z"
}
```

| Field | Read it like this |
|---|---|
| `price`, `priceOriginal` | In the site's own currency (`currency`), as numbers: 50900 is Rp50.900 |
| `priceOriginal` | Empty when the site shows no struck-out price for that product |
| `labels` | Shopee's own words on the card, in the site's language |
| `position`, `resultPage` | Where the product came in your results |
| `imageUrl` | Shopee's own picture link |

### 🧾 Reading the output

Every real row has `ok: true` and `recordType: "product"`. Rows with `ok: false` are free notes, one per search or link that gave no products, with `errorCode` and `error` saying why:

| `errorCode` | What happened |
|---|---|
| `NOT_SERVED` | The page was not served this run. Re-run it later |
| `NOT_FOUND` | Nothing public at this link: the product or shop is gone, or the link is wrong |
| `NO_RESULTS` | The search found no product, or the shop shows none |
| `BAD_INPUT` | The entry is not a Shopee search, shop or product link, or the site is not one of the nine |
| `TIME_LIMIT` | The run reached its time limit; `notRead` lists the entries it did not get to |
| `COST_LIMIT` | The run reached the maximum cost you set; `notRead` lists the rest |

An empty run returns one sample row with `_sample: true`. To keep only real products, filter on `ok` being true. The **Notes** view lists the free rows.

### 💡 What people use it for

- **Sellers** checking what the products they compete with cost today, and how deep the discounts go.
- **Brands** watching how their products are priced and labelled across Shopee's sites.
- **Buyers and resellers** finding the best sellers in a category before they stock it.
- **Researchers** comparing prices for the same kind of product across Southeast Asia, Taiwan, Brazil and Mexico.

A simple chain: run your category's searches here with **Sort by** set to `sales`, take the shop links of the best sellers, then read what buyers say about those shops with [Shopee Reviews Scraper](https://apify.com/dami_studio/shopee-shop-reviews-scraper).

### 🚧 What it does not do

- No buyer reviews. Those come from [Shopee Reviews Scraper](https://apify.com/dami_studio/shopee-shop-reviews-scraper).
- No seller e-mail addresses or phone numbers.
- No buying, carts or price alerts on Shopee itself.
- Nothing from inside a Shopee account: no orders, no chats, nothing only signed-in members see.
- It is not an official Shopee tool. Dami's Studio is independent and is not affiliated with or endorsed by Shopee, or by any other company named on this page.

### 🧭 Which marketplace scraper do you need?

| If you want | Use |
|---|---|
| Shopee products, prices and best sellers | This one |
| What buyers say about a Shopee shop | [Shopee Reviews Scraper](https://apify.com/dami_studio/shopee-shop-reviews-scraper) |
| AliExpress products and prices | [AliExpress Products Scraper](https://apify.com/dami_studio/aliexpress-products-scraper) |
| Taobao products and shops | [Taobao Scraper](https://apify.com/dami_studio/taobao-scraper) |
| Deals and best sellers in Latin America | [Mercado Libre Scraper](https://apify.com/dami_studio/mercadolibre-scraper) |

### ❓ Questions people ask

#### Do I need a Shopee account to scrape products?

No. You don't need a Shopee account, a cookie or a login. The actor reads the public product listings anyone can see.

#### Why do the prices differ from what I see in the Shopee app?

Prices move during the day, and the app can show you vouchers or new-user prices that depend on your own account. Open the product in a private browser window to compare with what a visitor sees. A price of 0.01 usually carries a new-user label: read `labels`.

#### Why does the same search give a slightly different order each time?

Shopee mixes its relevance order a little on every visit. The run reads page after page and keeps each product once, so you still get distinct products. Pick **Top sales** or a price order when the order matters to you.

#### Can I call it from code or an AI assistant?

Yes. The [API tab](https://apify.com/dami_studio/shopee-product-scraper/api) has ready-made calls, and AI assistants can use it through Apify's MCP server at `https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/shopee-product-scraper`. In Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("dami_studio/shopee-product-scraper").call(
    run_input={"searchQueries": ["wireless earbuds"], "market": "sg", "maxItems": 40, "sortBy": "sales"},
    max_total_charge_usd=0.05,
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row.get("ok") is False:
        continue
    print(row["price"], row["currency"], row["title"][:80])
```

#### Is scraping Shopee legal?

The actor reads public product listings, with no Shopee account and nothing private. Product rows rarely carry personal data, but where a shop or listing names a person, GDPR and similar laws apply to what you keep. Shopee's own terms still apply to what you do with the data. Apify has a good write-up on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/). We are not lawyers, and this is not legal advice.

### 🆘 If something breaks

Open an issue on the actor's **Issues** tab. Include the run ID and the search or link that went wrong, and we will look at it.

# Actor input Schema

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

What you would type into Shopee's search box, one search per line. Each search's products come back, one row per product.

## `market` (type: `string`):

The Shopee site the search words run on. Links below carry their own site.

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

Shopee search links (…/search?keyword=…), shop links (shopee.sg/shop/123456 or shopee.sg/shopname) or product links, on any of the 9 Shopee sites listed above.

## `maxItems` (type: `integer`):

Stop each search or shop at this many products. You pay only for products that come back.

## `sortBy` (type: `string`):

The order Shopee lists the products in. A search link you paste keeps its own order unless you pick one here.

## `includeDescription` (type: `boolean`):

Also opens each product's page for its description. Slower, same price.

## Actor input object example

```json
{
  "searchQueries": [
    "wireless earbuds"
  ],
  "market": "sg",
  "maxItems": 40,
  "sortBy": "relevance",
  "includeDescription": false
}
```

# Actor output Schema

## `results` (type: `string`):

Every row in the default dataset: each product's name, price, price before discount, discount, rating, ships-from place, picture and links, with its description when asked for. A search or link that could not be read returns a free row saying why.

# 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": [
        "wireless earbuds"
    ]
};

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

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

```

## MCP server setup

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