# Yiwugo Scraper & API - Yiwu Wholesale Products, MOQ, Suppliers (`rel8ble/yiwugo-scraper`) Actor

Yiwugo scraper and API (义乌购): Yiwu market wholesale products and suppliers by keyword. One row per product: CNY price tiers, MOQ, stock, specs, shop, market, floor, booth number, mobile, e-mail, WeChat, WhatsApp. Product pages included, no start fee. $0.80 per 1,000, the cheapest.

- **URL**: https://apify.com/rel8ble/yiwugo-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.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.

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

## Yiwugo Scraper & API - Yiwu Wholesale Products, MOQ, Suppliers

**Yiwugo scraper** (义乌购) for importers, Amazon / Shopify sellers, dropshippers and sourcing agents: enter a product keyword such as `hair clip` or `christmas decorations` and get products from the **Yiwu International Trade City** online market as clean JSON, CSV or Excel. Each row is one product with the **CNY wholesale price, quantity price tiers, MOQ, stock, specs and variants**, plus the market shop behind it: **market district, floor, section, booth number, years on Yiwugo, and the shop's published mobile, e-mail, WeChat and WhatsApp**. Use it as a **Yiwu market scraper**, a **1688 / Alibaba alternative for small-commodity sourcing**, or an unofficial **Yiwugo API** from your own code, Make, Zapier or n8n.

It reads the English site (en.yiwugo.com) over plain HTTP, with **no browser and no login**. 50 products with full product pages took 62 seconds in a cloud test and cost $0.04: **$0.80 per 1,000 results, product pages included, no start fee**, the cheapest Yiwugo scraper on the Store.

### What you get

- **Product**: name, product URL, Chinese-site URL, main image plus all images, item number, unit weight, attributes (material, origin, QTY/CTN, ...), variants (colors, sizes, styles).
- **Wholesale pricing**: price range in CNY (`priceMin` / `priceMax` as numbers), **quantity price tiers** (`[{ minQuantity, price, unit }]`), "price negotiable" flag, **MOQ** as a number with its unit, stock quantity.
- **Shop / supplier**: shop name, shop page, years on Yiwugo, "Superior Supplier" badge, **market district, floor, section and physical booth number** in Yiwu International Trade City.
- **Contacts the shop publishes**: mobile, e-mail, WeChat ID, WhatsApp. Contact-person names are not collected.
- **Buyer signals**: review count and average rating (when the product has reviews).
- **Clean search results**: paid "\[Ad]" placements that often do not match your keyword are skipped by default.

### Sample output

Real rows from a run for "hair clip" with default settings:

| productName | priceText | moqText | shopName | market | boothNumber | yearsOnYiwugo |
|---|---|---|---|---|---|---|
| double love sweet hollow out barrettes ... | CN¥ 0.95 ~ 1.15 | 1200 piece | Yingmin Accessory Firm | International Trade Mart (District 1) | 3575 | 15 |
| acetate hair claw headdress cherry barrettes ... | CN¥ 6.0 | 2 piece | Juyi Jewelry | International Trade Mart (District 1) - East | 102104A | 5 |
| headdress for han chinese clothing full set ... | CN¥ 27.0 ~ 32.0 | 3 piece | Heart charm | International Trade Mart (District 1) | 3148 | 12 |
| cute children's hair clips 7-piece hairpin ... | CN¥ 2.5 ~ 3.8 | 1 board | Yiqiao jewelry | International Trade Mart (District 1) - East | 102095B | 7 |

In that 50-row cloud run (default input, 512 MB, datacenter proxy, 62 s): price, MOQ, stock, market, floor, section, booth number, mobile and e-mail 100%, WeChat 90%, weight 86%, variants 84%, quantity price tiers 64% (the rest are single-price or negotiated), WhatsApp 26%, reviews 20%.

### Use cases

