# 1688 Scraper | Products, Reviews, Details, Wholesale Prices (`silentflow/1688-scraper`) Actor

Scrape 1688.com, Alibaba's Chinese wholesale marketplace, by keyword (English or Chinese) or offer ID. Get tiered pricing, MOQ, specs, color and size variants, verified supplier details, after-sales guarantees and buyer reviews. Built for dropshipping, Amazon FBA and private-label sourcing.

- **URL**: https://apify.com/silentflow/1688-scraper.md
- **Developed by:** [SilentFlow](https://apify.com/silentflow) (community)
- **Categories:** E-commerce, Other, Lead generation
- **Features:** Limited permissions
- **Stats:** 58 total users, 6 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## 1688 Wholesale Scraper

**Turn 1688.com into a clean wholesale supplier feed.** Product specs, tiered wholesale pricing, every available color and size, supplier trust signals and buyer reviews, structured and ready for analysis. In seconds, not hours.

### How it works

![How it works](https://api.apify.com/v2/key-value-stores/hPvPG863cYcfJmkbi/records/how-it-works-v2.png)

Type a product keyword in English or Chinese, or paste the offer IDs you already have, and press Start. Every result comes back as one structured record: pricing tiers, variant options, supplier profile, after-sales guarantees and a buyer review summary. Export to JSON, CSV or Excel, or pull it straight into your sourcing pipeline.

Three steps, no setup:

1. **Search or paste IDs.** Enter keywords (wireless earbuds or 蓝牙耳机) or a list of offer IDs.
2. **Get structured records.** Each product returns pricing, variants, supplier and reviews as clean fields, not a wall of Chinese HTML.
3. **Export or pipe.** Download as JSON, CSV, Excel, or read the dataset from the API into your own tools.

### ✨ Why teams choose this over other 1688 scrapers

Sourcing from 1688 by hand means copy-pasting Chinese product pages, guessing where the price actually breaks, and never knowing if a supplier is a real factory or a reseller. Running scrapers that hand back half the fields and break on the first run? Paying extra to unlock supplier and factory details other tools hide behind a toggle?

- ⭐ **Buyer reviews on every product.** Star rating, positive rate, and the exact words buyers use (fast shipping, great quality, responsive seller) with sample reviews and the variant each buyer bought. Most 1688 scrapers give you no reviews at all. This one reads buyer sentiment so you can spot a proven product before you contact the supplier.
- 🎨 **Every color and size, reliably.** The available variant options come back on every product that has them, straight from the product page. You see the full choice set (colors, sizes, models) even for listings other scrapers return half-empty.
- 🏭 **Know who you are buying from.** Every keyword row says whether the supplier is a manufacturer or a wholesaler, whether 1688 inspected its factory or its business, its 1688 rating out of 5 with five service scores (consultation, product, logistics, disputes, returns), its years on 1688, its badges and the share of its buyers who ordered again, next to the full product page. In a test search for iphone case, all 18 rows carried every one of these signals.
- 🔍 **Filter the way a sourcing buyer does.** Set a price range in yuan, a maximum MOQ, a supplier type (manufacturer, wholesaler, inspected factory, verified merchant) and a supplier city (Shenzhen, Yiwu, Guangzhou...). 1688 narrows the search on its side and every row is checked again before it is saved, so a product outside your filters never lands in your dataset. In that test, 18 of the first 50 offers were Shenzhen manufacturers at 10 yuan or less with an MOQ of 10 or less, and only those 18 were saved.
- 📈 **Sales and sponsored placements, separated.** Orders, total units sold, units and sales value of the last 30 days, and a flag on paid placements, so you can rank by real demand and skip the ads.
- 💰 **The real price breaks on every product.** The tiers that matter (10 units at one price, 1000 at another) come back as structured steps, so you can compare true unit cost across suppliers instead of eyeballing a headline price.
- 🛡️ **Trust and demand signals built in.** After-sales guarantees (quality guarantee, breakage and late-shipment compensation), buyer protections, monthly sales and 30-day sales value, so you can vet a supplier and gauge real demand in one row.
- 📋 **Full product specs.** Chip type, material, function, model and the rest, as clean name and value pairs, not buried in a description blob.
- 🖼️ **Full image gallery and video.** Every product image plus the product video when the supplier posts one, not just a single thumbnail.
- ⚡ **Fast by default, deep on demand.** Product, pricing, variants, reviews and supplier come from a single fast pass. Turn on the per-variant matrix (each color and size with its own stock and price) only when you need that depth.
- 🌏 **Search in English or Chinese.** Type wireless earbuds or 蓝牙耳机. Chinese keywords reach the full domestic catalog and return far more suppliers.
- 🎯 **Strict result cap.** Set Max results and get exactly that. No surprise overage from a scraper that ignores your limit.

### 🎯 What you can do with 1688 data

| Team | What they build |
|---|---|
| Sourcing | A shortlist of inspected factories in one city for a product, ranked by price break, rating and repeat-buyer rate, with supplier guarantees on each row |
| E-commerce | A landed-cost and margin model from cost, variants and shipping weight before importing a single unit |
| Dropshipping | A catalog of suppliers that sell from one unit (Max MOQ 1), with consignment support and the exact colors and sizes each offers |
| Private label | A factory comparison by years on platform, review sentiment, response rate and verification status |
| Market research | A view of wholesale price ranges and best-selling products across a category, tracked over time |
| Procurement | A weekly watch on a set of offer IDs for price, stock and minimum-order changes |
| Agencies | A supplier database refreshed on a schedule and fed to clients as clean CSV or a Google Sheet |

### 📥 Input parameters

| Field | Type | Description |
|---|---|---|
| `keywords` | array | Products to search for, English or Chinese. Each keyword is searched separately and Max results applies per keyword. |
| `offerIds` | array | Specific product IDs to scrape directly. Can be combined with keywords; offer IDs are scraped as given, without filters. |
| `maxResults` | integer | Maximum products per keyword. Default 100. With filters on, the run reads further into the results until it has this many matching products. |
| `sortBy` | string | `relevance`, `bestSelling`, `priceAsc` or `priceDesc`. |
| `minPrice` / `maxPrice` | number | Price range in Chinese yuan (`10` and `20`). A product is kept when any of its prices (MOQ price, bulk tier or promotion) falls in the range. |
| `maxMoq` | integer | Largest minimum order quantity you accept. `1` keeps suppliers that sell single units. |
| `supplierType` | string | `any` (default), `manufacturer`, `wholesaler`, `inspectedFactory` (深度验厂) or `verifiedMerchant` (实商). |
| `supplierCity` | string | One supplier city. English names of the main sourcing hubs work (Shenzhen, Guangzhou, Dongguan, Yiwu, Ningbo, Shantou, Quanzhou...); any other city in Chinese (`临沂`). |
| `includeSkuMatrix` | boolean | Also return the per-variant matrix (each color and size with its own stock and price). Off by default for the fastest runs. Colors, sizes, pricing, reviews and supplier come regardless. |

Filters apply to keyword search only. 1688 applies the price range, MOQ and city on its side; paid placements it mixes into the results ignore them, so every row is checked again against all your filters before it is saved, and the supplier type is checked on each row.

### 📊 Output data

Each product is one record. A keyword row from a real run for `iphone case` (Shenzhen manufacturers, at most 10 yuan, MOQ up to 10), trimmed to two images, four specs, one guarantee and one review:

```json
{
  "id": "658183485760",
  "url": "https://detail.1688.com/offer/658183485760.html",
  "offerId": "658183485760",
  "title": "华为mate50pro手机壳素皮适用MATE40PRO防摔外壳新款高端30保护套",
  "detailUrl": "https://detail.1688.com/offer/658183485760.html",
  "categoryId": "1042207",
  "specs": [
    { "name": "适用机型", "value": "华为" },
    { "name": "材质", "value": "仿皮PU素皮" },
    { "name": "工艺", "value": "磨砂" },
    { "name": "款式", "value": "后盖款" }
  ],
  "skuProperties": [
    { "name": "颜色", "values": ["青色", "橙色", "黑色", "绿色", "紫色"] }
  ],
  "customization": false,
  "supportsMixedOrders": true,
  "dropship": { "enabled": true, "consignTiers": [{ "price": 10, "beginAmount": 2, "endAmount": 0 }] },
  "services": [
    { "name": "晚发必赔", "description": "若商家未按订单约定的时间发货，您可以在订单详情申请赔付" }
  ],
  "buyerProtections": ["7天包换", "48小时发货", "诚e赊"],
  "freightInsurance": false,
  "supplier": {
    "companyName": "深圳市宝安区环金马电子厂",
    "memberId": "b2b-221172181955265193",
    "userId": "2211721819552",
    "loginId": "环金马科技加工厂",
    "location": "广东深圳市",
    "sellerType": "生产加工",
    "isVerified": true,
    "certifications": ["实商"],
    "winportUrl": "https://winport.m.1688.com/page/index.html?memberId=b2b-221172181955265193",
    "repeatRate": "35%",
    "responseRate": "92%"
  },
  "businessType": "manufacturer",
  "factoryInspected": false,
  "businessInspected": true,
  "supplierRating": 4,
  "serviceScores": { "consultation": 3, "product": 2.67, "logistics": 3.86, "disputes": 4, "returns": 3.33 },
  "sellerYears": 6,
  "supplierBadges": ["实商", "深度验商"],
  "repurchaseRate": "35%",
  "productRepurchaseRate": "66%",
  "price": { "min": 8, "max": 10, "currency": "CNY" },
  "promoPrice": null,
  "unit": "个",
  "quantityPrices": [
    { "price": 10, "beginAmount": 2, "endAmount": 499 },
    { "price": 9, "beginAmount": 500, "endAmount": 9999 },
    { "price": 8, "beginAmount": 10000, "endAmount": 0 }
  ],
  "minOrderQuantity": 2,
  "stock": 109420,
  "soldCount": 895,
  "orderCount": 668,
  "unitsSold": 24864,
  "monthlySales": 8,
  "gmv30Days": 90,
  "unitWeight": 0.055,
  "reviews": {
    "total": 600,
    "rating": 5,
    "goodRate": 100,
    "items": [
      { "content": "物流很快，手机壳质量很好，服务很好", "date": "2023-04-22", "sku": "颜色:青色; 适用型号:Mate50精孔" }
    ]
  },
  "province": "广东",
  "city": "深圳市",
  "shipping": { "location": "广东深圳", "deliveryDays": 2, "freeShipping": false },
  "images": [
    "https://cbu01.alicdn.com/img/ibank/O1CN0196KGN82KQs13CuV7N_!!2211721819552-0-cib.jpg",
    "https://cbu01.alicdn.com/img/ibank/O1CN01cBz3Qb2KQsBPLs7jk_!!2211721819552-0-cib.jpg"
  ],
  "videoUrl": "https://cloud.video.taobao.com/play/u/2211721819552/p/2/e/6/t/1/386741737147.mp4",
  "isSponsored": false,
  "isCrossBorderTrade": false,
  "sourceKeyword": "iphone case",
  "sourceType": "search",
  "scrapedAt": "2026-11-06T02:21:27Z"
}
```

`price` is the regular price range from the price tiers. When the listing shows a promotion below it (限时价), the promotional price is in `promoPrice`. A row scraped from `offerIds` has `sourceType` `offerId` and carries the product page fields; the supplier signals that only the search listing shows (business type, inspections, rating, service scores, years, badges, repurchase rates, orders, units sold, 30-day sales, sponsored flag) are `null` there, and `province` and `city` come from the shipping origin.

When you turn on `includeSkuMatrix`, products that expose it also carry a `skuVariants` array, one row per color and size:

```json
{
  "skuVariants": [
    { "skuId": "6130776786823", "specId": "f561c4f7...", "specs": "Black / M", "stock": 7890, "saleCount": 12 },
    { "skuId": "6130776786824", "specId": "a63c985e...", "specs": "White / L", "stock": 7883, "saleCount": 4 }
  ]
}
```

### 🗂️ Data fields

| Category | Fields |
|---|---|
| Identity | `id`, `url`, `offerId`, `title`, `detailUrl`, `categoryId`, `sourceType`, `sourceKeyword`, `scrapedAt` |
| Media | `images` (full gallery), `videoUrl` |
| Pricing | `price` (min, max, currency), `promoPrice`, `unit`, `quantityPrices` (tiered: price, beginAmount, endAmount) |
| Variants | `skuProperties` (variant options: name plus every value, colors and sizes), `skuVariants` (per-variant skuId, specId, specs, stock, saleCount, opt-in), `minOrderQuantity`, `stock`, `unitWeight` |
| Sales | `soldCount` (units sold as the product page shows it), `unitsSold` (total units sold), `orderCount` (orders), `monthlySales` (units sold in the last 30 days), `gmv30Days` (sales value of the last 30 days in yuan, a floor: 1688 shows ranges such as 1万+) |
| Trade | `dropship` (enabled, consignment price), `customization`, `supportsMixedOrders` (混批), `isCrossBorderTrade`, `shipping` (location, postFee, deliveryDays, freeShipping) |
| Trust | `services` (after-sales guarantees, each with name and a plain-language description), `buyerProtections`, `freightInsurance`, `isSponsored` (paid placement) |
| Supplier signals | `businessType` (`manufacturer`, `wholesaler`, `agent`, `serviceProvider`), `factoryInspected` (深度验厂), `businessInspected` (深度验商), `supplierRating` (0 to 5), `serviceScores` (consultation, product, logistics, disputes, returns, each 0 to 5), `sellerYears`, `supplierBadges`, `repurchaseRate` (the shop's repeat buyers), `productRepurchaseRate` (this product's), `province`, `city` |
| Supplier | `companyName`, `legalCompanyName`, `memberId`, `userId`, `loginId`, `sellerType`, `isVerified`, `repeatRate`, `responseRate`, `certifications`, `serviceScores`, `winportUrl`, `location` |
| Reviews | `total`, `rating`, `goodRate`, `withImagesCount`, `impressionTags` (sentiment keyword plus count), `items` (per review: rating, content, date, sku, images) |

A keyword row carries 47 top-level fields; in the test run above, 41 of them were filled on most rows. In the full row behind the example, the `supplier` object carries 13 populated fields and `serviceScores` 5; `reviews` has up to 6 top-level fields plus a sample of individual reviews with 5 fields each, and `price` up to 4. A value 1688 does not show is `null`, never an empty string. `id`, `offerId`, `url` and `detailUrl` are stable and permanent; image URLs stay valid for a couple of weeks; the product video URL is a CDN link that can expire sooner. Timestamps are ISO 8601 (`scrapedAt`).

### 🚀 Examples

#### Find wireless earbud suppliers

```json
{ "keywords": ["wireless earbuds"], "maxResults": 100 }
```

#### Search the domestic catalog in Chinese

```json
{ "keywords": ["蓝牙耳机", "充电宝"], "maxResults": 200 }
```

#### Find the cheapest suppliers first

```json
{ "keywords": ["phone case"], "sortBy": "priceAsc", "maxResults": 50 }
```

#### Pull the best-selling products in a category

```json
{ "keywords": ["LED strip lights"], "sortBy": "bestSelling", "maxResults": 100 }
```

#### Get per-variant stock and price for apparel

```json
{ "keywords": ["卫衣 女"], "includeSkuMatrix": true, "maxResults": 60 }
```

#### Find inspected factories in Shenzhen

```json
{ "keywords": ["蓝牙耳机"], "supplierType": "inspectedFactory", "supplierCity": "Shenzhen", "maxResults": 50 }
```

#### Source samples and dropshipping stock from single units

```json
{ "keywords": ["phone case"], "maxMoq": 1, "maxPrice": 5, "sortBy": "bestSelling", "maxResults": 100 }
```

#### Shortlist manufacturers in a price band

```json
{ "keywords": ["iphone case"], "supplierType": "manufacturer", "minPrice": 2, "maxPrice": 10, "maxMoq": 10, "maxResults": 100 }
```

#### Audit specific products you already source

```json
{ "offerIds": ["1063153988432", "738026063940"] }
```

### 🤖 Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:

```
You have access to the 1688 Wholesale Scraper on Apify: silentflow/1688-scraper

Input schema:
- keywords (array of strings): products to search, English or Chinese
- offerIds (array of strings): specific product IDs, scraped as given; can be combined with keywords
- maxResults (integer, default 100): products per keyword
- sortBy (string): relevance | bestSelling | priceAsc | priceDesc
- minPrice, maxPrice (number, CNY): keep products with any price in the range (keyword search only)
- maxMoq (integer): keep products whose minimum order is at most this (keyword search only)
- supplierType (string, default any): any | manufacturer | wholesaler | inspectedFactory | verifiedMerchant
- supplierCity (string): one city, English hub name (Shenzhen, Yiwu...) or Chinese (深圳)
- includeSkuMatrix (boolean, default false): also return per-variant stock and price

Output per product (null when 1688 does not show a value):
- id, url, offerId, title, detailUrl, categoryId, images[], videoUrl
- price { min, max, currency }, promoPrice, unit
- quantityPrices[] { price, beginAmount, endAmount }  (tiered wholesale pricing)
- skuProperties[] { name, values[] }  (variant options: colors, sizes)
- skuVariants[] { skuId, specId, specs, stock, saleCount }  (per-variant, opt-in)
- minOrderQuantity, stock, soldCount, unitsSold, orderCount, monthlySales, gmv30Days, unitWeight
- services[] { name, description }, buyerProtections[], freightInsurance, supportsMixedOrders, isSponsored
- dropship { enabled, consignTiers[] }, customization, isCrossBorderTrade, shipping { location, postFee, deliveryDays, freeShipping }
- businessType (manufacturer | wholesaler | agent | serviceProvider), factoryInspected, businessInspected
- supplierRating (0-5), serviceScores { consultation, product, logistics, disputes, returns }, sellerYears, supplierBadges[]
- repurchaseRate (shop), productRepurchaseRate (this product), province, city
- supplier { companyName, memberId, userId, loginId, sellerType, isVerified, repeatRate, responseRate, certifications[], serviceScores, winportUrl, location }
- reviews { total, rating, goodRate, withImagesCount, impressionTags[] { name, count }, items[] { rating, content, date, sku, images } }
- sourceType (search | offerId), sourceKeyword, scrapedAt

No login, no API key. Proxies included. Use apify-client for Python or JS.
```

### 💻 Integrations

#### Build a supplier shortlist in Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("silentflow/1688-scraper").call(run_input={
    "keywords": ["wireless earbuds"],
    "supplierType": "manufacturer",
    "maxMoq": 50,
    "sortBy": "bestSelling",
    "maxResults": 100,
})

