# 1688 Wholesale Scraper - Prices, MOQ & Supplier Leads (`scrapesage/1688-wholesale-scraper`) Actor

Scrape 1688.com wholesale offers: tiered price ladder, minimum order quantity, stock, units sold, repurchase rate, factory verification badges, full product attributes and supplier leads with company name and storefront URL. No login, no browser. Export CSV/JSON.

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

## Pricing

from $6.00 / 1,000 offer detail & supplier lead scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 1688 Wholesale Scraper - Products, Price Tiers, MOQ & Supplier Leads

Scrape **1688.com**, Alibaba's China-domestic wholesale platform and the sourcing spine behind most
Shopee / Lazada / TikTok Shop / Temu / Amazon sellers.

One merged record per offer: the **tiered wholesale price ladder**, **minimum order quantity**,
**repurchase rate**, lifetime units sold, factory verification badges, the full product attribute
table, and the **supplier lead** (company name + direct storefront URL).

No login. No browser. No cookies to supply. Just keywords in, structured wholesale data out.

***

### Why this one

Most 1688 actors are one-trick: listings *or* products *or* suppliers. This returns the whole
sourcing picture in a single row, including two signals nobody else exposes:

- **Repurchase rate (复购率)** - 1688's own repeat-buyer percentage. The single best proxy for
  "will this supplier actually deliver twice", and it is on every listing.
- **The tiered price ladder** - the real wholesale price at each minimum quantity, not just the
  headline number.

Chinese service tags and commitments are also returned **translated to English**, so the dataset is
usable by buyers who do not read Chinese.

### What you get per offer

**Listing** - offer ID, title, URL, image, price, recent transaction count, repurchase rate,
supplier city, TrustPass membership years, deep-verified-factory / verified-supplier /
powerful-merchant / hot-selling flags, sponsored flag, service tags (CN + EN), search rank,
and the total result count for the keyword.

**Detail & supplier lead** (when *Include full offer details* is on, the default):
tiered price ladder `[{price, minQuantity}]`, min/max price, **minimum order quantity**,
available stock, **lifetime units sold**, want-to-buy count, mixed-batch support, unit + unit weight,
courier and dispatch window, supplier province/city, the **full attribute table** (brand, model,
materials, specifications - 33 fields on our sample), every product image, the product video, and the
supplier lead: **company name, seller login ID, seller user ID, member ID and storefront URL**.

### Input

| Field | Type | Notes |
|---|---|---|
| `keywords` | array | Product keywords. Chinese returns the richest results (`耳机`, `手机壳`, `数据线`, `女装`, `包装盒`). English also works (`earphones` -> 301 results, `phone case` -> 2,000). |
| `startUrls` | array | 1688 search/category URLs to scrape directly. |
| `maxItems` | integer | Total offers to return. Default 100. |
| `maxPagesPerKeyword` | integer | Result pages per keyword (~20 offers each). Default 5. |
| `includeDetails` | boolean | Open each offer page for price tiers, MOQ, attributes and the supplier lead. Default **on**. |
| `detailConcurrency` | integer | Parallel detail fetches, 1-6. Default 4. |
| `proxyCountryCodes` | array | Residential proxy countries to rotate through. Default: a sensible mix. |
| `proxyConfiguration` | object | Residential proxy strongly recommended. |

Leave the input empty and the actor runs a small **sample search** rather than failing - so a blank
run still returns real data.

```json
{
  "keywords": ["耳机", "phone case"],
  "maxItems": 100,
  "includeDetails": true
}
```

### Example output (trimmed)

```json
{
  "offerId": "898449197083",
  "title": "26新款华强北7代蓝牙耳机运动降噪耳机蓝牙长续航高音质无线耳",
  "url": "https://m.1688.com/offer/898449197083.html",
  "price": 15.07,
  "currency": "CNY",
  "priceTiers": [{ "price": 15.86, "minQuantity": 1 }],
  "minOrderQuantity": 1,
  "stockAvailable": 101534488,
  "salesCount": 3000,
  "totalSold": 6054,
  "repurchaseRate": 18,
  "supplierCity": "深圳市",
  "supplierLocation": "广东深圳",
  "companyName": "深圳市信业禾科技有限公司",
  "supplierUrl": "https://winport.m.1688.com/page/index.html?memberId=b2b-...",
  "brand": "华强北",
  "isVerifiedFactory": true,
  "isPowerfulMerchant": true,
  "serviceTags": ["深度验厂"],
  "serviceTagsEn": ["Deep-verified factory"],
  "courier": "常发中通快递",
  "deliveryLimitDays": 1,
  "attributes": { "耳机类别": "耳塞式耳机", "品牌": "华强北", "型号": "L1" }
}
```

