# DHgate Scraper (Cheap) (`data_api/dhgate-scraper-cheap`) Actor

Extract DHgate search results and product details in bulk. Get titles, prices, images, ratings, and seller details with built-in bypass protection.

- **URL**: https://apify.com/data\_api/dhgate-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## DHgate Product Scraper

![DHgate Product Scraper](cover.jpg)

Copying DHgate listings by hand is slow, and the site fights back with rate limits the moment you speed up. This scraper does the collecting for you: hand it a few keywords or paste in DHgate search and category links, and it pulls back every product as a clean row — title, price, store, feedback, reviews, and recent sales. Bypass handling is built in, so there are no proxies to wire up and no blocks to babysit. Run one keyword or a long list and export the lot to a spreadsheet.

### What you get

One row per product, with the same set of columns every time, so results drop straight into a sheet or database. Each row covers three things:

- **Product** — `productTitle`, `priceText`, `minOrderText`, `minOrderQty`, `productLink`, `imageLink`, `shipsFree`
- **Store and reputation** — `storeName`, `storeId`, `storeLink`, `positiveFeedback`, `reviewsTotal`, `ratingScore`, `unitsSoldRecent`
- **Identifiers and timing** — `listingId`, `productCode`, `collectedAt`

### Quick start

1. Press **Try for free** and open the input form.
2. Add your **Search keywords** (one per line), or paste DHgate links into **DHgate page URLs** — either works, or use both.
3. Set **Products per source** to cap how many listings come back for each keyword or link.
4. Click **Start**, then download the results as JSON, CSV, Excel, or XML once the run wraps up.

![How it works](how-it-works.jpg)

### Use cases

- **Dropshipping product hunting** — surface trending wholesale items and gauge demand before you list them in your own store.
- **Price monitoring** — track price ranges and minimum-order terms across competing sellers over time.
- **Supplier checks** — weigh feedback scores, review counts, and recent sales to pick sellers worth ordering from.
- **Catalog building** — pull clean product links and image URLs into a product database for analysis or import.
- **Market sizing** — measure how many sellers and listings sit behind a keyword to read a niche's competition.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchTerms` | array of strings | One of searchTerms or targetUrls | DHgate keywords, one per line. The scraper walks the search results for each. |
| `targetUrls` | array of strings | One of searchTerms or targetUrls | DHgate wholesale, search, or category links to pull directly, one per line. |
| `resultsLimit` | integer | No | How many listings to collect per keyword or link. Ceiling is 1000. Default `20`. |
| `timeoutSeconds` | integer | No | Seconds to wait on a single page request before giving up. Default `45`. |

#### Example input

```json
{
    "searchTerms": [
        "mechanical keyboard",
        "running shoes"
    ],
    "targetUrls": [
        "https://www.dhgate.com/wholesale/search.do?searchkey=mechanical+keyboard"
    ],
    "resultsLimit": 20,
    "timeoutSeconds": 45
}
```

### Output

Each product becomes one row in the dataset, and the columns stay the same across every run so your output stays rectangular.

#### Example output

