# Shopee Search Results Scraper (`axiomworks/shopee-product-scraper`) Actor

Collect products from Shopee search results by keyword or search URL. Each row includes the title, current and original prices, discount, rating, seller location, image, product URL, and shop and item IDs. Supports eight markets and reads public pages without login.

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

## Pricing

from $5.05 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

**Returns:** one row per Shopee product with `title`, `price`, `originalPrice`, `discountPercent`, `rating`, `location`, `url` and `image`.
**Input:** `{"searchTerms": ["wireless earbuds"], "country": "SG", "maxItems": 50}`
**Best for:** price monitoring across Southeast Asian and Brazilian marketplaces, product research before sourcing, competitor and discount tracking.

```json
{
    "title": "DES SNEAKERS PROMO Sepatu / sneaker PRIA DAN WANITA NEW MODE API DS20",
    "price": 30328,
    "originalPrice": 210000,
    "currency": "IDR",
    "discountPercent": 86,
    "rating": 4.1,
    "location": "Kab. Bogor",
    "url": "https://shopee.co.id/DES-SNEAKERS-PROMO-Sepatu-sneaker-PRIA-DAN-WANITA-NEW-MODE-API-DS20-i.651940814.13268587518"
}
```

### What does Shopee Product Scraper do?

Shopee Product Scraper is a Shopee scraper for search results. Give it keywords (in any language) and a country, or paste Shopee search URLs, and it returns one row per product card: the product title, current price, strike-through price, discount, star rating, the seller's ship-from location, the product image, the product URL and the shop and item IDs. It works on eight Shopee markets: Singapore (shopee.sg), Malaysia (shopee.com.my), the Philippines (shopee.ph), Indonesia (shopee.co.id), Thailand (shopee.co.th), Vietnam (shopee.vn), Taiwan (shopee.tw) and Brazil (shopee.com.br).

It reads the public search result pages, with no login, no cookies and no Shopee account. Each search page holds 40 products and the Actor walks through the pages (up to 16 per search) until it has as many results as you asked for. Prices come back both as shown on the page (`priceText`, in the local number format) and as plain numbers (`price`), with the ISO currency code of the market, so a spreadsheet or database can use them directly.

Use it as a lightweight Shopee API alternative when you need search results: what is listed for a keyword, at what price, how deep the discounts are, how products are rated and where sellers ship from. It is built for fast, repeatable runs that you can schedule or call from AI agents.

### What data can you get from Shopee?

| Field | Description | Example |
|---|---|---|
| `id` | Shopee item ID (same as `itemId`), unique within a run | `52518535489` |
| `itemId` | Item ID from the product link | `52518535489` |
| `shopId` | Seller shop ID from the product link | `177674139` |
| `title` | Product name shown on the result card | `Jabra Elite 85t ... Wireless Earbuds` |
| `url` | Product page URL on the market's site | `https://shopee.sg/...-i.177674139.52518535489` |
| `image` | Main product image URL | `https://down-sg.img.susercontent.com/file/...` |
| `price` | Current (promotion) price as a number | `33.49` |
| `priceText` | Current price as shown, local number format | `33.49`, `30.328`, `79,90` |
| `originalPrice` | Strike-through price before discount, as a number | `210000` |
| `originalPriceText` | Strike-through price as shown | `210.000` |
| `currency` | ISO currency code of the market | `SGD`, `IDR`, `BRL` |
| `discountPercent` | Discount from the card's badge | `52` |
| `discountText` | Discount badge as shown | `-52%`, `5折` |
| `rating` | Star rating shown on the card (0-5) | `4.5` |
| `location` | Seller's ship-from location | `Mainland China`, `Minas Gerais` |
| `market` | Shopee site the product came from | `shopee.sg` |
| `searchKeyword` | Keyword that returned the product | `wireless earbuds` |
| `position` | 1-based rank in the results for that keyword | `1` |
| `scrapedAt` | Time the search page was fetched (ISO 8601) | `2026-10-14T19:39:23.973Z` |
| `sourceUrl` | Search page the product card was read from | `https://shopee.sg/search?keyword=wireless%20earbuds&page=0` |

A few notes on coverage, measured on real runs:

- `originalPrice` and `originalPriceText` are filled when the card shows a strike-through price. Cards in Indonesia, Vietnam, Thailand, Malaysia and Brazil usually do; cards in Singapore, the Philippines and Taiwan usually show only the current price and a discount badge, so `originalPrice` is mostly `null` there.
- `discountText` keeps the badge as Shopee shows it. Taiwan shows discounts as `折` (for example `5折` means you pay 50%), so `discountPercent` is `null` on those cards and `discountText` holds the original badge.
- `location` is `null` on cards that don't show a ship-from location (some Singapore listings).