- **Product sourcing**: compare Yiwu wholesale prices and MOQs for a product before you order, with the quantity breaks spelled out.
- **Supplier lead lists**: turn on **One row per shop** for a list of Yiwu market booths with mobile, e-mail and WeChat for a product category.
- **Small-batch buying**: set **Max MOQ** (e.g. 100) to find shops that sell in small quantities, ideal for testing products.
- **Price monitoring**: schedule a run and track `priceTiers`, `stockQuantity` and new products over time (join on `productId`).
- **Market visits**: get district, floor and booth number to plan a trip through Yiwu International Trade City.
- **Compare marketplaces**: run the same keyword on our Alibaba, DHgate, Global Sources and HKTDC scrapers (same account).
- **AI sourcing agents**: let an agent pull a priced supplier shortlist through the Apify MCP server.

### Example inputs for common jobs

Copy one into the JSON tab of the input form.

**Lead list: one row per established shop with an e-mail**

```json
{
    "searchTerms": ["hair clip", "phone case"],
    "maxResultsPerSearch": 200,
    "uniqueSuppliers": true,
    "minYearsOnYiwugo": 5,
    "onlyWithEmail": true
}
```

**Small MOQ and cheap: products to test on Amazon / TikTok Shop**

```json
{
    "searchTerms": ["kitchen gadgets", "pet toys"],
    "maxResultsPerSearch": 100,
    "maxMoq": 50,
    "maxPrice": 20
}
```

**Fast listing-only export (no product pages)**

```json
{
    "searchTerms": ["christmas decorations"],
    "maxResultsPerSearch": 600,
    "scrapeDetails": false
}
```

**A search URL, a market section or one product**

```json
{
    "searchTerms": [
        "https://en.yiwugo.com/search/s.html?queryKey=hair+clip",
        "https://en.yiwugo.com/product/list.html?subMarket=10011",
        "https://en.yiwugo.com/product/detail/955081249.html"
    ]
}
```

### How to use

1. Enter one or more English product keywords in **Products** (`hair clip`, `phone case`, `party supplies`), or paste en.yiwugo.com search, market-list or product URLs.
2. Set **Max results per search** (start with 20) and any filters.
3. Click **Start**, then download the results as JSON, CSV or Excel from the **Output** tab, or fetch them through the Apify API.

A keyword with no products is reported in the log and costs nothing.

### Input

| Field | Default | Description |
|---|---|---|
| `searchTerms` | `hair clip` | Keywords or Yiwugo search / market list / product URLs, one per line |
| `maxResultsPerSearch` | 50 | Products per keyword. 0 = everything (60 per page, up to 100 pages) |
| `scrapeDetails` | true | Read each product page: price tiers, stock, specs, variants, booth, contacts, reviews |
| `skipAds` | true | Skip the paid "\[Ad]" placements at the top of every search |
| `uniqueSuppliers` | false | One row per shop instead of one per product |
| `onlyWithPrice` | false | Skip products without a listed price |
| `maxMoq` | - | Skip products with an MOQ above this number |
| `maxPrice` | - | Skip products whose lowest unit price is above this (CNY) |
| `minYearsOnYiwugo` | 0 | Only shops at least this many years on Yiwugo |
| `onlyWithPhone` | false | Only shops that publish a mobile / landline / WhatsApp |
| `onlyWithEmail` | false | Only shops that publish an e-mail |
| `proxyConfiguration` | Apify Proxy | Datacenter proxy works; switch to RESIDENTIAL only if the log shows blocks |

### Output example

One dataset item per product. This one is from the real "hair clip" run (contact values shortened here; the dataset has them in full):

