# Douyin Shop 抖音商城 Product Scraper - Sales, Commission & Shops (`clover_folktale/douyin-shop-scraper`) Actor

Search Douyin Shop (抖音商城 / 抖店) products by keyword or list a shop's catalogue. Get price, 30-day sales and daily sales trend, creator commission rate, promoting creators, shop name and score, for product research and affiliate selection. No login or cookies needed. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/clover_folktale/douyin-shop-scraper.md
- **Developed by:** [Silkline](https://apify.com/clover_folktale) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 8 total users, 2 monthly users, 90.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 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

Douyin Shop 抖音商城 Scraper collects product data from Douyin Shop (抖音商城, called 抖店 on the merchant side) and returns clean, flat JSON. You can search products by keyword, or list every product of a shop. Search results include price, 30-day sales and the daily sales trend, the commission offered to creators, how many creators already promote the product, shop name and score, categories and tags. It is made for sellers, creators, agencies and analysts who do product research and affiliate selection, and it needs no Douyin account, API keys, proxies or cookies.

### What is Douyin Shop?

Douyin Shop (抖音商城) is the online marketplace inside Douyin (抖音), the Chinese short-video app. Shops sell products there, and many products are listed in a creator alliance pool, where creators pick them up and promote them in short videos and live streams in exchange for a commission. Product pages are hosted on jinritemai.com.

### What data can you get?

The Actor has two modes. `search` returns the full field set. `shop` fills a shorter set: `productId`, `promotionId`, `url`, `title`, `imageUrl`, `price`, `monthlySales`, `shopId` and `tags`. The other fields are present but empty (`null`) in `shop` mode.

| Field | What it contains | Modes |
|---|---|---|
| `monthlySales` | Units sold in the last 30 days | search, shop |
| `dailySales` | Units sold per day over the last 30 days, as a list of `{date, sales}` | search |
| `price` | Price in CNY shown to buyers (the after-coupon price in search mode) | search, shop |
| `regularPrice` | Price in CNY before discounts; empty when the product has no discount | search |
| `commissionRate` | Commission offered to creators who sell the product, in percent | search |
| `commissionAmount` | Commission in CNY per sold unit at the current price | search |
| `cooperatingCreators` | Number of creators currently promoting the product | search |
| `positiveRate` | Share of positive reviews in percent; empty for new products | search |
| `shopId` | Shop ID (use it as input for `shop` mode) | search, shop |
| `shopName` | Shop name | search |
| `shopScore` | Shop experience score | search |
| `shopLogoUrl` | Shop logo URL | search |
| `productId` | Douyin Shop product ID | search, shop |
| `promotionId` | Promotion ID of the product in the creator alliance pool | search, shop |
| `title` | Product title (Chinese) | search, shop |
| `url` | Link to the product page | search, shop |
| `imageUrl` | Main image URL | search, shop |
| `whiteImageUrl` | Image on a white background; empty for about half of the products | search |
| `categoryLevel1` | Top-level category name | search |
| `categoryLevel2` | Second-level category name | search |
| `categoryLevel3` | Third-level (leaf) category name | search |
| `tags` | Selling-point labels such as 现货, 包邮, 运费险, 24小时发货 | search, shop |
| `recommendReason` | Why the platform recommends the product, for example a leaderboard entry; empty for many products | search |
| `searchKeyword` | The search keyword this product was found with | search |
| `type` | Record type: `product` | search, shop |

This is product-selection data, not just a product list: monthly sales, a 30-day daily sales series, positive-review rate, shop score, commission rate and amount, and the number of creators promoting each product.

### How to use Douyin Shop 抖音商城 Scraper

1. Open the Actor in Apify Console.
2. Choose a **Mode**: "Search products by keyword" (`search`) or "Products of shops" (`shop`).
3. Enter Chinese **Keywords** for `search`, or shop IDs or shop links in **Shops** for `shop`.
4. Set **Max results**, the total number of products for the whole run.
5. Click **Start**. An empty input `{}` searches 手机壳 (phone cases) and finishes in seconds, so you can test it first.
6. When the run ends, open the dataset and export it as JSON, CSV, Excel or another format.

A common workflow is to search a keyword first, pick interesting shops from the `shopId` field, and then run `shop` mode to list those shops' full catalogues.

### Input

| Field | Type | Required | What it does | Default |
|---|---|---|---|---|
| `mode` | string | Optional | `search` (search products by keyword) or `shop` (list all products of shops) | `search` |
| `keywords` | array of strings | Optional | Search keywords in Chinese, for example 手机壳. They are searched one after the other until Max results is reached. Falls back to 手机壳 when empty. Used in `search` mode. | prefilled with 手机壳 |
| `shops` | array of strings | Optional (needed for `shop` mode) | Shop IDs (the `shopId` field of search results) or shop links containing `id=<digits>` or `shop_id=<digits>`. Products are listed shop by shop until Max results is reached. | none |
| `maxResults` | integer | Optional | Maximum number of products to return in total for this run, from 1 to 5000. The run stops as soon as it is reached. You are charged per item returned. | 20 |

Search products by keyword:

```json
{
  "mode": "search",
  "keywords": ["手机壳", "蓝牙耳机"],
  "maxResults": 100
}
```

Keywords are searched one after the other. With `maxResults` 100, 蓝牙耳机 is only searched if 手机壳 returns fewer than 100 products.

List all products of a shop:

```json
{
  "mode": "shop",
  "shops": ["89304496"],
  "maxResults": 100
}
```

### Output example

A product from `search` mode (illustrative values):

```json
{
  "type": "product",
  "productId": "3737990489048220104",
  "promotionId": "3738199207278936409",
  "url": "https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3737990489048220104&origin_type=2631",
  "searchKeyword": "手机壳",
  "title": "磁吸手机壳 肤感 镜头全包 防摔",
  "imageUrl": "https://p9-aio.ecombdimg.com/obj/ecom-shop-material/example-main-image",
  "whiteImageUrl": "https://p9-aio.ecombdimg.com/obj/ecom-shop-material/example-white-image",
  "categoryLevel1": "3C数码及配件",
  "categoryLevel2": "手机及配件",
  "categoryLevel3": "手机保护套/壳",
  "price": 58.0,
  "regularPrice": 359.0,
  "monthlySales": 3331,
  "positiveRate": 92.34,
  "shopId": "89304496",
  "shopName": "示例数码配件旗舰店",
  "shopLogoUrl": "https://p3-ecom-qualification-sign.ecombdimg.com/example-logo",
  "shopScore": 81.0,
  "commissionRate": 10.0,
  "commissionAmount": 5.8,
  "cooperatingCreators": 647,
  "tags": ["流量扶持", "券", "运费险", "现货"],
  "recommendReason": "入选磁吸手机保护套/壳昨日视频带货热推榜",
  "dailySales": [{"date": "2026-09-14", "sales": 44}, {"date": "2026-09-15", "sales": 50}]
}
```

`dailySales` holds 30 days; the example shows the first two.

A product from `shop` mode (illustrative values; every field is present, the search-only ones are `null`):

```json
{
  "type": "product",
  "productId": "3737990489048220104",
  "promotionId": "3738199207278936409",
  "url": "https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3737990489048220104",
  "searchKeyword": null,
  "title": "磁吸手机壳 肤感 镜头全包 防摔",
  "imageUrl": "https://p9-aio.ecombdimg.com/obj/ecom-shop-material/example-main-image",
  "whiteImageUrl": null,
  "categoryLevel1": null,
  "categoryLevel2": null,
  "categoryLevel3": null,
  "price": 58.0,
  "regularPrice": null,
  "monthlySales": 3331,
  "positiveRate": null,
  "shopId": "89304496",
  "shopName": null,
  "shopLogoUrl": null,
  "shopScore": null,
  "commissionRate": null,
  "commissionAmount": null,
  "cooperatingCreators": null,
  "tags": ["运费险", "现货"],
  "recommendReason": null,
  "dailySales": null
}
```

### How much does it cost?

The Actor uses pay-per-event pricing. You pay for two events:

| Event | Price (USD) | When it is charged |
|---|---|---|
| `run-start` | $0.03 | Once per run, when the first request to the data source succeeds, even if that request returns nothing. Each extra keyword or shop that the run actually reaches adds one more start fee, charged before that keyword's or shop's first request. |
| `result` | $0.008 | For each product returned |

Worked examples:

- 100 products from one keyword: $0.03 + 100 × $0.008 = **$0.83**.
- 100 products where the first keyword only has 60 products and the second keyword supplies the other 40: 2 × $0.03 + 100 × $0.008 = **$0.86**. If the first keyword already has 100 products, the second keyword is never searched and the run costs $0.83.
- The default of 20 products from one keyword: $0.03 + 20 × $0.008 = **$0.19**.

On the free Apify plan, a run returns at most 10 results in total; any paid Apify plan removes the limit. A free-plan run also makes only one request to the data source, so extra keywords or shops are not reached, and in `shop` mode a first shop with fewer than 10 products ends the run there. On the free Apify plan each account can run this Actor up to 3 times per 24 hours and 10 times per 7 days, within a small lifetime free allowance shared across all our Actors, and all free accounts share a daily free budget. When any of these limits is reached, the run stops before fetching anything and nothing is charged.

The start fee is not charged when the data source fails from the start or rejects the IDs, or when your spending limit cannot cover it, so a run that cannot reach the data costs nothing. Each start fee after the first is kept even if that keyword or shop then fails or returns nothing. You never pay for more than `maxResults` items, you are never charged for items that were not delivered, and the run stops by itself if your spending limit is reached.

### Use cases

- **Product selection for live-stream and short-video sellers**: see what sells this month, at what price and with which commission, using `monthlySales`, `dailySales`, `price` and `commissionRate`.
- **Affiliate selection for creators and agencies**: find products that pay a good commission (`commissionRate`, `commissionAmount`) and check how crowded they already are (`cooperatingCreators`).
- **Competitor and shop research**: list a competitor's catalogue in `shop` mode and see which products carry its sales.
- **Category and trend analysis**: group products by `categoryLevel1` to `categoryLevel3` and follow the 30-day `dailySales` series.
- **China e-commerce market research**: compare prices, discounts (`price` vs `regularPrice`), review rates and shop scores across keywords.
- **AI and data projects**: clean product records for catalogues, price models and trend analysis.

### Integrations and API

If you need a Douyin Shop product API for your own code, you can start this Actor through the Apify API and read the results from its dataset. You can also schedule runs (for example daily, to build your own sales history) and connect the Actor to Apify integrations such as webhooks, Make, Zapier or Google Sheets.

Example with the Python `apify-client`:

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
## 蓝牙耳机 is only searched if 手机壳 returns fewer than 100 products
run = client.actor("clover_folktale/douyin-shop-scraper").call(run_input={
    "mode": "search",
    "keywords": ["手机壳", "蓝牙耳机"],
    "maxResults": 100
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### Tips and limits

- A search request returns up to 30 products and a shop request up to 10, so large runs make many requests; expect a few seconds per request.
- Different pages of one search do not overlap. A single search can reach about 500 products. Add more keywords if you need more products.
- Keywords and shops are processed one after the other, and the next one is only reached when the previous one cannot fill `maxResults`.
- `maxResults` can be set up to 5000 per run.
- Prices are in Chinese yuan (CNY). `price` is the price buyers pay after the shop's coupon; `regularPrice` is the price before it.
- `commissionRate` is the percentage creators earn on each sale; `commissionAmount` is the same in yuan at the current price.
- A search that finds nothing, or a shop without products, is skipped, but its start fee is still charged once its request has succeeded. If too many inputs return nothing, the run stops to protect your budget.
- The Douyin Shop data source is sometimes unavailable for a few hours at a time, mostly for keyword search; shop mode is affected less often. The Actor keeps retrying for about a minute on its own. If the source is still down, the run fails without charging you and its status message says so. Try again later, or schedule the run to repeat every hour.
- **Often empty fields:** `regularPrice` when the product has no discount; `positiveRate` for products without reviews yet; `whiteImageUrl` (about half of the products) and `recommendReason` for many products; `commissionRate`, `commissionAmount` and `cooperatingCreators` for products outside the creator alliance pool. In `shop` mode all search-only fields are empty.
- On the free Apify plan a run returns at most 10 results in total and makes only one request to the data source.

### FAQ

#### Do I need a Douyin account or cookies?

No. You do not need a Douyin account, API keys, proxies or cookies.

#### Is it legal to scrape Douyin Shop?

The Actor returns only public data: what anyone sees on a Douyin Shop product page and in the creator alliance product pool (price, sales, shop name and score, the commission offered to creators). It returns no buyer data, no private shop data, and nothing like phone numbers or messages. You are responsible for how you use the data and for following the laws that apply to you.

#### How fresh is the data?

The data is collected when you start a run. `monthlySales` covers the last 30 days and `dailySales` gives one value per day for those 30 days. Schedule regular runs if you want to track changes over time.

#### Why are some fields empty?

Some fields only exist for some products, for example `regularPrice` only when there is a discount, and commission fields only for products in the creator alliance pool. `shop` mode fills a shorter field set. See Tips and limits for the full list.

#### How many products can I get?

Up to 5000 per run with `maxResults`. One search keyword reaches about 500 products, so use several keywords for larger runs. The free Apify plan is limited to 10 results per run and one request to the data source.

#### Can I schedule runs and export the data?

Yes. You can schedule runs in Apify Console or start them through the API, and export every dataset as JSON, CSV, Excel and other formats.

#### Can I search in English?

The keywords are expected in Chinese, for example 手机壳 or 蓝牙耳机. Product titles and categories are returned in Chinese.

#### Why did my run fail with "The data source is unavailable right now"?

The upstream source could not reach Douyin Shop during your run. You were not charged. These outages usually clear within a few hours; running again later, or on an hourly schedule, normally works.

#### A field or filter is missing. What can I do?

Open an issue from the Actor page and it will be looked at.

### More tools from the same developer

- [Douyin 抖音 Scraper - Videos, Comments, User IDs & IP Location](https://apify.com/clover_folktale/douyin-scraper)
- [Douyin Xingtu 巨量星图 Scraper - KOL Search & Rankings](https://apify.com/clover_folktale/xingtu-scraper)
- [Taobao 淘宝 Scraper - Products, Prices, Sales & Shop Ratings](https://apify.com/clover_folktale/taobao-scraper)
- [1688 阿里巴巴 Scraper - Wholesale Prices & Suppliers](https://apify.com/clover_folktale/1688-scraper)
- [TikTok Shop Scraper - Products, SKUs, Reviews & Reviewer IDs](https://apify.com/clover_folktale/tiktok-shop-scraper)
- [Xiaohongshu 小红书 RedNote Scraper - Notes, Comments & User IP](https://apify.com/clover_folktale/xiaohongshu-scraper)

# Actor input Schema

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

Search products by keyword, or list all products of shops.

## `keywords` (type: `array`):

Search keywords, Chinese (for example 手机壳). Results are collected keyword by keyword until Max results is reached. Falls back to 手机壳 when empty.

## `shops` (type: `array`):

Shop IDs (the shopId field of search results) or shop links containing id=<digits>. Products are listed shop by shop until Max results is reached.

## `maxResults` (type: `integer`):

Maximum number of products to return in total for this run. You are charged per item returned. On the free Apify plan a run returns at most 10 results in total; any paid Apify plan removes the limit.

## Actor input object example

```json
{
  "mode": "search",
  "keywords": [
    "手机壳"
  ],
  "maxResults": 20
}
```

# Actor output Schema

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

All scraped items (JSON, CSV, Excel via the dataset API).

# 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 = {
    "keywords": [
        "手机壳"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("clover_folktale/douyin-shop-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 = { "keywords": ["手机壳"] }

# Run the Actor and wait for it to finish
run = client.actor("clover_folktale/douyin-shop-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 '{
  "keywords": [
    "手机壳"
  ]
}' |
apify call clover_folktale/douyin-shop-scraper --silent --output-dataset

```

## MCP server setup

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