### How to use Shopee Product Scraper

1. Open Shopee Product Scraper in Apify Console and go to the Input tab.
2. Type one or more keywords in **Search keywords**, for example `wireless earbuds`, and pick the **Country** market. Or paste Shopee search URLs into **Shopee search URLs** (each URL keeps its own market and sort order).
3. Optionally choose **Sort by** (relevance, top sales, newest, price low to high or high to low) and set **Maximum results**.
4. Click **Start**. Small runs finish in seconds; each search page adds about two seconds because the Actor paces its requests politely.
5. Open the Output tab to see the table, and export the results as JSON, CSV, Excel, XML or RSS, or read them through the API.

Some tips:

`maxItems` is a total for the whole run. With several keywords it is split evenly between them, and if one keyword runs out early the remaining keywords get the leftover.

Shopee search is fuzzy: a keyword with no matching products still returns unrelated items on Shopee's own site. The Actor checks the first page, and if no product title shares a word with your keyword it returns 0 rows for that keyword with a warning, so you don't pay for unrelated products.

Keywords work in the local language of each market: `sepatu` on Indonesia, `鞋子` on Taiwan, `tênis` on Brazil, `giày` on Vietnam.

The Actor uses Apify Proxy (datacenter) by default and retries blocked requests on a new IP. If your runs get blocked, switch the proxy to a residential group.

### Input

| Field | Type | Required | Description |
|---|---|---|---|
| `searchTerms` | array of strings | One of `searchTerms` / `startUrls` | Keywords to search, in any language, on the `country` market. |
| `country` | string | No | Market for `searchTerms`: `SG`, `MY`, `PH`, `ID`, `TH`, `VN`, `TW` or `BR`. Default `SG`. |
| `startUrls` | array | One of `searchTerms` / `startUrls` | Shopee search URLs (`https://shopee.<market>/search?keyword=...`), as strings or `{"url": ...}` objects. `sortBy` and `order` in the URL are kept. Category, shop and product URLs are skipped with a warning. |
| `sortBy` | string | No | Order for `searchTerms`: `relevancy` (default), `sales`, `ctime` (newest), `price_asc`, `price_desc`. |
| `minPrice` / `maxPrice` | integer | No | Price range in the market's currency, applied by Shopee to `searchTerms`. Start URLs keep their own `minPrice` / `maxPrice`. |
| `minRating` | integer | No | Only products rated this many stars or more (1-5), applied by Shopee to `searchTerms`. Start URLs keep their own `ratingFilter`. |
| `maxItems` | integer | No | Maximum number of products in total, shared across all keywords and URLs, 1-10000, default 50. |
| `proxyConfiguration` | object | No | Proxy settings. Default: Apify Proxy (datacenter). |

Search several keywords on one market, sorted by top sales:

```json
{
    "searchTerms": ["sepatu", "tas wanita"],
    "country": "ID",
    "sortBy": "sales",
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": true }
}
```

Or start from a Shopee search URL you already have:

```json
{
    "startUrls": [{ "url": "https://shopee.com.br/search?keyword=t%C3%AAnis&sortBy=sales" }],
    "maxItems": 20
}
```

### Output

Each product is one row in the dataset. These items come from real runs of the Actor (Singapore, keyword `wireless earbuds`; Indonesia, keyword `sepatu`; Brazil, start URL for `tênis` sorted by sales):