suppliers = []
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item.get("isSponsored"):
        continue  # keep 1688's organic ranking only
    s = item.get("supplier") or {}
    r = item.get("reviews") or {}
    suppliers.append({
        "title": item["title"],
        "unit_price": item["price"]["min"],
        "moq": item["minOrderQuantity"],
        "company": s.get("companyName"),
        "factory_inspected": item.get("factoryInspected"),
        "rating": item.get("supplierRating"),
        "years": item.get("sellerYears"),
        "repeat_rate": item.get("repurchaseRate"),
        "good_rate": r.get("goodRate"),
    })

suppliers.sort(key=lambda x: (not x["factory_inspected"], -(x["rating"] or 0), x["unit_price"]))
for s in suppliers[:10]:
    print(s)
```

#### Monitor price and stock changes in Node.js

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

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('silentflow/1688-scraper').call({
    offerIds: ['1063153988432', '738026063940'],
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const p of items) {
    console.log(`${p.offerId}: ${p.price.min} CNY, stock ${p.stock}, MOQ ${p.minOrderQuantity}`);
}
```

#### Export a category to CSV

```python
import csv
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("silentflow/1688-scraper").call(run_input={"keywords": ["phone case"], "maxResults": 200})

with open("suppliers.csv", "w", newline="") as f:
    w = csv.writer(f)
    w.writerow(["offerId", "title", "minPrice", "moq", "company", "monthlySales"])
    for it in client.dataset(run["defaultDatasetId"]).iterate_items():
        s = it.get("supplier") or {}
        w.writerow([it["offerId"], it["title"], it["price"]["min"], it["minOrderQuantity"], s.get("companyName"), it.get("monthlySales")])
```

