# Shopee Scraper · Search, Product & Shop · 11 Markets (`memo23/shopee-scraper`) Actor

Shopee Scraper extracts products from keyword search, category pages, shops, or product URLs across Indonesia, Singapore, Malaysia, Philippines, Thailand, Vietnam, Taiwan, Brazil, Mexico, Colombia and Chile. Price, rating, seller, gallery. No login. Optional full product pages.

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

## Pricing

from $2.80 / 1,000 product cards

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

## Shopee Scraper · Search, Product & Shop · 11 Markets

Turn Shopee search terms or URLs into product rows — title, price, currency, seller ids, and image — across Indonesia, Singapore, Malaysia, Philippines, Thailand, Vietnam, Taiwan, Brazil, Mexico, Colombia and Chile. No login, no cookies.

Optional full product pages add description, brand, gallery, variants and seller fields.

| Input | Row(s) emitted |
|---|---|
| Keyword (`searchTerms`) | Product cards from `/list/{term}` |
| Search / list / category URL | Product cards from that page |
| Shop URL | Products listed on the shop |
| Product URL (`-i.shop.item` or `/product/shop/item`) | One product; price often missing until you also ran search |

***

### Why Use This Scraper?

- Eleven Shopee marketplaces in one actor
- Keyword search, category, shop, or a mixed list of URLs
- Price and title on search cards without an account
- Optional product-detail pass for gallery, brand and variants
- One flat row per product for JSON, CSV or Excel
- No browser, no cookies, no Shopee account

***

### Overview

Built for price monitors, marketplace researchers, and sourcing teams who need public Shopee listings as a table.

Every successful row is a **product**. A shop URL does not emit a shop-profile row — it emits that shop's products. Colombia and Chile do not serve search HTML; keyword-only runs there return an `unavailable` error row. Paste a product or shop URL instead.

This is crawler HTML, not Shopee's logged-in JSON API. The `/api/v4` routes 403 without their anti-crawler token. Search cards still carry price. A product-URL-only run often has `price: null` because the product page no longer ships it in the HTML we read.

***

### Supported Inputs

| Kind | Example |
|---|---|
| Keyword | `iphone` in `searchTerms`, `country: "ID"` |
| List / search URL | `https://shopee.sg/list/iphone` or `https://shopee.sg/search?keyword=iphone` |
| Category | `https://shopee.co.id/Komputer-Aksesoris-cat.11044261` |
| Shop | `https://shopee.co.id/shop/196846900` or `https://shopee.co.id/rasyidjaya_computer` |
| Product | `https://shopee.sg/Name-i.855002939.28095542543` or `https://shopee.co.id/product/196846900/11083699432` |

#### Unsupported

- Cart, checkout, buyer messages, or anything behind login
- Lazada
- Colombia / Chile **keyword search** (product and shop URLs still work)
- Server-side `sales` / `latest` sort (those values stay in page order)

***

### Use Cases

| Audience | What they use it for |
|---|---|
| Price monitors | Track a SKU or keyword across SEA and LATAM Shopee hosts |
| Sourcing | Shortlist sellers by price, title and shop id |
| Catalog teams | Enrich a list of Shopee URLs with title and image |
| Researchers | Compare listing density for a term across countries |

***

### How It Works

1. Keywords become `https://{host}/list/{term}`. A Shopee URL is classified as search, category, shop or product.
2. List / shop / category pages are fetched as crawler HTML (Facebook crawler UA). Product pages use a Chrome UA on `/product/{shop}/{item}`.
3. Cards come from schema.org `ItemList` plus `-i.{shop}.{item}` links. Prices in the title (`Rp3.460.000`) are parsed when the card has no schema price.
4. Filters (`minPrice`, `maxPrice`) drop cards before billing. `price_asc` / `price_desc` reorder in memory.
5. If `enrichProducts` is on, each kept card opens its product page and merges description, brand, images, attributes and models.

***

### Input Configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `auto` | `auto`, `search`, `product`, `shop` |
| `country` | string | `ID` | Marketplace for keywords. A URL keeps its own country. |
| `searchTerms` | array | — | One keyword per line |
| `startUrls` | array | — | Product, search, category or shop URLs |
| `maxItems` | integer | `40` | Cap for the whole run |
| `enrichProducts` | boolean | `false` | Full product page. Extra `product-detail` charge. |
| `sortBy` | string | `relevancy` | `relevancy`, `sales`, `latest`, `price_asc`, `price_desc` |
| `minPrice` / `maxPrice` | integer | — | Marketplace currency. Cards without a price are dropped. |
| `minRating` | number | — | Applied only when a card has a rating |
| `proxyConfiguration` | object | residential | Optional. Direct HTTP works on most hosts. |
| `maxConcurrency` | integer | `3` | Parallel requests, 1–8 |

#### Example — keyword search

```json
{
  "country": "ID",
  "searchTerms": ["iphone"],
  "maxItems": 40
}
```

#### Example — product URLs plus detail

```json
{
  "mode": "product",
  "startUrls": ["https://shopee.co.id/product/1732890112/26795239857"],
  "enrichProducts": true
}
```

#### Example — one shop

```json
{
  "mode": "shop",
  "startUrls": ["https://shopee.co.id/shop/196846900"],
  "maxItems": 20
}
```

***

### Output Overview

One dataset row per product. Search cards include `title`, `price`, `currency`, `url`, `itemId`, `shopId`, `imageUrl` when the page has them. Error rows carry `error`, `errorKind` (`unavailable` for a dead marketplace or bad URL) and `message` — those are not charged.

With `enrichProducts`, the same row also gets `description`, `brand`, `images`, `categoryPath`, `attributes`, `models`, `shopName`, `shopRating`, `isOfficialShop`.

