# 1688 Scraper — Wholesale Products, Prices & Suppliers (China) (`tortuga/1688-scraper`) Actor

Scrape 1688.com wholesale offers by keyword, shop, offer URL or image search: CNY prices, MOQ, quantity price tiers, sales, SKUs, specs and supplier details. No login.

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

## Pricing

from $1.50 / 1,000 offer scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Products, Prices & Suppliers (China)

Scrape **1688.com**, Alibaba's Chinese wholesale marketplace used by dropshippers, Amazon sellers and sourcing agents. Search by **keyword** (Chinese or English), paste **search, shop or offer URLs**, or **search by image** to find the factory behind a product photo. Every offer comes with its CNY price, sales, repurchase rate, images, badges and the supplier's company name, location, years on 1688 and service scores. Turn on **offer details** for the minimum order quantity (MOQ), quantity price tiers, every SKU variant with price and stock, specifications, description images, ship-from city and package weight and size.

No 1688 account, no login and no browser: the Actor uses 1688's own search API and offer pages, like a signed-out visitor.

### What data does 1688 Scraper extract?

| Field | Example | Notes |
|---|---|---|
| `offerId`, `url` | `927875250705`, `https://detail.1688.com/offer/927875250705.html` | |
| `title` | `跨境适用苹果18promax手机壳磁吸16防摔磨砂iphone17pm保护壳批发` | Chinese, as the seller wrote it (1688 offers no translation) |
| `price` | `7.5` | CNY, the price the result card shows |
| `priceMin`, `priceMax`, `currency` | `7.04`, `7.5`, `CNY` | range over tiers / variants with details |
| `priceTiers` | `[{"minQuantity": 50, "maxQuantity": 499, "price": 7.5}, ...]` | details and image search |
| `moq`, `unit` | `50`, `个` | details and image search |
| `soldText`, `soldCount`, `soldScope` | `已售2.7万+件`, `27000`, `1688` | `allChannels` when 1688 shows 全网 (all channels) |
| `bookedCount` | `413` | 1688's order counter shown to its ranking |
| `repurchaseRate`, `offerRepurchaseRate` | `60`, `4` | % (回头率 of the shop / of the offer) |
| `image`, `images` | full-size `cbu01.alicdn.com` URLs | details add the whole gallery |
| `badges` | `["实力商家", "深度验商", "假一赔四", "48小时发货"]` | supplier / service badges as shown |
| `isAd` | `false` | sponsored result |
| `supplier.name`, `loginId`, `memberId` | `东莞市九美电子科技有限公司`, `广东七彩电子`, `b2b-2210356332867938a0` | |
| `supplier.province`, `city` | `广东`, `东莞市` | |
| `supplier.yearsOnPlatform` | `6` | years on 1688 |
| `supplier.businessType`, `businessTypeEn` | `生产加工`, `manufacturer` | manufacturer / wholesaler |
| `supplier.serviceScores` | `{"composite": 4.5, "logistics": 4.0, "goods": 3.67, ...}` | 1688 service ratings |
| `supplier.shopUrl`, `winportUrl` | shop links | `winportUrl` works as a start URL for the shop's whole catalog |
| `skus` | `[{"attributes": {"颜色": "黑色"}, "price": 20.01, "promotionPrice": 10.01, "stock": 24960}]` | details |
| `attributes` | `{"材质": "优质TPU", "品牌": "三丰"}` | details: specification table |
| `shipFrom`, `deliveryPromise`, `freeShipping` | `广东省佛山市`, `承诺30天发货`, `false` | details |
| `unitWeightKg`, `packageSizes` | `0.04`, `[{"lengthCm": 17, "widthCm": 7, "heightCm": 1, "weightG": 40}]` | details |
| `rating`, `positiveRate`, `reviewCount` | `5.0`, `99.9`, `7970` | details |
| `descriptionImages`, `videoUrl` | image URLs, MP4 | details |
| `supplier.isPowerMerchant`, `isSuperFactory`, `serviceScore`, `repurchaseRate3m` | `true`, `true`, `5.0`, `68.51` | details |
| `similarity` | `0.79` | image search: how close the match is |

