# Taobao Category Products Scraper API (`dami_studio/taobao-category-products-scraper`) Actor

Browse Taobao by category: title, price in CNY, image, product URL, seller and shop IDs. 20 categories, 3,133 products. No account, no Chinese IP, no browser. $1.95 per 1,000 - the lowest price of any Taobao scraper on Apify with an active user base. Category browsing, not keyword search.

- **URL**: https://apify.com/dami\_studio/taobao-category-products-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

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

## Taobao Category Products Scraper API

Browse Taobao by category and get product rows back as JSON: product ID, title, price in CNY, image,
product URL, SKU ID, Taobao's own leaf category ID, seller ID and shop ID.

No Taobao account, no cookies, no captcha solving, no browser, no Chinese IP, no proxy of your own.
Pick a category, get rows.

**Read the "What this is not" section before you buy.** This is a category browser, not a keyword
search, and the catalogue it can reach is finite. Being straight about that up front is cheaper for
both of us than a refund.

### Price

**$1.95 per 1,000 products**, plus $0.002 to start a run.

That is the lowest price of any Taobao scraper on Apify with an active user base. The four Taobao
scrapers that have one charge $5.99, $9.99 and $12.00 per 1,000 on their entry tier, dropping to
$2.00-$7.99 per 1,000 only on their top volume tiers. One actor does list lower, at $1.50 per
1,000, but it has two users in its lifetime and one of them in the last 30 days. Their start fees
are $0.009 to $0.12 against $0.002 here.

You are charged per product row returned. Sample rows and diagnostic rows are never charged, and a
run that returns nothing costs only the start fee.

| Products | Cost |
|---|---|
| 100 | $0.197 |
| 500 | $0.977 |
| 1,000 | $1.952 |
| 3,133 (every product all 20 categories hold) | $6.111 |

### What a row looks like

Two real rows, copied out of cloud runs on 2026-08-09:

```json
{
  "productId": "14694804727",
  "title": "整流二极管快恢复4007等各种型号",
  "price": 2.42,
  "currency": "CNY",
  "productUrl": "https://item.taobao.com/item.htm?id=14694804727",
  "imageUrl": "https://img.alicdn.com/bao/uploaded/i2/738263294/O1CN01XWMLM81aChmOpZuYi_!!4611686018427379966-0-item_pic.jpg",
  "skuId": "3807680996276",
  "leafCategoryId": "50018814",
  "sellerId": "738263294",
  "shopId": "68071911",
  "shopUrl": "https://shop68071911.taobao.com",
  "promoBadgeImageUrl": "https://img.alicdn.com/imgextra/i1/O1CN01nRidmm1UAVxdcYMzF_!!6000000002477-2-tps-104-56.png",
  "categoryId": "999999207",
  "category": "industrial",
  "categoryNameZh": "工业用品",
  "categoryNameEn": "Industrial supplies",
  "page": 0,
  "position": 1,
  "scrapedAt": "2026-08-09T17:18:04.277Z"
}
```

```json
{
  "productId": "717203446746",
  "title": "蝶翼长尾斑马鱼小型热带鱼观赏鱼",
  "price": 14.9,
  "currency": "CNY",
  "productUrl": "https://item.taobao.com/item.htm?id=717203446746",
  "imageUrl": "https://img.alicdn.com/bao/uploaded/i1/1017431750/O1CN01AnRKiz1OnYBJl8yMU_!!1017431750.jpg",
  "skuId": "5872156425275",
  "leafCategoryId": "50003251",
  "sellerId": "1017431750",
  "shopId": "73105644",
  "shopUrl": "https://shop73105644.taobao.com",
  "promoBadgeImageUrl": null,
  "categoryId": "999999114",
  "category": "pets",
  "categoryNameZh": "宠物生活",
  "categoryNameEn": "Pet supplies",
  "page": 0,
  "position": 4,
  "scrapedAt": "2026-08-09T17:20:35.472Z"
}
```

### Field coverage, measured

Counted over a real cloud run that drained all 20 categories to exhaustion — 3,133 products, 3,133
unique product ids, zero duplicates — on 2026-08-09. These are the actual percentages, not a wish
list.

| Field | Filled | What it is |
|---|---|---|
| `productId` | 100% | Taobao's numeric item id (`nid`) |
| `title` | 100% | Product title, as listed (Chinese) |
| `price` | 100% | Current price in yuan. Range seen: ¥0.01 to ¥99,999, median ¥56 |
| `currency` | 100% | Always `CNY` |
| `productUrl` | 100% | `https://item.taobao.com/item.htm?id=...` |
| `imageUrl` | 100% | Main product image on `img.alicdn.com` |
| `skuId` | 100% | The specific SKU the feed surfaced |
| `leafCategoryId` | 100% | Taobao's own leaf category id — 1,248 distinct across 3,133 rows |
| `sellerId` | 100% | Seller account id |
| `shopId` | 100% | Shop id — 2,462 distinct shops across 3,133 rows |
| `shopUrl` | 100% | `https://shop<shopId>.taobao.com` |
| `categoryId` / `category` / `categoryNameEn` | 100% | Which category the row came from |
| `categoryNameZh` | 95.9% | Chinese category name. Empty only for the two unlisted feeds, which Taobao gives no name |
| `promoBadgeImageUrl` | 67.3% | Campaign badge image when the listing carries one (4 distinct badges seen) |
| `page` / `position` | 100% | Where in the feed it appeared |
| `scrapedAt` | 100% | ISO timestamp |

