# 1688 Products Scraper: Wholesale, MOQ & 1688 Image Search (`hyperbach/1688-products-scraper`) Actor

Scrape 1688.com products by keyword (English or Chinese), search URL, offer id, shop or image: price tiers by quantity, MOQ, sold count, images, the supplier's name, years, location and scores; every SKU, specs and shipping on a switch. No login. Export to CSV, JSON or Excel. Misses free.

- **URL**: https://apify.com/hyperbach/1688-products-scraper.md
- **Developed by:** [Hyperbach](https://apify.com/hyperbach) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.45 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Products Scraper: Wholesale, MOQ & 1688 Image Search

**1688.com products, logged out: keywords in English or Chinese, 1688 search URLs with their filters, product URLs or offer ids, a shop's member id, or an image in; one row per product out — the offer id and URL, the title (and an English title from 1688's own translator), the price tiers by quantity in CNY, the minimum order and its unit, the sold count, orders and repurchase rate, images, the ad flag, and the supplier's name, years on 1688, province and city, six service scores and factory flags — and with the product page on, every SKU with its stock (and its price when the offer is priced by SKU), the specs, the category, the listing date, shipping, services, promotions, the review summary, certificates, dropship figures, the shop card and, for a verified factory, its profile (staff, factory area, monthly output) with its street address and coordinates.** One free row per input says what it gave: COMPLETE, CAPPED, TRUNCATED or PARTIAL. No login, no cookies, no API key, no browser, proxies handled for you.

**From $2.00 per 1,000 rows (`product`) on the Free plan, $1.70 on Starter; every row and add-on is priced under Pricing below.** A run start is $0.0054. The default input returns about 51 rows for about $0.1054. Every input gets one free row with its verdict; a search 1688 lists nothing for on two exits (`no_results`), a product 1688 answers its 404 page for on two exits (`not_found`) and a refusal the run could not pass (`failed`) are named there and never charged.

![A 1688 product page on a phone: wireless earbuds with three wholesale price tiers. Beside it, the row this Actor returns for the product, with price_tiers as numbers per order quantity, the minimum order, the sold count, the supplier, its years on 1688 and the shipping origin.](https://api.apify.com/v2/key-value-stores/dcLLNGq99686o2A4v/records/hero-1688-products-scraper.webp)

### Tested head-to-head on 2026-11-06

The job: the first 50 relevance-sorted products of one 1688 keyword (wireless earbuds, the input schema's example). Every Actor ran on it the same day from the same harness; a rival's cost is what a buyer account paid, this Actor's is its list price on the Free plan. Fields counts the filled fields of a typical row. Our row on this job is the search card (the product page is the includeDetails switch); zen-studio's row is its product with its page's fields. Re-measured monthly.

| Actor | Rows | First row | Run time | Cost | Fields | Failures |
|---|---|---|---|---|---|---|
| **this Actor** | 51 | 10 s | 19 s | $0.11 | 40 | none |
| `zen-studio/1688-wholesale-scraper` | 50 | 122 s | 126 s | $0.24 | 51 | none |
| `devcake/1688-com-products-scraper` | 50 | 7.0 s | 7.2 s | $0.10 | 49 | none |

### Why this 1688 scraper

- **Every input 1688 has.** Keywords in English (`wireless earbuds`, searched as you type them, never machine-translated) or Chinese (`蓝牙耳机`); search URLs from your browser with their sort, price, province, city and supplier filters (GBK- or UTF-8-encoded); product URLs or bare offer ids; a shop by its member id (`b2b-…`, the `supplier_member_id` of any row); and an image, uploaded to 1688's own image search. Each search gets its own cap (`maxResults`), the run's cap sits on top (`maxItems`).
- **The card's fields on every row, fast.** A search page of 60 products carries the price tiers by quantity (on 34 of 60 cards of an ordinary search; the minimum order is the first tier's quantity), the sold count, orders and repurchase rate, the supplier's years on 1688 (60 of 60), province and city, six service scores and the factory and inspection flags. On the Apify worker one run of build 0.1.6 gave 200 such rows of four searches, the first after 5.2 s and the last at 10.0 s (`JamgLP86IaQudG74z`, 2026-11-06).
- **The product page when you want it.** `includeDetails` reads each product's own page and its calls: every SKU with its stock and image, and its price when the offer is priced by SKU (every combination, logged out; an offer priced by quantity has its tiers and no SKU price), the full price tiers, the specs (16–26 attributes a page), the category, the listing date, the shipping origin, dispatch promise, fee, weight and package sizes, services, promotions and mixed-batch terms, the review summary, the certificates, the dropship figures, the shop card (followers, main category, repeat rate, service score, fulfilment rate), and for a supplier that is a verified factory its factory card: the street address and coordinates, staff and production staff, factory area, monthly output and annual trade, processing modes and main products (one call a supplier; any other seller says `not_factory`). Pages are read on ten connections at once: one run of build 0.1.6 gave 200 rows of four searches with their pages on the Apify worker, the first after 11.3 s and the last at 73.7 s (`QLJ0U2pwu5ccmn9Oc`, 2026-11-06); offer ids always get their page.
- **Filters that hold.** 1688's own sorts (relevance, best selling, price up or down), price range, Super Factory or Verified Merchant, manufacturers only, province and city; plus filters applied on each row before it is counted or charged: the maximum minimum order (1688's own MOQ filter works the other way, at least N), ads, title words, one product per supplier, and the price range checked again on the row — a search URL's own price range and one-product-per-supplier key too (1688's own filters let some through).
- **Honest runs.** 1688's slider is read from the answer and the connection is changed at once, never waited on; a search is `no_results` only when two connections agree, a product `not_found` only when two do. Every input gets a row that says what happened; a product is charged once a run even when several inputs list it, the product page only when it was read.

### Who it's for