```json
[
    {
        "id": "28693913633",
        "itemId": "28693913633",
        "shopId": "1120328630",
        "title": "Monster MQT68 TWS Bluetooth Earphone Wireless 6.0 Noise Reduction Touch Control HD Calls Headphone",
        "url": "https://shopee.sg/Monster-MQT68-TWS-Bluetooth-Earphone-Wireless-6.0-Noise-Reduction-Touch-Control-HD-Calls-Headphone-i.1120328630.28693913633",
        "image": "https://down-sg.img.susercontent.com/file/cn-11134207-820l4-miqzmmqrrf2ba9",
        "price": 0.01,
        "priceText": "0.01",
        "originalPrice": null,
        "originalPriceText": null,
        "currency": "SGD",
        "discountPercent": 99,
        "discountText": "-99%",
        "rating": 4.8,
        "location": "SG",
        "market": "shopee.sg",
        "searchKeyword": "wireless earbuds",
        "position": 1,
        "scrapedAt": "2026-10-14T19:39:23.973Z",
        "sourceUrl": "https://shopee.sg/search?keyword=wireless%20earbuds&page=0"
    },
    {
        "id": "13268587518",
        "itemId": "13268587518",
        "shopId": "651940814",
        "title": "DES SNEAKERS PROMO Sepatu / sneaker PRIA DAN WANITA NEW MODE API DS20",
        "url": "https://shopee.co.id/DES-SNEAKERS-PROMO-Sepatu-sneaker-PRIA-DAN-WANITA-NEW-MODE-API-DS20-i.651940814.13268587518",
        "image": "https://down-id.img.susercontent.com/file/sg-11134253-7rdx8-mcn7xqbaf60w58",
        "price": 30328,
        "priceText": "30.328",
        "originalPrice": 210000,
        "originalPriceText": "210.000",
        "currency": "IDR",
        "discountPercent": 86,
        "discountText": "-86%",
        "rating": 4.1,
        "location": "Kab. Bogor",
        "market": "shopee.co.id",
        "searchKeyword": "sepatu",
        "position": 1,
        "scrapedAt": "2026-10-14T19:39:32.763Z",
        "sourceUrl": "https://shopee.co.id/search?keyword=sepatu&page=0"
    },
    {
        "id": "58265422164",
        "itemId": "58265422164",
        "shopId": "1284939254",
        "title": "TÊNIS FEMININO ESPORTIVO PASSEIOS E CAMINHADAS",
        "url": "https://shopee.com.br/TÊNIS-FEMININO-ESPORTIVO-PASSEIOS-E-CAMINHADAS-i.1284939254.58265422164",
        "image": "https://down-br.img.susercontent.com/file/br-11134207-820lx-mq3q9845dekjd0",
        "price": 79.9,
        "priceText": "79,90",
        "originalPrice": null,
        "originalPriceText": null,
        "currency": "BRL",
        "discountPercent": null,
        "discountText": null,
        "rating": 4.9,
        "location": "Minas Gerais",
        "market": "shopee.com.br",
        "searchKeyword": "tênis",
        "position": 42,
        "scrapedAt": "2026-10-14T19:38:07.026Z",
        "sourceUrl": "https://shopee.com.br/search?keyword=t%C3%AAnis&sortBy=sales&page=1"
    }
]
```

Prices are parsed per market. Indonesia, Vietnam and Brazil write `30.328` or `79,90` (dot for thousands, comma for decimals); the other markets write `1,127.90`. The `price` field is always a plain number, so `30.328` in Indonesia becomes `30328` and `79,90` in Brazil becomes `79.9`.

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

Shopee Product Scraper is charged per result. You pay only for the products returned, and `maxItems` caps how many that can be. A keyword that matches nothing returns 0 rows and costs nothing in results. See the Pricing tab for the current price.

If you set a maximum cost per run in the run options, the Actor stops cleanly when that budget is reached and keeps the results it already saved.

### Use with AI agents (MCP)

Connect Shopee Product Scraper to Claude, Cursor or any MCP client through the Apify MCP server:

```json
{
    "mcpServers": {
        "apify": {
            "url": "https://mcp.apify.com/?tools=axiomworks/shopee-product-scraper"
        }
    }
}
```

Example prompts:

1. "Find the 30 best-selling wireless earbuds on Shopee Singapore and list title, price and rating."
2. "Search Shopee Indonesia for 'sepatu' sorted by price low to high and show which products have a discount above 50%."
3. "Compare the prices of 'iphone 15 case' on Shopee Malaysia and Shopee Philippines and tell me where sellers ship from."

The input schema is written for agents: each field says what it does, its limits and its default, and an agent only needs `searchTerms` plus `country` (or one search URL) to get results.

### Integrations and API