### How to use 1688 Scraper

1. Enter **Search terms** (e.g. `蓝牙耳机`), and/or paste **Start URLs**, and/or **Image URLs** for image search.
2. Pick a sort order and an optional price range in yuan.
3. Set **Max items** (you pay per offer) and turn on **Include offer details** if you need MOQ, tiers and SKUs.
4. Keep the default proxy (Apify residential, China). Run, then export JSON, CSV or Excel.

### Input example

```json
{
  "searchTerms": ["蓝牙耳机"],
  "sortBy": "sales",
  "minPrice": 10,
  "maxPrice": 50,
  "maxItems": 100,
  "includeDetails": true
}
```

Start URLs can be a search page (`https://s.1688.com/selloffer/offer_search.htm?keywords=...`, filters such as `sortType`, `priceStart` or `province` in the URL are kept), a shop (`https://winport.m.1688.com/page/index.html?memberId=b2b-...`), an offer (`https://detail.1688.com/offer/<id>.html`, always with full details) or an image search page.

### Output example

```json
{
  "offerId": "649182176196",
  "url": "https://detail.1688.com/offer/649182176196.html",
  "title": "适用于苹果iPhone12手机壳mini7透明13PromaxPC6硬壳11XS防摔防震",
  "price": 1.99,
  "currency": "CNY",
  "soldText": "已售100+件",
  "soldCount": 100,
  "soldScope": "1688",
  "bookedCount": 413,
  "repurchaseRate": 60,
  "image": "https://cbu01.alicdn.com/img/ibank/O1CN01gD1SRK1X38BzYFG2V_!!2210356332867-0-cib.jpg",
  "badges": ["假一赔四", "深度验商", "先采后付", "退货包运费"],
  "isAd": false,
  "supplier": {
    "name": "东莞市九美电子科技有限公司",
    "memberId": "b2b-2210356332867938a0",
    "yearsOnPlatform": 6,
    "province": "广东",
    "city": "东莞市",
    "businessType": "生产加工",
    "businessTypeEn": "manufacturer",
    "serviceScores": {"composite": 4.5, "consultation": 3.0, "logistics": 4.0, "dispute": 4.0, "returns": 4.0, "goods": 3.67}
  },
  "searchTerm": "手机壳",
  "position": 2
}
```

With **Include offer details** the same item also gets `moq`, `priceTiers`, `skus`, `attributes`, `shipFrom`, `unitWeightKg`, `packageSizes`, `rating`, `reviewCount`, `images`, `descriptionImages` and the supplier's badges.

### How much does it cost?

Pay per result: **$0.0015 per offer** saved, plus **$0.0025 per offer page** when details are on (or for each offer URL you paste), so a fully detailed offer costs $0.004. There is no start fee. Proxy traffic is billed by Apify to your account at your plan's residential rate: about 50 KB per 60 search results and 30-120 KB per detailed offer, i.e. roughly $0.01 per 1,000 search results and $0.3-1 per 1,000 detailed offers at $8/GB (offers with hundreds of variants have bigger pages).

### Search 1688 by image

Put product photos in **Image URLs**. Photos already on Alibaba's CDN (`alicdn.com`, e.g. from 1688, Taobao, AliExpress listings) are searched directly; other photos (your own, Amazon, Shopify) are uploaded to 1688's image search first. You get up to 40 matching offers per page, each with `similarity`, MOQ and quantity price tiers, so you can compare factories for the same product in one run. `searchImageUrl` tells which of your photos a match belongs to.

### Does it work with English keywords?

Yes, but 1688 does not translate them: an English keyword matches offers whose Chinese titles contain that English word (common on cross-border listings, e.g. `dress`). Chinese keywords reach far more of the market. Titles are returned in Chinese; 1688 provides no English version.

### Monitor changes on a schedule

