# 1688 Wholesale Products Scraper - Prices, Suppliers, No Login (`benthepythondev/1688-wholesale-products-scraper`) Actor

Returns 1688.com wholesale products for any keyword (Chinese or English) or product link: price, sold count, repurchase rate, supplier name, city, years and six service scores. Optional full record: price tiers, MOQ, SKUs with stock, attributes, freight. No login, no browser.

- **URL**: https://apify.com/benthepythondev/1688-wholesale-products-scraper.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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 Products Scraper: Prices, Suppliers, No Login

Get 1688.com, China's domestic wholesale marketplace, as clean rows: product, price in yuan, sold count, repurchase rate, and the supplier behind it (company, province and city, years on 1688, factory inspection, six service scores). Turn on full records to add quantity price tiers, minimum order (MOQ), every SKU with its price and stock, attributes, rating, reviews, ship-from place and dispatch promise. Search by keyword (Chinese or English), by 1688 search link, or give product links. No login, no cookies, no browser. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

**Price per product:** $0.0015 on the Free plan, $0.0014 on Bronze, $0.0013 on Silver, $0.0012 from Gold up. A **full record** is a second event: $0.0025 Free, $0.0024 Bronze, $0.0023 Silver, $0.0021 from Gold up. So 1,000 products cost $1.50 without and $4.00 with full records on the Free plan. Searches that return nothing, pages 1688 does not serve and ads you leave out are not charged.

> Until the new price takes effect (about two weeks after this version was published), a product costs $0.0025 and full records are not charged at all.

### 🔎 What is the 1688 Wholesale Products Scraper?

1688.com is where Chinese factories and wholesalers sell to resellers, at prices well below AliExpress or Amazon. Sourcing agents, dropshippers, Amazon and Shopify sellers use it to find a product's factory price, compare suppliers and check minimum orders. This Actor does what a buyer does in the search box and on the product page, and returns every product as one row with its supplier.

#### What data does it extract?

- **Product:** `offerId`, `title`, `url`, `image`, `price` (CNY), `isAd`, `tags`
- **Demand:** `soldText` and `soldCount` ("已售10万+件" = 100000), `soldScope` (this listing or all sellers of the item), `repurchaseRatePercent`, `bookedCount`
- **Supplier:** `supplier.name`, `province`, `city`, `yearsOnPlatform`, `isFactoryInspected`, `isBusinessInspected`, `isSuperFactory`, `serviceScores` (overall, consultation, logistics, disputes, returns, goods), `shopUrl`, `shopReturnBuyerRatePercent`
- **Full record** (`includeDetails`, or any product link): `minOrderQuantity`, `unit`, `priceTiers` (quantity breaks), `priceMin`, `priceMax`, `skus` (name, price, stock, sold), `totalStock`, `rating`, `goodRatingPercent`, `reviewsCount`, `reviewTags`, `categoryId`, `categoryName`, `attributes`, `images`, `shipsFrom`, `dispatchPromise`, `guarantees`, `company` (registered name, factory or trader, 3-month buyer repeat rate, service score, shop and contact page link)

#### What users of other 1688 Actors report, and what this one does

| Reported in other 1688 Actors' issue tabs | Here |
|---|---|
| "Only 20 products" | Reads page after page (60 per page) until your limit or the end of 1688's list: up to 2,000 per keyword. The status message says how many 1688 counted. |
| "Search stalls indefinitely with no progress or error, until timeout" | Every request has a 30 s limit, a refused visitor is replaced at once, and the run stops 75 s before its timeout with its rows saved. |
| "The MOQ parameter is not being respected" | `minOrderQuantity` comes from the product's own trade record, next to the full quantity price tiers. |
| "includeSkuDetails returns empty variants" | `skus` lists every variant with price and stock from the product page. |
| "Supplier enrichment capped at ~10 suppliers" | Supplier name, place, years and the six service scores are on every search row, at no extra charge. |
| Intermittent RISK_CONTROL / rgv587 failures | A refused visitor is dropped and the request goes out again from a new visitor with another browser fingerprint, then through Apify datacenter and residential addresses. Nothing is solved or bypassed by force, and a product that stays refused is not charged. |

### ⬇️ Input