```json
{
    "listingId": "1110354937",
    "productCode": "8aaad2129eb5c81d019ebecae3712da9",
    "productTitle": "Wireless Mechanical Keyboard 87-Key Hot-Swappable RGB Backlit Gaming Keyboard",
    "productLink": "https://www.dhgate.com/product/wireless-mechanical-keyboard-87-key/1110354937.html",
    "imageLink": "https://img4.dhresource.com/webp/m/300x300/f3/albu/ys/g/19/f587b96d-d64e-463e-a4e9-6b83d662070c.jpg",
    "priceText": "US $34.20 - 48.90 ",
    "minOrderText": "1 Piece",
    "minOrderQty": "1",
    "storeName": "keyboardworld",
    "storeId": "8aaab8188f519474018f6708f33e1679",
    "storeLink": "https://www.dhgate.com/store/top-selling/21989441.html",
    "positiveFeedback": "99.4%",
    "reviewsTotal": "38",
    "ratingScore": "5.0",
    "unitsSoldRecent": "1.1K+",
    "shipsFree": true,
    "collectedAt": "2026-06-29T09:00:43.029000+00:00"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | DHgate item code for the listing. |
| `productCode` | string | Internal product identifier from DHgate. |
| `productTitle` | string | Headline of the product listing. |
| `productLink` | string | Clean HTTPS link to the product detail page. |
| `imageLink` | string | Primary product photo as an HTTPS URL. |
| `priceText` | string | Listed price or price range as shown. |
| `minOrderText` | string | Minimum purchase wording (e.g. 1 Piece). |
| `minOrderQty` | string | Minimum order as a plain number. |
| `storeName` | string | Storefront handle or domain of the seller. |
| `storeId` | string | DHgate user ID for the seller. |
| `storeLink` | string | Link to the seller's storefront. |
| `positiveFeedback` | string | Share of positive seller feedback. |
| `reviewsTotal` | string | Number of buyer reviews on the listing. |
| `ratingScore` | string | Average buyer rating, out of 5. |
| `unitsSoldRecent` | string | Recent sales count shown on the listing. |
| `shipsFree` | boolean | True when the listing ships free. |
| `collectedAt` | string | ISO timestamp of when the row was captured. |

### Tips for best results

- **Start with a small batch.** Run one keyword at `resultsLimit` 20 first to confirm the columns fit your pipeline before scaling up.
- **Mix keywords and links.** Keywords cover broad discovery; pasted search or category links let you target an exact slice of DHgate.
- **Raise `resultsLimit` deliberately.** It defaults to 20 to keep runs cheap; push it toward 1000 only when you actually need the depth, since deeper pages cost more time.
- **Bump `timeoutSeconds` if pages lag.** On heavy category pages, 60 seconds gives slow responses room to land instead of erroring out.
- **Some fields can be empty.** A listing without reviews or a sales figure returns those fields blank — that is how the source page renders it, not a scrape failure.

### How can I use DHgate product data?

**How can I use the DHgate Product Scraper to find dropshipping products?**
Feed in keywords for the niche you sell, set `resultsLimit`, and the scraper returns matching products with `priceText`, `minOrderText`, `unitsSoldRecent`, and `positiveFeedback`. Sort by recent sales and feedback to shortlist items that already move, then pull `productLink` and `imageLink` straight into your store import.

**How can I scrape DHgate prices to track competitors?**
Paste the DHgate search or category links you care about into `targetUrls` and run the scraper on a schedule. Each run captures `priceText` and `minOrderText` per listing with a `collectedAt` timestamp, so you can stack the exports and watch how wholesale pricing shifts over weeks.

**How can I vet DHgate sellers before ordering?**
Every row carries `storeName`, `storeLink`, `positiveFeedback`, `reviewsTotal`, `ratingScore`, and `unitsSoldRecent`. Export a keyword's results and rank sellers by feedback and review volume to separate established storefronts from brand-new ones before you commit to a bulk order.

**How can I export DHgate product data to a spreadsheet?**
Once the run finishes, download the dataset as CSV, Excel, JSON, or XML, or pull it through the Apify API. The output is flat and consistent, so it opens cleanly in Google Sheets or Excel for filtering, pivot tables, and price comparisons.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

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

Keywords to look up on DHgate. Add one keyword per line and the scraper walks the matching search results.

## `targetUrls` (type: `array`):

Paste DHgate wholesale, search, or category page links to pull directly. One link per line.

## `resultsLimit` (type: `integer`):

How many product listings to collect for each keyword or link. The ceiling is 1000.

## `timeoutSeconds` (type: `integer`):

How long to wait on a single DHgate page request before giving up.

## Actor input object example

```json
{
  "searchTerms": [
    "mechanical keyboard",
    "running shoes",
    "led strip lights"
  ],
  "targetUrls": [
    "https://www.dhgate.com/wholesale/search.do?searchkey=mechanical+keyboard"
  ],
  "resultsLimit": 20,
  "timeoutSeconds": 45
}
```

# 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": [
        "mechanical keyboard"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/dhgate-scraper-cheap").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": ["mechanical keyboard"] }

# Run the Actor and wait for it to finish
run = client.actor("data_api/dhgate-scraper-cheap").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "mechanical keyboard"
  ]
}' |
apify call data_api/dhgate-scraper-cheap --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=data_api/dhgate-scraper-cheap",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/6pHcKAoCiEfiHn201/builds/aklCGYZ3f61Fra6Jf/openapi.json