**Fields you will not find here, and why.** Taobao's category feed carries a `monthSale` field and it
is an empty string on 100% of 2,897 rows measured, so this actor does not ship it and does not
promise sales volume. The price object carries an `originalPrice` next to the `promotionPrice`, and
the two are identical on 100% of those rows, so shipping a "was / now" pair would be fiction — there
is one honest `price`. `isPreSale` is `false` on every row, `icons` is empty on every row, and
`matchType` and `source` have a single constant value each. None of them are shipped.

### What this is not

- **Not a keyword search.** There is no search box in this feed and no keyword parameter. You cannot
  ask it for "red shoes". Taobao's actual keyword search API, `mtop.taobao.wsearch.appsearch`, is
  behind an authentication wall: it answers `RGV587_ERROR::SM` and redirects to
  `login.taobao.com/...?from=sm` at every version, on every host, under every referer, from a home
  address, from two datacenter addresses, from a rented static-ISP address and from a mainland-China
  address. That is a login demand, not a captcha and not a geo-block, so no proxy buys past it.
- **Not a product-detail scraper.** No descriptions, no attributes, no review text, no stock, no
  shipping. `mtop.taobao.detail.getdetail`, `getdesc` and `rate.detaillist` sit behind the same wall.
- **Not unlimited.** Each category is a finite, deterministic pool that runs out. A single run that
  drained all 20 to exhaustion returned **3,133 unique products** and stopped: industrial 982,
  building & renovation 291, home 230, pets 217, smart appliances 190, down to digital services at
  12\. That is the whole reachable catalogue. Re-running does not conjure more, and neither does
  changing IP: four different exit addresses returned the identical product ids for the same
  category, four times out of four.
- **Not a live inventory feed.** It is Taobao's own recommendation surface for each category. The
  same category returns the same products call after call, but Taobao decides what is in it.

### What it is good for

- A clean, priced, categorised sample of live Taobao inventory for price benchmarking or market
  research, without an account or a scraping stack.
- Seller and shop discovery: a full drain carried 2,462 distinct shops, each with a working
  `shop<id>.taobao.com` URL.
- Category mapping: 1,248 distinct Taobao leaf category ids tied to real products.
- Training or demo data for anything that needs real Chinese e-commerce titles, prices and images.

### Input

| Option | What it does |
|---|---|
| `categories` | Which of the 20 categories to browse. Pick as many as you like — they are drained four at a time in parallel. |
| `maxItems` | Hard cap on products returned across every category selected (1-5,000). |
| `maxPagesPerCategory` | How deep to page inside one category before moving on (1-200, default 60). Each page returns 7-25 products; the deepest category needs 64. |
| `proxyConfiguration` | Optional. The actor brings its own exit addresses; supply your own only if you want to. |

```json
{
  "categories": ["industrial", "pets", "home"],
  "maxItems": 500,
  "maxPagesPerCategory": 60
}
```

The 20 categories, with the size of each pool as measured on a full drain:

| Category | Chinese | Products |
|---|---|---|
| `industrial` | 工业用品 | ~982 |
| `building-materials` | 家装建材 | ~291 |
| `home` | 家享家居 | ~230 |
| `pets` | 宠物生活 | ~217 |
| `smart-appliances` | 智能家电 | ~190 |
| `commercial-agri` | 商业农业 | ~152 |
| `daily-goods` | 日用百货 | ~148 |
| `sports-outdoor` | 运动户外 | ~125 |
| `fashion` | 服饰时尚 | ~116 |
| `jewellery` | 珠宝饰品 | ~109 |
| `stationery` | 文教香薰 | ~94 |
| `food-fresh` | 食品生鲜 | ~91 |
| `unlisted-109` | — | ~79 |
| `toys` | 玩具潮玩 | ~60 |
| `flowers-garden` | 鲜花园艺 | ~59 |
| `auto` | 汽车用品 | ~56 |
| `unlisted-206` | — | ~51 |
| `3c-digital` | 3C数码 | ~37 |
| `appliances` | 家用电器 | ~34 |
| `digital-life` | 数字生活 | ~12 |

The category list is a closed set on purpose. Taobao answers `SUCCESS` with an empty result for any
id outside its own list — an unknown category looks exactly like an exhausted one — so a free-text
field would fail silently instead of telling you.

### Speed and limits, measured

- **Throughput:** 1,000 products in 31 seconds on Apify (default 1 GB), four categories in parallel.
  A 25-product run finishes in 7 seconds. Draining all 20 categories to exhaustion — 3,133 products
  — took 16 minutes.
- **Rate limit:** none found. 443 consecutive requests on a single datacenter exit address at 92
  requests per minute returned 442 successes and zero challenges. No captcha, no session death, no
  rotation needed.
