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

Scrape 1688.com products and search results without login, cookies or your own proxy. Get wholesale prices by quantity, variants with stock, sales, supplier card, ratings, dropshipping terms and description: about 100 fields per offer. Fast, pay per result, export to JSON, CSV or Excel.

- **URL**: https://apify.com/maksim_lazouski/1688-product-scraper.md
- **Developed by:** [Maksim Lazouski](https://apify.com/maksim_lazouski) (community)
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.00 / 1,000 offer rows

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

### What does 1688 Product Scraper do?

1688 Product Scraper reads **product offers** and **search results** from [1688.com](https://www.1688.com), the Chinese wholesale marketplace. Give it **offer links** or **search keywords** and it returns one row per offer with about 100 fields: wholesale prices by quantity, variants with stock, sales, supplier, ratings, dropshipping terms and description.

- **No 1688 account, no cookies, no proxy of your own.** Paste links or keywords and press Start.
- **Full offer rows.** The supplier card, the ratings, the dropshipping terms and the description come with every offer, not only what the offer page itself carries.
- **Search by keyword.** Up to 180 offers per keyword, each stored once.
- **Fast.** About 2,600 offers an hour with the default settings; 100 offers took a little over two minutes in our runs.
- **You pay per row** that was read and stored, and for nothing else.

It runs on the Apify platform, so you also get scheduling, an API, webhooks, integrations, and export of the results to JSON, CSV, Excel or HTML.

### What data can you extract from 1688?

| Group | Fields |
|---|---|
| Offer | id, title, category name and ids, brand, attributes, selling points, status, dates created, changed and posted |
| Price | lowest and highest price, price by quantity, prices before a promotion, unit, smallest order, mixed-batch terms |
| Variants | every variant with its id, name, price and stock; total stock; weight and package size |
| Sales | units sold, orders in 30 days, repeat-buyer rate, number of reviews, review tags, rating |
| Media | pictures, video link and cover |
| Delivery | where it ships from, postage, promised dispatch time, usual carrier, guarantees |
| Supplier | company name, seller ids, shop link, years on 1688, star level, main category, service scores, badges (TrustPass, factory, strength merchant) |
| Dropshipping | whether it is offered, the channels it is offered for, prices and services |
| Description | text, pictures, link to the description file |

A search row is shorter: offer id, title, price, price by quantity, units sold, repeat-buyer rate, supplier name and ids, shop link, years on 1688, province and city, tags, picture, link, whether the result is an ad, and its place on the page.

### How to scrape 1688 products

1. Open the actor and go to the **Input** tab.
2. Paste **offer links or ids** (one per line), or type **search keywords**, or both.
3. For keywords, choose how many pages of results to read (1 to 3) and whether to open every search result to get its full offer row.
4. Press **Start**.
5. Open the **Output** tab, or export the dataset as JSON, CSV or Excel, or read it through the API.

### How much does it cost to scrape 1688?

You pay for the rows the actor stores, at two prices:

| What | Price |
|---|---|
| An offer row | $3.00 per 1,000 |
| A search result row | $0.50 per 1,000 |

- 1,000 full offer rows cost $3.00.
- One keyword read to the end is at most 180 search rows: $0.09.
- A keyword with every result opened is at most 180 offer rows: $0.54.

You do not pay for offers the actor could not read, and a run that reads nothing fails without charging a row. Apify's free plan comes with $5 of usage a month, which is enough for about 1,600 offer rows.

### Input

| Field | What it does |
|---|---|
| `offers` | Offer links or ids. `https://detail.1688.com/offer/762640272016.html` and `762640272016` are the same. |
| `keywords` | Search keywords. Chinese keywords find the most. |
| `maxPagesPerKeyword` | 1 to 3 pages of results per keyword, 60 results a page. |
| `scrapeDetails` | Off: a short row per search result. On: the full offer row for every search result. |
| `includeExtras` | Adds the supplier card, ratings, dropshipping terms and description to every offer. On by default. |
| `maxItems` | Stop after this many rows. |
| `maxConcurrency` | How many offers and search pages are read at the same time. 10 by default. |

Offers by link:

```json
{
    "offers": [
        "https://detail.1688.com/offer/1038945499752.html",
        "762640272016"
    ]
}
```

A keyword, with the full row for every result:

```json
{
    "keywords": ["手机壳"],
    "maxPagesPerKeyword": 2,
    "scrapeDetails": true
}
```

### Output

Every row has a `type` field: `offer` or `search_result`.

#### An offer row

About 100 fields; the main ones are shown here, with the lists cut short.

```json
{
    "type": "offer",
    "offer_id": "1038945499752",
    "url": "https://detail.1688.com/offer/1038945499752.html",
    "title": "雅盾磁吸适用iPhone18promax手机壳秒变苹果17promax全包防摔壳16",
    "category_name": "iPhone保护套",
    "brand": "潮虹兔",
    "unit": "个",
    "price_min": 7,
    "price_max": 8.5,
    "price_tiers": [
        {"price": 8.5, "from_quantity": 1},
        {"price": 8, "from_quantity": 300},
        {"price": 7, "from_quantity": 3000}
    ],
    "min_order": 1,
    "stock_total": 1559335,
    "sku_count": 156,
    "skus": [
        {"sku_id": 6224367734976, "spec": "黑色>iPhone 14pro", "price": null, "discount_price": null, "stock": 9999, "sold": 0}
    ],
    "sold_count_min": 600,
    "orders_30d_min": 3000,
    "review_count": 21328,
    "goods_grade": 5,
    "good_rate_percent": 99.6,
    "repeat_rate_3m": "57.18%",
    "attributes": {"材质": "PC", "款式": "二合一", "品牌": "潮虹兔"},
    "images": ["https://cbu01.alicdn.com/img/ibank/O1CN01MQmJszTNdAB2vH2e_!!3872131675-0-cib.jpg"],
    "has_video": true,
    "ships_from": "广东省深圳市",
    "post_fee": 3,
    "delivery_promise": "承诺48小时发货·常发韵达快递",
    "guarantees": ["7天无理由退货", "晚发必赔"],
    "company": "深圳市亿佳合兴科技有限公司",
    "shop_url": "https://shop764420m281617.1688.com",
    "supplier_years": 9,
    "supplier_star": 4,
    "supplier_main_category": "苹果专用配件",
    "supplier_scores": {"品质达标率": "99.9%", "综合履约率": "91.9%", "店铺回头率": "57.2%"},
    "seller_is_trustpass": true,
    "seller_is_factory": false,
    "rating_grade": 5,
    "rating_good_percent": 100,
    "dropship_channels": ["Lazada", "Amazon", "Shopify", "Shopee"],
    "dropship_prices": [{"quantity": "1件价格", "price": 8.5}],
    "description_text": "首先恭喜您找到源头厂家货源，批发量大价优！...",
    "description_images": ["https://cbu01.alicdn.com/img/ibank/O1CN01hBll2W1OFCAqJ7128_!!3872131675-0-cib.jpg"],
    "created_at": "2026-04-05T14:18:37Z",
    "modified_at": "2026-10-13T13:18:30Z"
}
```

#### A search result row

```json
{
    "type": "search_result",
    "keyword": "蓝牙耳机",
    "page": 1,
    "position": 5,
    "offer_id": "1051199602311",
    "url": "https://detail.1688.com/offer/1051199602311.html",
    "title": "【新升级】2026新款蓝牙耳机无线耳夹运动降噪高音质无线夹耳",
    "price": 5.01,
    "price_note": "限时价",
    "sold_text": "全网4.2万+件",
    "sold_count_min": 42000,
    "booked_count": 8135,
    "repeat_buyer_rate": "10%",
    "company": "厦门祥德行塑胶有限公司",
    "shop_url": "http://shop7176332hn1j77.1688.com",
    "supplier_years": 2,
    "province": "福建",
    "city": "厦门市",
    "tags": ["退货包运费", "先采后付", "回头率10%"],
    "image": "https://cbu01.alicdn.com/img/ibank/O1CN01HcxZQF1JWzrRozisJ_!!2219639211037-0-cib.jpg",
    "is_ad": false
}
```

### Limits you should know

- **Search gives up to 180 offers per keyword.** 1688 shows a visitor who is not logged in three pages of 60 results and no more. It sometimes shows an offer again on a later page; the actor stores an offer once per keyword, at the place it was first shown, and you do not pay for the repeat. To get more offers, use more specific keywords.
- **A supplier card, a rating or a description is sometimes missing** for an offer: 1688 has none for it, or did not answer for that block. The row is returned with the fields it has.
- **Descriptions are mostly pictures.** Sellers on 1688 usually put the description into images, so `description_text` is often short and `description_images` is long.
- **The supplier's legal details** (registration number, registered capital) are on a separate page of the shop and are not read. `shop_credit_url` in the row points to it.
- **Text is returned as 1688 gives it:** in Chinese, prices in CNY.
- **A full offer row takes about 14 seconds** for one reader; ten read at the same time by default. For a large job set the run's timeout to fit.

### FAQ

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

No. The actor reads what 1688 shows to a visitor who is not logged in, and brings its own connections.

#### What happens when an offer could not be read?

Each offer is tried up to three times. What still fails is listed in the `FAILED` record of the run's key-value store, with the reason, and is not charged. The `SUMMARY` record holds the counts of the run. A row is never stored twice, also when the platform restarts a run.

#### Can I get more than 180 results for a keyword?

Not for one keyword: that is where 1688 stops a visitor who is not logged in. Use several narrower keywords instead. A search row is returned under every keyword that finds the offer; with "open every search result" the full offer row is read and charged once per run.

#### Can I run it on a schedule or call it from my code?

Yes. Use Apify's schedules for regular runs, and the Apify API or its clients for Python and JavaScript to start runs and read results. The `maxItems` field and the run's spending limit keep a run within a budget.

#### Is it legal to scrape 1688?

The actor reads only what 1688.com shows publicly, without logging in. Offer pages name companies and their shops, and a seller can be a private person, so handle names as the data protection rules that apply to you require. You are responsible for how you use the data; if you are not sure, ask a lawyer.

#### Something is wrong or a field is missing

Open an issue on the actor's **Issues** tab with the offer link or the keyword. Requests for other marketplaces are welcome there too.

1688 is a trademark of its owner. This actor is not affiliated with or endorsed by 1688.com or Alibaba Group.

# Actor input Schema

## `offers` (type: `array`):

1688 offers to read. Each line is a link such as https://detail.1688.com/offer/762640272016.html or just the number from it.

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

Keywords to search 1688 for. Chinese keywords find the most (手机壳 finds more than "phone case"). Every page of results holds 60 offers.

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

How many pages of search results to read for each keyword. 1688 shows a visitor who is not logged in three pages (up to 180 offers) per keyword, so 3 is the most. An offer that 1688 shows on more than one page is returned once.

## `scrapeDetails` (type: `boolean`):

Off: one short row per search result (title, price, sales, supplier, link). On: the actor opens the offer page of every result and returns the full offer row instead.

## `includeExtras` (type: `boolean`):

Adds to every offer the blocks its page loads beside the main data: the supplier card, the offer's ratings, the dropshipping terms and the description (text and pictures). Turn off to get only what the offer page itself carries.

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

The run stops once it has stored this many rows. Leave empty for no limit.

## `maxConcurrency` (type: `integer`):

How many offers and search pages are read at the same time, each from its own address. More is faster; the default suits most jobs.

## Actor input object example

```json
{
  "offers": [
    "https://detail.1688.com/offer/762640272016.html"
  ],
  "keywords": [
    "手机壳"
  ],
  "maxPagesPerKeyword": 1,
  "scrapeDetails": false,
  "includeExtras": true,
  "maxConcurrency": 10
}
```

# Actor output Schema

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

One row per offer or per search result; the field `type` says which.

## `summary` (type: `string`):

How many offers and search results were stored, how many failed, and why the run stopped if it did.

## `failed` (type: `string`):

The offers and keywords that could not be read, each with the reason. An empty list when everything was read.

# 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 = {
    "offers": [
        "https://detail.1688.com/offer/762640272016.html"
    ],
    "keywords": [
        "手机壳"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maksim_lazouski/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 = {
    "offers": ["https://detail.1688.com/offer/762640272016.html"],
    "keywords": ["手机壳"],
}

# Run the Actor and wait for it to finish
run = client.actor("maksim_lazouski/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 '{
  "offers": [
    "https://detail.1688.com/offer/762640272016.html"
  ],
  "keywords": [
    "手机壳"
  ]
}' |
apify call maksim_lazouski/1688-product-scraper --silent --output-dataset

```

## MCP server setup

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