| Field | Type | Description |
|---|---|---|
| `keywords` | array | Search words, one search each. Chinese finds far more (蓝牙耳机: 2,000; "bluetooth earphones": 176) |
| `startUrls` | array | 1688 product links or ids (always read with the full record), or 1688 search links |
| `maxResultsPerKeyword` | integer | Saved products per keyword, up to 2,000 (default 20) |
| `sortBy` | string | `relevance`, `price-asc`, `sales` (30-day best sellers) |
| `minPrice`, `maxPrice` | integer | Price bounds in yuan, 1688's own filter |
| `includeDetails` | boolean | Add the full record to each search row |
| `excludeAds` | boolean | Leave out paid placements |

Input names of other 1688 Actors also work: `searchQueries`, `queries`, `offerIds`, `productUrls`, `maxItems`, `maxResults`.

#### Example input

```json
{
  "keywords": ["蓝牙耳机", "phone case"],
  "maxResultsPerKeyword": 100,
  "sortBy": "sales",
  "includeDetails": true
}
```

### ⬆️ Output

One row with the full record (lists shortened):

```json
{
  "searchQuery": "蓝牙耳机",
  "page": 1,
  "position": 1,
  "offerId": "900701207194",
  "title": "爆款跨境私模2026年新款无线蓝牙耳机降噪长续航入耳式工厂批发",
  "url": "https://detail.1688.com/offer/900701207194.html",
  "price": 69.0,
  "currency": "CNY",
  "soldText": "全网1000+件",
  "soldCount": 1000,
  "soldScope": "all sellers of this item",
  "repurchaseRatePercent": 18.0,
  "shopReturnBuyerRatePercent": 47.0,
  "isAd": false,
  "tags": ["退货包运费", "先采后付", "7×24H响应", "深度验厂"],
  "supplier": {
    "name": "深圳市声达人科技有限公司",
    "province": "广东",
    "city": "深圳市",
    "yearsOnPlatform": 7,
    "isFactoryInspected": true,
    "shopUrl": "http://sdrtws.1688.com"
  },
  "detailsStatus": "ok",
  "minOrderQuantity": 1,
  "unit": "条",
  "priceTiers": [{"minQuantity": 1, "price": 25.0}],
  "priceMin": 25.0,
  "priceMax": 200.0,
  "skus": [{"skuId": "6098365385376", "name": "粉i50", "price": 69.0, "stock": 30, "sold": 0}],
  "totalStock": 4816,
  "rating": 4.9,
  "goodRatingPercent": 97.5,
  "reviewsCount": 97,
  "categoryName": "蓝牙耳机",
  "attributes": {"芯片类型": "杰理", "续航时间": "8小时以上", "品牌": "声达人"},
  "shipsFrom": "广东省深圳市",
  "dispatchPromise": "预计16小时发货，承诺10天发货",
  "guarantees": ["退货包运费", "晚发必赔", "极速退款"],
  "company": {"name": "深圳市声达人科技有限公司", "type": "factory", "buyerRepeatRate3Months": "47.93%", "serviceScore": "4.5分"},
  "scrapedAt": "2026-10-25T21:49:56+00:00"
}
```

A run also writes `SUMMARY` to its key-value store: products per keyword, what 1688 counted, how each search ended, requests made.

### 🤖 For AI agents

One input to copy: `{"keywords": ["保温杯"], "maxResultsPerKeyword": 30, "sortBy": "sales"}`. Inputs are arrays, nothing needs a login or key, and the default run returns rows in seconds. Product titles and attributes are in Chinese; translate them in your own step.

### 💡 Use cases

- 🏷️ **Find the factory price:** look up what an Amazon or TikTok Shop product costs at the source, with quantity breaks.
- 🏭 **Compare suppliers:** rank by years on 1688, factory inspection, repurchase rate and service scores before you send a message.
- 📦 **Plan an order:** MOQ, SKU stock, ship-from city and dispatch promise in one row.
- 📈 **Spot what sells:** sort by 30-day sales and follow sold counts over scheduled runs.

### ⚠️ Limits, stated plainly

