# Made-in-China Product Search Scraper (`datacach/made-in-china-product-search`) Actor

Search Made-in-China.com by keyword and export product listings with prices, minimum order quantities, specifications and supplier details.

- **URL**: https://apify.com/datacach/made-in-china-product-search.md
- **Developed by:** [DataCach](https://apify.com/datacach) (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 $0.50 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/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

## Made-in-China Product Search Scraper

Search **Made-in-China.com** by keyword and export every matching product listing — **FOB prices, minimum order quantities, specifications and verified supplier details** — as JSON, CSV or Excel.

### What is the Made-in-China Product Search Scraper?

This Actor **scrapes product search results from Made-in-China.com**, one of the largest B2B wholesale marketplaces connecting global buyers with Chinese manufacturers. You type the keywords a buyer would type — `led light`, `solar panel`, `stainless steel valve` — and it returns a clean, structured dataset of matching products.

Every record carries the **product name, FOB price range, minimum order quantity (MOQ), full specification list, product images and certifications**, plus the **supplier's name, location, business type, audit status and capability rating**. No CSS selectors, no code, no login. Just keywords.

### What can this Made-in-China scraper do?

- 🔍 **Search multiple keywords in one run** — each term is crawled independently and merged into a single dataset, with duplicates removed automatically.
- 💰 **Filter by FOB price range and MOQ** — find suppliers who will sell within your budget and at your order size.
- 🏭 **Filter by supplier type** — restrict results to Manufacturers/Factories to buy closer to the source and skip trading companies.
- ✅ **Filter by verification** — audited suppliers, Secured Trading Service, leading factories, or suppliers offering samples.
- 🛠️ **Filter by OEM/ODM capability** — find factories that will manufacture to your specification or rebrand an existing design.
- 📦 **Export to JSON, CSV, Excel, XML or HTML** — download directly or pull via the Apify API.
- 🔁 **Resumable and duplicate-safe** — if a run is interrupted or migrated, it picks up where it stopped and never re-collects a product it already returned.
- 🏷️ **Sponsored listings flagged, not hidden** — promoted products are marked with `isSponsored` so you can keep or drop them.

**Built on the Apify platform**, which means you also get:

- ⏰ **Scheduling** — re-run the search daily or weekly to track new products and price movements.
- 🔌 **API access** — trigger runs and fetch results programmatically from Python, JavaScript, or any HTTP client.
- 🔗 **Integrations** — pipe results into Google Sheets, Airtable, Slack, Zapier, Make, or a webhook.
- 🌐 **Proxy rotation** — Apify Proxy is enabled by default to keep large runs reliable.
- 📈 **Monitoring and alerts** — get notified if a run fails or returns less than expected.

### What data does the Made-in-China scraper extract?

| Field | Description |
|---|---|
| `title` | Full product name |
| `url` | Direct link to the product page |
| `productId` | Made-in-China's stable product identifier |
| `price.min` / `price.max` | FOB price range in the listed currency |
| `price.incoterm` | Trade terms the price refers to, e.g. `FOB Price` |
| `minOrder.quantity` / `minOrder.unit` | Minimum order quantity and its unit (Pieces, Sets, Meters…) |
| `attributes` | Product specifications as name/value pairs |
| `attributesMap` | The same specifications as a flat object, convenient for spreadsheets |
| `imageUrl` / `imageUrls` | Primary product image and every other image on the listing |
| `certifications` | Product certifications shown on the listing, e.g. `CE`, `RoHS` |
| `isSampleAvailable` | Whether the supplier will send a sample |
| `isSecuredTrading` | Whether the listing is covered by payment protection |
| `inquiryUrl` | Direct link to contact the supplier about this product |
| `supplier.name` | Supplier company name |
| `supplier.url` | Supplier's storefront |
| `supplier.location` / `province` / `country` | Where the supplier is based |
| `supplier.businessType` | Manufacturer/Factory, Trading Company, etc. |
| `supplier.isAudited` | Whether an independent third party has inspected the supplier |
| `supplier.starRating` | Supplier Capability Index, 0–5 |
| `supplier.reviewRating` | Buyer review score, where published |
| `supplier.memberLevel` | Membership tier, e.g. `Diamond Member` |
| `supplier.managementCertifications` | e.g. `ISO9001:2015` |
| `searchTerm` / `page` / `position` | Which keyword and result position produced the record |
| `isSponsored` | Whether the supplier paid to promote this listing |
| `extraction_datetime` / `extraction_date` | When the record was collected (UTC) |

### How do I scrape Made-in-China.com product data?

1. Click **Try for free** to open the Actor.
2. Type your keywords into **Search terms** — one per line, for example `led light` and `solar panel`.
3. Set **Maximum products** to how many results you want in total.
4. *(Optional)* Open **🎯 Filters** to narrow by price, MOQ, supplier type or verification status.
5. Click **Start** and watch the log.
6. When the run finishes, open the **Output** tab and download your data as **JSON, CSV, or Excel** — or fetch it from the API.

### Input

The only required input is **Search terms**. Everything else has a sensible default.

**Search**

- **Search terms** — the keywords to look for. Each is searched separately.

**Limits**

- **Maximum products** — total distinct products to collect across all keywords.
- **Start from page** — begin the crawl at a later results page.
- **Start index** — skip the first N results of each keyword before saving anything. Note that it does *not* make the run faster, and see the FAQ below for why **Exclude already-collected products** is the more reliable option on this site.
- **Exclude already-collected products** — paste the `url` or `productId` column from a previous export; those products are never saved again.
- **Maximum pages per search term** — how deep to search each keyword. **This is what ends the run** (see the FAQ below).
- **Products per page request** — leave at 50; larger pages mean fewer requests and a faster run.

**Filters** — all applied by Made-in-China.com itself, so filtering costs nothing extra:

- Minimum / maximum **FOB price**
- Maximum **minimum order quantity**
- **Supplier business type** — Manufacturer/Factory, Trading Company, Group Corporation, Other
- **Customisation capability** — OEM, ODM, Own Brand
- **Audited suppliers only**, **Secured Trading only**, **Leading factories only**, **Samples available only**
- **Product attribute keyword** — an extra term matched against specifications, e.g. `waterproof`
- **Include sponsored listings** — on by default

**Proxy & performance** — proxy configuration, concurrency, request delay, retries and timeout. The defaults are tuned to be fast without triggering the site's protections.

### Output example

Each product is one dataset record:

```json
{
  "productId": "uSynbfOhrHYF",
  "url": "https://nbweixin.en.made-in-china.com/product/uSynbfOhrHYF/China-Christmas-Decorative-Wooden-Pendant-LED-Garland-String-Light.html",
  "title": "Christmas Decorative Wooden Pendant LED Garland String Light",
  "isSponsored": false,
  "price": {
    "currency": "US$",
    "min": 1.0,
    "max": 5.0,
    "incoterm": "FOB Price",
    "text": "US$1.00-5.00"
  },
  "minOrder": { "quantity": 1000, "unit": "Pieces", "text": "1,000 Pieces" },
  "attributes": [
    { "name": "Type", "value": "Christmas Decorations" },
    { "name": "Power Source", "value": "Battery" },
    { "name": "Material", "value": "MDF" }
  ],
  "attributesMap": {
    "Type": "Christmas Decorations",
    "Power Source": "Battery",
    "Material": "MDF"
  },
  "imageUrl": "https://image.made-in-china.com/43f34j00OfqblaocgigP/Christmas-Decorative-Wooden-Pendant-LED-Garland-String-Light.webp",
  "imageUrls": ["https://image.made-in-china.com/43f34j00OfqblaocgigP/..."],
  "certifications": [],
  "isSecuredTrading": false,
  "isSampleAvailable": false,
  "inquiryUrl": "https://www.made-in-china.com/sendInquiry/prod_uSynbfOhrHYF_ReqmoIguJfHW.html",
  "supplier": {
    "id": "ReqmoIguJfHW",
    "name": "Ningbo Weixin Houseware Co., Ltd.",
    "url": "https://nbweixin.en.made-in-china.com",
    "location": "Zhejiang, China",
    "province": "Zhejiang",
    "country": "China",
    "memberLevel": "Diamond Member",
    "isAudited": true,
    "badges": ["Audited Supplier"],
    "starRating": 5,
    "reviewRating": 5.0
  },
  "searchTerm": "led light",
  "page": 1,
  "position": 1,
  "extraction_datetime": "2026-08-06T14:30:00.123456+00:00",
  "extraction_date": "08-06-2026"
}
```

You can download the dataset in various formats such as **JSON, CSV, Excel, XML or HTML**.

### Use cases

- 🛒 **Product sourcing** — build a shortlist of manufacturers for a product you want to import, filtered to audited factories within your budget.
- 📊 **Price benchmarking** — compare FOB price ranges across dozens of suppliers before negotiating.
- 📉 **Price monitoring** — schedule the Actor weekly and track how wholesale prices move over time.
- 🔎 **Supplier discovery and due diligence** — find OEM-capable factories in a specific province and check their audit status and capability rating.
- 📚 **Market and catalogue research** — map which products dominate a category and what specifications are standard.
- 🏷️ **Private label sourcing** — filter to ODM suppliers offering samples to find partners for your own brand.
- 🤖 **Feeding an internal tool** — pull structured B2B product data into your own dashboard, ERP or AI agent through the Apify API.

### Other Actors you might like

| Actor | What it does |
|---|---|
| *Your other Actor* | *Add cross-links to related scrapers you publish* |

### FAQ

#### Is it legal to scrape Made-in-China.com?

This Actor collects only **publicly available product listings** — the same information any visitor sees without logging in. It does not access private data, bypass authentication, or collect personal contact details beyond the public inquiry link. Web scraping of public data is broadly lawful in the EU and US, but you are responsible for how you use the data, including compliance with Made-in-China.com's Terms of Service and any applicable copyright or database rights. If you plan to scrape at scale or republish the data, take your own legal advice.

#### Why does the run keep going and never finish on its own?

Made-in-China.com **never signals a last page of results**. Even page 1,000 of a common keyword returns a full page of increasingly loosely-related products, and a keyword that matches nothing returns fuzzy near-matches rather than an empty page. Because of that, the run is bounded by **Maximum pages per search term** and **Maximum products** rather than by the site. If you want more results, raise those limits — but expect relevance to fall off the deeper you go.

#### How do I collect only new products and skip ones I already have?

Use **Exclude already-collected products**. Paste the `url` or `productId` column from your previous export — either works — and those products are never saved again, no matter where they appear in the results. This is the reliable way to run the same search repeatedly and only pay for what's new.

There is also a **Start index**, which skips the first N results of each keyword by position. It's useful for straightforward batching (you have the first 500, so start at 500), but be aware of two things. First, it does **not** speed up the run: results are found by crawling, so the Actor still walks up to that point — it only changes which results are saved. Second, **Made-in-China.com reorders its results between requests**, so "result number 500" is not perfectly reproducible from one run to the next. If you need a guarantee of no repeats, use the exclusion list, which doesn't depend on order. The two can be combined: the start index is applied first, then the exclusion list.

#### Why did I get fewer products than I asked for?

Three common reasons: your **filters** were too narrow, **Maximum pages per search term** stopped the crawl before the target was met, or the site started returning products already collected — duplicates are removed, so they don't count toward your total. Try raising `maxPagesPerTerm`, loosening filters, or adding more keywords.

#### Can I get Made-in-China data through an API?

Yes. Every Apify Actor is available through the **Apify API**. You can start a run, pass input, and fetch the resulting dataset from Python, JavaScript, or plain HTTP. See the **API** tab on the Actor page for ready-made code snippets, and the [Apify API docs](https://docs.apify.com/api/v2).

#### Does this scraper get supplier contact details like emails and phone numbers?

No. It returns the supplier's public storefront URL and the **inquiry link** you would use to contact them through Made-in-China.com's own messaging system. It does not collect personal contact information.

#### Can I schedule this to run automatically?

Yes — use the **Schedules** tab on the Apify platform to run the search hourly, daily, weekly or on a custom cron expression, and connect an integration to have results delivered to Google Sheets, Slack, or a webhook.

#### Do I need proxies?

Apify Proxy is enabled by default and is recommended. For large or frequent runs, switching `proxyConfiguration` to **Residential** proxies further reduces the chance of being blocked.

#### Are sponsored listings included?

Yes, by default — they are genuine product listings that suppliers paid to promote, and excluding them silently would distort your results. Each record carries an `isSponsored` flag so you can filter them yourself, or set **Include sponsored listings** to off.

### Support

Found a bug, or a field that isn't being extracted correctly? Open an issue on the Actor's **Issues** tab and include the run ID — that's the fastest way to get it fixed.

Need something this Actor doesn't do — deeper product-page data, supplier-level crawling, or a different marketplace? Get in touch about a custom solution.

# Actor input Schema

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

Keywords to search for on Made-in-China.com. Each term is searched separately and the results are combined into one dataset. Use the words a buyer would type, for example <code>led light</code> or <code>solar panel</code>.

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

Total number of products to collect across all search terms. Duplicates are removed first, so you get this many <i>distinct</i> products. Free plan users are limited to 10.

## `startPage` (type: `integer`):

Skip ahead to this results page. Useful for collecting a second batch without repeating products you already have — set it past the pages a previous run covered.

## `startIndex` (type: `integer`):

Skip this many results from the <b>start of each search term</b> before saving any. Use it to continue where a previous run stopped: if you already have the first 500, set <b>500</b> to begin from result 501 instead of paying for them again. Combined with <b>Maximum products</b>, the saved range is \[startIndex, startIndex + maxResults).<br><br>⚠️ <b>Two caveats.</b> It does <b>not</b> make the run faster — results are found by crawling, so the Actor still walks up to that point; it only changes which results are <i>saved</i>. And Made-in-China.com reorders its results between requests, so index N is not perfectly reproducible — for guaranteed no-repeats use <b>Exclude already-collected products</b> instead, which does not depend on order. Ignored on the free plan.

## `excludeUrls` (type: `array`):

Products you already have — these are <b>never saved again</b>, whatever order the site returns them in. Paste either the <code>url</code> or the <code>productId</code> column from a previous export; both are recognised. Unlike <b>Start index</b> this is order-independent, which makes it the reliable way to collect only what is new. Applied after Start index. Free plan runs may list at most one entry here.

## `maxPagesPerTerm` (type: `integer`):

Safety limit on how deep each keyword is searched. <b>This is what ends the run.</b> Made-in-China.com never reports a last page — it keeps returning increasingly loosely related products indefinitely — so without this cap a run would continue until it timed out. Raise it only if you want results well beyond the closest matches.

## `resultsPerPage` (type: `string`):

How many products to request per page. Larger pages mean fewer requests, so the run is faster and less likely to be rate limited. Leave at 50 unless you are debugging.

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

Only return products whose FOB price starts at or above this amount. Leave empty for no lower bound.

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

Only return products whose FOB price reaches at most this amount. Leave empty for no upper bound.

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

Only return products a supplier will sell in quantities at or below this number. Set it low to find suppliers willing to take small orders.

## `businessTypes` (type: `array`):

Restrict results to these kinds of supplier. Choose <b>Manufacturer/Factory</b> to skip resellers and buy closer to the source.

## `rdCapabilities` (type: `array`):

Restrict results to suppliers offering these production arrangements — for example <b>OEM</b> to make a product to your own specification, or <b>ODM</b> to rebrand an existing design.

## `auditedSupplierOnly` (type: `boolean`):

Only return products from suppliers inspected by an independent third party.

## `securedTradingOnly` (type: `boolean`):

Only return products covered by Made-in-China.com's payment protection scheme.

## `leadingFactoryOnly` (type: `boolean`):

Only return products from suppliers Made-in-China.com has assessed as leading manufacturers.

## `sampleAvailableOnly` (type: `boolean`):

Only return products the supplier will send as a sample before a full order.

## `attributeFilter` (type: `string`):

Extra keyword matched against product specifications, for example <code>waterproof</code>. Plain English only — other alphabets are ignored by the site.

## `includeSponsored` (type: `boolean`):

Sponsored products are genuine listings that suppliers paid to promote. They are included by default and flagged with <code>isSponsored</code> so you can filter them later. Turn this off to exclude them entirely.

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

Proxy used for requests. Apify Proxy is recommended. For large runs, switching to <b>Residential</b> proxies reduces the chance of being blocked.

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

How many pages to request at once. The default of 5 is the highest rate verified to run cleanly against this site. Raising it speeds up multi-keyword runs but increases the risk of being blocked.

## `minDelayMs` (type: `integer`):

Pause between requests, randomised slightly around this value to avoid a machine-like pattern.

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

How many times to retry a page that fails before giving up on it.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a page before treating it as failed. Search pages are large, so allow a generous timeout.

## Actor input object example

```json
{
  "searchTerms": [
    "led light"
  ],
  "maxResults": 50,
  "startPage": 1,
  "startIndex": 0,
  "excludeUrls": [],
  "maxPagesPerTerm": 20,
  "resultsPerPage": "50",
  "businessTypes": [],
  "rdCapabilities": [],
  "auditedSupplierOnly": false,
  "securedTradingOnly": false,
  "leadingFactoryOnly": false,
  "sampleAvailableOnly": false,
  "includeSponsored": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 5,
  "minDelayMs": 250,
  "maxRequestRetries": 3,
  "requestTimeoutSecs": 45
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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"
    ],
    "excludeUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("datacach/made-in-china-product-search").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"],
    "excludeUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("datacach/made-in-china-product-search").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"
  ],
  "excludeUrls": []
}' |
apify call datacach/made-in-china-product-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datacach/made-in-china-product-search"
        }
    }
}

```

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/oeiQVQBDav2EmWShV/builds/2zgJx4u2MqZ2bygjx/openapi.json
