# DHgate Scraper — Wholesale Products, Price Tiers & Sellers (`logiover/dhgate-scraper`) Actor

DHgate.com scraper: export wholesale products by keyword, category, store or item number with volume price tiers, MOQ, shipping cost and delivery days to your country, sales, ratings, reviews, specifications and seller details. No login. Export CSV, Excel, JSON.

- **URL**: https://apify.com/logiover/dhgate-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 results

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

## DHgate Scraper — DHgate.com Wholesale Products, Price Tiers, MOQ and Sellers to CSV, Excel or JSON

> **Not affiliated with DHgate.** This is an independent tool that reads the public pages DHgate.com (敦煌网) shows to every visitor. "DHgate" and "DHgate.com" are trademarks of their owner and are used here only to describe what the tool works with.

**DHgate Scraper** is a DHgate.com scraper and DHgate API alternative for wholesale product data: type a keyword such as *wireless earbuds*, *led strip lights* or *yoga pants*, paste a DHgate search, category, store or product URL, or give category IDs, store numbers and item numbers, and it exports every product it finds with the **price range and quantity price tiers, minimum order quantity (MOQ), units sold, rating and review count, free-shipping flag, delivery promise** and the **seller behind the listing** — store name, store ID, positive-feedback score, level and years on DHgate. Switch on *Read the product page* and every row also carries the full **volume price ladder, shipping cost and delivery days to your country, ships-from warehouse, options, specifications, package size and weight, the newest reviews, and the seller's registered company, country, orders, product count and staff size**. Scrape dhgate.com without login, without cookies and without writing code, then export to CSV, Excel, JSON, XML or straight into Google Sheets, a database or an AI agent. DHgate itself shows at most 4,040 products for one search; with deep search switched on (the default) big searches continue in price bands, so a single keyword gives **more than 10,000 unique products** in one run.

People use it as a **DHgate product scraper**, a **DHgate price and MOQ tracker**, a **DHgate seller scraper** and a lightweight **DHgate.com API** for dropshipping product research, wholesale price comparison, private-label sourcing, supplier shortlists, competitor monitoring and catalogue building. It answers long-tail needs like *export DHgate search results to Excel*, *scrape DHgate products with price tiers*, *DHgate wholesale price list*, *find low MOQ products on DHgate*, *DHgate free shipping products list*, *scrape all products of a DHgate store* or *DHgate seller feedback data*, and the Chinese-language ones cross-border teams search for: 敦煌网数据采集、敦煌网爬虫、敦煌网商品采集、敦煌网商品数据导出、敦煌网批发价格监控、敦煌网店铺商品抓取、敦煌网卖家数据、跨境电商选品工具、一件代发选品、起订量与阶梯价导出. Every row is a real DHgate.com listing with a stable item code, cleaned types (numbers as numbers, ISO dates, absolute URLs) and nothing invented.

### Table of contents

