The short answer
1688 has an official API. Its Open Platform at open.1688.com opens it solution by solution, not as one public endpoint, and registering as a developer takes an Alibaba China-site account with an enterprise-verified Alipay account bound to it. The keyword search and product detail calls come mainly with the cross-border solutions. The self-use one adds a whitelist by 1688 staff, and for users in its scope 1688 states a monthly check: at least 160,000 yuan of sales on orders confirmed as received, and a ratio of that amount to API calls of at least 0.5. Among the solutions we read, the others are reserved for ERP and SaaS providers, for merchants you already ordered from, or for your own products. The Open Platform lists other solutions, such as a country service station and dropshipping, that we do not detail here. To read search results and product details without an account, a whitelist or a sales threshold, our 1688 Scraper takes keywords or offer links and returns them. Thirty products with variants, stock and supplier data took a 41-second run and cost $0.155.
What 1688's APIs give you
1688.com is the domestic wholesale marketplace of Alibaba Group. Its Open Platform groups APIs into solutions, each for a role. This is what the solution pages and API references linked below say, read on November 4, 2026. They are in Chinese and the translations are ours.
| Option | What it asks for | What it returns |
|---|---|---|
| Cross-border solution, self-use | A 1688 buyer account that 1688's cross-border staff add to a whitelist, then an order of the solution. For users in this scope, 1688 states that it checks each month that the sales on orders confirmed as received, closed on 1688 and through its sourcing API, reach 160,000 yuan, and that this amount divided by the number of API calls reaches 0.5. A missed threshold brings “governance measures”. See the solution page, tab “How to connect”. | Keyword and image search, and a product detail call with quantity-tier prices, price and stock per variant, supplier scores and shipping data, in the keyword search and product detail references. Titles come translated into the country language you pass (en or ja in the references). A product that neither a keyword search nor an image search returned cannot be looked up: error P0048, per the solution's release note of November 28, 2023. |
| Cross-border ERP and independent-site SaaS solution | Qualification as a “cross-border ERP provider”, applied for with supporting materials, then an order of the solution. To offer your tool to others, a listing in 1688's service market, reviewed in 1 to 3 working days, per the solution page. | Product query and retrieval, order creation and query, payment and logistics, for the ERP or site-builder tool that its users authorize. |
| Procurement solution, buyer self-use | A 1688 buyer account at level L2 or above, per the solution page. | Product information, batch orders, logistics tracking and refunds, for merchants you already ordered from. The product call, alibaba.product.simple.get, needs payment and returns “simple information”, mainly to match records in an ERP. |
| Procurement solution, service-provider edition | Role qualification, an order of the solution, call quota for its two paid calls, and an app listed in 1688's service market. A free listing must bring at least 10,000 purchase orders a month through the API, or 1688 takes the solution back, per the solution page. | Buyer procurement functions inside an app sold in 1688's service market. |
| Our 1688 Scraper | An Apify account. No 1688 account, whitelist or sales threshold. | Searches of up to 2,000 results, and, with full details (scrapeDetails), for each product the quantity tiers, every variant with price and stock, specifications, sales, rating and supplier fields. Chinese text, prices in CNY. It reads only, and is paid per result. |
The general product call, alibaba.product.get, reads one product by ID but, in its reference, “can only query your own products”.
The developer registration is the same for all of them. The app-access page says a developer needs an Alibaba China-site account with an enterprise real-name-verified Alipay account bound to it (merchant-verified for enterprise developers). The app then starts with a traffic limit of 5,000, raised to 100,000 once Alibaba staff approve it and it is configured in the app market, a review the page puts within a week. The platform introduction limits the tools that merchants and buyers build for themselves to enterprise users, for their own use: selling them privately or authorizing other companies is forbidden.
If you buy on 1688 and want your software to place and pay orders, track parcels and receive English titles, the API does that and our Actor does not. The self-use solution's thresholds are set on purchases made through 1688, so it fits a company already buying at that volume. For research, or a supplier shortlist before you have bought anything, those sales do not exist yet.
Shortlist suppliers at your quantity
This script searches 1688 for vacuum insulated cups, reads 30 products with full details, keeps the ones 1688 types as factory that you can order 500 of, prices them at 500 units and writes a CSV:
import csv
from apify_client import ApifyClient
QUANTITY = 500
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/1688-scraper").call(run_input={
"searchQueries": ["保温杯"], # vacuum insulated cup
"sort": "sales",
"scrapeDetails": True,
"maxResultsPerSearch": 30,
"maxItems": 30,
})
products = [p for p in client.dataset(run.default_dataset_id).iterate_items()
if p["type"] == "product" and p["status"] == "ok" and p["detailLevel"] == "full"]
def unit_price(p):
"""Price per unit at QUANTITY: the last quantity tier reached, else the single price."""
tiers = [t for t in p["priceTiers"] or [] if t["minQuantity"] <= QUANTITY]
return max(tiers, key=lambda t: t["minQuantity"])["price"] if tiers else p["price"]
offers = [p for p in products
if p["supplierType"] == "factory"
and (p["minOrderQuantity"] or 1) <= QUANTITY
and (p["stock"] or 0) >= QUANTITY]
offers.sort(key=unit_price)
print(len(products), "products,", len(offers), "factory offers you can order", QUANTITY, "from")
for p in offers[:10]:
print(f'{unit_price(p):6.2f} CNY | min order {p["minOrderQuantity"] or 1:>3} | '
f'repeat buyers {p["supplierRepeatBuyerRate"]}% | sold {p["sold"]} | {p["url"]}')
with open("shortlist.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["offerId", "unitPrice", "total", "minOrderQuantity", "repeatBuyerRate", "inspected", "sold", "url"])
for p in offers:
w.writerow([p["offerId"], unit_price(p), round(unit_price(p) * QUANTITY, 2), p["minOrderQuantity"],
p["supplierRepeatBuyerRate"], p.get("factoryInspected"), p["sold"], p["url"]])
Tested with apify-client 3.4 on November 4, 2026. With apify-client 2.x, write run["defaultDatasetId"] instead of run.default_dataset_id. It printed:
30 products, 28 factory offers you can order 500 from
7.30 CNY | min order 1 | repeat buyers 58.72% | sold 594177 | https://detail.1688.com/offer/594208233163.html
9.00 CNY | min order 1 | repeat buyers 59.95% | sold 93796 | https://detail.1688.com/offer/1032130276764.html
9.40 CNY | min order 2 | repeat buyers 62.45% | sold 256205 | https://detail.1688.com/offer/794013801400.html
| The search 保温杯, 30 products | Result |
|---|---|
| Products read with full details | 30 |
Typed factory by 1688 (supplierType) | 29 |
| Factory offers orderable at 500 units | 28 |
Inspected by 1688 (factoryInspected), among those 28 | 10 |
| Price per unit at 500, CNY | 7.30 to 62.00, median 12.35 |
| Supplier repeat buyer rate | 35.0% to 84.7%, median 56.4% |
| Products with quantity tiers | 5 |
| Run time and cost | 41 s, $0.155 |
One factory offer was left out because it shows no stock figure. Of the 5 products with quantity tiers, 2 cost less at 500 units than at the minimum order. The other 25 have no tiers: 1688 prices them by variant, and price is then the lowest variant price. The 7.30 CNY offer above has 41 variants, priced from 7.30 to 11.49 CNY (priceRange), so to price the variant you want, read variants. supplierType is 1688's own label and 29 of these 30 products carry factory; factoryInspected is the narrower filter.
What a product looks like
The cheapest offer at 500 units in that run, shortened to some of its fields and 2 of its 41 variants:
{
"type": "product",
"status": "ok",
"detailLevel": "full",
"offerId": "594208233163",
"url": "https://detail.1688.com/offer/594208233163.html",
"title": "不锈钢保温杯316智能水杯男女士茶水分离高颜值礼品定制杯子批发",
"price": 7.3,
"priceRange": "7.30-11.49",
"currency": "CNY",
"unit": "个",
"priceTiers": [],
"minOrderQuantity": 1,
"mixedOrder": {"minQuantity": 2, "minAmount": 100},
"stock": 1273211,
"sold": 594177,
"soldPeriod": "全网销量",
"rating": 5,
"reviewCount": 164377,
"shippingFee": 1.5,
"dispatchTime": "承诺3天发货·常发中通快递",
"supplierType": "factory",
"supplierRepeatBuyerRate": 58.72,
"supplierYears": 13,
"factoryInspected": true,
"updatedAt": "2026-11-04T12:07:42Z",
"variants": [
{"skuId": "6220918826480", "options": ["直杯 哑光深蓝", "(含税价)所有系列材质保真假一赔十"], "price": 7.3, "stock": 41979, "weightGrams": 283},
{"skuId": "6220918826451", "options": ["橡胶漆款 杏雨梨云", "(含税价)所有系列材质保真假一赔十"], "price": 10.3, "stock": 49283, "weightGrams": 283},
"..."
]
}
Titles, options and specifications are in Chinese, as on 1688. Supplier names, shop links and images are in the record too.
Watch the prices of your shortlist
Put the offer IDs you shortlisted in the script below. Each run reads them again and compares them with the reading saved by the previous run. It prints a price or quantity-tier change, an offer taken down (a free unavailable record), and stock that fell under the quantity you need:
import json
from pathlib import Path
from apify_client import ApifyClient
OFFERS = ["594208233163", "1032130276764", "794013801400", "975693178980", "998257618380", "1076380943016"]
NEEDED = 500 # units you plan to order
SNAPSHOT = Path("snapshot.json")
def changes(before, now):
"""Compare two readings, {offerId: fields, or None when the offer is gone}."""
for offer_id, new in now.items():
if offer_id not in before:
continue
old = before[offer_id]
if new is None and old is not None:
yield offer_id, "taken down"
elif new and old:
if new["price"] != old["price"] or new["tiers"] != old["tiers"]:
yield offer_id, f'price {old["price"]} -> {new["price"]} CNY'
if new["stock"] is not None and new["stock"] < NEEDED and (old["stock"] or 0) >= NEEDED:
yield offer_id, f'stock {old["stock"]} -> {new["stock"]}, under {NEEDED}'
if __name__ == "__main__":
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/1688-scraper").call(run_input={"productUrls": OFFERS})
now = {}
for p in client.dataset(run.default_dataset_id).iterate_items():
if p["status"] == "ok":
now[p["offerId"]] = {"price": p["price"], "tiers": p["priceTiers"], "stock": p["stock"]}
elif p["status"] == "unavailable":
now[p["offerId"]] = None
before = json.loads(SNAPSHOT.read_text()) if SNAPSHOT.exists() else {}
found = list(changes(before, now))
for offer_id, what in found:
print(offer_id, what)
print(len(now), "offers read:", f"{len(found)} changes since the last reading" if before else "first reading saved")
SNAPSHOT.write_text(json.dumps(now))
Run it every day from cron or another scheduler. Tested with apify-client 3.4 on November 4, 2026: the first run saved 6 offers in 22 seconds, and a second run less than a minute later read them in 8 seconds and found no change. Each run cost $0.035, which is $1.05 for 30 daily runs. The comparison itself was also checked on a hand-edited reading, where it reported a price change, a stock fall under 500 and a removed offer.
Limits
- A search returns at most 2,000 results, the most 1688 shows for one search. Several keywords or price ranges (
minPriceandmaxPrice, in CNY) go further. - Titles, options and specifications are in Chinese. English keywords are accepted. Prices are in CNY before shipping, and
shippingFeeis the shipping within China. - Prices for members only, coupons and shipping costs outside China are not collected.
- When 1688 does not serve the full details of a product at that moment, you get its search data with a
detailsNote, charged as a search result. - An offer that no longer exists comes back as a free
unavailablerecord, an offer listed without any price asnoPrice, and an input that fails as a freeerrorrecord whoseretryablefield says if a later run may work. - Supplier fields are company and shop data, and some suppliers are sole proprietors, which can make their names personal data under laws such as the GDPR. 1688's terms and the law that applies to you govern how you use the data.
What it costs
| Result | Per 1,000, every Apify plan |
|---|---|
| Search result | $2.50 |
| Product with full details | $5.00 |
Plus $0.005 per run start at the default memory. The 30 products above cost $0.155, and the 6 offers of the watch script $0.035. A 2,000-result search without details costs $5.00 plus the start fee. Offers that no longer exist, offers without a price, errors and duplicates are not charged. Set a maximum cost per run and the run stops before going over it.
Questions
Does 1688 have an official API?
Yes. The Open Platform at open.1688.com publishes APIs by solution. Registration asks for an Alibaba China-site account with an enterprise real-name-verified Alipay account, and the app is reviewed within a week, per the app-access page. Keyword search and product details come mainly with the cross-border solutions, where the self-use one adds the whitelist and the monthly thresholds described above.
Can an individual use the 1688 API?
The pages we read describe no route for individuals. Developer registration asks for an enterprise real-name-verified Alipay account, and the platform introduction limits the tools that merchants and buyers build for themselves to enterprise users, for their own use.
Can I get 1688 product data in English?
The official search and detail calls take a country parameter and return translated titles, en and ja in the references. Our Actor delivers titles, options and specifications in Chinese, as on 1688.
Do I need a 1688 account to use the Actor?
No. The Actor uses no 1688 account, cookies or API key.
Run it on the Apify Store
Products with full details cost $5.00 per 1,000 and search results $2.50 per 1,000 on every plan, plus $0.005 per run at the default memory. Offers that no longer exist, offers without a price, errors and duplicates are not charged, and you can set a maximum cost per run.