Turn on **Only new or changed items** and the Actor remembers what earlier runs of the same input returned: each run outputs only offers that are new in the watched results or whose price (card price, price range, quantity tiers) or MOQ changed. Unchanged offers are dropped on the search results, before any offer page is opened, so they cost nothing; offer URLs are compared after their page is read and are not charged when unchanged. **Max items** becomes the window checked on every run, e.g. the first 60 results of a search sorted by sales. Save the input as a task and add a Schedule to it in Apify Console (for example daily). Every output offer carries `changeType` (`new` or `changed`); changed ones carry `previousValues`, e.g. `{"price": 2.98}`. Sold counts and repurchase rates move all the time and do not count. Use **Monitoring key** to keep several schedules on the same search separate.

### Does it work without login?

Yes. Everything comes from what 1688 shows a signed-out visitor. 1688 answers its search API only from Chinese residential IPs (datacenter, US and HK addresses get a slider captcha) and blocks an IP after a couple of offer pages, so the Actor uses Apify's residential proxy in China and opens every offer page from a new IP. It does not solve captchas. Shop pages on `<name>.1688.com` need a login, so use the shop's winport link (every result has it in `supplier.winportUrl`).

### Integrations and API

Use the results in Make, Zapier, n8n or Google Sheets, or call the Actor from Python or JavaScript with the Apify client. The **API** tab has ready-made snippets.

### Is it legal to scrape 1688.com?

The Actor collects only data 1688 shows publicly to signed-out visitors: offer listings, prices, sales figures and supplier business information (company name, location, ratings). It does not log in, does not reveal hidden values and does not collect personal data beyond the public shop and company names sellers publish. You are responsible for how you use the data and for complying with 1688's terms and applicable law.

### Support

Found a bug or need a field? Open an issue in the **Issues** tab.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on 1688.com, one search per line. Chinese keywords give the best results (e.g. 蓝牙耳机, 手机壳). English keywords are not translated by 1688: they match offers whose titles contain the English word (common on cross-border listings), so Chinese keywords reach far more of the market. Titles are returned in Chinese as the sellers wrote them.

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

1688 URLs: search result pages (s.1688.com/selloffer/offer_search.htm?keywords=..., filters in the URL are kept), shop listings (the shop's winport link with memberId=b2b-..., found in every result as supplier.winportUrl; <name>.1688.com shop pages need a login and are not supported), offer pages (detail.1688.com/offer/<id>.html, always scraped with full details) and image search pages (s.1688.com/youyuan/index.htm?imageAddress=...).

## `imageUrls` (type: `array`):

Find suppliers by photo: one image URL per line (JPG/PNG/WEBP under 4 MB). Images on Alibaba's CDN (alicdn.com, e.g. an AliExpress or 1688 product photo) are searched directly; other images are uploaded to 1688's image search first. Returns up to 40 matching offers per page, with MOQ and quantity price tiers.

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

Order of keyword and search-URL results. 'sales' = best sellers first (30-day volume).

## `minPrice` (type: `number`):

Only offers priced at or above this many yuan (keyword and search-URL results).

## `maxPrice` (type: `number`):

Only offers priced at or below this many yuan (keyword and search-URL results).

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

Stop after this many offers in total (all searches together). You pay per offer saved, so this caps the cost.

## `maxPagesPerSearch` (type: `integer`):

Result pages to read per search term / URL: 60 offers per page for keyword and shop searches, 40 for image searches. 1688 shows at most 2,000 results per search (34 pages).

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

Open each offer page for MOQ, quantity price tiers, all SKU variants with price and stock, specifications, all images, description images, ship-from location, package weight and size, rating and supplier badges. Charged as an extra 'detail' event per offer and slower (one residential page load per offer).

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new items or items whose price/status changed. Use with a Schedule; unchanged items are not charged.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input

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

1688 answers search requests only from Chinese residential IPs (datacenter, US and HK IPs get a captcha), so the default is Apify RESIDENTIAL proxy with country CN. Proxy traffic is billed to your Apify account: about 50 KB per 60-offer search page and 30-120 KB per offer page with details.

## Actor input object example

```json
{
  "searchTerms": [
    "蓝牙耳机"
  ],
  "sortBy": "default",
  "maxItems": 100,
  "maxPagesPerSearch": 5,
  "includeDetails": false,
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CN"
  }
}
```

# 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 = {
    "searchTerms": [
        "蓝牙耳机"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CN"
    }
};

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

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

```

## MCP server setup

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