Run Shopee Product Scraper from your own code with the Apify API. Set `APIFY_TOKEN` to your Apify API token (send it in the `Authorization` header, never in the URL).

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("axiomworks/shopee-product-scraper").call(
    run_input={"searchTerms": ["wireless earbuds"], "country": "SG", "maxItems": 50}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"], item["currency"])
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('axiomworks/shopee-product-scraper').call({
    searchTerms: ['wireless earbuds'],
    country: 'SG',
    maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/axiomworks~shopee-product-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["wireless earbuds"], "country": "SG", "maxItems": 50}'
```

You can also connect the Actor to Make, Zapier, n8n, Google Sheets, Slack or your own webhooks from the Integrations tab, and run it on a schedule (for example every morning) to track prices and discounts over time.

### FAQ

**Which Shopee countries are supported?**
Singapore, Malaysia, the Philippines, Indonesia, Thailand, Vietnam, Taiwan and Brazil. Pick one with `country` for keywords, or mix markets freely with `startUrls`.

**Does it need a Shopee account or cookies?**
No. It reads public search result pages without logging in.

**Why are there no stock counts, units sold, descriptions or variants?**
Those live on Shopee's product pages and private API, which are not publicly readable without signed requests. This Actor focuses on what search results show publicly: title, price, discount, rating, location and links.

**Why did a keyword return 0 results?**
Shopee fills empty searches with unrelated products. When no product on the first page shares a word with your keyword, the Actor treats the keyword as having no results, logs a warning and moves on. Check the spelling, try the local language of the market, or use a broader keyword.

**How many results can I get per keyword?**
Shopee shows 40 products per page; the Actor reads up to 16 pages per keyword or URL. Duplicate products across pages are removed. Deep pages of a narrow keyword may contain loosely related items, because Shopee pads its results.

**What does `position` mean?**
It is the product's rank in the results for its keyword, counted across pages after duplicates are removed, so you can track how a product moves in search over time.

**Why is `originalPrice` empty for Singapore results?**
Singapore, Philippine and Taiwanese cards usually don't show a strike-through price, only the discount badge. `discountText` and `discountPercent` still tell you the discount.

**What if a run gets blocked?**
Blocked pages are retried with backoff on a new proxy IP. If a keyword stays blocked, the run still finishes, keeps the results of the other keywords and says which one failed. Switching the proxy to a residential group usually helps.

### Is it legal to scrape Shopee?

Shopee Product Scraper collects only publicly available product listing data from Shopee search pages, without logging in. Product listings are business data, not personal data, but you are responsible for how you use the results, including compliance with Shopee's terms and with laws such as GDPR or local data protection rules. This is not legal advice; ask a lawyer if you are unsure about your use case.

Shopee Product Scraper is an independent tool. It is not affiliated with, endorsed by or sponsored by Shopee.

### Related Actors

| Actor | What it does |
|---|---|
| [Newegg Products Scraper](https://apify.com/axiomworks/newegg-products-scraper) | Product listings and prices from Newegg |
| [Made-in-China Product Scraper](https://apify.com/axiomworks/made-in-china-products-scraper) | Supplier product listings from Made-in-China.com |
| [Wayfair Product Scraper](https://apify.com/axiomworks/wayfair-product-scraper) | Product data from Wayfair |

### Feedback

Found a bug or need a field that isn't here? Open an issue on the Issues tab and we'll look at it.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on Shopee, one per line, in any language, e.g. 'wireless earbuds', 'sepatu', '鞋子'. Each keyword is searched on the Country market and returns one row per product card (title, price, discount, rating, location). Give searchTerms, startUrls or both. A keyword with no matching products returns 0 rows and a warning.

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

Shopee market the keywords are searched on, default SG. SG shopee.sg (SGD), MY shopee.com.my (MYR), PH shopee.ph (PHP), ID shopee.co.id (IDR), TH shopee.co.th (THB), VN shopee.vn (VND), TW shopee.tw (TWD), BR shopee.com.br (BRL). Applies to searchTerms only; startUrls use the market in their URL.

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

Shopee search result URLs from any of the 8 markets, as strings or {"url": ...} objects, e.g. https://shopee.com.br/search?keyword=t%C3%AAnis\&sortBy=sales. sortBy and order in the URL are kept. Category, shop and product URLs are not supported: they are skipped with a warning. Optional when searchTerms is given.

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

Result order for searchTerms, default relevancy (Shopee's own ranking). sales = top sales, ctime = newest, price_asc / price_desc = by price. Start URLs keep their own sortBy/order.

## `minPrice` (type: `integer`):

Only products priced at or above this amount, in the market's currency (SG dollars for SG, rupiah for ID, etc.). Applied by Shopee to searchTerms; leave empty for no limit. Start URLs keep their own minPrice.

## `maxPrice` (type: `integer`):

Only products priced at or below this amount, in the market's currency. Applied by Shopee to searchTerms; leave empty for no limit. Start URLs keep their own maxPrice.

## `minRating` (type: `integer`):

Only products rated this many stars or more (1-5). Applied by Shopee to searchTerms; leave empty for any rating. Start URLs keep their own ratingFilter.

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

Maximum number of products to return in total, shared across all keywords and URLs (split evenly, leftovers go to the next target), 1-10000, default 50. Shopee shows 40 products per page and up to 16 pages per search. The run stops as soon as this many results are saved, and you are charged only for results returned.

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

Proxy to use for requests, default Apify Proxy (datacenter). Switch to residential proxies only if runs get blocked.

## Actor input object example

```json
{
  "searchTerms": [
    "phone case"
  ],
  "country": "SG",
  "sortBy": "relevancy",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Dataset with one item per result, in the order found.

# 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 = {
    "searchTerms": [
        "phone case"
    ],
    "country": "SG",
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("axiomworks/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 = {
    "searchTerms": ["phone case"],
    "country": "SG",
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("axiomworks/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 '{
  "searchTerms": [
    "phone case"
  ],
  "country": "SG",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call axiomworks/shopee-product-scraper --silent --output-dataset

```

## MCP server setup

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