### 📈 Performance

| Metric | Value |
|---|---|
| Speed | Fast by default: product, pricing, variant options, reviews and supplier from a single pass |
| Depth on demand | Turn on `includeSkuMatrix` for per-variant stock and price when you need it |
| Always included | Tiered pricing, specs, variant options, gallery, shipping, supplier and review summary on every product |
| Search depth | Up to 2,000 products per keyword |
| Filters | Price range, maximum MOQ, supplier type and supplier city, checked on every row before it is saved |
| Languages | English and Chinese keywords |
| Freshness | Live, fetched on demand at run time, no caching |

### 💾 Data export

Every run writes to a dataset you can export as JSON, CSV, Excel, HTML or RSS from the Apify console, or pull programmatically:

```
https://api.apify.com/v2/datasets/{DATASET_ID}/items?format=csv&token=YOUR_TOKEN
```

### 💡 Tips for best results

- Use Chinese keywords for the widest selection. 1688 is a domestic Chinese marketplace, so 蓝牙耳机 returns far more suppliers than its English equivalent.
- Sort by `bestSelling` to surface proven products with real order volume before you contact a supplier.
- Read `quantityPrices` to find the order quantity where the unit price drops. The break point is often lower than the listing headline suggests.
- Use `reviews.goodRate` and the review samples to filter for products buyers actually like, then `monthlySales` to confirm real demand.
- Leave `includeSkuMatrix` off for fast category scans, and turn it on only for the shortlist where you need each color and size with its own stock and price.
- Find factories, not resellers: set `supplierType` to `inspectedFactory`, then sort your sheet by `supplierRating` and `sellerYears`.
- Use `supplierCity` to go straight to a sourcing cluster: Shenzhen for electronics, Yiwu for small commodities, Guangzhou for apparel and beauty, Dongguan for hardware, Shantou for toys.
- Set `maxMoq` to `1` for samples and dropshipping, and drop rows where `isSponsored` is true to see 1688's organic ranking.