```json
{
    "searchTerm": "hair clip",
    "position": 4,
    "productId": "955081249",
    "productName": "cute children's hair clips hair accessories 7-piece hairpin dopamine hairpin non-slip rhinestone clip hairware metal side clip",
    "productUrl": "https://en.yiwugo.com/product/detail/955081249.html",
    "image": "https://ywgimg.yiwugo.com/product/shop_258403/normal/955081249/20240112/hTFbgf4xgeMw6e3e.png",
    "isAd": false,
    "currency": "CNY",
    "priceText": "CN¥ 2.5 ~ 3.8",
    "priceMin": 2.5,
    "priceMax": 3.8,
    "moq": 1,
    "moqUnit": "board",
    "moqText": "1 board",
    "shopName": "Yiqiao jewelry",
    "shopId": "L102819",
    "yearsOnYiwugo": 7,
    "marketLocation": "International Trade Mart (District 1) - East",
    "priceTiers": [
        { "minQuantity": 1, "price": 3.8, "unit": "board" },
        { "minQuantity": 60, "price": 2.8, "unit": "board" },
        { "minQuantity": 1000, "price": 2.5, "unit": "board" }
    ],
    "priceNegotiable": false,
    "stockQuantity": 87450,
    "itemNumber": "YQ-010",
    "weight": "0.045 kg/board",
    "attributes": { "metal + iron": "clip", "origin": "yiwu", "QTY/CTN": "1000 board/carton" },
    "variants": ["1# lanxing", "2# yellow star", "3#cd", "4#wang"],
    "market": "International Trade Mart (District 1) - East",
    "floor": "2 F",
    "industry": "Jewelry",
    "boothNumber": "102095B",
    "mobile": "1866826....",
    "email": "zhenzhen....@163.com",
    "wechat": "yiqiao....",
    "whatsapp": "+8619883....",
    "reviewCount": 781,
    "rating": 5,
    "chineseUrl": "https://www.yiwugo.com/product/detail/955081249.html",
    "detailScraped": true,
    "sourceUrl": "https://en.yiwugo.com/search/s.html?queryKey=hair+clip",
    "scrapedAt": "2026-10-29T09:35:24.416Z"
}
```

A per-search summary (pages read, rows filtered out, stop reason) is saved as `RUN_SUMMARY` in the key-value store.

### Pricing

**$0.80 per 1,000 results** (pay per result), with **product pages included**: price tiers, booth number and shop contacts cost nothing extra. Filtered rows, duplicates and failed requests are never charged, and there is no start fee. Apify's platform usage is included in that price.

| Products | Cost |
|---|---|
| 20 (the prefilled input) | $0.016 |
| 100 | $0.08 |
| 1,000 | $0.80 |
| 10,000 | $8.00 |

Apify's free plan ($5 of monthly credit) covers about 6,250 products a month.

Other Yiwugo actors on the Store (free-plan prices, October 2026): piotrv1001 listings $1.00 per 1,000 plus $5.00 per 1,000 for the item detail (supplier contacts, booth) plus $0.00005 per run, so a full row costs about 7x more there; noahadler $2.00 + $0.00005 per run; chris-wang $4.00 + $0.01 per run; guzik_andre $1.00; getascraper booth monitor $0.88 + $0.00005 per run; monpham93 $10.00 + $0.0001 per run.

### Integrations

Run it on an Apify schedule, through the Apify REST API, the JavaScript / Python clients, Make, Zapier, n8n, Google Sheets, or from AI agents via the Apify MCP server. Join runs on `productId` to track price and stock changes, or on `shopId` to build a supplier CRM.

### FAQ

**Are prices in US dollars?**
No. Yiwugo quotes EXW prices in Chinese yuan (CNY), and the actor keeps them in CNY (`currency: "CNY"`). Divide by about 7.1 for USD.

**Why do some products have no price tiers?**
Some shops sell at one price, price by specification, or mark the price "to be negotiated" (`priceNegotiable: true`); then `priceTiers` is empty and `priceMin` / `priceMax` hold the indicative range.

**Why does the search return fewer products than the site shows?**
By default the paid "\[Ad]" placements are skipped, along with duplicates. Turn **Skip paid results** off to keep them (flagged `isAd`).

**Is it legal to scrape Yiwugo?**
It collects only public product and shop data shown to every visitor, from pages Yiwugo's robots.txt allows, with no login. Contact-person names are not collected; the shop contacts are the business contacts each market booth publishes. You are responsible for using the data in line with Yiwugo's terms and laws such as GDPR / PIPL. This is not legal advice.

