# DHgate Products Scraper & API - Wholesale Prices, MOQ, Sellers (`rel8ble/dhgate-scraper`) Actor

DHgate products scraper and API: search DHgate.com wholesale products by keyword with price, MOQ, free-shipping, rating and sold filters. One result = one product: price range, discount %, MOQ, sold count, rating, seller and feedback %, image, URL. No login. $0.15 per 1,000, the cheapest.

- **URL**: https://apify.com/rel8ble/dhgate-scraper.md
- **Developed by:** [Giovanni Rich](https://apify.com/rel8ble) (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

$0.15 / 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.

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 Products Scraper & API - Wholesale Prices, MOQ, Sellers

This **DHgate products scraper** turns DHgate.com keyword listings into clean JSON, CSV or Excel: enter a keyword and get each product's current price range, original price and discount, MOQ, sold count, rating and reviews, free shipping, seller store name, seller feedback score and a full-size image link.
Use it as a **DHgate product scraper** for dropshipping and price research, a **DHgate seller scraper** to map who sells what, or an unofficial **DHgate API** ($0.15 per 1,000 products) you call from your own code, Make, Zapier or n8n.

It reads the product data DHgate embeds in its own listing pages, over plain HTTP, with **no headless browser and no login**. 40 products per page, about 100 products in under 10 seconds.

### What you get

- **Product**: item code, title, product URL, image (300 px) and full-size image, video flag, DHgate category ID, sponsored flag.
- **Price**: current price from / to in USD, price unit (piece, set, meter, ...), **original price and discount %** with the promotion end date when the product is on sale.
- **MOQ**: minimum order as a number, its unit and the original text.
- **Demand signals**: sold count, product rating, review count, share of positive reviews.
- **Shipping**: free shipping and 7-day return flags for the ship-to country (US by default).
- **Seller**: store name, seller ID, store URL, years on DHgate (when shown) and **positive feedback %**.

### Sample output

Real rows from a cloud run for `led light` (US ship-to):

| title | priceText | moqText | soldCount | rating | sellerName | seller feedback % |
|---|---|---|---|---|---|---|
| 5M LED Light String 60 Leds Computer Desk DIY Backlight 24 Key Remote... | US $1.14 - 1.47 | 5 Meters | 40 | 4.9 | adairs | 98.9 |
| 5M/10M LED Strip RGB USB 5050 SMD LEDs Lights 44key controller... | US $9.70 - 13.96 | 1 Set | 83 | 4.7 | lighting1617 | 100 |
| Led Strip 15 20 Meters Outdoor Wifi Alexa 5050 5V Rgb Tape Led Lights... | US $2.72 - 3.43 | 1 Piece | 21 | 4.8 | tabletpc2015 | 96.8 |
| 24V RGB 5m 10m 20m 30m LED Neon Strip Light Bluetooth APP... (53% off) | US $6.58 - 13.49 | 1 Piece | 4 | 5 | joykiss | 98.4 |

### Use cases

- **Dropshipping product research**: find low-MOQ, free-shipping products with real sold counts and ratings before you list them on Shopify, eBay or Amazon.
- **Wholesale price benchmarking**: compare `priceMin` / `priceMax` and MOQ for one product type across dozens of DHgate sellers in a single run.
- **Discount and promotion tracking**: `originalPriceMin`, `discountPercent` and `promotionEnds` show which listings are on sale and until when.
- **Supplier scouting**: rank sellers by `sellerPositiveFeedbackPercent` and by how many of your keyword's products they carry.
- **Price monitoring**: schedule the same keywords daily and compare prices and sold counts by `productId`.
- **AI agents**: "find LED strips under $5 with MOQ 1 and free shipping" maps straight onto the input fields.

### Pricing

**$0.15 per 1,000 products** (pay per result; duplicates, products removed by your filters and failed requests are never charged). **No start fee.** It is the cheapest DHgate scraper on the Store at every run size:

| DHgate scraper (30-day users) | Price per 1,000 products |
|---|---|
| **This one** | **$0.15, no start fee** |
| automation-lab product & supplier (4) | $0.16 + $0.005 per run |
| 123webdata (2) | $0.89 + $0.01 per run, $1.99 per 1,000 detail pages |
| chimerical_quicklime (2) | $0.93 + $0.005 per run |
| piotrv1001 listings (15) | $1.00 |
| devcake products (9) | $1.00 + $0.01 per run |
| shahidirfan products (6) | $1.00 + $0.00005 per run |
| logiover (1) | $1.20 |

| You scrape | You pay |
|---|---|
| 100 products | $0.015 |
| 1,000 products | $0.15 |
| 10,000 products | $1.50 |
| 100,000 products | $15.00 |

The Apify free plan's $5 monthly credit covers about 33,000 products. The prefilled input (`led light` and `yoga mat`, 20 products each) costs $0.006, and 100 products took about 9 seconds in a cloud test. If you set a maximum cost per run, the scraper stops cleanly when it reaches it.

#### Why this one

- **Cheapest DHgate scraper on the Store**: $0.15 per 1,000, under a sixth of what the most-used ones charge ($1.00), with no start fee.
- **Discount data included**: original price, discount % and promotion end date on every sale listing.
- **Seller quality in the same row**: store name, store URL, seller ID and positive feedback %.
- **Filters that save money**: price, MOQ, free shipping, rating and sold count are applied before you are charged.
- **Fast and light**: plain HTTP, no browser or login, 40 products per page.

### FAQ

**Does it need a browser, cookies or a DHgate account?**
No. Plain HTTPS requests for DHgate's public listing pages. No login, no personal data.

**Which proxy should I use?**
None: leave the default. The actor connects directly and retries any blocked request through Apify residential proxy automatically.

**Why did a keyword return fewer results than I asked for?**
Either DHgate's category pages for that keyword ran out, or your filters removed the rest. `RUN_SUMMARY` shows the counts and the stop reason.

**Can I track prices and discounts over time?**
Yes: schedule the actor daily on the same keywords and compare `priceMin`, `discountPercent` and `soldCount` by `productId`.

**Is there an official DHgate API?**
DHgate's open platform is for registered sellers managing their own store. To read public product listings by keyword, this actor works as an unofficial DHgate API: one call in, JSON rows out.

**How much does a typical run cost?**
A 500-product price check is $0.075; a 10,000-product catalog sweep is $1.50. The free plan's $5 credit covers about 33,000 products a month.

### Example inputs for common jobs

Dropshipping shortlist: single-unit orders with free shipping, 4+ stars and proof of sales (at most $0.03 for 200 products):

```json
{ "searchTerms": ["phone case", "led strip"], "maxResultsPerSearch": 100, "maxMoq": 1, "freeShippingOnly": true, "minSold": 10, "minRating": 4 }
```

Wholesale price benchmark for one product type inside one category (about $0.08):

```json
{ "searchTerms": ["human hair wig"], "categories": ["Hair Products"], "maxResultsPerSearch": 500 }
```

Cheap stock under $5 a piece for a store launch, sponsored listings left out:

```json
{ "searchTerms": ["keychain", "sticker", "hair clip"], "maxPrice": 5, "includeAds": false, "maxResultsPerSearch": 200 }
```

Whole-keyword sweep for seller mapping (every product DHgate's category pages hold; about $1.50 per 10,000):

```json
{ "searchTerms": ["yoga mat"], "maxResultsPerSearch": 0 }
```

### How to use

1. Enter one or more keywords in **Search terms** (e.g. `led light`, `yoga mat`). DHgate search URLs work too; the keyword is read from them.
2. Optionally limit to top-level **categories** and set filters: price, MOQ, free shipping, minimum rating, minimum sold count.
3. Click **Start** and download the results as JSON, CSV or Excel from the **Output** tab, or fetch them through the Apify API.

### How it searches

DHgate shows 40 products per listing page. For each keyword the actor reads the all-categories page first, then walks the keyword's **category facets** (biggest first: e.g. "led light" in Lights & Lighting > LED Strips, Home & Garden > Christmas Decorations, ...), each of which adds up to 40 more products. Duplicates across facets are removed and never charged. It uses only the plain listing URLs DHgate links from its own category filter.

### Input

| Field | Default | Description |
|---|---|---|
| `searchTerms` | `led light` | Keywords or DHgate search URLs, one per line |
| `maxResultsPerSearch` | 100 | Unique products per keyword. 0 = as many as the keyword's category pages hold |
| `categories` | all | Top-level categories by name or URL: `Lights & Lighting`, `Home & Garden`, `Electronics`, ... |
| `minPrice` / `maxPrice` | - | Unit price filter in USD |
| `maxMoq` | - | e.g. `1` for single-unit orders |
| `freeShippingOnly` | false | Only free-shipping products |
| `minRating` | - | Minimum product rating 1-5 |
| `minSold` | - | Minimum units sold |
| `includeAds` | true | Keep sponsored listings (flagged `isAd`) |

### Input example

```json
{
    "searchTerms": ["yoga mat", "phone case"],
    "maxResultsPerSearch": 250,
    "freeShippingOnly": true,
    "maxPrice": 15
}
```

### Output example

One dataset item per product. This one is from a real run for "led light":

```json
{
    "searchTerm": "led light",
    "position": 8,
    "productId": "1060632844",
    "title": "24V RGB 5m 10m 20m 30m LED Neon Strip Light Bluetooth APP 24key 44key Remote Control Music Sync Power Kit 60LED Waterproof Decor H260511",
    "url": "https://www.dhgate.com/product/24v-rgb-5m-10m-20m-30m-led-neon-strip-light/1060632844.html",
    "image": "https://img4.dhresource.com/300x300/f3/albu/ys/y/06/3959417d-dd0c-4ad3-b166-a7e4d3630a07.jpg",
    "imageLarge": "https://img4.dhresource.com/0x0/f3/albu/ys/y/06/3959417d-dd0c-4ad3-b166-a7e4d3630a07.jpg",
    "priceMin": 6.58,
    "priceMax": 13.49,
    "priceText": "US $6.58 - 13.49",
    "currency": "USD",
    "priceUnit": "Piece",
    "originalPriceMin": 13.99,
    "originalPriceMax": 28.7,
    "discountPercent": 53,
    "promotionEnds": "2026-10-31 23:59:00",
    "moq": 1,
    "moqUnit": "Piece",
    "moqText": "1 Piece",
    "soldCount": 4,
    "rating": 5,
    "reviewCount": 2,
    "positiveReviewPercent": 100,
    "freeShipping": false,
    "sevenDayReturn": false,
    "hasVideo": false,
    "isAd": false,
    "categoryId": "117003002",
    "sellerName": "joykiss",
    "sellerId": "22048458",
    "sellerStoreUrl": "https://www.dhgate.com/store/top-selling/22048458.html",
    "sellerYears": null,
    "sellerPositiveFeedbackPercent": 98.4,
    "listingCategory": null,
    "shipTo": "United States",
    "sourceCategoryId": null,
    "scrapedAt": "2026-10-24T05:26:22.601Z"
}
```

The dataset has three views: **Overview**, **Prices & discounts** and **Sellers**. The `RUN_SUMMARY` record lists, per keyword, the matches DHgate reports, pages read, duplicates and filtered products skipped, and why the search stopped.

### API example

Python (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("rel8ble/dhgate-scraper").call(run_input={"searchTerms": ["yoga mat", "phone case"], "maxResultsPerSearch": 200, "maxMoq": 1})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], "|", item["priceText"], "|", item["sellerName"])
```

One HTTP call that runs the actor and returns the rows (curl):

```bash
curl -X POST "https://api.apify.com/v2/acts/rel8ble~dhgate-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["yoga mat"], "maxResultsPerSearch": 100, "freeShippingOnly": true}'
```

### Integrations

- **Make, Zapier and n8n**: run the actor and pass the products on to any app.
- **Google Sheets**: export the dataset straight to a spreadsheet.
- **Apify API**: start runs and download results over REST, or with the JavaScript and Python clients.
- **Webhooks**: get notified when a run finishes.
- **MCP for AI agents**: the Apify MCP server (https://mcp.apify.com) lets Claude, ChatGPT, Cursor and other agents call this DHgate scraper as a tool.

### Limits

- **Coverage per keyword comes from category facets.** Each facet page holds DHgate's top 40 for that keyword and category, so a broad keyword yields thousands of products, a narrow one fewer. With strict filters, fewer of each page pass, so expect fewer results than `maxResultsPerSearch`.
- **Best-match order only.** Sorting by price, orders or newest is not available.
- **DHgate matches loosely.** Even a nonsense keyword returns loosely related products. Check titles if precision matters.
- **Prices are for the US** (DHgate's default ship-to country for the request); `shipTo` shows which one applied.
- **Listing data only.** Variants, full specifications, shipping fees and review texts are on the product page, which this version does not open.
- `soldCount`, `rating` and `sellerYears` are filled only when DHgate shows them on the card (about half of products).

# Actor input Schema

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

Provide at least one. Product keywords to search on DHgate.com, e.g. \["led light", "yoga mat"], or DHgate search URLs (the keyword is read from them). One search per line. Default \["led light"] (demo only).

## `maxResultsPerSearch` (type: `integer`):

Optional. Maximum unique products saved per keyword, integer >= 0. Default 100; 0 = as many as DHgate's category pages for the keyword hold (often several thousand). You pay per product, so use 10-20 for a quick answer.

## `categories` (type: `array`):

Optional. Limit the search to DHgate top-level categories, by name or URL, e.g. \["Lights & Lighting", "Home & Garden"] or \["https://www.dhgate.com/wholesale/home-garden/c019.html"]. Names: Apparel, Automobiles & Motorcycles, Baby, Kids & Maternity, Bags & Luggage, Cell Phones & Accessories, Computers & Networking, Electronics, Fashion Accessories, Games & Accessories, Hair Products, Health & Beauty, Home & Garden, Jewelry, Lights & Lighting, Office & School & Business & Industrial, Pet Supplies, Shoes & Accessories, Sports & Outdoors, Toys & Gifts, Watches, Wedding & Party Events. Omit for all categories.

## `minPrice` (type: `integer`):

Optional. Minimum unit price in US dollars, integer >= 0. Products whose highest price is below it are skipped (not charged). Omit for no minimum.

## `maxPrice` (type: `integer`):

Optional. Maximum unit price in US dollars, integer >= 0. Products whose lowest price is above it are skipped (not charged). Omit for no maximum.

## `maxMoq` (type: `integer`):

Optional. Only products whose minimum order is at or below this quantity, integer >= 1, e.g. 1 for single-unit orders. Omit for no limit.

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

Optional boolean. true = only products with free shipping. Default false.

## `minRating` (type: `integer`):

Optional. Minimum product rating 1-5 (products without reviews are skipped when set). Omit for any.

## `minSold` (type: `integer`):

Optional. Only products DHgate shows as sold at least this many times (products without a sold count are skipped when set). Omit for any.

## `includeAds` (type: `boolean`):

Optional boolean. true = keep sponsored listings (flagged isAd: true). Default true.

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

Optional, advanced. Parallel requests, integer 1-10. Default 3. Leave unset.

## `maxRequestRetries` (type: `integer`):

Optional, advanced. Retries per failed or blocked request, integer 0-20; each retry uses a new proxy IP. Default 6.

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

Optional, advanced. Leave as is. Default {"useApifyProxy": false} = automatic: direct connection first, and only requests that get blocked are retried through Apify residential proxy. Set Apify Proxy groups or your own proxy URLs to force them for every request.

## Actor input object example

```json
{
  "searchTerms": [
    "led light",
    "yoga mat"
  ],
  "maxResultsPerSearch": 20,
  "freeShippingOnly": false,
  "includeAds": true,
  "maxConcurrency": 3,
  "maxRequestRetries": 6,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `products` (type: `string`):

All products found, with prices, discounts, MOQ, sold count, rating and seller.

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

Per-keyword counts, pages visited and stop reasons.

# 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": [
        "led light",
        "yoga mat"
    ],
    "maxResultsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rel8ble/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": [
        "led light",
        "yoga mat",
    ],
    "maxResultsPerSearch": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("rel8ble/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": [
    "led light",
    "yoga mat"
  ],
  "maxResultsPerSearch": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call rel8ble/dhgate-scraper --silent --output-dataset

```

## MCP server setup

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