- **Latency:** 0.3-0.6 seconds per request while the pagination cursor is short. It degrades to
  5-10 seconds per request on a deep drain, because the cursor is the list of every product id
  already seen and it passes 10,000 characters. A full 982-product drain of one category took about
  6 minutes on a slow exit and under a minute on a fast one.
- **Depth:** each category exhausts deterministically. Taobao returns `SUCCESS` with an empty result
  when there is nothing left, and the actor stops there rather than paging into nothing.
- **Rotation:** the actor rotates exit addresses when one is refused, but rotation adds zero rows.
  The pool is deterministic per category, so this actor deliberately does not burn proxy money
  chasing volume that does not exist.
- **Proxy:** plain Apify datacenter addresses. Residential is never requested — measured
  `PROXY_RESIDENTIAL_TRANSFER_GBYTES: 0` on every run.

### How it works, and how it can break

The actor talks to Taobao's mobile JSON gateway (`h5api.m.taobao.com`) using the same md5 request
signature Taobao's own web client uses, with a token minted from a `_m_h5_tk` cookie. The category
feed itself is addressed by an application id lifted from a versioned Alibaba CDN bundle
(`@ali/pegasus-project-tbhome-2024`). **Alibaba can retire that id without notice.** If they do, the
gateway will start answering something other than `SUCCESS`.

When that happens this actor fails loudly: it writes an uncharged `TAOBAO_API_CHANGED` row carrying
the exact `ret` string Taobao returned, and the run is marked failed. It will not quietly return
zero rows and bill you for them. Every failure path — blocked exits, an empty category, an unknown
category — writes an uncharged diagnostic row that says what happened.

### FAQ

**Can I search Taobao for a keyword with this?**
No. Taobao's keyword search API requires a logged-in, real-name-verified Taobao account; without one
it returns `RGV587_ERROR::SM` and a login redirect. This actor browses categories instead. If you
need keyword search, the actors that offer it are reselling a paid third-party API.

**Do I need a Taobao account, cookies, or a Chinese IP?**
No, none of the three. No browser either. The category feed answers plain HTTP requests from
ordinary datacenter addresses.

**How many products can I get in total?**
3,133 unique products across all 20 categories, measured on a run that drained every one of them to
exhaustion. `industrial` alone holds 982. Each category has a fixed pool that runs out; more
requests and more IP addresses do not enlarge it.

**Why is there no sales volume / units sold field?**
Because the feed's `monthSale` field is empty on 100% of the rows measured. Any Taobao scraper
showing you sales volume from this surface would be inventing it.

**Why is there no "original price" vs "sale price"?**
Because Taobao returns both and they are identical on 100% of 2,897 rows measured. One price is the
honest answer.

**Do the same products come back if I run it twice?**
Yes, largely. The pool per category is deterministic — that is a feature if you are tracking prices
over time, and a limitation if you expected an endless firehose.

**What do I pay if the run fails or finds nothing?**
Only the $0.002 start fee. Diagnostic and sample rows are never charged.

**Can I get product descriptions, reviews or stock levels?**
Not from this actor. Those endpoints are behind the same login wall as keyword search.

### Output fields

`productId`, `title`, `price`, `currency`, `productUrl`, `imageUrl`, `skuId`, `leafCategoryId`,
`sellerId`, `shopId`, `shopUrl`, `promoBadgeImageUrl`, `categoryId`, `category`, `categoryNameZh`,
`categoryNameEn`, `page`, `position`, `scrapedAt`.

# Actor input Schema

## `categories` (type: `array`):

Which Taobao categories to browse. Pick as many as you like — they are drained side by side. This is a category browser, NOT a keyword search: there is no search box in Taobao's category feed, so you cannot ask it for "red shoes".

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

Hard cap on products returned across every category selected (1-5000). Each category has a finite pool that runs out — the whole catalogue across all 20 is roughly 3,100 unique products — so asking for more than a category holds simply stops early. You are charged per product returned.

## `maxPagesPerCategory` (type: `integer`):

How deep to page inside one category before moving on (1-200). Each page returns 7-25 products and the deepest categories need 40-70 pages to bottom out. Raise it for a full drain of a big category, lower it for a quick sample.

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

Optional. The actor brings its own exit addresses and Taobao's category feed does not need a Chinese IP, a residential IP or a browser. Leave this alone unless you want to run through your own proxies.

## Actor input object example

```json
{
  "categories": [
    "industrial"
  ],
  "maxItems": 200,
  "maxPagesPerCategory": 60,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "categories": [
        "industrial"
    ],
    "maxItems": 200,
    "maxPagesPerCategory": 60,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/taobao-category-products-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 = {
    "categories": ["industrial"],
    "maxItems": 200,
    "maxPagesPerCategory": 60,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/taobao-category-products-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 '{
  "categories": [
    "industrial"
  ],
  "maxItems": 200,
  "maxPagesPerCategory": 60,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call dami_studio/taobao-category-products-scraper --silent --output-dataset

```

## MCP server setup

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