1. [At a glance](#at-a-glance)
2. [What you get](#what-you-get)
3. [Who uses it](#who-uses-it)
4. [Cookbook: ready-made inputs](#cookbook-ready-made-inputs)
5. [How to run it in Apify Console](#how-to-run-it-in-apify-console)
6. [How to run it through the API](#how-to-run-it-through-the-api)
7. [Input reference](#input-reference)
8. [Data dictionary](#data-dictionary)
9. [Real output sample](#real-output-sample)
10. [How much data and how fast](#how-much-data-and-how-fast)
11. [What you pay](#what-you-pay)
12. [Integrations](#integrations)
13. [Performance tips](#performance-tips)
14. [Troubleshooting and status messages](#troubleshooting-and-status-messages)
15. [Honest limits](#honest-limits)
16. [DHgate Scraper compared with the other options](#dhgate-scraper-compared-with-the-other-options)
17. [FAQ](#faq)
18. [Glossary](#glossary)
19. [Is it legal to scrape DHgate.com?](#is-it-legal-to-scrape-dhgatecom)
20. [Changelog](#changelog)
21. [Support](#support)

### At a glance

| | |
|---|---|
| **What it scrapes** | DHgate.com (敦煌网), the cross-border wholesale marketplace: keyword searches, pasted search / category / store / product URLs, category IDs, store numbers and item numbers |
| **One row** | One product listing; 37 columns from search cards, 72 with the product page read, 75 with the full description |
| **Input** | Search terms, DHgate URLs, category IDs, store IDs, item codes, plus DHgate's own filters: price window, max MOQ, single piece, free shipping, on sale, customizable, US warehouse, ship-to country, sort |
| **Depth** | DHgate lists at most 4,040 products per search window; deep search adds up to 16 price bands per search. Measured: 15,000 unique products in one run, 0 duplicates |
| **Speed** | 20 products in 3.0 s; 1,000 products in about 9.8 s; 15,000 products in 115.0 s (platform runs, 25 October 2026 UTC). With product pages: 1,000 products in 249 s |
| **Login / cookies** | None. No DHgate account needed |
| **Export** | JSON, CSV, Excel, XML, HTML table, RSS; API; integrations (Make, Zapier, n8n, Google Sheets, Airtable, webhooks, MCP) |
| **Duplicates** | Every product is saved once per run (de-duplicated by item code across all searches, bands and stores) |
| **Currency** | US dollars, pinned by the Actor so rows are comparable whatever country the run starts from |
| **Pricing** | Pay per result: from $1.20 per 1,000 products on the free plan, down to $0.80 per 1,000 on higher Apify plans |

### What you get

Each dataset row is one DHgate product listing. The columns fall into seven groups; the full list with types, meanings and measured fill rates is in the [data dictionary](#data-dictionary).

**Product identity.** `itemCode` (DHgate's item number, the stable key), `url`, `title`, `productId`, `image` (full-size), `categoryId` and — with the product page — `images` (the gallery), `categoryName` and `categoryPath` (*Sports & Outdoors > Fitness Supplies > Yoga > Yoga Outfit*).

**Price and order terms.** `price` as DHgate writes it (*US $60.65 - 114.94*), `priceMin` / `priceMax`, `regularPriceMin` / `regularPriceMax` before the seller's promotion, `discountPercent`, `promotionEndsAt`, `currency` (always USD), `unit`, `minOrderQuantity`, `coupons` and — with the product page — `priceTiers`, the volume price ladder: for example 1–9 pieces at $14.89, 10–33 at $14.14, 34–99 at $13.50, 100–999 at $11.37 and 1,000+ at $7.11, each with the regular and the promotion price.

**Sales and reviews.** `soldCount` / `soldText` (*34 sold*, *2.1K+ sold*), `rating`, `reviewCount` and — with the product page — `ratingCounts` (reviews per star), `autoReviewCount`, `reviewHighlights`, DHgate's AI `reviewSummary` and the newest 0–20 `reviews` with text, date, country, options bought and the buyer name exactly as DHgate masks it.

**Shipping.** `shipToCountry`, `freeShipping`, `fastDeliveryDays` (the *X Days Delivery* promise) and — with the product page — `shippingCost` to your country for the minimum order, `shippingMethod`, `deliveryDaysMin` / `deliveryDaysMax`, `shipsFrom`, `shipsFromOptions`, `deliverable`.

**Product details.** `options`, `specifications`, `packageSizeCm`, `packageWeightKg`, `lastUpdated`, the flags `customizable`, `hasVideo`, `sponsored`, and optionally `description`, `descriptionHtml`, `descriptionImages`.

**Seller.** `sellerName`, `sellerStoreId`, `sellerId`, `sellerUrl`, `sellerPositiveFeedback`, `sellerLevel` (LV0 … LV5), `sellerYears` and — with the product page — `sellerCompany` (the registered company, often in Chinese: *深圳市泰尔晟贸易有限公司*), `sellerCountry`, `sellerOrders`, `sellerProductCount`, `sellerReviewCount`, `sellerSince`, `sellerOnTimeDeliveryRate`, `sellerEmployees`, `sellerMainCategories`, `sellerKeyAccount`.

**Run context.** `hasDetails`, `searchTerm` (what found the product) and `scrapedAt`.

### Who uses it

**1. Dropshippers and small online shops.** Search the product idea, switch on *Free shipping only* and *Single piece orders only*, sort the export by `soldCount` and `rating`, and shortlist the listings whose `priceMin`, `shippingCost` and `deliveryDaysMax` leave a margin before importing titles and full-size pictures into your shop.

**2. Amazon FBA and private-label sellers.** Read the `priceTiers` ladder at 100 and 1,000 units, compare `minOrderQuantity` and `sellerPositiveFeedback` across forty suppliers of one product, and take the median as the reference price in your first negotiation.

**3. Sourcing agents and buying offices.** Turn a client's keywords into a supplier list in minutes: one row per product with `sellerName`, `sellerCompany`, `sellerCountry`, `sellerOrders`, `sellerYears`, `sellerLevel` and the store link.

**4. Price-comparison and deal sites.** Pull `priceMin`, `regularPriceMin`, `discountPercent` and `promotionEndsAt` for a category every day and publish the products whose promotion just started.

**5. Market researchers and category analysts.** The run SUMMARY states how many products DHgate reports for each search, and the dataset gives the price distribution, the share of free-shipping and customizable listings and the seller-level mix of a niche.

**6. Competitor and brand monitoring.** Search your brand, model names or a competitor's store (`storeIds`), keep `itemCode`, `url`, `sellerName` and `scrapedAt` as evidence and watch new listings appear.

**7. Marketplace and catalogue builders.** Seed a taxonomy with DHgate's `categoryId` / `categoryName` / `categoryPath` and representative titles, attributes (`specifications`) and options.

**8. Procurement and purchasing managers.** Benchmark what a part costs at your volume, check `shippingCost` and `deliveryDaysMin`–`deliveryDaysMax` to your country, and compare US-warehouse offers (*US warehouse only*) with China-shipped ones.

**9. Data scientists.** Train price-prediction, title-classification or demand models on tens of thousands of labelled listings: titles, categories, MOQ, tier prices, sold counts, ratings and seller features are clean typed columns.

**10. Review and quality analysts.** With the product page and *Reviews per product* = 20, export the newest reviews with country and purchased options, the star split and the share of automatic reviews to judge which listings are trustworthy.

**11. Seller-side competitive intelligence.** If you sell on DHgate, run your keywords weekly, count how many listings belong to your own `sellerStoreId` and compare your `priceTiers`, `discountPercent` and `fastDeliveryDays` with the competitors that sell the same thing.

**12. Cross-border e-commerce teams in China (跨境电商卖家).** Track how same-category listings are priced and promoted, which sellers reach LV3 and above, and which products carry the *X Days Delivery* badge.

**13. AI-agent builders.** Give an assistant the Actor as a tool ("find 200 customizable tote bags under $3 with free shipping to Germany") and let it reason over typed rows.

### Cookbook: ready-made inputs

Every recipe below was run on the Apify platform on 25 October 2026 (the quick checks with a smaller *Max products*) and returned the rows its description promises. Paste the JSON into the **JSON** tab of the input form, or send it as the body of an API call.

#### Recipe 1 — Quick sample of a keyword

```json
{ "searchTerms": ["wireless earbuds"], "maxItems": 20 }
```

Twenty products in about three seconds — the same input Apify's daily check runs.

#### Recipe 2 — 1,000 products for one keyword

```json
{ "searchTerms": ["yoga pants"], "maxItems": 1000 }
```

#### Recipe 3 — A whole niche, tens of thousands of products

```json
{ "searchTerms": ["led lights", "phone case"], "maxItems": 15000, "deepSearch": true }
```

Deep search walks each keyword in price bands past DHgate's 4,040-result window. This is the shape of the proof run in [How much data and how fast](#how-much-data-and-how-fast).

#### Recipe 4 — Many keywords, evenly

```json
{ "searchTerms": ["yoga pants", "sports bra", "leggings"], "maxItemsPerSearch": 100, "maxItems": 300 }
```

#### Recipe 5 — Full wholesale detail: price tiers, shipping and seller company

```json
{ "searchTerms": ["wireless earbuds"], "includeDetails": true, "maxItems": 200 }
```

Every product also gets its own page read: `priceTiers`, `shippingCost`, `deliveryDaysMin/Max`, `sellerCompany`, `specifications`, `options`, reviews. Expect roughly four products a second.

#### Recipe 6 — Browse a category by ID

```json
{ "categoryIds": ["117003002"], "maxItems": 500 }
```

117003002 is *LED Strips*; every row carries its `categoryId`. IDs are in the `categoryId` column and in category URLs (`…/c117003002.html`).

#### Recipe 7 — Every product of one store

```json
{ "storeIds": ["22318278"], "maxItems": 5000 }
```

The number is the one in the store URL (`www.dhgate.com/store/22318278`); the 32-character `sellerId` works too.

#### Recipe 8 — Paste a DHgate search URL with its filters

```json
{ "startUrls": ["https://www.dhgate.com/wholesale/search.do?searchkey=yoga+pants&freeshipping=1"], "maxItems": 500 }
```

Search, category (`…/c117003002.html`), store and product URLs are all understood; DHgate's own filter parameters in a search URL are kept.

#### Recipe 9 — Read specific products

```json
{ "itemCodes": ["1114143067", "1114811530"], "maxItems": 50 }
```

Item codes (or product URLs in `startUrls`) are always read from their product pages, so these rows carry the full detail columns. Ideal for a daily price watch on a fixed list.

#### Recipe 10 — A price window

```json
{ "searchTerms": ["led strip lights"], "minPrice": 5, "maxPrice": 10, "maxItems": 500 }
```

Prices are per piece in US dollars; the range is sent to DHgate and checked again on every product.

#### Recipe 11 — Low minimum order with free shipping

```json
{ "searchTerms": ["phone case"], "singlePieceOnly": true, "freeShippingOnly": true, "maxItems": 500 }
```

#### Recipe 12 — Products on sale right now

```json
{ "searchTerms": ["sneakers"], "onSaleOnly": true, "maxItems": 500 }
```

#### Recipe 13 — Customizable products

```json
{ "searchTerms": ["tote bag"], "customizableOnly": true, "maxItems": 500 }
```

#### Recipe 14 — US-warehouse stock with real shipping costs

```json
{ "searchTerms": ["laptop stand"], "usWarehouseOnly": true, "includeDetails": true, "maxItems": 100 }
```

In the test every returned product shipped from the United States.

#### Recipe 15 — Shipping to another country

```json
{ "searchTerms": ["wireless earbuds"], "shipToCountry": "GB", "includeDetails": true, "maxItems": 30 }
```

`shippingCost`, delivery days and availability are calculated for the United Kingdom (DHgate writes it `UK`, so `shipToCountry` in the rows reads `UK`). Products the seller does not deliver there have `deliverable: false` and empty shipping columns.

#### Recipe 16 — Best sellers of a keyword

```json
{ "searchTerms": ["phone case"], "sortBy": "bestselling", "maxItems": 500 }
```

DHgate's *recently sold* order; it reaches about 3,000 results per search.

#### Recipe 17 — Descriptions and description pictures

```json
{ "itemCodes": ["898929515"], "includeDescription": true }
```

Adds `description` (text), `descriptionHtml` and `descriptionImages`. Many sellers use pictures only, then `description` is empty and the pictures are in `descriptionImages`.

### How to run it in Apify Console

1. Open the Actor and press **Try for free** (an Apify account is free to create; no DHgate account is needed).
2. In **Search terms**, type one keyword per line exactly as you would in the DHgate search box — for example *wireless earbuds*. Or paste DHgate URLs, category IDs, store IDs or item codes in the fields below.
3. Set **Max products (total)**. Leave the default 1,000 for a first real run, or 20 for a quick look.
4. Optional: open **Filters** to set a price window, a maximum MOQ, single piece, free shipping, on sale, customizable or US warehouse.
5. Optional: under **Output**, choose the **Ship-to country** and switch **Read the product page of every product** on for price tiers, shipping cost and the seller's company.
6. Press **Start**. Products appear in the **Output** tab within seconds; the status line shows how many were saved and how many result pages were read.
7. When the run finishes, open **Export** and download CSV, Excel, JSON, XML or HTML — or switch the table view between *Products*, *Prices & MOQ*, *Shipping* and *Sellers*.
8. To repeat it, save the input as a **Task**, add a **Schedule** (daily, weekly) and an integration or webhook so new results land where you work.

The run's key-value store holds a `SUMMARY` record with the outcome, the number of products DHgate reports for each search, pages read, duplicates skipped, the network routes used and the reason each search stopped.

### How to run it through the API

Every Apify Actor is an API. The simplest call starts a run, waits for it and returns the products in one response (keep it to small runs — the call waits for up to five minutes):

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~dhgate-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN&format=json" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["wireless earbuds"],"maxItems":200}'
```

For bigger runs, start the run asynchronously and fetch the dataset when it has finished — the official clients do the waiting for you.

**Node.js** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('logiover/dhgate-scraper').call({
    searchTerms: ['led strip lights'],
    includeDetails: true,
    shipToCountry: 'DE',
    maxItems: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0].title, items[0].priceTiers, items[0].shippingCost);
```

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("logiover/dhgate-scraper").call(run_input={
    "searchTerms": ["yoga pants", "leggings"],
    "freeShippingOnly": True,
    "maxItemsPerSearch": 1000,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["itemCode"], item["priceMin"], item["minOrderQuantity"], item["sellerName"])
```

The dataset can also be downloaded directly as a file: `https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv` (or `xlsx`, `json`, `xml`, `html`). Add `&fields=itemCode,title,priceMin,priceMax,minOrderQuantity,sellerName` to export only the columns you need, or `&omit=images,reviews` to drop the long ones.

### Input reference

| Field (API name) | Type | Default | What it does |
|---|---|---|---|
| **Search terms** (`searchTerms`) | array | `[]` | Keywords as typed into the DHgate search box; each is one search. |
| **DHgate URLs** (`startUrls`) | array | `[]` | Search, category, store or product URLs; filter parameters in a search URL are kept. |
| **Category IDs** (`categoryIds`) | array | `[]` | Category IDs such as 117003002 (LED Strips) or 117 (Lights & Lighting). Alone = browse; with search terms = narrow the searches. |
| **Store IDs** (`storeIds`) | array | `[]` | Every product of a store: the number in the store URL or the 32-character `sellerId`. |
| **Item codes** (`itemCodes`) | array | `[]` | Single products by item number; always read from their product pages. |
| **Max products (total)** (`maxItems`) | integer | `1000` | Limit for the whole run; 0 = no limit. Prefill: 20. |
| **Max products per search** (`maxItemsPerSearch`) | integer | `0` | Optional limit per search term / URL / category / store; 0 = none. |
| **Deep search** (`deepSearch`) | boolean | `true` | Continue big searches in US-dollar price bands after DHgate's 4,040-result window. |
| **Sort** (`sortBy`) | string (select) | `"relevance"` | `relevance`, `bestselling`, `price_asc`, `price_desc`. Deep search always continues in price order. |
| **Min price (USD)** (`minPrice`) | number | — | Lowest price per piece; sent to DHgate and checked again on every product. |
| **Max price (USD)** (`maxPrice`) | number | — | Highest price per piece (same rules). |
| **Max minimum order (MOQ)** (`maxMinimumOrder`) | integer | — | Only products whose MOQ is at most this many units. |
| **Single piece orders only** (`singlePieceOnly`) | boolean | `false` | Only products with a minimum order of 1. |
| **Free shipping only** (`freeShippingOnly`) | boolean | `false` | Only products with free shipping to the ship-to country. |
| **On sale only** (`onSaleOnly`) | boolean | `false` | Only products with a running seller promotion. |
| **Customizable only** (`customizableOnly`) | boolean | `false` | Only products the seller will customize. |
| **US warehouse only** (`usWarehouseOnly`) | boolean | `false` | Only products stocked in a US warehouse. |
| **Ship-to country** (`shipToCountry`) | string | `"US"` | Two-letter code the shipping cost, delivery time and availability are calculated for (US, GB, DE, FR, AU, CA, BR, IN …). |
| **Read the product page of every product** (`includeDetails`) | boolean | `false` | Adds price tiers, shipping, seller company, options, specifications, gallery, reviews. One extra page per product. |
| **Include full description** (`includeDescription`) | boolean | `false` | Adds the description as text, HTML and image URLs. Product-page option. |
| **Reviews per product** (`maxReviews`) | integer | `5` | Newest reviews stored per product (0–20). |
| **Parallel requests** (`concurrency`) | integer | `12` | Product pages read at the same time (1–30). Lower it if DHgate starts refusing requests. |
| **Proxy** (`proxyConfiguration`) | object | `{"useApifyProxy": true}` | Leave as is: direct connection first, Apify datacenter proxies when DHgate refuses, a few residential US requests as a last resort. |

### Data dictionary

Column order is the order below. Fill rate = share of rows where the column holds a value (booleans count when true or false), measured on 25 October 2026 as *cards / page*: **search-card rows** on the 15,000-row proof run, **product-page rows** on a 1,000-row run with *Read the product page* on; the three description columns on a 100-product run with *Include full description*. A dash means the column does not exist in that mode: a default run has 37 columns, a run with product pages 72, with descriptions 75. Rows read by item code leave out the six search-card-only columns (`minOrderText`, `coupons`, `customizable`, `hasVideo`, `sponsored`, `fastDeliveryDays`). Empty means the value is `null` — nothing is invented.

**Product**

| Column | Type | Fill: cards / page | Meaning | Example |
|---|---|---|---|---|
| `itemCode` | string | 100 % / 100 % | DHgate item number — the number at the end of the product URL. Stable; every product is saved once per run. | `"1114811456"` |
| `url` | string | 100 % / 100 % | Product page on www.dhgate.com (https, no tracking parameters). | `"https://www.dhgate.com…"` |
| `title` | string | 100 % / 100 % | Product title as the seller wrote it (plain text, HTML entities decoded). | `"16W Twinkle DC 12V Fib…"` |
| `productId` | string | 100 % / 100 % | DHgate internal product ID (32 characters); used by DHgate's own review and order endpoints. | `"8aaae1bd9f279651019f58…"` |
| `image` | string | 100 % / 100 % | Main product image at full size. | `"https://img4.dhresourc…"` |
| `images` | array | — / 100 % | Full product gallery at full size (product page only). | `["https://img4.dhres…", …]` |

**Category**

| Column | Type | Fill: cards / page | Meaning | Example |
|---|---|---|---|---|
| `categoryId` | string | 100 % / 100 % | DHgate category the product is filed under (leaf category). Use it in the Category IDs input. | `"117003002"` |
| `categoryName` | string | — / 100 % | Name of that leaf category (product page only). | `"Portable Speakers"` |
| `categoryPath` | string | — / 100 % | Breadcrumb from the top-level category down to the leaf, separated by " > " (product page only). | `"Electronics > Speakers…"` |

**Price & order**

| Column | Type | Fill: cards / page | Meaning | Example |
|---|---|---|---|---|
| `price` | string | 100 % / 100 % | Unit price or range in US dollars, promotion included, as DHgate writes it; with the product page it spans the whole price ladder. | `"US $23.72 - 44.95"` |
| `priceMin` | number | 100 % / 100 % | Lowest unit price, promotion included (USD). With the product page: the cheapest ladder tier; on search cards: the lowest price the card shows. | `23.72` |
| `priceMax` | number | 100 % / 100 % | Highest unit price, promotion included (equals priceMin for a single price); with the product page the entry tier. | `44.95` |
| `regularPriceMin` | number | 100 % / 100 % | Lowest unit price before the seller's promotion (equals priceMin when there is no promotion). | `23.72` |
| `regularPriceMax` | number | 100 % / 100 % | Highest unit price before the seller's promotion. | `44.95` |
| `currency` | string | 100 % / 100 % | ISO code of every price in the row. Always USD — the Actor pins DHgate's currency so rows are comparable. | `"USD"` |
| `discountPercent` | number | 67.5 % / 80.1 % | Percent off while a seller promotion runs; null when there is none. | `61` |
| `promotionEndsAt` | string | 67.5 % / 80.1 % | End of the running promotion (ISO 8601; the search card carries DHgate's local time, the product page UTC). | `"2026-10-31T15:59:00.000Z"` |
| `unit` | string | 100 % / 100 % | What one price unit is: Piece, Pair, Set, Meter … | `"Piece"` |
| `lotSize` | number | — / 100 % | Units DHgate sells as one lot (1 for almost every product). Prices in this Actor are always per unit. | `1` |
| `minOrderQuantity` | number | 100 % / 100 % | Minimum order quantity (MOQ) in units. | `1` |
| `minOrderText` | string | 100 % / 100 % | MOQ exactly as the search card writes it (search results only). | `"1 Piece"` |
| `maxOrderQuantity` | number | — / 100 % | Largest quantity DHgate accepts in one order (product page only). | `100000` |
| `priceTiers` | array | — / 100 % | Volume pricing from the product page: \[{minQuantity, maxQuantity (null = and more), price, promoPrice (null when no promotion)}], per unit in USD. | `[{"minQuantity": 1, "maxQuantity": 2, …}, …]` |
| `coupons` | array | 29.5 % / 55.3 % | Seller coupons and spend-and-save offers shown on the search card, e.g. "$2 off $40+", "Per $100 Save $5". | `["$1 off $100+"]` |
| `inStock` | boolean | — / 100 % | False when the listing is marked sold out or offline by the seller (product page only). | `true` |

**Sales & reviews**

| Column | Type | Fill: cards / page | Meaning | Example |
|---|---|---|---|---|
| `soldCount` | number | 15.8 % / 30 % | The sold figure DHgate prints next to the rating ("34 sold", "2.1K+ sold"); rounded when DHgate rounds. No time window is stated. | `34` |
| `soldText` | string | 15.8 % / 30 % | The sold figure exactly as shown. | `"34"` |
| `rating` | number | 13.4 % / 23.9 % | Average product rating, 1-5. Null while the product has no reviews. | `5` |
| `reviewCount` | number | 13.4 % / 100 % | Number of product reviews, as DHgate counts them (includes automatic 5-star reviews). | `33` |
| `autoReviewCount` | number | — / 23.9 % | How many reviews DHgate generated itself (default 5-star ratings when the buyer wrote none). Product page only. | `0` |
| `ratingCounts` | object | — / 23.9 % | Reviews per star rating: {"5":n,"4":n,"3":n,"2":n,"1":n}. Product page only. | `{"1": 0, "2": 0, "3": 0, "…` |
| `reviewHighlights` | array | — / 1.9 % | Most mentioned review phrases with counts: \[{text, count}]. Product page only. | `[{"text": "good bag …", "count": 2, …}, …]` |
| `reviewSummary` | string | — / 3.5 % | DHgate's AI summary of the reviews, when the product has one. | `"It's a great product! …"` |
| `reviews` | array | — / 23.9 % | Newest reviews (up to Reviews per product): \[{rating, text, date, buyer, country, purchased, autoReview}]. Buyer names are masked by DHgate. | `[{"rating": 5, "text": "Omg this …", …}, …]` |

**Product details**

| Column | Type | Fill: cards / page | Meaning | Example |
|---|---|---|---|---|
| `options` | array | — / 97.5 % | Selectable options of the product (colour, size, style, shipping-from …): \[{name, values\[]}] (product page only). | `[{"name": "Options", "values": ["Black", …, …}, …]` |
| `specifications` | array | — / 100 % | Item attributes the seller filled in: \[{name, value}] (product page only). | `[{"name": "Communica…", "value": "Bluetooth…", …}, …]` |
| `packageSizeCm` | string | — / 100 % | Package length x width x height in centimetres, for one lot (product page only). | `"55x55x55"` |
| `packageWeightKg` | number | — / 100 % | Gross weight of one lot in kilograms (product page only). | `1` |
| `lastUpdated` | string | — / 100 % | Date the seller last edited the listing (product page only). | `"2026-09-29"` |
| `customizable` | boolean | 94 % / 96.4 % | The seller offers customization (logo, packaging …). Search results only. | `false` |
| `hasVideo` | boolean | 100 % / 100 % | The listing has a short product video. Search results only. | `false` |
| `sponsored` | boolean | 100 % / 100 % | True for paid placements DHgate mixes into the first result page (AD badge). They are real products. Search results only. | `true` |

**Shipping**

| Column | Type | Fill: cards / page | Meaning | Example |
|---|---|---|---|---|
| `shipToCountry` | string | 100 % / 100 % | Destination the shipping figures are for (ISO code, DHgate writes the UK as UK). | `"US"` |
| `shippingCost` | number | — / 99.9 % | Shipping cost to the ship-to country for the minimum order quantity. 0 with freeShipping=true. Null when the seller does not deliver there. | `0` |
| `freeShipping` | boolean | 100 % / 99.9 % | Free shipping to the ship-to country (product page), or the card's badge on search-only rows; empty where the seller does not deliver. | `false` |
| `shippingMethod` | string | — / 99.9 % | Carrier / service the seller uses for the default delivery option (product page only). | `"Seller-Defined STD Log…"` |
| `deliveryDaysMin` | number | — / 99.9 % | Shortest estimated delivery time to the ship-to country, in days (product page only). | `10` |
| `deliveryDaysMax` | number | — / 99.9 % | Longest estimated delivery time, in days (product page only). | `20` |
| `fastDeliveryDays` | number | 9.5 % / 19 % | "X Days Delivery" badge on the search card: the delivery time the seller promises. Only some products carry it. | `15` |
| `shipsFrom` | string | — / 99.9 % | Warehouse country of the default delivery option. | `"China"` |
| `shipsFromOptions` | array | — / 17.1 % | Warehouse countries the buyer can choose between when the product offers several (China, Germany, United States …). | `["China"]` |
| `deliverable` | boolean | — / 100 % | False when the seller does not deliver to the ship-to country (product page only). | `true` |

**Seller**

| Column | Type | Fill: cards / page | Meaning | Example |
|---|---|---|---|---|
| `sellerId` | string | 100 % / 100 % | DHgate seller ID (32 characters). Use it in the Store IDs input. | `"8aaa106e9d85abac019e01…"` |
| `sellerStoreId` | string | 99.9 % / 100 % | Numeric store ID — the number in the store URL. | `"22318278"` |
| `sellerName` | string | 99.9 % / 100 % | Store name (DHgate's "seller name"). | `"royallight"` |
| `sellerUrl` | string | 99.9 % / 100 % | Store page on www.dhgate.com. | `"https://www.dhgate.com…"` |
| `sellerCompany` | string | — / 100 % | Registered company name of the seller when DHgate shows it (often in Chinese). Product page only. | `"香港航瑞科技有限公司"` |
| `sellerCountry` | string | — / 100 % | Country the seller is located in, as the store header shows it. Product page only. | `"China"` |
| `sellerPositiveFeedback` | number | 96.3 % / 96 % | Share of positive feedback of the seller, in percent. | `100` |
| `sellerOrders` | number | — / 99.7 % | Confirmed orders of the seller ("10232 Orders" in the store header). Product page only. | `320` |
| `sellerProductCount` | number | — / 100 % | Number of products the seller lists. Product page only. | `152` |
| `sellerReviewCount` | number | — / 96.3 % | Number of buyer reviews of the seller's store. Product page only. | `429` |
| `sellerYears` | number | 23.5 % / 100 % | The seller's years-on-DHgate badge as the site shows it ("1st Year", "9th Year"). | `10` |
| `sellerSince` | string | — / 100 % | Registration date of the store (product page only, when DHgate shows it). | `"2026-06-23"` |
| `sellerLevel` | string | 99.2 % / 100 % | DHgate store level badge, LV0 … LV5 (L0-L2, L3-L4, L5+ on the site). | `"LV0"` |
| `sellerOnTimeDeliveryRate` | number | — / 39.1 % | Share of orders the seller delivered on time, in percent, when DHgate shows it. Product page only. | `93` |
| `sellerEmployees` | string | — / 99.7 % | Staff size the seller states ("5 - 10 People"). Product page only. | `"51 - 100 People"` |
| `sellerMainCategories` | array | — / 100 % | Main product categories of the seller. Product page only. | `["Cell Phones & Acce…", …]` |
| `sellerKeyAccount` | boolean | — / 100 % | DHgate flags large sellers with the key-account (VIP) badge. Product page only. | `false` |

**Description**

| Column | Type | Fill: cards / page | Meaning | Example |
|---|---|---|---|---|
| `description` | string | — / 93 % | Full product description as plain text with line breaks. Only with "Include full description". | `"Company Information\nTr…"` |
| `descriptionHtml` | string | — / 100 % | The seller's description HTML (DHgate's own page-template fragment removed). Only with "Include full description". | `"<div style=\"background…"` |
| `descriptionImages` | array | — / 93 % | Image URLs inside the description. Only with "Include full description". | `["https://www.dhreso…", …]` |

**Run**

| Column | Type | Fill: cards / page | Meaning | Example |
|---|---|---|---|---|
| `hasDetails` | boolean | — / 100 % | True when the product page was read for this row; false for rows built from the search card alone. | `true` |
| `searchTerm` | string | 100 % / 100 % | The search term, category, store or URL that found the product; "item code" for products read by item number. | `"led lights"` |
| `scrapedAt` | string | 100 % / 100 % | When the row was collected (ISO 8601, UTC). | `"2026-10-25T12:40:39.530Z"` |

### Real output sample

Two rows from platform runs of 25 October 2026, unmasked, exactly as stored (JSON view; CSV and Excel flatten arrays and objects into JSON text).

**Search-card row** — *bluetooth speaker*, with a running promotion, seller coupon, rating and sold count (run `qGDVaPjqiwZFzEase`):

```json
{
  "itemCode": "1112779134",
  "url": "https://www.dhgate.com/product/uk-warehouse-charger-6-portable-speakers/1112779134.html",
  "title": "UK warehouse Charger 6 Portable Speakers Wireless Bluetooth Speaker Water Dance Bass Music player Kaleidoscope Audio186g",
  "productId": "8aaa0d8a9eee7d82019f1670ccb04b0b",
  "image": "https://img4.dhresource.com/0x0/f3/albu/bw/y/30/549d39fb-10e7-44fc-ba79-cae99ad68939.jpg",
  "categoryId": "103002008",
  "price": "US $42.34 - 53.49",
  "priceMin": 42.34,
  "priceMax": 53.49,
  "regularPriceMin": 47.04,
  "regularPriceMax": 59.43,
  "currency": "USD",
  "discountPercent": 10,
  "promotionEndsAt": "2026-10-31T15:59:00.000Z",
  "unit": "Piece",
  "minOrderQuantity": 1,
  "minOrderText": "1 Piece",
  "coupons": [
    "$2 off $50+"
  ],
  "soldCount": 42,
  "soldText": "42",
  "rating": 5,
  "reviewCount": 10,
  "customizable": false,
  "hasVideo": false,
  "sponsored": true,
  "shipToCountry": "US",
  "freeShipping": true,
  "fastDeliveryDays": null,
  "sellerId": "8aaa86d69eeeadcd019eeeb155780009",
  "sellerStoreId": "22327059",
  "sellerName": "hangruitech",
  "sellerUrl": "https://www.dhgate.com/store/22327059",
  "sellerPositiveFeedback": 99.3,
  "sellerYears": null,
  "sellerLevel": "LV4",
  "searchTerm": "bluetooth speaker",
  "scrapedAt": "2026-10-25T12:41:08.157Z"
}
```

**Product-page row** — *bluetooth speaker* with *Read the product page of every product* (run `0GViZaeG1IrYUW6hE`):

```json
{
  "itemCode": "1098016656",
  "url": "https://www.dhgate.com/product/grip-portable-speaker-cross-border-grip-new/1098016656.html",
  "title": "grip portable speaker crossborder grip new outdoor cycling portable subwoofer bluetooth speaker",
  "productId": "8aaa01fa9cf55645019cffd06db528ee",
  "image": "https://www.dhresource.com/0x0//f3/albu/bw/l/18/a628acab-6768-41ac-b5ab-302322d8f6e1.jpg",
  "images": [
    "https://www.dhresource.com/0x0//f3/albu/bw/l/18/a628acab-6768-41ac-b5ab-302322d8f6e1.jpg",
    "https://img4.dhresource.com/0x0/f3/albu/bw/l/18/4b849fd3-056d-438f-bbc9-b92d1fcead0e.jpg",
    "https://img4.dhresource.com/0x0/f3/albu/bw/l/18/1de053d7-8460-47d8-80b9-514c3803977a.jpg",
    "https://www.dhresource.com/0x0//f3/albu/bw/l/18/8f1a8a1b-34a6-4576-8081-4f8d9935e2c0.jpg",
    "https://www.dhresource.com/0x0//f3/albu/bw/l/18/15c56349-54eb-4fbf-82e7-b1fbd5f2dcb4.jpg"
  ],
  "categoryId": "103002008",
  "categoryName": "Portable Speakers",
  "categoryPath": "Electronics > Speakers > Portable Speakers",
  "price": "US $23.30 - 26.49",
  "priceMin": 23.3,
  "priceMax": 26.49,
  "regularPriceMin": 80.35,
  "regularPriceMax": 91.36,
  "currency": "USD",
  "discountPercent": 71,
  "promotionEndsAt": "2026-10-31T15:59:00.000Z",
  "unit": "Piece",
  "lotSize": 1,
  "minOrderQuantity": 1,
  "minOrderText": "1 Piece",
  "maxOrderQuantity": 100000,
  "priceTiers": [
    {
      "minQuantity": 1,
      "maxQuantity": 3,
      "price": 91.36,
      "promoPrice": 26.49
    },
    {
      "minQuantity": 4,
      "maxQuantity": 12,
      "price": 83.28,
      "promoPrice": 24.15
    },
    {
      "minQuantity": 13,
      "maxQuantity": null,
      "price": 80.35,
      "promoPrice": 23.3
    }
  ],
  "coupons": null,
  "inStock": true,
  "soldCount": 32,
  "soldText": "32",
  "rating": 5,
  "reviewCount": 8,
  "autoReviewCount": 0,
  "ratingCounts": {
    "1": 0,
    "2": 0,
    "3": 0,
    "4": 0,
    "5": 8
  },
  "reviewHighlights": null,
  "reviewSummary": null,
  "reviews": [
    {
      "rating": 5,
      "text": "Very satisfied",
      "date": "2026-04-24",
      "buyer": "0nek****bes5",
      "country": "United States",
      "purchased": "Options: blue, Shipping from: China",
      "autoReview": false
    },
    {
      "rating": 5,
      "text": "Stable performance, works great",
      "date": "2026-04-24",
      "buyer": "wuu8****vl0z",
      "country": "United States",
      "purchased": "Options: blue, Shipping from: China",
      "autoReview": false
    },
    {
      "rating": 5,
      "text": "I love this item, worth every penny",
      "date": "2026-04-24",
      "buyer": "wf7e7r****z8ciw",
      "country": "United States",
      "purchased": "Options: purple, Shipping from: China",
      "autoReview": false
    },
    {
      "rating": 5,
      "text": "Super practical, daily use is very convenient",
      "date": "2026-04-24",
      "buyer": "bn1k****dpt",
      "country": "United States",
      "purchased": "Shipping from: China, Options: Black",
      "autoReview": false
    },
    {
      "rating": 5,
      "text": "Very satisfied",
      "date": "2026-04-24",
      "buyer": "3jp***skn",
      "country": "United States",
      "purchased": "Options: purple, Shipping from: China",
      "autoReview": false
    }
  ],
  "options": [
    {
      "name": "Options",
      "values": [
        "Black",
        "Red",
        "blue",
        "purple",
        "camo"
      ]
    },
    {
      "name": "Shipping from",
      "values": [
        "China"
      ]
    }
  ],
  "specifications": [
    {
      "name": "Communication",
      "value": "Bluetooth"
    },
    {
      "name": "Feature",
      "value": "Wireless Portable Bluetooth Mini"
    },
    {
      "name": "Cabinet Material",
      "value": "Plastic Metal"
    },
    {
      "name": "Crossover Type Of The Main Speaker",
      "value": "Full-Range"
    }
  ],
  "packageSizeCm": "10x10x10",
  "packageWeightKg": 0.348,
  "lastUpdated": "2026-10-24",
  "customizable": false,
  "hasVideo": false,
  "sponsored": false,
  "shipToCountry": "US",
  "shippingCost": 0,
  "freeShipping": true,
  "shippingMethod": "Seller-Defined STD Logitstics",
  "deliveryDaysMin": 10,
  "deliveryDaysMax": 20,
  "fastDeliveryDays": null,
  "shipsFrom": "China",
  "shipsFromOptions": [
    "China"
  ],
  "deliverable": true,
  "sellerId": "2c9362ec7a5aab37017ace8d29e34efc",
  "sellerStoreId": "21704141",
  "sellerName": "nishoes52seller",
  "sellerUrl": "https://www.dhgate.com/store/21704141",
  "sellerCompany": "瑞缇纳有限公司",
  "sellerCountry": "China",
  "sellerPositiveFeedback": 97.8,
  "sellerOrders": 3151,
  "sellerProductCount": 71,
  "sellerReviewCount": 7845,
  "sellerYears": 1,
  "sellerSince": "2021-08-30",
  "sellerLevel": "LV5-1",
  "sellerOnTimeDeliveryRate": 91,
  "sellerEmployees": "11 - 50 People",
  "sellerMainCategories": [
    "Cell Phones & Accessories",
    "Cameras & Photo",
    "Games & Accessories",
    "Computers & Networking",
    "Electronics"
  ],
  "sellerKeyAccount": false,
  "hasDetails": true,
  "searchTerm": "bluetooth speaker",
  "scrapedAt": "2026-10-25T12:50:00.813Z"
}
```

**CSV columns of a default run (37):**

`itemCode, url, title, productId, image, categoryId, price, priceMin, priceMax, regularPriceMin, regularPriceMax, currency, discountPercent, promotionEndsAt, unit, minOrderQuantity, minOrderText, coupons, soldCount, soldText, rating, reviewCount, customizable, hasVideo, sponsored, shipToCountry, freeShipping, fastDeliveryDays, sellerId, sellerStoreId, sellerName, sellerUrl, sellerPositiveFeedback, sellerYears, sellerLevel, searchTerm, scrapedAt`

**Added with the product page (35; 72 columns in all, plus `description`, `descriptionHtml`, `descriptionImages` with the description option):**

`images, categoryName, categoryPath, lotSize, maxOrderQuantity, priceTiers, inStock, autoReviewCount, ratingCounts, reviewHighlights, reviewSummary, reviews, options, specifications, packageSizeCm, packageWeightKg, lastUpdated, shippingCost, shippingMethod, deliveryDaysMin, deliveryDaysMax, shipsFrom, shipsFromOptions, deliverable, sellerCompany, sellerCountry, sellerOrders, sellerProductCount, sellerReviewCount, sellerSince, sellerOnTimeDeliveryRate, sellerEmployees, sellerMainCategories, sellerKeyAccount, hasDetails`

### How much data and how fast

All numbers below were measured on the Apify platform on **25 October 2026 (UTC)** with the default memory (1,024 MB) and default settings unless noted.

| Run | Products saved | Duplicates | Duration | Pages read |
|---|---|---|---|---|
| Prefill: *wireless earbuds*, max 20 | 20 | 0 | 3.0–3.2 s (first products after ~1 s) | 1 result page |
| *yoga pants*, max 1,000 | 1,000 | 0 | 9.9 s | 24 result pages |
| *bluetooth speaker*, max 1,000 | 1,000 | 0 | 9.8 s | 25 result pages |
| *led lights* + *phone case*, max 12,000, deep search | 12,000 | 0 | 95.0 s | 356 result pages |
| *led lights* + *phone case* + *yoga pants*, max 15,000, deep search | 15,000 | 0 | 115.0 s | 436 result pages |
| *bluetooth speaker*, max 1,000, **product pages read** | 1,000 | 0 | 249 s | 25 result + 1,000 product pages |
| 100 item codes with descriptions | 100 | 0 | 84.4 s | 100 product pages |

In the 15,000-product run *led lights* (DHgate reported 202,493 matches) gave 7,221 unique products from 11 price bands and *phone case* (67,766 matches) gave 7,779; the limit was reached before the third keyword started. On an earlier build (1.0.1) *led lights* alone gave 10,176 unique products in 55 s. Peak memory was 122 MB. The 12,000 and 15,000 runs were measured on builds 1.0.3 and 1.0.6; later builds changed only option paths named in the [changelog](#changelog), not how a plain search is read.

**Why 4,040 per search window.** DHgate reports large totals but shows at most 101 pages of 40 products for one search. With one consistent session per search a price-sorted window gave 4,040 unique products, a best-match window about 3,270 and a best-selling window about 2,970, after which DHgate repeats a fallback page. The Actor stops a window when pages stop bringing new products.

**How deep search goes further.** When you ask for more than about 2,500 products from one search, the Actor repeats it in US-dollar price bands (0–0.5, 0.5–1, 1–2, 2–3, 3–5, 5–8, 8–12, 12–20, 20–35, 35–60, 60–100, 100–200, 200–500, 500–1,500, 1,500–5,000 and 5,000+), three bands at a time, each a price-sorted search of its own; a band that still fills a window is cut in two. Products are de-duplicated across bands, searches and stores, and the work stops as soon as *Max products* is reached. Your own price filter is respected: bands are cut to the window you set.

**What makes it fast.** A search page returns 40 products with price, MOQ, sales, rating, shipping badge and seller, so 1,000 products need 25 requests, and up to eight pages are read in parallel. The product page is a separate request per product; DHgate rate-limits those, so the Actor paces itself and reads about four products a second with product pages on.

**Network routes.** Direct connection first, Apify datacenter proxies when DHgate refuses requests, a small capped number of residential US requests as a last resort. In the 100-item-code test 29 of 130 requests were refused; the Actor switched route and still read all 100 pages. `SUMMARY` shows requests, refusals and routes of every run.

**Ranking consistency.** Without a session DHgate shuffles best-match order on every request. Each search is read with one consistent session, which keeps its pages from overlapping; the order can still differ from your browser.

### What you pay

This Actor is priced **per result**: you pay only for products saved to your dataset, nothing for pages, retries, proxies or compute.

| Products | Free Apify plan ($1.20 / 1,000) | Higher Apify plans (down to $0.80 / 1,000) |
|---|---|---|
| 1,000 | $1.20 | from $0.80 |
| 10,000 | $12.00 | from $8.00 |
| 100,000 | $120.00 | from $80.00 |

The per-1,000 price steps down with your Apify plan: $1.20 on the free plan, about $1.07 and $0.93 on the next two discount tiers and $0.80 on the highest tiers. The exact price for your account is shown on the Actor's pricing tab before you start.

**Maximum cost per run.** Apify lets you set a *Max cost per run* (in the run options, or `maxTotalChargeUsd` in the API). The Actor reads that limit before writing, saves exactly as many products as the limit covers, writes its SUMMARY and finishes as **Succeeded** with the message *"PARTIAL — stopped at the run's maximum cost per run with N product(s) saved. Raise "Max cost per run" to collect more."* It does not keep reading pages it could not save. Example: with a $5 limit on the free plan the run stops at 4,166 products. For large exports set both *Max products* and a cost limit you are comfortable with.

### Integrations

- **Google Sheets.** Use Apify's Google Sheets integration (or the dataset's CSV URL with `IMPORTDATA`) to send each run's products to a sheet — one tab per keyword works well with *Max products per search*.
- **Make, Zapier and n8n.** All three have Apify modules: trigger "Actor run finished", then map `title`, `priceMin`, `minOrderQuantity`, `sellerName` and `url` into your CRM, a spreadsheet, Slack or email.
- **Airtable.** Send rows into an Airtable base and link products to sellers by `sellerStoreId` for a lightweight sourcing database.
- **Webhooks.** Add a webhook on *run succeeded* to call your own endpoint with the dataset ID, then pull the items through the API.
- **Schedules.** Save the input as a task and schedule it daily or weekly for price monitoring or a fresh seller list; join runs on `itemCode`. For a fixed watch list use `itemCodes` with *Reviews per product* = 0.
- **AI agents and MCP.** Apify's MCP server exposes Actors as tools, so an AI assistant can run *DHgate Scraper* with a JSON input ("find 200 customizable tote bags under $3 with free shipping") and reason over the returned rows.
- **Data warehouses.** Load the JSON or CSV export into BigQuery, Snowflake, Postgres or a data lake; `itemCode` is the primary key and `sellerStoreId` the seller key. Fetching the dataset with `format=json&clean=1` gives one object per product ready for bulk loading.
- **Python and Node.js.** See [How to run it through the API](#how-to-run-it-through-the-api) for client code.

### Performance tips

- **Ask for what you need.** Runs stop as soon as *Max products* is reached; the prefill of 20 finishes in about three seconds.
- **Leave the product page off for lists.** Search cards already carry price, MOQ, sales, rating, free shipping and the seller. Switch *Read the product page* on only when you need tiers, shipping cost, the seller's company or specifications — it is about 25 times slower per product.
- **Use two steps for big detail jobs.** Run a card-only search for 10,000 products, filter in your sheet, then feed the `itemCode`s you care about back through `itemCodes` for the full detail.
- **Spread budgets across keywords** with *Max products per search*, otherwise the first keyword may take most of a total limit.
- **Use DHgate's filters instead of filtering afterwards.** Price, MOQ, free shipping, on sale, customizable and US warehouse are applied by DHgate and checked again by the Actor, so you pay only for products you want.
- **Several specific keywords** (*led strip 12v*, *cob led strip*) give precise niches; deep search on one broad keyword gives the widest coverage.
- **Pick the ship-to country first** — shipping cost and delivery days are for one country per run.
- **Keep the default proxy setting;** lower *Parallel requests* only if product pages keep failing.

### Troubleshooting and status messages

The run's status line always says what happened, and the `SUMMARY` record in the key-value store has the details per search.

| Status message (start) | Run status | What it means and what to do |
|---|---|---|
| `COMPLETED — N product(s) from S search(es) (limit of N reached) · P result page(s)` | Succeeded | Everything requested was collected. Without "(limit of N reached)" the searches simply had no more products. |
| `PARTIAL — N product(s) … the run time limit was reached` | Succeeded | The run's timeout ended the crawl. Raise the timeout (default 3,600 s) or lower *Max products*. |
| `PARTIAL — … N result page(s) could not be read` / `a search was cut short by DHgate refusing requests` | Succeeded | A few pages failed after all retries; products from all other pages are saved. Run again to fill the gap. |
| `… N product page(s) could not be read (those rows hold search-card data only; hasDetails = false)` | Succeeded | Some product pages failed; those rows keep the search-card columns. Re-read them with `itemCodes`. |
| `… N product(s) had been removed` | Succeeded | DHgate answered "gone" (HTTP 404/410) for N products a search had found; they are not saved. |
| `PARTIAL — stopped at the run's maximum cost per run with N product(s) saved. Raise "Max cost per run" to collect more.` | Succeeded | Your cost limit was reached; see [What you pay](#what-you-pay). |
| `EMPTY_RESULT — DHgate answered but has no products for this search. …` | Succeeded | DHgate listed nothing for that keyword and filter combination (for example a price window of $9,000–$9,001). |
| `EMPTY_RESULT — none of the N item code(s) exists on DHgate (any more) …` / `DHgate has no store with the number … (HTTP 404)` | Succeeded | The products were removed or the numbers are wrong; copy store numbers from `www.dhgate.com/store/<number>`. |
| `BLOCKED — DHgate could not be read (…) after N request(s). This is an access problem, not an empty result.` | Failed | Every route was refused. Run again in a few minutes; keep the default proxy setting. |
| `FETCH_FAILED — DHgate could not be read (…)` / `the crawl stopped before any product was saved (…)` / `no product could be saved and N page(s) failed (…)` | Failed | Network errors on every route (or a custom proxy that does not work), or every page that should hold products failed. A rerun normally succeeds. |
| `INVALID_INPUT — Give at least one search term …` | Failed | Nothing to search: add a keyword, a DHgate URL, a category ID, a store ID or an item code. |
| `INVALID_INPUT — "…" is not a valid URL` / `is not a dhgate.com URL` / `has no searchkey, catalog or supplierid` / `Category ID "…" is not a number` / `Item code "…" is not a DHgate item number` / `Store ID "…" is not valid` / `Unknown sortBy` / `Ship-to country … must be a two-letter country code` / `maxMinimumOrder must be 1 or more` | Failed | Fix the named input: category IDs look like 117003002, item codes like 1114811530, store IDs are the number in the store URL or the 32-character seller ID, sort is `relevance`, `bestselling`, `price_asc` or `price_desc`, the country a code such as US or DE. |

While the run is working, the status line shows progress such as `Collected 7,194 product(s) · 226 result pages · 60s`. `SUMMARY.searches[].stop` says why each search ended: `ENOUGH` (your limit), `END` (no more pages), `REPEATS`, `WINDOW` (DHgate's 101-page window), `BANDS` (deep search finished), `BLOCKED` / `FAILED`, `TIME`, `EMPTY`.

**Products for a nonsense word?** DHgate's search is fuzzy and never answers "nothing" for an unknown word: a nonsense string returned products and a count of several hundred. The Actor saves what DHgate lists; check `title` and `categoryName` for rare terms. A truly empty result needs a filter combination that matches nothing.

### Honest limits

- **4,040 results per search window.** DHgate's own limit. Deep search, several keywords, categories and stores go beyond it; one broad keyword will not return all of the hundreds of thousands DHgate reports.
- **Price tiers, shipping cost, the seller's company, specifications and reviews need the product page.** Search cards do not carry them, so a default run leaves those columns out entirely. The product page is one extra request per product and DHgate rate-limits it.
- **Card prices can show the entry price only.** For a small share of products the search card shows the price for the minimum order instead of the whole ladder (one of 14 products in the hand check); with the product page read, `priceMin` and `priceMax` span the full ladder.
- **DHgate's own filters are loose.** In the test a "single piece only" search listed products with a minimum order of 50–300, and a $5–$10 search listed $1 products. The Actor checks MOQ and price again on every product and drops the ones outside your range (counted as `outsideYourFilters` in `SUMMARY`); free shipping, on sale and customizable were exact in the test.
- **Sold counts are DHgate's rounded text** (*2.1K+*) with no stated time window, and many products have none; ratings exist only for products with reviews.
- **Buyer names are masked by DHgate itself** (*dfgd\*\*\*\*ydg*). Reviews hold at most the newest 20 per product.
- **Shipping cost is for the minimum order to one ship-to country.** Delivery days are DHgate's estimate. Products the seller does not deliver to that country have `deliverable: false`.
- **No e-mail addresses or phone numbers.** DHgate does not publish them; buyers contact sellers inside DHgate.
- **Prices are US dollars only.** The Actor pins the currency; other display currencies are not offered.
- **Order differs from your browser.** DHgate personalises and shuffles best-match order; the set of products is the same kind, the exact order may not be. Row order in the dataset is not a ranking.
- **Sponsored listings are mixed in** by DHgate on the first result page. They are real products, flagged in `sponsored`. Category pages also list a stray product from another category now and then (1 of 80 in the test).
- **Seller feedback and sales move daily.** A figure can differ by a tenth of a point between two reads (99.2 vs 99.3 in the hand check).
- **DHgate.com only.** AliExpress, Alibaba.com, 1688 and Temu are different sites and are not covered by this Actor.

### DHgate Scraper compared with the other options

| | DHgate Scraper | Copying from the website by hand | DHgate's own seller tools |
|---|---|---|---|
| Speed | 1,000 products in ~10 s (cards), 4 products/s with product pages | Minutes per page | Not designed for export |
| Volume | 10,000+ products per keyword in one run | A few dozen before fatigue | Your own store only |
| Fields | 37–75 typed columns incl. tiers, shipping, seller company | Whatever you copy | Varies |
| Filters | DHgate's own filters, set once in the input | Clicked per search | Yes, in the browser |
| De-duplication | Automatic, by item code | Manual | — |
| Repeatable / scheduled | Yes (tasks, schedules, API, webhooks) | No | No |
| Login | Not needed | Not needed for browsing | Seller account |
| Cost | Pay per product | Your time | Free for sellers |

As far as we know DHgate does not publish an open API for searching its public catalogue; its seller-side integrations are meant for managing your own store. For buyers, analysts and sourcing teams who need search results as data, a scraper is the practical route.

### FAQ

#### How do I scrape DHgate without coding?

Open the Actor, type a keyword in *Search terms*, press Start and download the table from the Output tab as CSV or Excel. No DHgate account, cookies or code are needed.

#### Is there an official DHgate API for product search?

As far as we know there is no open API for searching DHgate's public catalogue; the seller-side integrations are for managing your own store. This Actor reads the same public pages every visitor sees and returns clean JSON.

#### Can I export DHgate products to Excel or CSV?

Yes. Every dataset downloads as CSV, Excel (`xlsx`), JSON, XML or HTML from the Export button or the API (`?format=csv`).

#### How many products can I scrape from DHgate?

In one run 15,000 unique products in 115 seconds (25 October 2026). DHgate shows at most 4,040 per search window; deep search continues in price bands, and more keywords, categories and stores add more.

#### Why does DHgate report 200,000 results when I get about 4,000 per window?

DHgate counts every fuzzy match but lists only 101 pages of 40 per search. Deep search repeats the search in price bands so each band shows its own window; that is how one keyword reaches 10,000+ products.

#### Do I need a DHgate account, login or cookies?

No. Everything comes from public pages; the Actor sets only the cookies that pin the currency (USD) and the ship-to country.

#### How do I get DHgate price tiers (bulk pricing)?

Switch on *Read the product page of every product*. `priceTiers` then lists every quantity break with the regular and promotion price per unit, for example 1–9 pieces at $14.89 down to 1,000+ at $7.11.

#### How do I get shipping cost and delivery time to my country?

Set *Ship-to country* (for example `DE`) and switch the product page on: you get `shippingCost`, `shippingMethod`, `deliveryDaysMin`, `deliveryDaysMax` and `shipsFrom` for that country. Search-card rows carry only `freeShipping` and the *X Days Delivery* promise.

#### What currency are the prices in?

US dollars. DHgate shows a visitor's local currency; the Actor pins USD so a run from any country is comparable.

#### What is the difference between priceMin, priceMax and priceTiers?

`priceMin` / `priceMax` are the cheapest and the dearest unit price, promotion included; `priceTiers` is the full ladder by quantity (product page only); `regularPriceMin` / `regularPriceMax` are the prices before the seller's promotion.

#### How do I scrape all products of one DHgate store?

Put the store number from its URL (`www.dhgate.com/store/22318278`) into *Store IDs*, or paste the store URL into *DHgate URLs*. A store with thousands of products is split by price bands like any big search. `sellerStoreId` and `sellerId` in every row are valid store IDs.

#### How do I scrape a whole DHgate category?

Put the category ID into *Category IDs* or paste the category URL. IDs are in the `categoryId` column and in URLs like `…/c117003002.html`; a parent ID such as 117 covers its sub-categories.

#### Can I paste a DHgate search URL?

Yes. Search, category, store and product URLs go into *DHgate URLs*; DHgate's filter parameters in a search URL (price, sort, free shipping, minimum order …) are kept.

#### How do I find low MOQ products on DHgate?

Switch on *Single piece orders only* or set *Max minimum order*, and read `minOrderQuantity` for the exact number; the Actor drops products whose MOQ is above your limit.

#### How do I find products with free shipping?

Switch on *Free shipping only*, or read `freeShipping` (and `shippingCost` with the product page). It is free shipping to the ship-to country you chose.

#### Can I monitor DHgate prices every day?

Yes: save a task, add a daily schedule and join the runs on `itemCode`. For a fixed list use `itemCodes`, which reads each product page and returns the whole ladder.

#### How fast is it?

Search cards: 1,000 products in about 10 seconds, 15,000 in under two minutes. With product pages: about four products a second (1,000 in 249 seconds).

#### How much does it cost to scrape 10,000 DHgate products?

$12.00 on the free Apify plan, down to $8.00 on higher plans — see [What you pay](#what-you-pay).

#### What happens when I set a maximum cost per run?

The Actor saves exactly as many products as the limit covers and finishes as Succeeded with a `PARTIAL — stopped at the run's maximum cost per run …` message; nothing is charged beyond the limit.

#### Why are some products marked sponsored?

DHgate mixes paid placements into the first result page. They are real products; `sponsored` is `true` for them so you can drop them.

#### Why is the order different from what I see on DHgate?

DHgate shuffles best-match order per visitor. The Actor keeps one session per search so its own pages do not overlap, but the order can differ from your browser; `sortBy: price_asc` or `bestselling` give stable orders.

#### What does the "sold" number mean?

It is the text DHgate prints next to the rating (*34 sold*, *2.1K+ sold*), with no stated time window; large numbers are rounded. `soldText` keeps the original, `soldCount` the number.

#### Why do many products have no rating or sold count?

New and slow listings have neither and DHgate prints nothing for them. In the 15,000-product run 13.4 % of the products had a rating and 15.8 % a sold figure; the [data dictionary](#data-dictionary) shows every column.

#### Can it get reviews?

Yes, with the product page: `reviewCount`, `rating`, `ratingCounts`, `reviewHighlights`, DHgate's AI `reviewSummary` and the newest 0–20 reviews in `reviews`. Buyer names are masked by DHgate itself (*dfgd\*\*\*\*ydg*). Not the full review history.

#### Does it return seller contact details or e-mails?

No. DHgate does not publish seller e-mails or phone numbers. You get store link, name, company name, country, orders, feedback score, level (`LV0` … `LV5`), years on DHgate (`sellerYears`, the *1st Year* / *9th Year* badge) and staff size.

#### Can I use it from Python, Node.js, Google Sheets, Zapier, Make or n8n?

Yes — see [How to run it through the API](#how-to-run-it-through-the-api) and [Integrations](#integrations). Apify's MCP server also exposes the Actor to AI agents as a tool with plain JSON input.

#### Does it work for AliExpress, Alibaba or Temu?

No — this Actor reads DHgate.com only. Those sites have different pages and need their own scrapers.

#### Are Chinese-language values supported?

Yes. DHgate's English site shows English titles; seller company names are the registered Chinese names (*深圳市泰尔晟贸易有限公司*) and are stored as proper UTF-8.

#### Does it get product descriptions and pictures?

Pictures: `image` always, `images` (the gallery) with the product page. Descriptions: switch on *Include full description* for `description`, `descriptionHtml` and `descriptionImages`. Many sellers describe with pictures only; then `description` is empty.

#### Why do I get products that do not match my keyword?

DHgate's search is fuzzy and fills a window with loosely related products when a term is rare. Check `title` and `categoryName`, narrow with `categoryIds`, or use a more specific phrase.

#### What should I do if a run ends with BLOCKED or FETCH_FAILED?

Run again in a few minutes with the default proxy setting; the Actor already retries on other routes before it gives up. DHgate refuses some datacenter ranges, so a US address works best if you use your own proxy. See [Troubleshooting](#troubleshooting-and-status-messages).

### Glossary

| Term | Chinese | Meaning |
|---|---|---|
| DHgate | 敦煌网 | Chinese cross-border B2B2C wholesale marketplace (DHgate.com) |
| MOQ (minimum order quantity) | 起订量 | The smallest quantity a seller accepts per order (`minOrderQuantity`) |
| Price tiers | 阶梯价 | Unit prices that fall as the order quantity rises (`priceTiers`) |
| Dropshipping | 一件代发 | Selling without stock; the seller ships single pieces to your customer |
| Free shipping | 包邮 | Shipping paid by the seller (`freeShipping`) |
| Store / seller | 店铺 / 卖家 | A seller's shop on DHgate (`sellerName`, `sellerStoreId`) |
| Positive feedback | 好评率 | Share of positive seller ratings (`sellerPositiveFeedback`) |
| Sold | 已售 | Units sold as printed on the listing (`soldCount`) |
| Review / rating | 评价 / 评分 | Buyer reviews and the 1–5 star average (`reviewCount`, `rating`) |
| Shipping fee | 运费 | Cost of delivery to the ship-to country (`shippingCost`) |
| Delivery time | 送达时间 / 交货期 | Estimated days to deliver (`deliveryDaysMin`, `deliveryDaysMax`) |
| Overseas warehouse | 海外仓 | Stock held abroad, e.g. the US warehouse filter |
| Customization | 定制 | Logo, packaging or colour made to order (`customizable`) |
| Promotion | 限时促销 | A time-limited seller discount (`discountPercent`, `promotionEndsAt`) |
| Category | 类目 | DHgate's product category (`categoryId`, `categoryPath`) |
| Item code | 商品编号 | DHgate's product number (`itemCode`) |
| Store level | 店铺等级 | LV0 … LV5 badge (`sellerLevel`) |
| On-time delivery rate | 准时发货率 | Share of orders delivered on time (`sellerOnTimeDeliveryRate`) |
| Cross-border e-commerce | 跨境电商 | Selling across borders — the main use of this data |
| Product selection | 选品 | Choosing what to sell or source |

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

The Actor collects only information DHgate.com publishes openly to every visitor without a login: product listings, prices, review texts and the business details sellers choose to show. It does not bypass logins or paywalls and it does not collect buyer accounts or private messages. Scraping publicly available data is generally lawful in many jurisdictions, but the responsibility for how you use the data is yours. Respect DHgate's terms of use, do not republish copyrighted pictures or texts without the rights holder's permission, and if your use involves personal data (review authors are shown masked by DHgate itself; a seller's company name is business data) comply with the laws that apply to you — China's Personal Information Protection Law (PIPL), the EU and UK GDPR, India's Digital Personal Data Protection Act 2023, the CCPA and others. If in doubt, ask a lawyer.

### Changelog

- **1.0 (25 October 2026)** — First release: keyword, category, store, URL and item-code modes; deep search in price bands; DHgate's own filters (price, MOQ, single piece, free shipping, on sale, customizable, US warehouse, ship-to country, sort) checked again on every product; optional product-page read with price tiers, shipping, seller company, specifications, options, gallery and reviews; optional descriptions; 37 / 72 / 75 typed columns; per-result pricing with a clean stop at the maximum cost per run. Proof runs: 12,000 unique products (build 1.0.3) and 15,000 unique products (build 1.0.6); later builds changed item-code rows, filter checks, price columns of product-page rows, descriptions and status messages only.

### Support

Questions, a missing field, a search that behaves oddly? Open an issue on the Actor's **Issues** tab with the run ID — **we reply within 24 hours**. Feature requests are welcome; tell us which DHgate filter or column would help your workflow.

# Changelog

This Actor's version history is a separate document: https://apify.com/logiover/dhgate-scraper/changelog.md

# Actor input Schema

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

Product keywords exactly as you would type them into the DHgate search box, e.g. wireless earbuds, led strip lights, yoga pants, phone case, sneakers. Each term is one DHgate search. A search shows up to about 3,300 results; with Deep search on, bigger searches continue in price bands and one keyword can give 10,000+ products.

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

Optional. Paste DHgate URLs: search pages (https://www.dhgate.com/wholesale/search.do?searchkey=…), category pages (…/wholesale/led-strips/c117003002.html), store pages (https://www.dhgate.com/store/22318278) or single product pages (…/product/…/1114811530.html). DHgate's own filters in a search URL (price, sort, free shipping, minimum order …) are kept.

## `categoryIds` (type: `array`):

Optional. DHgate category IDs such as 117003002 (LED Strips) or 117 (Lights & Lighting) — the categoryId column of this Actor's output or the c… number in a category URL. Without search terms each category is browsed on its own; with search terms the searches are narrowed to these categories.

## `storeIds` (type: `array`):

Optional. List every product of a store: the number from a store URL (22318278 from www.dhgate.com/store/22318278) or the 32-character seller ID from the sellerId column.

## `itemCodes` (type: `array`):

Optional. Read single products by item number — the number at the end of a product URL, e.g. 1114811530. These are fetched straight from their product pages.

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

Upper limit for the whole run. 0 = no limit. Every product is saved once even if several searches find it.

## `maxItemsPerSearch` (type: `integer`):

Optional cap for each search term / URL / category / store (0 = no cap), useful to spread a budget evenly across many keywords.

## `deepSearch` (type: `boolean`):

DHgate shows at most 4,040 results for any single search, even when it reports 200,000 matches. With this on, a search that wants more than about 2,500 products continues automatically in US-dollar price bands (each band is a search of its own), so one keyword can give tens of thousands of unique products. Off = stop after DHgate's own result window.

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

Order of results. Best match and Best selling reach about 3,000 results per search; the price orders reach 4,040. Deep search always continues in price order.

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

Optional. Lowest price per piece in US dollars. It is sent to DHgate as its own price filter and checked again on every product: a product is kept when its displayed price range reaches into your range.

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

Optional. Highest price per piece in US dollars (same rules as Min price).

## `maxMinimumOrder` (type: `integer`):

Optional. Only products whose minimum order quantity is at most this many units. DHgate's "Min. order" filter is applied and every product's own minimum order is checked again.

## `singlePieceOnly` (type: `boolean`):

Only products you can order as a single piece (minimum order of 1). DHgate's filter is applied and every product's own minimum order is checked again, because DHgate's filter alone also lists some bulk-only products.

## `freeShippingOnly` (type: `boolean`):

Only products with free shipping to your ship-to country.

## `onSaleOnly` (type: `boolean`):

Only products with a running seller promotion.

## `customizableOnly` (type: `boolean`):

Only products the seller will customize (logo, packaging …).

## `usWarehouseOnly` (type: `boolean`):

Only products stocked in a US warehouse.

## `shipToCountry` (type: `string`):

Two-letter country code the shipping cost, delivery time and availability are calculated for, e.g. US, GB, DE, FR, AU, CA, BR, IN. All prices are in US dollars.

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

Off (default): one row per product from the search results — about 10,000 products a minute. On: every product also gets its own product page read — volume price tiers, shipping cost and delivery days to your country, seller company, specifications, options, gallery and latest reviews. That is one extra page per product and DHgate rate-limits it, so expect a few hundred to a couple of thousand products a minute.

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

Adds the seller's full description as text, as HTML and its image URLs (large: often 10-40 KB per product). Needs "Read the product page".

## `maxReviews` (type: `integer`):

How many of the newest reviews to store with each product (0 = none, 20 = all the product page shows). Review counts, star split and highlights are always included.

## `concurrency` (type: `integer`):

How many product pages are read at the same time. 12 is a good balance; lower it if DHgate starts refusing requests.

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

The Actor starts on the direct connection and switches to Apify datacenter proxies by itself when DHgate refuses a request; residential proxies (US) are used only as a last resort for a few requests. The default works for nearly everyone.

## Actor input object example

```json
{
  "searchTerms": [
    "wireless earbuds"
  ],
  "startUrls": [],
  "categoryIds": [],
  "storeIds": [],
  "itemCodes": [],
  "maxItems": 20,
  "maxItemsPerSearch": 0,
  "deepSearch": true,
  "sortBy": "relevance",
  "singlePieceOnly": false,
  "freeShippingOnly": false,
  "onSaleOnly": false,
  "customizableOnly": false,
  "usWarehouseOnly": false,
  "shipToCountry": "US",
  "includeDetails": false,
  "includeDescription": false,
  "maxReviews": 5,
  "concurrency": 12,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All products collected in this run.

# 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": [
        "wireless earbuds"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/dhgate-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": ["wireless earbuds"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/dhgate-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": [
    "wireless earbuds"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/dhgate-scraper --silent --output-dataset

```

## MCP server setup

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