# 1688 Product Scraper (`axlymxp/1688-product-scraper`) Actor

Scrape 1688.com wholesale products by keyword, product URL or offer ID. Get the full MOQ price ladder, minimum order, supplier company and badges, sales counts, ships-from province/city, images, attributes and SKU variants as clean JSON/CSV. No 1688 login needed. Pay only for results.

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

## Pricing

from $3.00 / 1,000 products

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/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

Turn 1688.com (阿里巴巴 China wholesale) into a spreadsheet of sourcing-ready products: the **full MOQ price ladder**, minimum order quantity, supplier company and trust badges, sales counts, ships-from province and city, images, attributes and (for product pages) every SKU variant with stock. Search by keyword, or paste product URLs / offer IDs. No 1688 account, no cookies.

Built for sourcing agents, importers, Amazon/Shopify/Shopee sellers and dropshippers who compare factory-direct prices before they contact a supplier, and for developers feeding a catalog, ERP or AI sourcing agent.

### What you get

One row per product, the same shape for keyword and URL inputs:

| Field | Description |
| --- | --- |
| `offerId`, `url`, `title` | Offer ID, product page URL, Chinese title as published |
| `price`, `priceMax`, `currency` | Lowest tier price and MOQ price in CNY |
| `priceTiers` | The wholesale ladder: `[{minQuantity, maxQuantity, price}]`, e.g. 2–499 → ¥9.00, 500–4999 → ¥8.50, ≥5000 → ¥7.50 |
| `moq`, `unit` | Minimum order quantity and selling unit (个 / 件 / 套 …) |
| `salesCount`, `salesText`, `sales30Days`, `ordersCount`, `repurchaseRate` | Demand signals as 1688 shows them |
| `companyName`, `sellerLoginId`, `sellerMemberId`, `shopUrl`, `sellerYears` | Supplier identity and storefront |
| `isVerifiedSupplier`, `isFactory`, `sellerTags`, `bizType` | TrustPass (诚信通), manufacturer / 实力商家, badges such as 深度验厂, 7天包换, 48小时发货 |
| `province`, `city`, `shippingLocation`, `deliveryPromise`, `deliveryDays`, `unitWeightKg`, `freeShipping` | Where it ships from and how fast |
| `images`, `mainImage`, `videoUrl` | Media URLs (CDN, no login needed) |
| `attributes` | `[{name, value}]` — material, style, function, applicable models … |
| `categoryId`, `categoryName`, `categoryPath`, `brand` | 1688 category |
| `skus`, `skuProps` | SKU variants `[{skuId, specAttrs, price, stock, salesCount}]` and the variant dimensions (product-page rows) |
| `rating`, `goodRatePercent`, `reviewCount`, `favoriteCount`, `serviceScore` | Reputation (product-page rows) |
| `supportsMixedWholesale`, `mixMinQuantity`, `mixMinAmount`, `stockTotal` | Mixed-batch terms and bookable stock |
| `isAd`, `keywords`, `source`, `scrapedAt` | Promoted-listing flag, originating keyword, `search` or `detail`, timestamp |

Fields marked *product-page rows* are filled for `productUrls` / `offerIds` inputs and for keyword results when **Fetch full detail for search results** is on. Keyword rows without enrichment carry the price ladder, MOQ, supplier, sales, location, category IDs, one image and the headline attributes.

### Use cases

- **Supplier shortlists** — search a product, filter by MOQ ceiling and price range, compare real quantity-break prices side by side.
- **Landed-cost checks** — read the price at *your* order size instead of the "from" price.
- **Catalog refresh** — feed your tracked offer IDs on a schedule and watch price ladders, stock and sales move.
- **Factory sourcing** — keep only `isFactory` suppliers in one province so one freight consolidation covers the order.
- **Market research** — sales counts, repurchase rates and review volumes across a whole keyword.

### Input