### How it works

1688's mobile surface (`m.1688.com`) is fully **server-rendered** - both search results and the offer
page's `window.__INIT_DATA` blob. So the whole scrape is HTTP + parsing: no headless browser, which
keeps runs fast and cheap and removes an entire class of breakage.

1688 rate-limits **per IP** rather than blocking outright. Each worker session therefore primes on the
mobile homepage, carries its own cookie jar, and rotates to a fresh residential IP the moment an
anti-bot interstitial appears. Measured **8/8 (100%)** on rotating residential sessions.

If 1688 does throttle every attempt, the run still ends **Succeeded** with a status message asking you
to re-run - never a crash, and on pay-per-event you are charged only for records you actually receive.

### Use with AI assistants (MCP)

This actor works as a tool in any [MCP](https://docs.apify.com/platform/integrations/mcp)-compatible
assistant (Claude, Cursor, VS Code). Point your MCP client at the Apify MCP server and ask it to
source products - it can search 1688 and return structured supplier data without you writing any code.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### Pricing

Pay-per-event - you pay for records returned, not for runtime:

| Event | Price | What it covers |
|---|---|---|
| Offer scraped | $0.003 | One listing record from search/category |
| Offer detail & supplier lead | $0.006 | Full record: price tiers, MOQ, stock, attributes, images, supplier lead |

No start fee and no charge for pagination.

### Notes & honest limits

- **No sort option is exposed.** `m.1688.com`'s search endpoint ignores `sortType` (verified across
  `booked` / `priceUp` / `price_asc` / `va_price` / `normal` - none produced sorted output), so rather
  than ship a control that silently does nothing, there isn't one.
- **`trustPassYears`, `serviceTags` and `videoUrl` are honestly sparse.** Only TrustPass member
  suppliers display membership years, only qualifying suppliers get service badges, and only some
  offers have a product video. These are source-gated, not extraction gaps.
- Prices are in **CNY**, and titles/attributes are in Chinese (with service tags translated).
- Scrapes public data only. No login, and no personal data beyond the public seller storefront.

# Actor input Schema

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

Product keywords to search on 1688.com. Chinese keywords return the richest results (e.g. 耳机 = earphones, 手机壳 = phone case, 数据线 = cable, 女装 = womenswear, 包装盒 = packaging box). English keywords also work for many categories. Leave empty to run a small sample search.

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

Optional 1688.com search or category URLs to scrape directly instead of (or in addition to) keywords. Both m.1688.com and www.1688.com search URLs are accepted.

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

Maximum number of offers to return across all keywords and URLs. Set to 0 for no limit (the run then stops safely on its own time budget).

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

How many result pages to walk per keyword (each page holds about 20 offers).

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

Open each offer page to add wholesale price tiers, minimum order quantity, stock, total units sold, full product attributes, images, video, courier and the supplier's company name and storefront URL. Turn off for a faster, cheaper listing-only run.

## `detailConcurrency` (type: `integer`):

How many offer detail pages to fetch in parallel. Lower this if you see anti-bot retries in the log.

## `proxyCountryCodes` (type: `array`):

Two-letter country codes for the residential proxy pool. 1688 rate-limits per IP, so the actor rotates across these. Leave empty for a sensible default mix.

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

Residential proxy is strongly recommended - 1688 rate-limits per IP and the actor rotates sessions automatically.

## Actor input object example

```json
{
  "keywords": [
    "耳机"
  ],
  "startUrls": [],
  "maxItems": 50,
  "maxPagesPerKeyword": 5,
  "includeDetails": true,
  "detailConcurrency": 4,
  "proxyCountryCodes": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All scraped 1688 offers (with price tiers, MOQ, sales volume, repurchase rate and supplier details) as JSON items in the default dataset.

# 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": [
        "耳机"
    ],
    "maxItems": 50,
    "maxPagesPerKeyword": 5,
    "includeDetails": true,
    "detailConcurrency": 4,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/1688-wholesale-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": ["耳机"],
    "maxItems": 50,
    "maxPagesPerKeyword": 5,
    "includeDetails": True,
    "detailConcurrency": 4,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/1688-wholesale-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "耳机"
  ],
  "maxItems": 50,
  "maxPagesPerKeyword": 5,
  "includeDetails": true,
  "detailConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapesage/1688-wholesale-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/1688-wholesale-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/w03PtDL2YN4pKaJZa/builds/MDLG4bo5ge8yAceqM/openapi.json