***

### Output Samples

Real row from `country: "ID"`, `searchTerms: ["iphone"]`, `maxItems: 5` (run `C32Pp8Odx8aWBJSzz`):

```json
{
  "type": "product",
  "country": "ID",
  "currency": "IDR",
  "title": "iPhone 17 Pro 256 & 512GB, Chip A19 Pro, Super Retina XDR - Garansi Resmi",
  "price": 23290000,
  "itemId": "26795239857",
  "shopId": "1732890112",
  "url": "https://shopee.co.id/iPhone-17-Pro-256-512GB-Chip-A19-Pro-Super-Retina-XDR-Garansi-Resmi-i.1732890112.26795239857"
}
```

***

### Key Output Fields

| Group | Fields |
|---|---|
| Identity | `country`, `itemId`, `shopId`, `url` |
| Offer | `title`, `price`, `currency`, `originalPrice`, `imageUrl` |
| Provenance | `searchTerm`, `sourceUrl`, `position`, `page`, `scrapedAt` |
| Detail (opt-in) | `description`, `brand`, `images`, `categoryPath`, `attributes`, `models`, `shopName`, `shopRating`, `isOfficialShop` |

***

### FAQ

**Does it need Shopee cookies?**
No. The JSON API does (`/api/v4` returns 403 without their token). This actor reads the public crawler HTML instead.

**Why is `price` null on a product URL?**
The product page often strips price from the HTML. Run a keyword or category search to get card prices, then turn on `enrichProducts` if you want the gallery.

**Which countries work for search?**
ID, SG, MY, PH, TH, VN, BR, TW, MX. CO and CL need a product or shop URL.

**Is there a start fee?**
Yes — Apify's per-GB actor-start ($0.005). Then $0.0036 per product card (Bronze) and $0.0063 per successful product-detail. Error rows are free.

***

### Support

Found a bug or need a field that is not there? Open an issue on the actor's **Issues** tab.

Email: muhamed.didovic@gmail.com

***

### Additional Services

Need a custom scraper, a tailored export, or an integration into your own pipeline? Custom builds are available — muhamed.didovic@gmail.com.

***

### Explore More Scrapers

- **Coupang Scraper** — Korean marketplace search
- **Etsy Scraper** — listings, shops, seller leads
- **Instagram Search Scraper** — accounts, hashtags, audio
- **Instagram Hashtag Scraper** — top, recent and reels

Browse the full collection at [apify.com/memo23](https://apify.com/memo23).

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/shopee-scraper`).

**Purpose:** Public Shopee product cards from keywords or URLs across 11 country hosts. No login.

**Minimal input:**

```json
{ "country": "ID", "searchTerms": ["iphone"], "maxItems": 5 }
```

**Output:** one dataset row per product — type, country, currency, title, price, url, itemId, shopId, imageUrl, searchTerm, sourceUrl. Failed targets return `{error, errorKind, message}`.

**Behaviors an agent should know:**

- Always set `maxItems`.
- A URL's host wins over `country`.
- `mode: "product"` / `"shop"` ignores `searchTerms`.
- CO/CL keyword search returns `errorKind: "unavailable"` — pass a product or shop URL.
- Billing: `product` per delivered card, `product-detail` only when enrichment succeeds. Error rows are free.
- Product-URL runs often have null `price`. Prefer keyword search when price is required.
- No cookies and no `/api/v4` — do not send session tokens.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Shopee Pte. Ltd., Sea Limited, or any of their subsidiaries. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available Shopee listing and product pages — no authenticated endpoints, paid features, or content behind the Shopee login wall. Users are responsible for ensuring their use complies with Shopee's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

***

### SEO Keywords

Shopee scraper, scrape Shopee, Shopee API, Shopee product scraper, Shopee search scraper, Shopee shop scraper, Apify Shopee, Indonesia Shopee scraper, Shopee price monitoring, Shopee marketplace data, SEA ecommerce scraper, Shopee catalog export, Shopee seller intelligence, shopee.co.id scraper, Shopee no login

# Actor input Schema

## `mode` (type: `string`):

Auto decides from the URL. Search = keyword / list / category. Product = full product pages. Shop = a seller and their listings.

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

Used for keyword searches. A URL keeps its own country. Colombia and Chile do not serve search HTML — paste product or shop URLs there.

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

One keyword per line, searched in the selected marketplace.

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

Product pages (...-i.shop.item or /product/shop/item), search, category (...-cat.id) or shops.

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

Stop after this many products per run.

## `enrichProducts` (type: `boolean`):

Open each product page for description, brand, gallery, variants and seller. Billed as product-detail.

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

Client-side sort. Shopee's crawler pages ignore server sort — price\_asc / price\_desc reorder cards we already have; sales and latest stay in page order.

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

Minimum price in the marketplace currency. Products without a price are dropped.

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

Maximum price in the marketplace currency. Products without a price are dropped.

## `minRating` (type: `number`):

Keep products rated at least this (0–5). Crawler cards often have no rating and are kept.

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

Residential proxies in the marketplace country are the most stable. The run still works if you turn this off.

## `maxConcurrency` (type: `integer`):

Parallel requests.

## Actor input object example

```json
{
  "mode": "auto",
  "country": "ID",
  "searchTerms": [
    "iphone"
  ],
  "maxItems": 40,
  "enrichProducts": false,
  "sortBy": "relevancy",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxConcurrency": 3
}
```

# Actor output Schema

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

Product cards from search, shop or URL — title, price, ids, image, and optional detail fields.

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

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/shopee-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": ["iphone"] }

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

```

## MCP server setup

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