# Taobao & Tmall Scraper (`jakvbs/taobao-tmall`) Actor

Scrape Taobao and Tmall products by link, item id, keyword or category: CNY price, images, category, seller, shop scores, review summary. No login. Drop-in compatible with memo23, pizani and zen-studio inputs.

- **URL**: https://apify.com/jakvbs/taobao-tmall.md
- **Developed by:** [Jakub Sieczczyński](https://apify.com/jakvbs) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 product (full detail)s

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

### What does Taobao & Tmall Scraper do?

**Taobao & Tmall Scraper** extracts **product data from Taobao and Tmall** by product link, item id, keyword or category:
**price in CNY, title, images, category, ship-from city, seller and shop scores, review summary and the latest review**.
No login, no cookies, no browser.

- **Drop-in compatible** with the inputs of `memo23/taobao-scraper`, `pizani/taobao-product-scraper` and
  `zen-studio/taobao-detail-scraper`: switch by changing only the Actor ID.
- **Fast and steady:** about 7,000 full products per hour with default settings (load test: 1,804 products from
  101 categories and keywords in 15 minutes; 8 pushbacks from Taobao, each moved to a new IP, no failed page).
- **Fair billing:** list rows and full product rows are priced separately, no start fee, and inputs that fail are never charged.
- **Every link format:** item.taobao.com, detail.tmall.com, detail.tmall.hk, m.intl.taobao.com, a.m.taobao.com/i…htm,
  world.taobao.com, s.taobao.com/search?q=, bare item ids.

### How to scrape Taobao and Tmall

1. Click **Try for free**.
2. Paste product links or item ids into **Product URLs or IDs**, and/or add **Search keywords** (Chinese or English)
   or **Category IDs**.
3. Keep **Complete list results from each product page** on if you need seller, shop scores and reviews for keyword
   and category results.
4. Click **Start**, then download the data as JSON, CSV, Excel or HTML, or get it through the Apify API.

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

Pay per result, no subscription to this Actor and no start fee:

| Event | Price | When |
|---|---|---|
| `product` | **$2.00 / 1,000** | a list row (keyword or category result with product pages off, or a product whose own page could not be read) |
| `productDetail` | **$3.50 / 1,000** | a full product row (product page read) |

The Apify platform usage (compute, residential proxy) is included. Inputs that fail are listed in `FAILED_INPUTS`
and never charged. Set a maximum cost per run in the run options; the run stops when it is reached. With the $5 of
monthly credit on Apify's free plan you get about 1,400 full product rows.

### Input example

```json
{
  "startUrls": ["https://item.taobao.com/item.htm?id=730344766230", "1079352038299"],
  "searchQueries": ["蓝牙耳机", "phone case"],
  "categoryIds": ["50064014"],
  "scrapeDetails": true,
  "maxItems": 100
}
```

### Output example

One row per product (shortened):

```json
{
  "itemId": "956554108294",
  "url": "https://item.taobao.com/item.htm?id=956554108294",
  "platform": "taobao",
  "title": "蕉下聲波電動牙刷智能...",
  "price": 59.9,
  "originalPrice": 59.9,
  "currency": "CNY",
  "categoryPath": ["日化/清潔/護理", "個人洗浴/清潔/護理", "牙膏/牙刷/口腔護理", "牙刷"],
  "location": "浙江金華",
  "image": "https://img.alicdn.com/imgextra/i3/2217327519038/O1CN012cEzSz2GdSiaeIgt3_!!2217327519038.jpg",
  "shop": {
    "shopName": "蕉家個護企業店",
    "sellerId": "2217327519038",
    "sellerType": "C",
    "creditLevel": 15,
    "shopOpenedAt": "2024-01-23 20:07:45",
    "ratings": { "description": 4.8, "service": 4.9, "logistics": 4.9 }
  },
  "reviews": {
    "positiveRate": "99%",
    "positiveCount": "1万+",
    "negativeCount": "20",
    "latestReview": { "rating": 5, "date": "2026-09-23 10:34", "variant": "顏色分類:全效潔齒-銀色4支刷頭質保1個月", "text": "…" }
  },
  "detailLevel": "full",
  "source": { "kind": "item", "input": "https://item.taobao.com/item.htm?id=956554108294", "rank": null },
  "scrapedAt": "2026-10-23T21:37:59.241Z"
}
```

All fields: `itemId`, `url`, `worldUrl`, `platform` (taobao / tmall), `title`, `price`, `priceMax` (price ranges),
`originalPrice`, `currency`, `priceHkd` / `priceTwd` (list rows), `hasRangePrice`, `categoryId`, `rootCategoryId`,
`categoryPath`, `location`, `freeShipping`, `areaLimit`, `image`, `images`, `paymentMethods`, `descriptionMatchScore`,
`shop` (`shopId`, `shopName`, `sellerId`, `sellerType` B = Tmall / business, C = individual, `creditLevel`,
`shopOpenedAt`, `itemCount`, `newItemCount`, `shopUrl`, `ratings`), `reviews` (`positiveRate`, `positiveCount`,
`neutralRate`, `negativeRate`, `negativeCount`, `latestReview`), `detailLevel` (full / listing), `source` (`kind`,
`input`, `rank`), `queryTotalResults`, `scrapedAt`.

### What it does not do (yet)

- **No SKU variants and no list of reviews.** Only the review summary and the latest review. `includeVariants`,
  `includeReviews` and `fetchReviews` are accepted and logged.
- **20 products per keyword or category.** Logged-out visitors only get the first page; use more specific keywords or
  categories for more.
- **Some products are not on Taobao's public product pages.** In our sample, 8 of 15 item ids taken from other Actors'
  examples were not available there. They end up in `FAILED_INPUTS` and cost nothing.
- **Shortened titles on product pages.** Taobao shortens titles on product pages (`...`); keyword and category rows keep
  the full title. Titles and categories come in Traditional Chinese characters, as Taobao's international site shows them.
- **Sorting** (`searchSort`) is accepted and logged; results come in Taobao's default order.

### FAQ

#### How does it compare with other Taobao scrapers?

Measured on 2026-10-23 with the same 60 products and 3 keywords. The price check compares with the product page in
CNY.

| | This Actor | scrapesage | memo23 | zen-studio | pizani |
|---|---|---|---|---|---|
| Price per 1,000 full products | **$3.50** | $6.00 | $4.00 + $0.005 / run | $9.99 + $0.009 / run | $4.99 |
| Price equal to the product page | 47 / 47 | 46 / 46 | 46 / 46 | 0 / 5 | 0 / 17 |
| SKU variants | no | no | no | yes | yes |
| Seconds per product | 0.46 | 2.0 | 0.71 | 13 | 9 |

zen-studio and pizani return SKU variants and some products that Taobao's public pages do not have; their `price` is
a different figure from the price on the product page (for example 293.33 vs 294.00).

#### How many products can I scrape, and how fast?

With the default 4 parallel sessions, about 2 products per second, each session on its own residential IP and paced
so Taobao does not block it. Raise `maxConcurrency` (up to 20) for large runs. Use `maxItems` and the maximum cost
per run to cap a run.

#### Why did an input fail?

Every failed input is listed with a reason in the `FAILED_INPUTS` record of the run's key-value store: removed
products, keywords Taobao publishes no page for, links that only open from mainland China (e.tb.cn share links:
paste the full product link instead). Failed inputs are never charged.

#### Is it legal to scrape Taobao?

The Actor reads public product pages without logging in and collects no personal data beyond public shop names and
the text of one public review. Check Taobao's terms and the law that applies to you before using the data, especially
commercially.

#### I need a feature

Open an issue on the Actor's Issues tab: SKU variants and more results per keyword are the next things on the list.

# Actor input Schema

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

Taobao or Tmall product links (item.taobao.com, detail.tmall.com, detail.tmall.hk, m.intl.taobao.com, world.taobao.com/item/…), bare numeric item ids, or world.taobao.com keyword / category links. One row per product; duplicates are removed. e.tb.cn share links only open from mainland China, so paste the full product link instead.

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

Chinese or English keywords (蓝牙耳机, phone case). Each returns Taobao's top 20 products for it with a `rank` (Taobao shows logged-out visitors only the first page; add more specific keywords or categories for more). Taobao publishes these pages for common product terms only; a keyword without a page is named in FAILED_INPUTS and costs nothing.

## `categoryIds` (type: `array`):

The number in world.taobao.com/category/<id>.htm. Top 20 products each.

## `scrapeDetails` (type: `boolean`):

Adds seller id, Tmall flag, shop credit level, shop scores, shop age, review summary, latest review, ship-from city and category path to keyword and category results. One extra page per product, so each row is charged as a full product (`productDetail`) instead of a list row (`product`).

## `tmallOnly` (type: `boolean`):

Keep products sold by Tmall stores. Needs the product pages, so it turns on the option above.

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

Stop after this many products in total.

## `priceMin` (type: `integer`):

Keep products priced at or above this, in yuan. Products without a price are kept. Filtered products are never charged.

## `priceMax` (type: `integer`):

Keep products priced at or below this, in yuan.

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

One residential IP per parallel lane; each lane paces itself and slows down when Taobao pushes back.

## `proxy` (type: `object`):

Accepted for compatibility; the actor routes through Apify residential proxy (US) itself.

## `product_url` (type: `string`):

One product link or id.

## `items` (type: `array`):

Same as Product URLs above.

## `searchSort` (type: `string`):

Relevance only for now; other values are logged and ignored.

## `translateKeywords` (type: `boolean`):

Not needed: Taobao's pages accept English keywords as given.

## `includeVariants` (type: `boolean`):

Not available yet: SKU-level prices and stock are not on Taobao's public pages.

## `includeReviews` (type: `boolean`):

Not available yet: rows carry the review summary and the latest review.

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

Accepted, not used yet.

## `fetchReviews` (type: `boolean`):

Accepted, not used yet.

## Actor input object example

```json
{
  "startUrls": [
    "https://item.taobao.com/item.htm?id=730344766230",
    "1079352038299"
  ],
  "searchQueries": [
    "蓝牙耳机"
  ],
  "scrapeDetails": true,
  "tmallOnly": false,
  "maxItems": 100,
  "maxConcurrency": 4,
  "proxy": {
    "useApifyProxy": true
  },
  "searchSort": "relevance",
  "translateKeywords": true,
  "includeVariants": false,
  "includeReviews": false,
  "maxReviewsPerProduct": 20,
  "fetchReviews": false
}
```

# Actor output Schema

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

One row per product.

## `failedInputs` (type: `string`):

Inputs that produced no product, each with a reason. Never charged.

# 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 = {
    "startUrls": [
        "https://item.taobao.com/item.htm?id=730344766230",
        "1079352038299"
    ],
    "searchQueries": [
        "蓝牙耳机"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jakvbs/taobao-tmall").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 = {
    "startUrls": [
        "https://item.taobao.com/item.htm?id=730344766230",
        "1079352038299",
    ],
    "searchQueries": ["蓝牙耳机"],
}

# Run the Actor and wait for it to finish
run = client.actor("jakvbs/taobao-tmall").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 '{
  "startUrls": [
    "https://item.taobao.com/item.htm?id=730344766230",
    "1079352038299"
  ],
  "searchQueries": [
    "蓝牙耳机"
  ]
}' |
apify call jakvbs/taobao-tmall --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jakvbs/taobao-tmall"
        }
    }
}
```

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/CYCb2005W7yPjFTRQ/builds/kdA68QVJm9vXMxLa1/openapi.json