| Parameter | Type | Description |
| --- | --- | --- |
| `keywords` | array | Search terms. Chinese keywords return the most results; English works for common product names. Up to 2,000 offers per keyword (1688's cap). |
| `productUrls` | array | `detail.1688.com/offer/<id>.html` or `m.1688.com/offer/<id>.html` links — full product data. |
| `offerIds` | array | Numeric offer IDs, same output as URLs. |
| `maxItems` | integer | Total products to save (default 100). |
| `sortBy` | select | `default` (best match), `sales`, `price_asc`, `price_desc`. |
| `enrichSearchResults` | boolean | Open each search hit's product page for SKUs, all attributes, images, rating, shipping. Default off. |
| `priceMin`, `priceMax` | integer | Lowest-tier price range in CNY. |
| `maxMoq` | integer | Keep suppliers whose minimum order is at most this many units. |
| `includeAds` | boolean | Keep promoted listings (`isAd: true`). Default on. |
| `proxyConfiguration` | object | **Use Apify RESIDENTIAL proxies.** 1688 serves only a handful of requests per IP before it shows a slider; residential rotation on every request is what keeps the run going. Datacenter IPs are blocked almost immediately. |

#### Example input

```json
{
  "keywords": ["保温杯", "wireless earbuds"],
  "productUrls": ["https://detail.1688.com/offer/735353578254.html"],
  "maxItems": 200,
  "sortBy": "sales",
  "maxMoq": 50,
  "enrichSearchResults": false,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

#### Example output (product page)

```json
{
  "offerId": "735353578254",
  "url": "https://detail.1688.com/offer/735353578254.html",
  "title": "适用iphone18PRO大视窗磁吸手机壳15磨砂漏标苹果11秒变17保护套",
  "price": 7.5,
  "priceMax": 9.0,
  "currency": "CNY",
  "priceTiers": [
    { "minQuantity": 2, "maxQuantity": 499, "price": 9.0 },
    { "minQuantity": 500, "maxQuantity": 4999, "price": 8.5 },
    { "minQuantity": 5000, "maxQuantity": null, "price": 7.5 }
  ],
  "moq": 2,
  "unit": "个",
  "salesCount": 17000,
  "salesText": "1.7万+",
  "sales30Days": 20000,
  "companyName": "深圳市亿佳合兴科技有限公司",
  "shopUrl": "https://shop764420m281617.1688.com",
  "isVerifiedSupplier": true,
  "isFactory": true,
  "sellerTags": ["一件代发", "镇店之宝"],
  "province": "广东省",
  "city": "深圳市",
  "deliveryPromise": "承诺48小时发货·常发韵达快递",
  "deliveryDays": 2,
  "unitWeightKg": 0.03,
  "images": ["https://cbu01.alicdn.com/img/ibank/O1CN01lAdPke1OFCTM0qUJK_!!3872131675-0-cib.jpg", "..."],
  "attributes": [{ "name": "材质", "value": "PC" }, { "name": "功能", "value": "其它,磁吸,防摔,抗指纹" }],
  "categoryId": "1046694",
  "categoryName": "iPhone保护套",
  "brand": "潮虹兔",
  "rating": 5.0,
  "goodRatePercent": 99.6,
  "reviewCount": 22447,
  "skus": [{ "skuId": "5994388491383", "specAttrs": "海军蓝【纳米磨砂防指纹手汗】>iPhone 15PLUS", "stock": 9999, "salesCount": 0 }],
  "skuProps": [{ "name": "颜色", "values": ["樱桃红", "橙色", "..."] }, { "name": "适用型号", "values": ["iPhone 15PLUS", "..."] }],
  "source": "detail",
  "scrapedAt": "2026-10-05T03:10:22Z"
}
```

### Scheduling and integrations

Run it on a schedule from the Apify Console to refresh a tracked list of offer IDs, add a webhook to get notified when a run finishes, or pull the dataset straight into Google Sheets, Make, Zapier or your own code through the Apify API. Every run writes an `OUTPUT` record to the key-value store with the number of products saved and any offers that could not be fetched (`not_found`, `blocked`), so partial results are never silent.

### Use with AI assistants and MCP

Add this Actor to an AI assistant through the Apify MCP server and ask in plain language: "find 1688 suppliers for insulated bottles with MOQ under 50 and list price tiers". The assistant fills the input, runs the Actor and reads the dataset back.

### FAQ

**Do I need a 1688 account or cookies?** No. Everything the Actor reads is public to anonymous visitors.

**Why residential proxies?** 1688 limits anonymous traffic per IP (a few product pages, a dozen search calls) and then shows a slider captcha. The Actor never solves captchas; it rotates to a fresh residential IP on every request instead. With datacenter IPs or no proxy, the run stops early with a clear "Blocked" status and keeps whatever it already saved.

**Are titles translated?** No — titles and attributes are delivered exactly as the supplier published them (Chinese). Keep them for pasting back into 1688 or sending to an agent; translate downstream if you need English.

**How many results per keyword?** 1688's search reports at most 2,000 offers per keyword. Use several keywords or the price / MOQ filters to go deeper.

**Are prices live?** Yes, every row is fetched at run time; `scrapedAt` tells you when. Prices are in CNY as shown to a guest visitor; logged-in or member prices can differ.

**What about products that disappear?** Removed offers are reported in the run's `OUTPUT` record as `not_found` and are not charged.

**Is this legal?** The Actor collects publicly available product listings only. You are responsible for using the data in line with 1688's terms and the laws that apply to you.

# Actor input Schema

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

Products to search on 1688.com, one keyword per line. Chinese keywords return the most results (e.g. <code>手机壳</code>, <code>保温杯</code>); English works for common product names. Each keyword yields up to 2,000 offers (1688's own cap), 20 per page.

## `productUrls` (type: `array`):

1688 offer pages to scrape in full (SKUs, attributes, images, rating, shipping). Accepts <code>https://detail.1688.com/offer/735353578254.html</code> and <code>m.1688.com/offer/...</code> links.

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

Numeric offer IDs (the number in the product URL). Same output as Product URLs.

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

Stop after this many products in total. You are charged per product saved.

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

Order 1688 ranks keyword results in. 'Best match' is 1688's default ranking.

## `enrichSearchResults` (type: `boolean`):

Also open every search hit's product page to add SKU variants with stock, all attributes, all images, rating, review count, shipping promise and category name. Slower (one extra page per product, ~100 KB of proxy traffic each).

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

Keep only products whose lowest tier price is at least this many yuan.

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

Keep only products whose lowest tier price is at most this many yuan.

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

Keep only products whose MOQ is at most this number of units (e.g. 10 to find suppliers who sell small lots).

## `includeAds` (type: `boolean`):

Keyword results include 1688's promoted (P4P) listings, flagged with <code>isAd: true</code>. Turn off to keep organic results only.

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

<b>Residential proxies are required for real runs.</b> 1688 allows only a handful of requests per IP before it shows a slider captcha; Apify RESIDENTIAL proxies rotate the exit IP on every request, which is exactly what this Actor needs. Datacenter IPs are blocked quickly.

## Actor input object example

```json
{
  "keywords": [
    "手机壳",
    "蓝牙耳机"
  ],
  "productUrls": [
    "https://detail.1688.com/offer/735353578254.html"
  ],
  "offerIds": [
    "735353578254",
    "927875250705"
  ],
  "maxItems": 100,
  "sortBy": "default",
  "enrichSearchResults": false,
  "includeAds": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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": [
        "保温杯"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/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 = {
    "keywords": ["保温杯"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/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 '{
  "keywords": [
    "保温杯"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call axlymxp/1688-product-scraper --silent --output-dataset

```

## MCP server setup

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