### ❓ FAQ

**What does the scraper return?**
A structured record per product: title, images, video, tiered pricing, variant options, minimum order quantity, stock, supplier profile, after-sales guarantees, buyer protections, demand signals and a buyer review summary.

**What is 1688?**
1688.com is Alibaba's domestic Chinese B2B wholesale marketplace, the factory-direct source that sits upstream of Alibaba.com and AliExpress. It is where most cross-border sellers buy at wholesale prices.

**Can I search in English?**
Yes. English and Chinese keywords both work. Chinese keywords reach the full domestic catalog and return more results.

**Do I need a 1688 account?**
No. The scraper reads publicly available product data. No login, no API key.

**How do I scrape a specific product?**
Put its offer ID (the number in the product URL) in the `offerIds` field. You can combine offer IDs and keywords in one run; offer IDs are scraped as given, without the filters.

**Can I keep only manufacturers, or only inspected factories?**
Yes. `supplierType` keeps one kind of supplier: `manufacturer` or `wholesaler` (the business model the supplier declares to 1688), `inspectedFactory` (1688 inspected the factory on site, 深度验厂) or `verifiedMerchant` (1688's 实商 badge). Every keyword row also carries `businessType`, `factoryInspected` and `businessInspected`, so you can filter further in your sheet.

**Are sponsored listings included?**
Yes, as 1688 shows them, and each row says so in `isSponsored`. 1688 mixes paid placements into its results and they ignore the price, MOQ and city filters, so they are checked against your filters like every other row before they are saved.

**Are rows outside my filters saved?**
No. A product whose price, MOQ, supplier type or city falls outside your filters is left out before it is saved, including when its full product page turns out to differ from the search listing. The run log says how many were left out.

**Does it return review text?**
Yes. Each review summary carries the total count, star rating, positive rate and top sentiment keywords, plus a sample of individual reviews with their text, star level, purchase date and the variant the buyer bought.

**Do I get every color and size?**
The variant options (available colors, sizes and models) come on every product that lists them. For the deeper matrix with per-variant stock and price, turn on `includeSkuMatrix`; it is added when the product page exposes it.

**How do the sort and filter options combine?**
`sortBy` and the filters apply to each keyword search, and `maxResults` caps each keyword separately. For example, `keywords: ["phone case"]` with `sortBy: "bestSelling"`, `maxMoq: 1` and `maxResults: 50` returns the 50 best-selling phone case offers you can order one at a time. With strict filters a keyword can run out of matching products before `maxResults`; the run then moves on and says so in the log.

**What is the difference between soldCount and unitsSold?**
`soldCount` is the sales figure the product page shows; `unitsSold` is the total units sold that the search listing reports, often higher for older offers. `orderCount` counts orders, and `monthlySales` the units sold in the last 30 days.

**How many products can I get per keyword?**
Up to 2,000 per keyword, capped by your Max results setting.

**Is the price in dollars?**
Prices are in Chinese yuan (CNY), the currency 1688 lists in. The `price` object includes the currency so you can convert as needed.

**Are the image and video links permanent?**
`offerId` and `detailUrl` are stable. Image URLs stay valid for a couple of weeks. The product video is a CDN link that can expire sooner, so download it if you need to keep it.

### ⚖️ Legal

This Actor extracts publicly available data from 1688.com. It does not bypass any login, paywall or CAPTCHA. Users are responsible for complying with 1688's terms of service and applicable data protection laws (GDPR, CCPA, and PIPL where relevant). When the output contains personal data, such as supplier contact names or reviewer nicknames, users must handle it accordingly. The data returned is informational; verify accuracy for regulated use cases.

### 🔗 Related scrapers

Building a China sourcing pipeline? See the full set of marketplace and supplier scrapers on our profile: [silentflow on Apify](https://apify.com/silentflow).

### 📬 Support

Need something this scraper does not do yet? We ship features fast.

- Feature requests go straight to our backlog
- Enterprise needs? We do custom integrations and high-volume plans
- Pricing questions? Check the Monetization tab on the actor page

Response time: usually under 24 hours.

Check out our other scrapers: [silentflow on Apify](https://apify.com/silentflow)

# Actor input Schema

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

Products to search on 1688, one keyword per line, in English (<code>iphone case</code>, <code>wireless earbuds</code>) or Chinese (<code>手机壳</code>, <code>蓝牙耳机</code>). Each keyword is searched on its own and Max results applies per keyword. Chinese keywords usually return more and better-matched products, since 1688 is a domestic Chinese marketplace. 1688 lists up to 2,000 products per keyword.

## `offerIds` (type: `array`):

Specific products to scrape directly, by the number in their 1688 address (<code>735353578254</code> from <code>detail.1688.com/offer/735353578254.html</code>). Can be combined with keywords. Offer IDs are scraped as given: the filters below apply to keyword search only.

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

How many products to save per keyword. With filters on, the run reads further into the results until it has this many matching products or 1688 runs out. Cost scales with the rows delivered, so set it to what you need.

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

How 1688 orders the search results. <code>Best selling</code> puts the products with the most orders first.

## `minPrice` (type: `number`):

Lowest unit price you want, in Chinese yuan (<code>10</code>). A product is kept when any of its prices (the MOQ price, a bulk tier or a promotion) reaches the range. Leave empty for no floor.

## `maxPrice` (type: `number`):

Highest unit price you want, in Chinese yuan (<code>20</code>). A product is kept when any of its prices (the MOQ price, a bulk tier or a promotion) is at or below it. Leave empty for no ceiling.

## `maxMoq` (type: `integer`):

Largest minimum order quantity you accept (<code>1</code> keeps only suppliers that sell single units, for samples and dropshipping; <code>50</code> keeps offers you can order from 50 units or fewer). Leave empty for no limit.

## `supplierType` (type: `string`):

Keep only one kind of supplier. <code>Manufacturer</code> (生产加工) and <code>Wholesaler</code> (经销批发) are the business model the supplier declares to 1688. <code>Inspected factory</code> keeps suppliers whose factory 1688 inspected on site (深度验厂). <code>Verified merchant</code> keeps suppliers with 1688's 实商 badge. Rarer types return fewer products per page, so the run reads more pages to fill Max results.

## `supplierCity` (type: `string`):

Keep only suppliers based in one city. The English names of the main sourcing hubs work (<code>Shenzhen</code>, <code>Guangzhou</code>, <code>Dongguan</code>, <code>Yiwu</code>, <code>Ningbo</code>, <code>Shantou</code>, <code>Quanzhou</code>...); any other city can be typed in Chinese (<code>深圳</code>, <code>临沂</code>). A county-level city such as Yiwu shows its parent city in the province field (金华). Leave empty for all of China.

## `includeSkuMatrix` (type: `boolean`):

Also fetch the per-variant matrix (each color and size with its own stock and price). This adds time. Available colors and sizes, tiered pricing, reviews and supplier details come on every product regardless. Leave off for the fastest runs.

## Actor input object example

```json
{
  "keywords": [
    "iphone case"
  ],
  "maxResults": 20,
  "sortBy": "relevance",
  "supplierType": "any",
  "includeSkuMatrix": false
}
```

# Actor output Schema

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

Every product with id, url, title, price range and promotion in CNY, unit, price tiers, MOQ, stock, units sold, orders, 30-day sales, specs, variants, guarantees, buyer protections, reviews, supplier identity, business type, inspections, rating, service scores, years on 1688, repurchase rates, province, city, images and video.

## `overview` (type: `string`):

Title, supplier, price range, MOQ, units sold, city and link for each product.

## `suppliers` (type: `string`):

Business type, factory and business inspection, rating, years on 1688, repeat buyers, orders, 30-day sales, province, city and sponsored flag for each product's supplier.

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

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

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

```

## MCP server setup

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