# 1688 Product Scraper - Wholesale Prices, MOQ, Suppliers (`neverempty/1688-product-scraper`) Actor

1688.com wholesale products by keyword or offer ID: Chinese title, price in CNY, quantity price tiers, MOQ, monthly sales, variants with stock, supplier company, factory flag, ratings, ship-from city, images and link. No login, no cookies. Export as JSON, CSV or Excel. Unofficial.

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

## Pricing

from $3.50 / 1,000 product returneds

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 Product Scraper

Get 1688.com wholesale products by keyword or by offer ID: the Chinese title, the unit price in Chinese yuan (CNY), quantity price tiers, minimum order quantity (MOQ), monthly sales, variants with their own price and stock, the supplier company, factory flag and ratings, the ship-from city, images and the product link. No login, no cookies: paste a search term or a 1688 link and export the rows to JSON, CSV or Excel.

### What you get

- **Search by keyword** - 40 products per search term from 1688's search page, up to 200 by adding related searches that contain your term. Up to 10 search terms per run. Each row keeps its position on the page and whether it was an ad.
- **Look up products by ID or link** - paste detail.1688.com links (or just the offer ID) and get the full product page. Up to 100 products per run.
- **Wholesale prices the way 1688 sets them** - the lowest unit price, the highest, every quantity tier (for example 1-99 pieces ¥2.50, 100-9999 ¥1.80, 10000+ ¥1.50), the MOQ and the unit. When the price is set per variant, each variant row has its own price and stock.
- **Supplier details** - company name, shop link, member ID, TrustPass years, power merchant and factory flags, service score, 3-month repeat buyer rate, positive review rate, rating and review count with review keywords.
- **Sourcing details** - monthly sales from the search list, units sold as the product page shows it (usually over the past year), stock, specifications (material, model and so on), ship-from province and city, dispatch promise, unit weight, free shipping, dropshipping and mixed-order support, sample (single piece) orders, and when the listing was created and updated.
- **Honest rows** - a search with no results, an offer ID that no longer exists, or a page that could not be read comes back as a free row that says why. Nothing is guessed.

### Input

| Field | What it does |
|---|---|
| Search terms | What you would type into the 1688 search box, for example 手机壳 or 蓝牙耳机. |
| Products (offer ID or URL) | 1688 offer IDs or detail.1688.com links. |
| Max products per search | 1 to 200 (40 per search page; above 40, related searches that contain your term are added). |
| Open each product page | Also read each search result's product page for price tiers, MOQ, variants, supplier ratings and ship-from city. |

Example input:

```json
{
    "searchQueries": ["手机壳", "蓝牙耳机"],
    "products": ["https://detail.1688.com/offer/682333375890.html"],
    "maxResultsPerSearch": 40,
    "includeDetails": false
}
```

### Output

One row per product. Example from a product page (shortened):

```json
{
    "status": "ok",
    "charged": true,
    "offerId": "682333375890",
    "title": "适用iPhone17透黑手机壳苹果15Promax全包边PC硬壳14/XS/XR保护套",
    "url": "https://detail.1688.com/offer/682333375890.html",
    "price": 1.5,
    "priceMax": 2.5,
    "currency": "CNY",
    "priceTiers": [
        { "minQuantity": 1, "maxQuantity": 99, "price": 2.5 },
        { "minQuantity": 100, "maxQuantity": 9999, "price": 1.8 },
        { "minQuantity": 10000, "maxQuantity": null, "price": 1.5 }
    ],
    "minOrderQuantity": 1,
    "unit": "个",
    "soldCount": 4100,
    "soldPeriod": "一年内",
    "stock": 28851657,
    "skus": [{ "skuId": "6297071731527", "attributes": ["全包边PC硬壳【透黑】", "iPhone18Pro摄像头精孔"], "price": null, "stock": 990989 }],
    "companyName": "东莞市九美电子科技有限公司",
    "shopUrl": "https://gdqcdz.1688.com",
    "isFactory": true,
    "serviceScore": 4.5,
    "repeatBuyerRate3m": 60.64,
    "goodRatePercent": 98.2,
    "reviewCount": 1222,
    "province": "广东省",
    "city": "东莞市",
    "deliveryText": "承诺48小时发货·常发中通快递",
    "unitWeightKg": 0.035,
    "supportsDropshipping": true,
    "checkedAt": "2026-10-25T08:00:00.000Z"
}
```

