Find 1688 factory prices for a product idea
1688.com is the domestic wholesale marketplace where Chinese factories and traders sell to businesses. It is in Chinese, prices are in yuan, and the useful facts (price per quantity, minimum order, whether the seller is a factory) sit on each product page.
arcadium/1688-products searches 1688 by keyword and, for the offers you pick, reads the product page: price tiers by quantity, MOQ, SKUs and supplier facts. This tutorial does it in two runs: a cheap search, then details for the five best sellers only.
Cost of this example on the Apify Free plan: 60 × $0.0018 + 5 × $0.00449 = $0.1305 ($0.099 on the Apify Gold plan and higher), plus $0.001 per GB of memory when the run starts.
What you need
- An Apify account and API token.
- The product name in Chinese gives the best matches (for example 保温杯 for an insulated cup); English keywords work too.
Step 1: Run it in the Apify Store (no code)
- Open arcadium/1688-products on the Apify Store and sign in (a free Apify account works).
- Enter the keyword in Search keywords, for example
保温杯. - Set Max products per keyword to 60 and Sort by to most sold.
- For a second run, put the offer ids you want in Offer IDs: each returns a full product with details.
- Optional: set a maximum cost per run in the run options as a hard cap.
- Click Start. Rows appear in the Output tab; export them as JSON, CSV or Excel.
The same input as JSON (paste it in the JSON tab of the input form):
{
"keywords": [
"保温杯"
],
"maxItemsPerKeyword": 60,
"sort": "sales"
}
Step 2: Call it over the Apify API
One HTTP call runs the actor and returns its rows. It suits runs up to about five minutes; for longer runs start the run asynchronously and read the dataset when it finishes.
curl -X POST "https://api.apify.com/v2/acts/arcadium~1688-products/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":["保温杯"],"maxItemsPerKeyword":60,"sort":"sales"}'
Step 3: Run it from Python
With apify-client 3.x, call() returns a Run object: read the dataset id as run.default_dataset_id (older examples use run["defaultDatasetId"], which no longer works).
# pip install "apify-client>=3"
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
actor = client.actor("arcadium/1688-products")
# 1. Search: cheap rows with price range, sold count and origin
run = actor.call(run_input={"keywords": ["保温杯"], "maxItemsPerKeyword": 60, "sort": "sales"})
found = [r for r in client.dataset(run.default_dataset_id).iterate_items() if r.get("rowType") == "product"]
top = sorted(found, key=lambda r: r.get("soldCount") or 0, reverse=True)[:5]
# 2. Details for the top 5 only: price tiers, MOQ, supplier
run = actor.call(run_input={"offerIds": [r["offerId"] for r in top]})
for p in client.dataset(run.default_dataset_id).iterate_items():
if p.get("rowType") != "product":
continue
s = p.get("supplier") or {}
print(p["offerId"], p.get("moq"), p.get("unit"), p.get("priceTiers"),
"factory" if s.get("isFactory") else "trader", p.get("origin"))
Step 4: Run it from JavaScript
// npm install apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('arcadium/1688-products').call({
"keywords": [
"保温杯"
],
"maxItemsPerKeyword": 60,
"sort": "sales"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
Step 5: Ask an AI assistant (MCP)
Apify’s hosted MCP server turns the actor into one tool. Add it to Claude, Cursor, VS Code or any MCP client:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=arcadium/1688-products",
"headers": {
"Authorization": "Bearer <APIFY_TOKEN>"
}
}
}
}Then ask, for example:
Use arcadium/1688-products to search 1688 for 保温杯 sorted by sales, 30 results. Translate the titles, convert the price range to USD at today’s rate you state, and list the five best sellers with their minimum order.
More clients and the local setup on the MCP page.
Output fields
Every row has a rowType; filter on it first. Failed inputs come back as free rows with a code and message. The fields this tutorial uses, from the actor’s dataset schema:
| Field | What it holds |
|---|---|
rowType | Kind of row. Filter on this first. 'product': one 1688 offer (charged); 'coverage': per-keyword completeness (free); 'error': an input failed (free). |
offerId | 1688 offer id, the number in the product link. Stable key for joins and monitoring. |
url | Product page link on detail.1688.com. |
title | Product title as the seller wrote it, usually Chinese; contact data removed. |
priceMin | Lowest unit price in CNY. |
priceMax | Highest unit price in CNY. |
priceTiers | Wholesale steps by quantity: {minQty, maxQty, price}. Empty when each variant is priced on its own. |
moq | Minimum order quantity. |
unit | Selling unit, e.g. 件 or 个. |
soldCount | Units sold; a lower bound on search rows, the exact total with details. |
origin | Dispatch location: province and city. |
supplier | Supplier facts: companyName, memberId, isFactory, isSuperFactory, factoryInspected, yearsOnPlatform, serviceScores, repurchaseRate3m, shopUrl. |
All fields: 1688 Products Scraper guide.
Cost per run
Pay per event: you pay for the rows delivered, at the actor’s live Apify price on 2026-11-01. Error, coverage and summary rows are free.
| What | Rows | Price per row (Free plan) | Subtotal |
|---|---|---|---|
| Product (search result): 60 search results | 60 | $0.0018 | $0.108 |
| Product with details: 5 products with details | 5 | $0.00449 | $0.0225 |
Cost of this example on the Apify Free plan: 60 × $0.0018 + 5 × $0.00449 = $0.1305 ($0.099 on the Apify Gold plan and higher), plus $0.001 per GB of memory when the run starts. Higher Apify plans pay less per row. The Store page always has the current price.
Limitations
- A product with details is charged instead of the plain search price, not on top of it.
- Prices are in yuan (CNY) before freight, export and import costs; they are a starting point for a quote, not a landed cost.
- Public data only. Nothing behind a login, and no contact details of sellers.
- 1688 shows at most 2,000 results per search. Use several keywords or price bands to go deeper.
- Prices are in yuan and titles, attributes and tags are in Chinese. Translation is not included.
- 1688 sometimes answers a search without the product list. The actor retries; if it still fails you get a free
blockedrow. - 1688 sometimes refuses all searches for a few minutes. The actor then waits up to
searchGateWaitMinutes(default 12, tries again every 3 minutes, nothing is charged while it waits) and carries on once searches work again. If they still fail, every keyword it could not search gets a freeblockedrow: run it again later. SetsearchGateWaitMinutesto 0 to stop at once instead. Product pages work the same way: if they keep refusing, the remaining keyword results arrive as plain products, charged at the plain price. - A search row has no variants. Add details for
skus. soldCountof a search row is a lower bound ("500+"). With details it is the exact total of the listing. The "全网" figure (soldScope: network) covers the same product across the web, not only this listing.- The freight
feeis indicative; 1688 calculates the real freight from the destination. - Titles and attributes are cleaned of e-mail addresses, phone numbers and messenger handles; a seller can still hide contact data in an image.
Links
- 1688 Products Scraper: fields, price table and sample output
- How to use 1688 Products Scraper: every input field, n8n, LangChain
- arcadium/1688-products on the Apify Store
- All tutorials