- **Sourcing agents and importers** — Search a product in Chinese or English, keep suppliers whose minimum order fits your first order, compare the price tiers by quantity and the suppliers' years and scores, then read the chosen products' pages for every SKU and the shipping terms.
- **Dropshippers and marketplace sellers** — Find 1688's source of a product by its image or its keyword, read the dropship figures and the sold count, and track the price tiers of the suppliers you buy from.
- **Market and price researchers** — Read a category's products sorted by sales or price, with province and city, to see where a product is made and what it costs at each quantity.

### Quick start

**Basic — newest postings**

```json
{
  "maxItems": 10
}
```

### Switching from `zen-studio/1688-wholesale-scraper`?

Your input works as it is. Each name in the left column is read as this Actor's own field and the run log says so (`read <theirs> as <ours>`); a name marked *not read* is ignored with a note. A value in the other Actor's shape, an object list or its own date form, is read too.

| zen-studio/1688-wholesale-scraper | this Actor | what to know |
|---|---|---|
| `keywords` | `keywords` | The same: each keyword is one search, English or Chinese, sent as typed. |
| `offerIds` | `offerIds` | The same: offer ids or product URLs, each one row with its product page. |
| `maxResults` | `maxResults` | The same: the most rows a search gives (0 = to the end of 1688's list). |
| `sortBy` | `sortBy` | The same four values: relevance, bestSelling, priceAsc, priceDesc. |
| `includeSkuDetails` | `includeDetails` | Reads each product's page: every SKU with its stock and image (its price when priced by SKU), and the rest of the page. |
| `includeDescriptionHtml` | `includeDescription` | The description's text, image URLs and raw HTML. |
| `includeSupplierIntelligence` | `includeDetails` | The dropship figures, certificates, package sizes and the shop card come with the product page. |
| `excludeKeywords` | `excludeKeywords` | The same: a title with any of these words is left out, free. |
| `priceMin` | `priceMin` | The same, in yuan. |
| `priceMax` | `priceMax` | The same, in yuan. |
| `minOrderQuantity` | `maxMinOrder` | Minimum order at most N, judged on each row's own minimum order. |
| `merchantType` | `merchantType` | The same values: any, superFactory, verifiedMerchant (1688's own supplier filter). |
| `province` | `province` | The same: Chinese name, as 1688 writes it (广东). |
| `city` | `city` | The same: Chinese name (深圳). |
| `proxyCountryMode` | *not read* | Not read: 1688's list is the same from CN, US and DE connections (53–58 of 60 products shared), so the Actor picks its own connections. |
| `feedback` | `feedback` | The same: a free-text note to the maintainers. The run does not read it; a person does. |

**What differs:**

- The leader's row is a product with its page; here the page is the `includeDetails` switch (offer ids always get it), so a search without it is the card's fields at the card's price.
- `maxResults` is per search here too; `maxItems` caps the whole run.
- `minOrderQuantity` (minimum order at most N) is read as `maxMinOrder` and applied on each row's own minimum order: 1688's own MOQ filter keeps minimum orders of at least N.
- No proxy country input: 1688's list is the same from CN, US and DE connections (measured 2026-11-05), so the connection's country is not yours to pick.
- Prices are CNY as 1688 shows them: 1688 serves no USD price and no rate to a logged-out reader.

### Output

One row per product, and one free summary row per input:

| field | meaning |
|---|---|
| `record_type` | `product` on a product row (charged); `target` on an input's free summary row. |
| `status` | `ok`, or why an input gave no row: `no_results` (1688 lists nothing, two connections agreed), `not_found` (1688's 404 page for the product on two connections, or an image URL that answers 404), `invalid_input` (a value that names nothing, with the reason in `note`), `failed` (1688 refused every connection), `not_read` (the run stopped before it). |
| `input` | The value you gave that this row answers. |
| `input_kind` | What the input was read as: `keyword`, `search_url`, `offer`, `shop`, `image` or `invalid`. |
| `position` | The product's place in 1688's list for its input (1 = first); 1 for an offer id. |
| `page` | The search page the product was on. |
| `id` | 1688's offer id. |
| `url` | The product's page on 1688. |
| `title` | The title as 1688 shows it (Chinese, or the seller's own English). |
| `title_en` | The title in English from 1688's own translator (`translateTitles`). |
| `price` | The price 1688 shows on the card (the lowest tier's price), CNY. |
| `price_min` | The lowest price of the tiers or the SKUs, CNY. |
| `price_max` | The highest price of the tiers or the SKUs, CNY. |
| `currency` | `CNY`: 1688's own currency. |
| `price_type` | 1688's own price type: on the card `NORMAL` (the list price), `UMP` (a promotion price 1688 shows to every reader), `TTTM`, `HandPrice` (1688's 到手价, the price after a discount the card names); on the page `rangePrice` or `skuPrice`. |
| `price_basis` | `quantity` when the price falls with the quantity (`price_tiers`), `sku` when each SKU has its own price (`skus`), null when the card shows one price. |
| `price_tiers` | The price tiers by quantity: `min_quantity`, `max_quantity` (null on the last), `price` in CNY. \[] when the card shows none or the price is per SKU. |
| `moq` | The minimum order quantity: the first tier's quantity on a card (an image match's own 起批 figure), the page's own minimum order with the page. |
| `unit` | The unit of the quantities (件, 条, 个, 套 …). |
| `sold_text` | The sold count as 1688 writes it (`已售3900+件`, `全网4.7万+件`). |
| `sold_count` | The sold count as a number: the shown figure's lower bound on a card (4.7万+ = 47000), the page's own count with the page. |
| `orders` | The card's order count (`bookedCount`). |
| `repurchase_rate` | The product's repurchase rate, 0–1. |
| `image_url` | The main image. |
| `images` | The images: the card's main image, or the page's gallery with the page. |
| `is_ad` | true for a promoted product (an ad) in the search list. |
| `same_design_url` | 1688's link to products of the same design. |
| `tags` | The card's service and promotion tags (`先采后付`, `退货包运费`, `回头率38%` …). A first-order cut is a tag (`首单减3元`: 3 yuan off a buyer's first order with the supplier); it is not taken off `price`. |
| `supplier_name` | The supplier's company name. |
| `supplier_member_id` | The supplier's member id (`b2b-…`): give it as input to read the shop's own products. |
| `supplier_login_id` | The supplier's login name on 1688. |
| `supplier_url` | The supplier's shop on 1688. |
| `supplier_years` | The supplier's years on 1688 (`tpYear`). |
| `supplier_province` | The supplier's province (广东); with an offer id, the shipping origin's province. |
| `supplier_city` | The supplier's city (深圳市); with an offer id, the shipping origin's city. |
| `business_type` | 1688's business type of the supplier (生产加工 = production and processing …). |
| `supplier_scores` | The supplier's six service scores on the card: `composite`, `consultation`, `logistics`, `dispute`, `return`, `goods` (0–5). |
| `super_factory` | true for a Super Factory (超级工厂): the search card's own badge, and every row of a Super Factory search (1688's own list). |
| `factory_inspected` | true when the factory is inspected (验厂). |
| `business_inspected` | true when the business is inspected. |
| `trustpass` | true for a TrustPass member (诚信通). |
| `verified_merchant` | true for a Verified Merchant (实力商家), read from the product page, and on every row of a Verified Merchant search (1688's own list); null otherwise. |
| `details_status` | `ok` when the product page was read (charged `details`), `failed` when 1688 did not serve it (the card's row, no `details` charge), `not_found` when the page is 1688's 404, `not_asked` without the product page. |
| `category_id` | The leaf category id. |
| `category_name` | The leaf category's name (蓝牙耳机). |
| `second_category_id` | The second-level category id. |
| `top_category_id` | The top category id. |
| `listed_at` | When the product was created on 1688 (UTC). |
| `stock` | The quantity the supplier can sell now. |
| `skus` | Every SKU: `sku_id`, `name`, `props` (each axis by its name: 颜色 = 黑色), `price` (null when the price is by quantity), `stock`, `sold`, `image_url`. |
| `sku_count` | How many SKUs the page lists. |
| `specs` | The product's attributes: `name` and `value`. |
| `video_url` | The product's video. |
| `ships_from` | The shipping origin (广东省深圳市). |
| `dispatch` | The dispatch promise and carrier as 1688 writes it (承诺48小时发货·常发韵达快递). |
| `dispatch_days` | The dispatch promise in days. |
| `shipping_fee` | The page's shipping fee for the default address, CNY. |
| `unit_weight_kg` | The weight of one unit, kg. |
| `package_sizes` | The package of each SKU: `length_cm`, `width_cm`, `height_cm`, `volume_cm3`, `weight_g`. |
| `services` | The page's guarantees (7天无理由退货, 晚发必赔 …). |
| `promotions` | The page's promotions and coupons: `type`, `label`, `detail`. |
| `mixed_batch` | Mixed-batch terms when the shop allows them: `min_quantity` and `min_amount` (CNY) across its products. |
| `review_score` | The review score (0–5) the product page shows. 1688 shows the same review summary on a supplier's listings of one product model, so the four review fields can describe the model, not this listing alone. |
| `good_rate` | The share of good reviews the product page shows, 0–1 (the page's review summary: see `review_score`). |
| `review_count` | The number of reviews the product page shows (the page's review summary: see `review_score`). |
| `review_tags` | The reviews' impression tags with their counts (卖家很给力: 5). No review text and no buyer name is read. |
| `compliance_warning` | 1688's compliance warning on the page, when it shows one. |
| `certificates` | The product's certificates: `name`, `type`, `images`. |
| `dropship` | The dropship figures 1688 shows on the page: `figures` (by 1688's key: distributors, 30-day and 7-day dropship orders, pickup rates, the publish date), their `labels`, the dropship `prices`, the `protections`. |
| `shop_name` | The shop's name on its shop card. |
| `shop_followers` | The shop's followers as 1688 writes them (2.8k粉丝). |
| `shop_main_category` | The shop's main category. |
| `shop_scores` | The shop's figures: `repeat_rate` and `fulfillment_rate` (0–1), `service_score` (0–5), and any other figure under 1688's own name. |
| `description` | The seller's description as text (`includeDescription`); many descriptions are images only. |
| `description_images` | The description's image URLs (`includeDescription`). |
| `description_html` | The description's raw HTML (`includeDescription`). |
| `verdict` | On an input's row: COMPLETE (1688's list ended), CAPPED (`maxResults` or `maxItems`), TRUNCATED (1688's 2,000-product display limit, or 1688 stopped serving mid-list: `note` says which) or PARTIAL (the run stopped: `note` says why). |
| `rows_delivered` | On an input's row: the product rows it delivered. |
| `note` | Why an input's row has the status or the verdict it has. |
| `scraped_at` | When this row was read (UTC). |
| `factory_status` | With the page: `ok` (the supplier is a verified factory: its factory card read), `not_factory` (1688 has no factory card for this seller: a trader or an unverified factory) or `failed`. |
| `supplier_address` | The factory's street address from its factory card (verified factories only). |
| `supplier_latitude` | The factory's latitude from its factory card. |
| `supplier_longitude` | The factory's longitude from its factory card. |
| `factory_profile` | The factory card as 1688 shows it: `name`, `founded`, `staff` and `production_staff` (bands such as 101~200人) with the inspected counts, `factory_area_m2` and `factory_area_inspected_m2`, `monthly_output`, `annual_trade`, `material_days`, `processing`, `vat_invoice`, `min_order`, `min_order_oem`, `main_products`, `main_devices`, `medal_level`, `super_factory`, `inspected`. |

Example record:

```json
{
  "record_type": "product",
  "status": "ok",
  "input": "853958648180",
  "input_kind": "offer",
  "position": 1,
  "page": null,
  "id": "853958648180",
  "url": "https://detail.1688.com/offer/853958648180.html",
  "title": "S510895B蓝牙耳机降噪大立体声运动风低功耗LED数显无线真入耳式",
  "title_en": null,
  "price": 7.6,
  "price_min": 7.6,
  "price_max": 8.5,
  "currency": "CNY",
  "price_type": "rangePrice",
  "price_basis": "quantity",
  "price_tiers": [
    {
      "min_quantity": 10,
      "max_quantity": 999,
      "price": 8.5
    },
    {
      "min_quantity": 1000,
      "max_quantity": 9999,
      "price": 8.0
    },
    {
      "min_quantity": 10000,
      "max_quantity": null,
      "price": 7.6
    }
  ],
  "moq": 10,
  "unit": "条",
  "sold_text": "全网销量400+",
  "sold_count": 445,
  "orders": null,
  "repurchase_rate": null,
  "image_url": "https://cbu01.alicdn.com/img/ibank/O1CN01BSdHHD1D4FIHj3u1e_!!2216552300162-0-cib.jpg",
  "images": [
    "https://cbu01.alicdn.com/img/ibank/O1CN01BSdHHD1D4FIHj3u1e_!!2216552300162-0-cib.jpg",
    "https://cbu01.alicdn.com/img/ibank/O1CN01oAeqHz1D4FIHZRbQu_!!2216552300162-0-cib.jpg",
    "https://cbu01.alicdn.com/img/ibank/O1CN01nRg83C1D4FIHrfTgL_!!2216552300162-0-cib.jpg",
    "https://cbu01.alicdn.com/img/ibank/O1CN01X2DHcb1D4FICumkow_!!2216552300162-0-cib.jpg",
    "https://cbu01.alicdn.com/img/ibank/O1CN01h0OVjq1D4FIHM6tL2_!!2216552300162-0-cib.jpg",
    "https://cbu01.alicdn.com/img/ibank/O1CN01wlyM0a1D4FIHoG8r7_!!2216552300162-0-cib.jpg",
    "https://cbu01.alicdn.com/img/ibank/O1CN01h0OVjq1D4FIHM6tL2_!!2216552300162-0-cib.jpg",
    "https://cbu01.alicdn.com/img/ibank/O1CN01MnPonw1D4FIHebmYE_!!2216552300162-0-cib.jpg"
  ],
  "is_ad": null,
  "same_design_url": null,
  "tags": [],
  "supplier_name": "深圳市钧乐电子有限公司",
  "supplier_member_id": "b2b-2216552300162d5a29",
  "supplier_login_id": "junledianzi",
  "supplier_url": "https://junledianzi.1688.com",
  "supplier_years": 4,
  "supplier_province": "广东",
  "supplier_city": "深圳市",
  "business_type": null,
  "supplier_scores": null,
  "super_factory": null,
  "factory_inspected": null,
  "business_inspected": null,
  "trustpass": true,
  "verified_merchant": false,
  "details_status": "ok",
  "category_id": "1048186",
  "category_name": "蓝牙耳机",
  "second_category_id": "50911",
  "top_category_id": "7",
  "listed_at": "2024-11-15T04:00:05Z",
  "stock": 30000,
  "skus": [
    {
      "sku_id": "5820864482379",
      "name": "黑色",
      "props": {
        "颜色": "黑色"
      },
      "price": null,
      "stock": 10000,
      "sold": 0,
      "image_url": "https://cbu01.alicdn.com/img/ibank/O1CN01wlyM0a1D4FIHoG8r7_!!2216552300162-0-cib.jpg"
    },
    {
      "sku_id": "5820864482381",
      "name": "肤色",
      "props": {
        "颜色": "肤色"
      },
      "price": null,
      "stock": 10000,
      "sold": 0,
      "image_url": "https://cbu01.alicdn.com/img/ibank/O1CN01MnPonw1D4FIHebmYE_!!2216552300162-0-cib.jpg"
    },
    {
      "sku_id": "5820864482380",
      "name": "白色",
      "props": {
        "颜色": "白色"
      },
      "price": null,
      "stock": 10000,
      "sold": 0,
      "image_url": "https://cbu01.alicdn.com/img/ibank/O1CN01h0OVjq1D4FIHM6tL2_!!2216552300162-0-cib.jpg"
    }
  ],
  "sku_count": 3,
  "specs": [
    {
      "name": "芯片类型",
      "value": "中科蓝讯"
    },
    {
      "name": "功能",
      "value": "其他"
    },
    {
      "name": "续航时间",
      "value": "4-8小时"
    },
    {
      "name": "品牌",
      "value": "中性"
    },
    {
      "name": "防水性能",
      "value": "生活防水"
    },
    {
      "name": "材质",
      "value": "PC+ABS"
    },
    {
      "name": "使用方式",
      "value": "入耳式"
    },
    {
      "name": "传输范围",
      "value": "10米"
    },
    {
      "name": "蓝牙协议",
      "value": "5.3"
    },
    {
      "name": "是否单双耳",
      "value": "双边立体声"
    },
    {
      "name": "颜色",
      "value": "黑色, 白色, 肤色"
    },
    {
      "name": "有可授权的自有品牌",
      "value": "否"
    },
    {
      "name": "支持订制",
      "value": "不支持"
    },
    {
      "name": "模具类型",
      "value": "公模"
    },
    {
      "name": "上市年份/季节",
      "value": "2024"
    },
    {
      "name": "风格",
      "value": "运动风"
    }
  ],
  "video_url": "https://cloud.video.taobao.com/play/u/2216552300162/p/2/e/6/t/1/428997986204.mp4",
  "ships_from": "广东省深圳市",
  "dispatch": "承诺48小时发货·常发韵达快递",
  "dispatch_days": 2,
  "shipping_fee": 4.0,
  "unit_weight_kg": 0.065,
  "package_sizes": [
    {
      "sku": "黑色",
      "length_cm": 12.0,
      "width_cm": 8.0,
      "height_cm": 3.3,
      "volume_cm3": 316.8,
      "weight_g": 65
    },
    {
      "sku": "白色",
      "length_cm": 12.0,
      "width_cm": 8.0,
      "height_cm": 3.3,
      "volume_cm3": 316.8,
      "weight_g": 65
    },
    {
      "sku": "肤色",
      "length_cm": 12.0,
      "width_cm": 8.0,
      "height_cm": 3.3,
      "volume_cm3": 316.8,
      "weight_g": 65
    }
  ],
  "services": [
    "严选品质不符包赔",
    "严选晚发必赔"
  ],
  "promotions": [
    {
      "type": "MIX_WHOLESALE",
      "label": "100件混批",
      "detail": "本店部分商品满1000元或100件可混批采购"
    }
  ],
  "mixed_batch": {
    "min_quantity": 100,
    "min_amount": 1000.0
  },
  "review_score": 4.7,
  "good_rate": 0.901,
  "review_count": 24,
  "review_tags": [
    {
      "tag": "卖家很给力",
      "count": 5
    },
    {
      "tag": "价格很便宜",
      "count": 3
    },
    {
      "tag": "合作最愉快",
      "count": 1
    },
    {
      "tag": "性价比超高",
      "count": 1
    },
    {
      "tag": "音质不错",
      "count": 1
    }
  ],
  "compliance_warning": null,
  "certificates": [],
  "dropship": {
    "figures": {
      "dfPoint": "158",
      "orderCnt30d": "100以内",
      "orderCnt7d": "100以内",
      "offerDelivery48hRate": "100.00%",
      "offerDelivery24hRate": "100.00%",
      "distributorCnt": "400+",
      "ptRate": "100.00%",
      "returnRate": "100.00%",
      "offerPublishDate": "2024年11月"
    },
    "labels": {
      "dfPoint": "商家代发热度",
      "orderCnt30d": "近30天代发数量",
      "orderCnt7d": "近7天代发数量",
      "offerDelivery48hRate": "48h揽收率",
      "offerDelivery24hRate": "24h揽收率",
      "distributorCnt": "铺货分销商数",
      "ptRate": "代发品质达标率",
      "returnRate": "代发买家留货率",
      "offerPublishDate": "商品发布时间"
    },
    "prices": [
      {
        "label": "≥10件",
        "price": 8.5
      }
    ],
    "protections": [
      "官方仓退货",
      "晚揽必赔"
    ]
  },
  "shop_name": "深圳市钧乐电子有限公司",
  "shop_followers": "2.8k粉丝",
  "shop_main_category": "手机配件",
  "shop_scores": {
    "service_score": 3.5,
    "repeat_rate": 0.65,
    "fulfillment_rate": 0.99,
    "店铺好评率": 0.901
  },
  "description": null,
  "description_images": [
    "https://cbu01.alicdn.com/img/ibank/O1CN011DxRaA1D4FIHsoRQz_!!2216552300162-0-cib.jpg",
    "https://cbu01.alicdn.com/img/ibank/O1CN01eFJALe1D4FIIAxTuh_!!2216552300162-0-cib.jpg",
    "https://cbu01.alicdn.com/img/ibank/O1CN01KeUk5s1D4FAngB0mq_!!2216552300162-0-cib.jpg",
    "https://cbu01.alicdn.com/img/ibank/O1CN01HZUIGX1D4FAkwW1g5_!!2216552300162-0-cib.jpg"
  ],
  "description_html": "<div style=\"width: 790.0px;\">\r        \r         <img src=\"https://cbu01.alicdn.com/img/ibank/O1CN011DxRaA1D4FIHsoRQz_!!2216552300162-0-cib.jpg\" style=\"display: block;width: 100.0%;height: auto;\" usemap=\"#_sdmap_0\"/>\r        \r        \r    \r        \r         <img src=\"https://cbu01.alicdn.com/img/ibank/O1CN01eFJALe1D4FIIAxTuh_!!2216552300162-0-cib.jpg\" style=\"display: block;width: 100.0%;height: auto;\" usemap=\"#_sdmap_1\"/>\r        \r        \r    \r        \r         <img src=\"https://cbu01.alicdn.com/img/ibank/O1CN01KeUk5s1D4FAngB0mq_!!2216552300162-0-cib.jpg\" style=\"display: block;width: 100.0%;height: auto;\" usemap=\"#_sdmap_2\"/>\r        \r        \r    \r        \r         <img src=\"https://cbu01.alicdn.com/img/ibank/O1CN01HZUIGX1D4FAkwW1g5_!!2216552300162-0-cib.jpg\" style=\"display: block;width: 100.0%;height: auto;\" usemap=\"#_sdmap_3\"/>\r        \r        \r    </div>",
  "verdict": null,
  "rows_delivered": null,
  "note": null,
  "scraped_at": "2026-11-05T18:41:07Z",
  "factory_status": null,
  "supplier_address": null,
  "supplier_latitude": null,
  "supplier_longitude": null,
  "factory_profile": null
}
```

### Pricing

**Pay for the products a run delivers**, plus one run start; no platform usage is billed to you. The price falls with your Apify plan.

| event | unit | Free | Starter | Scale | Business |
|---|---|---|---|---|---|
| Product (`product`) | per 1,000 | $2.00 | $1.70 | $1.45 | $1.45 |
| Product page (`details`) | per 1,000 | $3.00 | $2.55 | $2.10 | $1.50 |
| Run start (`start`) | per run | $0.0054 | $0.0054 | $0.0054 | $0.0054 |

A product row of a keyword, a search link, a shop or an image is **$2.00 per 1,000** on the Free plan ($0.002 a row) and $1.70 on Starter. A row that carries its product page (`includeDetails`, and every offer id or product URL) adds the **product page, $3.00 per 1,000** on the Free plan: $5.00 per 1,000 for the row with its page ($4.25 on Starter). A page 1688 does not serve is not charged: the row keeps the card's fields and pays the product row only. A product is charged once a run however many searches list it. Each run that delivers a product also pays the **run start, $0.0054 once**; a run that delivers none pays nothing at all. So the 50 products of one keyword cost $0.1054 on the Free plan and $0.0904 on Starter; 1,000 products $2.0054 and $1.7054; 100 products with their pages $0.5054 and $0.4304; 10 offer ids $0.0554 and $0.0479; every search of a run shares one start. Free: every input's own summary row, a search 1688 lists nothing for, an id 1688 does not have, a value that names nothing, a product your filters leave out, a product already delivered in the run, and an input left unread at `maxItems`, your charge limit or the time limit. A run that stops early (a timeout, an abort) is charged for the products it delivered.

Before the first request the log names the prices at your plan and the most the run can cost: `maxResults` for each search, shop or image (100 when you leave it out), `maxItems` over the whole run (the rows with their page counted first), 40 pages of 60 products for a search with `maxResults` 0, and never more than your charge limit. A search read to its end gives about 2,000 products: 1688 shows at most about 2,000 a search, and the 5 walks to 1688's own end of builds 0.1.6 to 0.1.8 gave 1,971 to 2,050 rows (1,975 for one keyword in 212 seconds on 2026-11-06). Set `maxResults`, `maxItems` or a charge limit for a lower maximum. Enterprise plans have their own rates — the Actor's Pricing tab shows the price for your plan.

### Usage patterns

- **Search by keyword** — Put `wireless earbuds` or `蓝牙耳机` in **Keywords** and set **Max results per search**. Each row is one product with its price tiers, minimum order, sales and supplier; the search's own row says COMPLETE (the list ended), CAPPED (your cap) or TRUNCATED (1688's 2,000-product display limit).
- **Read products by id or URL** — Put offer ids (`853958648180`) or product URLs in **Offer IDs or product URLs**. Each is one row with its product page: every SKU with price and stock, the specs, shipping, the shop card. An id 1688 does not have gets a free `not_found` row.
- **Paste a 1688 search, a shop or an image** — Paste a search page's URL (its keyword and filters are kept), a shop's member id (`b2b-…`, or a link with `memberId=`) to read the shop's own products, or an image URL in **Image URLs** to find similar products on 1688 (page by page, 60 a page, to **Max results per search**).

### Input configuration

| field | type | default | what it does |
|---|---|---|---|
| `keywords` | `array` | `[]` | Search words, one search a line, in English (<code>wireless earbuds</code>) or Chinese (<code>蓝牙耳机</code>), sent to 1688 as you type them (never machine-translated). Each keyword is its own search, capped by <b>Max results per search</b>. |
| `startUrls` | `array` | `[]` | 1688 links, one a line: a search page (<code>https://s.1688.com/selloffer/offer_search.htm?keywords=…</code>, its sort, price, province, city and supplier filters kept), a product page (<code>https://detail.1688.com/offer/853958648180.html</code>), or a shop link that carries its member id (<code>…memberId=b2b-…</code>, <code>m.1688.com/winport/b2b-….html</code>, or the bare <code>b2b-…</code> id). A shop's own address (<code>name.1688.com</code>) cannot be read logged out: its row says so and names the forms that work. |
| `offerIds` | `array` | `[]` | Products to read directly, one a line: the offer id (the digits of <code>detail.1688.com/offer/<b>853958648180</b>.html</code>) or the product URL. Each is one row with its product page (every SKU, the specs, shipping, the shop card). |
| `imageUrls` | `array` | `[]` | Images to find on 1688, one URL a line (a JPEG, PNG, WebP, GIF or BMP of at most 4 MB). The image is uploaded to 1688's own image search, and its similar products are read page by page (60 a page) to <b>Max results per search</b>. |
| `maxResults` | `integer` | `100` | Stop each keyword, search URL, shop or image after this many product rows (0 = to the end of 1688's list; 1688 shows at most 2,000 products a search). A product a filter leaves out, or one an earlier input of the run already delivered, is not counted. |
| `maxItems` | `integer` | `0` | The most product rows of the whole run, all inputs together; 0 = no cap beyond your charge limit. |
| `includeDetails` | `boolean` | `false` | Read every product's own page as well: every SKU with its price and stock, the full price tiers, the specs, the category, the listing date, shipping (origin, dispatch promise, fee, weight, package sizes), services, promotions, the review summary, certificates, dropship figures and the shop card (followers, main category, shop scores). Slower (the page is read on several connections at once) and charged as a product page per row. Offer IDs and product URLs always get it. |
| `includeDescription` | `boolean` | `false` | Add the seller's long description: its text, its image URLs and its raw HTML. Reads the product page too (as <b>Read each product's page</b>). |
| `translateTitles` | `boolean` | `false` | Add <code>title_en</code>: each title in English from 1688's own translator (the one its pages use), next to the Chinese title. |
| `sortBy` | `relevance` / `bestSelling` / `priceAsc` / `priceDesc` | `"relevance"` | 1688's own sort of the search list. |
| `priceMin` | `number` |  | Only products whose price is at least this many yuan (0 = no minimum). Sent to 1688's own price filter and checked on each row. |
| `priceMax` | `number` |  | Only products whose price is at most this many yuan (0 = no maximum). Sent to 1688's own price filter and checked on each row. |
| `maxMinOrder` | `integer` |  | Only products whose minimum order quantity is at most this (0 = any), judged on each row's own minimum order. 1688's own MOQ filter works the other way (at least N), so this filter is applied here. Without the product page, a card that shows no minimum order is left out (free); with it, the page's minimum order decides. |
| `merchantType` | `any` / `superFactory` / `verifiedMerchant` | `"any"` | 1688's own supplier filter: Super Factory (超级工厂) or Verified Merchant (实力商家). |
| `manufacturersOnly` | `boolean` | `false` | Only suppliers 1688 lists as production and processing (生产加工). |
| `province` | `string` |  | Only suppliers in this province, in Chinese as 1688 writes it: <code>广东</code> (Guangdong), <code>浙江</code> (Zhejiang), <code>江苏</code> (Jiangsu). |
| `city` | `string` |  | Only suppliers in this city, in Chinese, with its province: <code>深圳</code> (Shenzhen) with <code>广东</code>, <code>义乌</code> (Yiwu) with <code>浙江</code>. |
| `onePerSupplier` | `boolean` | `false` | Keep one product of each supplier in a search (1688 merges most; the rest are left out here, free). |
| `excludeAds` | `boolean` | `false` | Leave out the promoted (ad) products of the search list (free, not counted). |
| `excludeKeywords` | `array` | `[]` | Leave out a product whose title holds any of these words (any case; Chinese or English); free, not counted. |
| `feedback` | `string` |  | A note to the people who maintain this Actor: what you needed and did not get. For example a missing field, a wrong or empty result, or the Actor you switch from or to, and why. The run does not read it: the rows and the charges stay the same. A person reads every note. |

### Errors

**A run does not fail because of your input.** When an input cannot be used — a date that is not a date, an id in the wrong form, two settings that contradict each other — the run ends **Succeeded**, charges nothing, and says what to change:

- the status message starts with `INPUT REJECTED`;
- the dataset holds one row, `{"error": true, "code": "…", "message": "…"}`, and no results;
- the key-value store record `ERROR` holds the same object.

From code, check `error` on the first row before reading results.

A value that names nothing (an empty line, a link of another site, a shop's own address that 1688 serves only after a login) is not an error: it gets one free row with `status` invalid_input that says why, and the run goes on with the others. A run that ends **Failed** is a fault on our side, never your input; it charges nothing, and we are alerted.

### FAQ

**Are the prices in USD?**

No: prices are in Chinese yuan (CNY) as 1688 shows them. 1688 serves no USD price and no exchange rate to a logged-out reader (measured 2026-11-05), so the Actor does not invent one.

**Is the price a first-order or new-buyer price?**

No: `price` is the price 1688 shows a logged-out reader on the card, the same for every buyer, and `price_type` says which (`NORMAL` the list price, `UMP` a promotion, `HandPrice` 1688's price after a discount the card names). A first-order cut is a tag (`首单减3元`, 3 yuan off your first order with that supplier), never taken off `price`: on the 500 cards of 5 ordinary searches read on 2026-11-06 it was on 5, a `HandPrice` on 4, a `UMP` on 79.

**Why does a search stop near 2,000 products?**

1688 shows at most about 2,000 products for one search (its own count stops at 2000). The search's row then says TRUNCATED. Narrow the search (a province, a price range, a supplier type) to reach more of the list.

**Why did my maximum minimum order leave out products?**

1688's own minimum-order filter keeps products whose minimum order is at least the number, so the Actor applies yours on each row's own minimum order instead. A search card that shows no minimum order is left out (free) unless the product page is read; with `includeDetails` the page's minimum order decides.

**Can I give a shop's address like name.1688.com?**

Not that form: 1688 serves a shop's own pages only after a login. Give the shop's member id (`b2b-…`, the `supplier_member_id` column of any row from it) or a link that carries `memberId=`; the shop's own products then come as a search.

**Is a product charged twice when two of my searches list it?**

No. A product is delivered and charged once a run; the second search skips it (free) and its row says how many it read.

### Integration

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('hyperbach/1688-products-scraper').call({"maxItems": 10});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('hyperbach/1688-products-scraper').call(run_input={'maxItems': 10})
items = client.dataset(run['defaultDatasetId']).list_items().items
```

#### CLI

```bash
apify call hyperbach/1688-products-scraper --input '{"maxItems": 10}'
```

#### REST

```bash
curl -X POST "https://api.apify.com/v2/acts/hyperbach~1688-products-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H 'Content-Type: application/json' -d '{"maxItems": 10}'
```

#### AI agents and MCP

Apify's MCP server offers this Actor as a tool to Claude, Cursor, VS Code and any other MCP client. Connect `https://mcp.apify.com?tools=hyperbach/1688-products-scraper` and ask, for example: "Get 100 products from 1688.com for wireless earbuds with their price tiers by quantity, minimum order and the supplier's years on 1688". The agent fills the input from the table above and reads the rows from the run's dataset. A field under the name another Actor gives it is read as this Actor's own: `searchTerms`, `searchQueries`, `queries`, `query` as `keywords`; `urls`, `url`, `links`, `searchUrls` as `startUrls`; `productIds`, `productUrls`, `offerUrls`, `ids` as `offerIds`; `images`, `imageUrl`, `image` as `imageUrls` (and more). An agent or a person can add `feedback` to any run and say what was needed and not delivered: a missing field, a wrong or empty result, the Actor switched from or to, and why. The run returns the same rows at the same price, and a person reads every note.

#### n8n, Make and Zapier

The Apify node in n8n, the Apify app in Make and the Apify integration in Zapier run this Actor on a schedule or from a trigger and read its dataset. A webhook on the run's end (Integrations on the Actor page) sends the rows on to your own endpoint. Nothing to install on our side.

### Support

**Disagree with a charge?** Write to apify@hyperbach.com with the run ID. We will ask Apify to compensate you, and the charge comes back to your Apify account as platform credit.

**Did it do the job?** A short [review on the Store](https://apify.com/hyperbach/1688-products-scraper/reviews), at any rating, helps the next buyer choose.

### See also

- **[Amazon Product Details Scraper](https://apify.com/hyperbach/amazon-product-details-scraper)** — Amazon products by ASIN, URL or UPC / EAN / ISBN on 21 Amazon stores: the buy-box price, every best-seller rank, the rating and the review summary.
- **[AliExpress Product Details Scraper](https://apify.com/hyperbach/aliexpress-product-details-scraper)** — AliExpress products by URL or item id: every SKU with its own price and stock, in the country and currency you choose.
- **[Shopify Store Scraper](https://apify.com/hyperbach/shopify-products-scraper)** — every product of a Shopify store, with its variants, prices and images.
- **[Alibaba Products Scraper](https://apify.com/hyperbach/alibaba-scraper)** — the products of an Alibaba.com search: price range, minimum order and the supplier with its country and verification.
- **[Walmart Products Scraper](https://apify.com/hyperbach/walmart-scraper)** — Walmart products by search, category or URL: the price with the was-price, the seller and the rating.
- **[Coles Scraper](https://apify.com/hyperbach/coles-scraper)** — Coles Australia products and specials, with the price, the was-price and the unit price.

*This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.*

# Actor input Schema

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

Search words, one search a line, in English (<code>wireless earbuds</code>) or Chinese (<code>蓝牙耳机</code>), sent to 1688 as you type them (never machine-translated). Each keyword is its own search, capped by <b>Max results per search</b>.

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

1688 links, one a line: a search page (<code>https://s.1688.com/selloffer/offer_search.htm?keywords=…</code>, its sort, price, province, city and supplier filters kept), a product page (<code>https://detail.1688.com/offer/853958648180.html</code>), or a shop link that carries its member id (<code>…memberId=b2b-…</code>, <code>m.1688.com/winport/b2b-….html</code>, or the bare <code>b2b-…</code> id). A shop's own address (<code>name.1688.com</code>) cannot be read logged out: its row says so and names the forms that work.

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

Products to read directly, one a line: the offer id (the digits of <code>detail.1688.com/offer/<b>853958648180</b>.html</code>) or the product URL. Each is one row with its product page (every SKU, the specs, shipping, the shop card).

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

Images to find on 1688, one URL a line (a JPEG, PNG, WebP, GIF or BMP of at most 4 MB). The image is uploaded to 1688's own image search, and its similar products are read page by page (60 a page) to <b>Max results per search</b>.

## `maxResults` (type: `integer`):

Stop each keyword, search URL, shop or image after this many product rows (0 = to the end of 1688's list; 1688 shows at most 2,000 products a search). A product a filter leaves out, or one an earlier input of the run already delivered, is not counted.

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

The most product rows of the whole run, all inputs together; 0 = no cap beyond your charge limit.

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

Read every product's own page as well: every SKU with its price and stock, the full price tiers, the specs, the category, the listing date, shipping (origin, dispatch promise, fee, weight, package sizes), services, promotions, the review summary, certificates, dropship figures and the shop card (followers, main category, shop scores). Slower (the page is read on several connections at once) and charged as a product page per row. Offer IDs and product URLs always get it.

## `includeDescription` (type: `boolean`):

Add the seller's long description: its text, its image URLs and its raw HTML. Reads the product page too (as <b>Read each product's page</b>).

## `translateTitles` (type: `boolean`):

Add <code>title_en</code>: each title in English from 1688's own translator (the one its pages use), next to the Chinese title.

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

1688's own sort of the search list.

## `priceMin` (type: `number`):

Only products whose price is at least this many yuan (0 = no minimum). Sent to 1688's own price filter and checked on each row.

## `priceMax` (type: `number`):

Only products whose price is at most this many yuan (0 = no maximum). Sent to 1688's own price filter and checked on each row.

## `maxMinOrder` (type: `integer`):

Only products whose minimum order quantity is at most this (0 = any), judged on each row's own minimum order. 1688's own MOQ filter works the other way (at least N), so this filter is applied here. Without the product page, a card that shows no minimum order is left out (free); with it, the page's minimum order decides.

## `merchantType` (type: `string`):

1688's own supplier filter: Super Factory (超级工厂) or Verified Merchant (实力商家).

## `manufacturersOnly` (type: `boolean`):

Only suppliers 1688 lists as production and processing (生产加工).

## `province` (type: `string`):

Only suppliers in this province, in Chinese as 1688 writes it: <code>广东</code> (Guangdong), <code>浙江</code> (Zhejiang), <code>江苏</code> (Jiangsu).

## `city` (type: `string`):

Only suppliers in this city, in Chinese, with its province: <code>深圳</code> (Shenzhen) with <code>广东</code>, <code>义乌</code> (Yiwu) with <code>浙江</code>.

## `onePerSupplier` (type: `boolean`):

Keep one product of each supplier in a search (1688 merges most; the rest are left out here, free).

## `excludeAds` (type: `boolean`):

Leave out the promoted (ad) products of the search list (free, not counted).

## `excludeKeywords` (type: `array`):

Leave out a product whose title holds any of these words (any case; Chinese or English); free, not counted.

## `feedback` (type: `string`):

A note to the people who maintain this Actor: what you needed and did not get. For example a missing field, a wrong or empty result, or the Actor you switch from or to, and why. The run does not read it: the rows and the charges stay the same. A person reads every note.

## Actor input object example

```json
{
  "keywords": [
    "wireless earbuds"
  ],
  "startUrls": [],
  "offerIds": [],
  "imageUrls": [],
  "maxResults": 50,
  "maxItems": 0,
  "includeDetails": false,
  "includeDescription": false,
  "translateTitles": false,
  "sortBy": "relevance",
  "merchantType": "any",
  "manufacturersOnly": false,
  "onePerSupplier": false,
  "excludeAds": false,
  "excludeKeywords": []
}
```

# Actor output Schema

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

All scraped records in the default dataset. One row per product, and one free summary row per input:

# 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": [
        "wireless earbuds"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("hyperbach/1688-products-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": ["wireless earbuds"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("hyperbach/1688-products-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": [
    "wireless earbuds"
  ],
  "maxResults": 50
}' |
apify call hyperbach/1688-products-scraper --silent --output-dataset

```

## MCP server setup

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