**Which proxy should I use?**
The default Apify Proxy (datacenter) works. Yiwugo answers bursts from one IP with a robot check; the actor detects it and retries on a new proxy session (6 retries by default).

**Does Yiwugo have an official API?**
Not one a buyer can sign up for: Yiwugo does not publish a self-serve product search API. This actor works as one. Call it from the Apify API, the Python / JavaScript clients, Make, Zapier, n8n or the Apify MCP server and get the same rows as JSON.

**How much does a typical job cost?**
A 200-shop supplier lead list (one row per shop) costs $0.16. A weekly check of 5 keywords x 100 products is about 2,150 rows a month, about $1.75. A full category with 0 = everything (up to 6,000 products per keyword) is at most $4.80.

Need a custom scraper or a ready dataset? Hire me on Fiverr: https://www.fiverr.com/rel8ble

# Actor input Schema

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

Provide at least one. English product keywords, e.g. "hair clip", "phone case", "christmas decorations", or en.yiwugo.com URLs: a search (https://en.yiwugo.com/search/s.html?queryKey=hair+clip), a market list (https://en.yiwugo.com/product/list.html?subMarket=10011) or one product (https://en.yiwugo.com/product/detail/955081249.html). Default \["hair clip"] (demo).

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

Optional. Products saved per keyword / URL, integer >= 0. Default 50; 0 = everything Yiwugo returns (60 per page, up to 100 pages). You pay per row, so start with 20.

## `scrapeDetails` (type: `boolean`):

Default true. Reads each product page and adds quantity price tiers, stock, item number, weight, attributes, variants, all images, market / floor / section / booth number and the shop's published mobile, e-mail, WeChat and WhatsApp. Turn off for the fastest listing-only export (name, price range, MOQ, shop, market).

## `skipAds` (type: `boolean`):

Default true. Yiwugo puts a few paid placements at the top of every search that often do not match the keyword. false = keep them (flagged isAd).

## `uniqueSuppliers` (type: `boolean`):

Optional. true = keep only the first product of each shop (a supplier lead list). Default false = one row per product.

## `onlyWithPrice` (type: `boolean`):

Optional. Skip products without a listed price. Default false.

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

Optional. Skip products whose minimum order quantity is above this number, e.g. 100 for small-batch buying. Omit for no limit.

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

Optional. Skip products whose lowest unit price is above this, in Chinese yuan (1 USD is about 7.1 CNY). Omit for no limit.

## `minYearsOnYiwugo` (type: `integer`):

Optional. Keep only shops at least this many years on Yiwugo (an established-booth filter). Default 0.

## `onlyWithPhone` (type: `boolean`):

Optional. Keep only products whose shop publishes a mobile, landline or WhatsApp number (reads product pages). Default false.

## `onlyWithEmail` (type: `boolean`):

Optional. Keep only products whose shop publishes an e-mail (reads product pages). Default false.

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

Optional, advanced. Parallel requests, 1-20. Default 6.

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

Optional, advanced. Retries per failed or blocked request (each on a new proxy session), 0-20. Default 6.

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

Optional, advanced. Default Apify Proxy (datacenter), which works for Yiwugo. Switch to {"useApifyProxy": true, "apifyProxyGroups": \["RESIDENTIAL"]} only if the log shows repeated blocks.

## Actor input object example

```json
{
  "searchTerms": [
    "hair clip"
  ],
  "maxResultsPerSearch": 20,
  "scrapeDetails": true,
  "skipAds": true,
  "uniqueSuppliers": false,
  "onlyWithPrice": false,
  "minYearsOnYiwugo": 0,
  "onlyWithPhone": false,
  "onlyWithEmail": false,
  "maxConcurrency": 6,
  "maxRequestRetries": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per product: price, price tiers, MOQ, specs and the Yiwu market shop with booth number and published contacts.

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

Per-search counts, pages read 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": [
        "hair clip"
    ],
    "maxResultsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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