# 1688 Scraper - Wholesale Prices, MOQ & Suppliers (`crawloop/1688-scraper`) Actor

1688.com scraper for China wholesale offers. Search by keyword or offer ID and export CNY price ladders, MOQ, sold counts, factory flags, images, and supplier location. 1688 API alternative for Python, Node.js, and MCP.

- **URL**: https://apify.com/crawloop/1688-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (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 $1.60 / 1,000 product listings

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 Scraper — Wholesale Prices, MOQ & Suppliers

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Alibaba Group or 1688. Data is read from publicly accessible pages only. No login. You are responsible for complying with applicable law and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

> **Contact-data controls:** This Actor does not collect supplier phone, WeChat, or inbox contacts. Output is offer, price, MOQ, and company-name fields published on public search cards and offer pages.

> **Crawloop China sourcing suite** — 1688 factory offers, then Alibaba.com export PDPs and AliExpress retail comps.

| **1688 Scraper** ◄── you are here | [Alibaba Product Scraper](https://apify.com/crawloop/alibaba-product-scraper) | [AliExpress Search Scraper](https://apify.com/crawloop/aliexpress-search-scraper) |
| :--- | :--- | :--- |
| China wholesale offers, MOQ, factory flags | Alibaba.com FOB ladders & Gold suppliers | AliExpress retail search, sold count |

Also see: [Europages Scraper](https://apify.com/crawloop/europages-scraper) · [WLW Scraper](https://apify.com/crawloop/wlw-scraper) · [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper)

**1688 Scraper** for Apify is a **1688.com scraper** and **1688 API alternative**. Search by **Chinese or English keyword**, or paste **offer IDs / product URLs**, and export **CNY prices, MOQ ladders, sold counts, factory flags, images, and supplier location** as JSON (CSV / Excel from the dataset).

Built for **factory shortlists**, **dropship sourcing**, **Amazon FBA cost checks**, and **price monitoring**. Run from the Console or scrape 1688 with **Python**, **Node.js**, **cURL**, or **MCP** / AI assistants. Fast HTTP path (`curl_cffi` + signed mobile search) — no headless browser and no 1688 account.

### When to use this Actor

- You need a **1688 scraper** or **1688 API alternative** for wholesale offers
- You want **keyword search** (手机壳, wireless earbuds) or a **tracked list of offer IDs**
- You need **MOQ ladders**, **sold volume**, and **factory vs trader** signals
- You prefer a **browser-free** crawl on Apify with China residential proxy

### When not to use this Actor

- **Alibaba.com export listings** — use [Alibaba Product Scraper](https://apify.com/crawloop/alibaba-product-scraper)
- **AliExpress retail** — use [AliExpress Search Scraper](https://apify.com/crawloop/aliexpress-search-scraper)
- **Reverse image search** — not in this Actor
- **Login-only shop catalogs / RFQ / chat** — public offer data only; shop pages are often challenged
- **Personal contacts** — no phone, WeChat, or inbox harvesting

### Key features

- **1688 API alternative** — structured dataset instead of manual browsing
- **Keyword search** — Chinese queries return denser catalogs; English is accepted
- **Offer URL / ID** — refresh known products for monitoring
- **Listing or detail** — search cards by default; optional offer page for quantity prices, gallery, SKUs
- **Sourcing filters** — price band, MOQ ceiling, province, factory / super-factory
- **Stable IDs** — `offerId` + canonical URL for Scheduler / dedupe
- **Lightweight** — 256 MB HTTP, Chrome TLS fingerprint, session rotate on challenge pages

### Use cases

| Use case | What you get |
| :--- | :--- |
| **Factory shortlist** | Keyword results with price, MOQ, location, factory flags |
| **Landed-cost check** | Quantity-break prices from the offer page |
| **Catalog refresh** | Offer IDs in, updated sold count and price out |
| **Region sourcing** | Province filter (广东, 浙江) plus city substring |
| **Dropship research** | Sold volume and repurchase rate when published |

### Input parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `searchQueries` | Array | `["手机壳"]` | Keywords. Chinese first. |
| `offerUrls` | Array | — | Public offer URLs |
| `offerIds` | Array | — | Numeric offer IDs |
| `supplierUrls` | Array | — | Shop URLs (best-effort; often challenged) |
| `sortBy` | String | `relevance` | `relevance`, `bestSelling`, `priceAsc`, `priceDesc` |
| `priceMin` / `priceMax` | Integer | — | CNY unit-price band |
| `minOrderQuantity` | Integer | — | Maximum acceptable MOQ |
| `merchantType` | String | `any` | `any`, `superFactory`, `verifiedMerchant` |
| `province` / `city` | String | — | Chinese names (`广东`, `深圳`) |
| `includeDetails` | Boolean | `false` | Fetch offer page (price ladder, gallery) |
| `includeSkuDetails` | Boolean | `false` | SKU matrix; implies details |
| `maxItems` | Integer | `50` | Dataset cap |
| `maxPagesPerKeyword` | Integer | `3` | ~20 offers per page |
| `requestDelayMs` | Integer | `400` | Delay between HTTP calls |
| `proxyConfiguration` | Object | CN residential | Recommended against challenge pages |

#### Example — keyword search

```json
{
  "searchQueries": ["手机壳"],
  "maxItems": 50,
  "sortBy": "bestSelling",
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "CN"
  }
}
```

#### Example — offer IDs

```json
{
  "offerIds": ["588600851175"],
  "includeSkuDetails": true
}
```

Offer URL shape (inside JSON only):

```json
{
  "offerUrls": [
    { "url": "https://detail.1688.com/offer/588600851175.html" }
  ]
}
```

### Output

One dataset row per offer. Search-only rows are `recordType: listing`. Offer pages are `detail`. Export JSON, CSV, or Excel from the default dataset.

| Field | Description |
| :--- | :--- |
| `offerId` | Numeric 1688 offer ID |
| `url` | Canonical offer URL |
| `title` | Chinese title |
| `titleEn` | English title when the page publishes one |
| `priceMin` / `priceMax` | Unit price band in CNY |
| `quantityPrices` | MOQ ladder (`minQuantity`, `price`) on detail rows |
| `minOrderQuantity` | Minimum order quantity |
| `soldCount` / `soldText` | Parsed and raw sold labels |
| `repurchaseRate` | Repeat-buy percent |
| `images` / `imageUrl` | Gallery |
| `supplier.companyName` | Factory / company name |
| `supplier.isFactory` / `isSuperFactory` | Trust signals |
| `province` / `city` / `location` | Supplier region |
| `skuVariants` | Spec / price / stock when enabled |
| `scrapedAt` | ISO timestamp |

#### Example row

```json
{
  "recordType": "listing",
  "offerId": "588600851175",
  "url": "https://detail.1688.com/offer/588600851175.html",
  "title": "QC3.0充电器 无线充美规usb充电头 9v2a智能手机快充 18W快充欧规",
  "currency": "CNY",
  "priceMin": 6.8,
  "priceMax": 7.2,
  "minOrderQuantity": 20,
  "unit": "个",
  "soldCount": 12000,
  "location": "广东省深圳市",
  "supplier": {
    "companyName": "深圳豪诺天电子有限公司",
    "isFactory": true
  }
}
```

### Integration examples

Replace `YOUR_TOKEN` with your Apify API token. Actor name: `crawloop/1688-scraper`.

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('crawloop/1688-scraper').call({
  searchQueries: ['手机壳'],
  maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("crawloop/1688-scraper").call(
    run_input={"searchQueries": ["手机壳"], "maxItems": 50}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~1688-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["手机壳"],"maxItems":50}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call this Actor by its Store ID `crawloop/1688-scraper`.

Example prompts:

- "Run crawloop/1688-scraper for keyword 手机壳, max 20 rows, and return offerId, priceMin, MOQ, and company name"
- "Scrape these 1688 offer IDs with crawloop/1688-scraper and include SKU variants"
- "After the 1688 factory shortlist, run Alibaba Product Scraper for export FOB ladders, then AliExpress Search Scraper for retail comps"

### Suite next step

After a China factory shortlist, pull the same products’ export PDPs with [Alibaba Product Scraper](https://apify.com/crawloop/alibaba-product-scraper), or retail sold-count comps with [AliExpress Search Scraper](https://apify.com/crawloop/aliexpress-search-scraper). For EU manufacturer alternatives, use [Europages Scraper](https://apify.com/crawloop/europages-scraper) or [WLW Scraper](https://apify.com/crawloop/wlw-scraper).

### FAQ

**Do I need a 1688 login?**\
No. Keyword search uses the public mobile search gateway. Offer pages are public HTML. Shop catalogs often show a challenge page — those rows are skipped.

**Why Chinese keywords?**\
The catalog is Mandarin. `手机壳` returns far more offers than `phone case`. Keep English as a second query if you want both result sets.

**Can I scrape 1688 with Python or Node.js?**\
Yes. Use the Apify client examples above, or call the Actor from an MCP-capable assistant. The dataset is JSON; download CSV or Excel from the run.

**Listing vs detail?**\
Default search cards are enough for shortlists (title, price, sold, company). Turn on `includeDetails` when you need the MOQ price ladder, gallery, or factory card type. `includeSkuDetails` adds the spec matrix.

**Why residential CN or HK?**\
A few search calls may succeed from datacenter IPs. Volume runs hit a challenge page (`x5sec` / TMD). China or Hong Kong residential is the reliable path.

**Does this scrape Alibaba.com?**\
No. 1688 is the China-domestic wholesale site. Export B2B listings live on a different domain.

**Are empty runs billed per product?**\
Failed, filtered, and captcha rows are not charged as products. Configure Actor start in Console so a zero-result tick is still covered.

### Related Actors

- [Alibaba Product Scraper](https://apify.com/crawloop/alibaba-product-scraper) — Alibaba.com FOB ladders, MOQ, Gold / Verified
- [AliExpress Search Scraper](https://apify.com/crawloop/aliexpress-search-scraper) — AliExpress retail search cards
- [Europages Scraper](https://apify.com/crawloop/europages-scraper) — Europe B2B companies
- [WLW Scraper](https://apify.com/crawloop/wlw-scraper) — DACH B2B companies
- [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper) — Amazon search listings
- [Mercado Libre Listings Scraper](https://apify.com/crawloop/mercado-libre-listings-scraper) — LATAM marketplace listings

# Actor input Schema

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

Wholesale keywords. Chinese terms return denser catalogs (e.g. 手机壳); English works but is thinner. Each keyword is searched separately.

## `offerUrls` (type: `array`):

Public 1688 product URLs. Example in JSON: https://detail.1688.com/offer/588600851175.html

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

Numeric 1688 offer IDs when you already know the products. Skips keyword search for those IDs.

## `supplierUrls` (type: `array`):

Best-effort shop catalog. 1688 often challenges public shop pages; failed shops are skipped and not billed.

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

Keyword ranking. Best selling uses 30-day transaction count on the search card.

## `priceMin` (type: `integer`):

Keep offers whose lowest unit price is at least this many yuan.

## `priceMax` (type: `integer`):

Keep offers whose lowest unit price is at most this many yuan.

## `minOrderQuantity` (type: `integer`):

Keep suppliers whose minimum order is at most this quantity. Offers with no MOQ are dropped when this filter is set.

## `merchantType` (type: `string`):

Filter by factory / super-factory signals published on the card or offer page.

## `province` (type: `string`):

Chinese province name, e.g. 广东 or 浙江. Pinyin is ignored by 1688 search.

## `city` (type: `string`):

Optional city substring filter on returned rows (e.g. 深圳, 义乌).

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

Open each offer page for the MOQ price ladder, gallery, sold text, factory card type, and review summary. Slower, richer rows.

## `includeSkuDetails` (type: `boolean`):

Add skuVariants (spec, price, stock). Implies offer details. Larger output.

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

Maximum dataset rows across all keywords and IDs.

## `maxPagesPerKeyword` (type: `integer`):

About 20 offers per page. 1688 search depth is capped per keyword.

## `requestDelayMs` (type: `integer`):

Politeness delay between search pages and offer fetches.

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

China or Hong Kong residential is recommended. Datacenter IPs work for a few mtop calls, then 1688 serves a challenge page.

## Actor input object example

```json
{
  "searchQueries": [
    "手机壳"
  ],
  "sortBy": "relevance",
  "merchantType": "any",
  "includeDetails": false,
  "includeSkuDetails": false,
  "maxItems": 50,
  "maxPagesPerKeyword": 3,
  "requestDelayMs": 400,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CN"
  }
}
```

# Actor output Schema

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

Default dataset items.

# 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": [
        "手机壳"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CN"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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 = {
    "searchQueries": ["手机壳"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CN",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/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 '{
  "searchQueries": [
    "手机壳"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CN"
  }
}' |
apify call crawloop/1688-scraper --silent --output-dataset

```

## MCP server setup

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