- 1688 counts at most 2,000 products per keyword. For more, split the topic into narrower keywords or price ranges.
- Texts are as the sellers wrote them, mostly Chinese. Prices are in yuan (CNY) and do not include shipping out of China.
- Sold counts are 1688's rounded figures ("10万+"); `soldCount` is their lower bound.
- A full record needs one product page per product, read through residential addresses: about 1 to 2 seconds per product. A page 1688 does not serve keeps its search data, gets `detailsStatus: "refused"` and is not charged for details.
- Seller phone numbers and the buyer-only "contact supplier" data are not read; `contactPageUrl` links to the supplier's public contact page.

### ❓ FAQ

**Do I need a 1688 account, cookies or a proxy?** No. The Actor brings its own routes.

**Can I search in English?** Yes, but 1688 matches English words against the few listings written for export buyers. Chinese keywords return many times more products; a translator gives you the words.

**How many products per keyword?** Up to 2,000, the most 1688 lists. Set `maxResultsPerKeyword` to 2000.

**What is the difference between `price` and `priceTiers`?** `price` is the card price in the search results. `priceTiers` are the seller's quantity breaks, and `skus` the price per variant, both from the product page.

**Are ads included?** Yes, flagged with `isAd: true`. Turn on `excludeAds` to leave them out (and not pay for them).

**What happens at my spending limit or timeout?** The run stops cleanly, keeps every saved row and says so in its status message. A resurrected run continues where it stopped, without repeats.

**Can I monitor prices over time?** Schedule the same input daily and compare `price`, `priceTiers` and `soldCount` by `offerId`.

**Is it legal?** It reads public product pages a logged-out visitor sees and returns product and company data, no personal data of private people. Check 1688's terms and your local law for your use, and respect GDPR and CAN-SPAM if you use the company data for outreach.

### 🔗 You might also like

- [AliExpress Product Scraper](https://apify.com/benthepythondev/aliexpress-product-scraper): full AliExpress records with SKUs and shipping
- [Amazon Search Scraper](https://apify.com/benthepythondev/amazon-search-scraper): Amazon results by keyword, to compare with the factory price
- [TikTok Shop Scraper](https://apify.com/benthepythondev/tiktok-shop-scraper): what sells on TikTok Shop US
- [Shopify Store Scraper](https://apify.com/benthepythondev/shopify-store-scraper): every product of a Shopify store

**Keywords:** 1688 scraper, 1688.com scraper, 1688 api, 1688 product scraper, 1688 wholesale, alibaba 1688 scraper, china wholesale scraper, 1688 supplier scraper, 1688 price tiers, 1688 moq, 1688 sourcing, factory price china, dropshipping sourcing, 1688 to csv, 1688 search scraper, 1688 no login

# Actor input Schema

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

Search words, one search each. Chinese words match far more products (蓝牙耳机 finds 2,000, 'bluetooth earphones' 176), English works for cross-border listings. A 1688 search link (s.1688.com/selloffer/offer_search.htm?keywords=...) can go into 'Product or search links'.

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

1688 product links (detail.1688.com/offer/<id>.html), bare product ids, or 1688 search links. A product given here is always read with its full record.

## `maxResultsPerKeyword` (type: `integer`):

1688 counts at most 2,000 products per keyword (34 pages of 60). Each saved product is one charged row.

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

Order of the search results.

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

Lowest card price in yuan. Leave empty for no bound.

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

Highest card price in yuan. Leave empty for no bound.

## `includeDetails` (type: `boolean`):

Reads each product's page too: quantity price tiers, minimum order, SKUs with price and stock, attributes, rating, reviews, ship-from place, freight and the seller company. Charged as a second event per product that got it; slower (about 1-2 s per product).

## `excludeAds` (type: `boolean`):

Skip paid placements in the results. Skipped ads are not charged.

## `debug` (type: `boolean`):

Log every request.

## Actor input object example

```json
{
  "keywords": [
    "蓝牙耳机"
  ],
  "maxResultsPerKeyword": 20,
  "sortBy": "relevance",
  "includeDetails": false,
  "excludeAds": false,
  "debug": false
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

# 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("benthepythondev/1688-wholesale-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 = { "keywords": ["蓝牙耳机"] }

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/1688-wholesale-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 '{
  "keywords": [
    "蓝牙耳机"
  ]
}' |
apify call benthepythondev/1688-wholesale-products-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,benthepythondev/1688-wholesale-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/0WBZCGTTjDTiMNuTC/builds/3BtAjMumDozAp3RFt/openapi.json