Search rows without Open each product page also carry monthlySales (for example 月销2807个), brand, tags, TrustPass years and the ad flag; their product page fields are null with a note saying how to fill them.

Export the dataset as JSON, CSV, Excel or HTML, or read it through the Apify API.

### Pricing

You pay a small fee when a run starts and then per product row with a price. Free rows (no results, product not found, not readable, budget reached) are never charged. Set a maximum total charge on the run and the Actor stops before going over it.

### FAQ

#### How do I scrape 1688 wholesale prices?

Put your search terms (Chinese works best) in Search terms, or paste product links in Products, and start the run. Each row has the unit price in CNY and the product link; turn on Open each product page to add quantity price tiers and the MOQ.

#### Can I get the MOQ and price per quantity?

Yes. minOrderQuantity and priceTiers come from the product page: products given by ID or link always have them, and search results have them with Open each product page on.

#### Can I find factories and compare suppliers?

Yes. Each product page row has isFactory, serviceScore, repeatBuyerRate3m, goodRatePercent, reviewCount, the ship-from city and the shop link, so you can sort suppliers in a spreadsheet.

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

No. The Actor reads only public pages and sends no login or cookies.

#### Why is the search list price different from the product page?

The search list shows one price, while the product page sets prices by quantity or by variant. With Open each product page on, price is the lowest product page unit price and searchListPrice keeps the list price; priceNote says when they differ.

### Limitations

- One 1688 search page lists 40 products. Above 40, the Actor adds up to 4 related searches that contain your term, so a broad term may return fewer products than you ask for; a free row says how many were returned. Use more specific search terms to reach other products.
- Product page fields (price tiers, MOQ, variants, supplier ratings, ship-from city) are filled only when the product page is read: for products given by ID or link, or for search results with Open each product page on.
- When the price is set by quantity tiers, variants have no price of their own (skus\[].price is null) and the tiers apply to every variant.
- Short share links (qr.1688.com) are not supported; open them in a browser and copy the full link.
- If 1688 shows a check or sign-in page, the Actor stops and says so. It does not solve or bypass check pages. Rows returned before that are kept and charged, the rest are not.
- Prices are what 1688 shows to a visitor without an account and can differ from what a signed-in buyer sees.
- Titles and values are in Chinese as the supplier wrote them.
- This Actor is not affiliated with 1688.com or Alibaba.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

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

What you would type into the 1688 search box, for example 手机壳, 蓝牙耳机 or 充电宝. Chinese terms match best; English terms also work. Up to 10 search terms per run. Leave Search terms and Products both empty to run the example search 手机壳.

## `products` (type: `array`):

Optional. 1688 offer IDs or links, for example 682333375890 or https://detail.1688.com/offer/682333375890.html. Each one returns the full product page: quantity price tiers, MOQ, variants with prices and stock, specifications, supplier ratings, ship-from city and weight. Short share links (qr.1688.com) are not supported; open them in a browser and copy the full link. Up to 100 per run.

## `maxResultsPerSearch` (type: `integer`):

How many products to return for each search term, from 1 to 200. One 1688 search page lists 40 products; above 40, related searches that contain your term are added (up to 4 more pages), so a term may return fewer than you ask. You are charged only for the products returned.

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

When on, each search result's product page is also read, adding quantity price tiers, MOQ, variants, stock, specifications, supplier ratings, factory flag, repeat buyer rate, ship-from city and weight. Slower: a few extra seconds per product. Products given by ID or URL always use the product page.

## Actor input object example

```json
{
  "searchQueries": [
    "手机壳"
  ],
  "maxResultsPerSearch": 40,
  "includeDetails": false
}
```

# Actor output Schema

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

One row per 1688 product: offer ID, Chinese title, price in CNY, quantity price tiers, MOQ, monthly sales, supplier company and shop, ship-from city, images and link. A search with no products, a product that no longer exists, a check page, or a run that hit its maximum charge comes back as a free row that says why.

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

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

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

```

## MCP server setup

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