# Chinese B2B Supplier & Product Finder by Province (`dataspryva/chinese-b2b-supplier-and-product-finder`) Actor

Search Made-in-China.com products and suppliers by keyword or category, with province, business type, certification, price, MOQ and trust-badge filters for sourcing and lead generation.

- **URL**: https://apify.com/dataspryva/chinese-b2b-supplier-and-product-finder.md
- **Developed by:** [Dataspryva](https://apify.com/dataspryva) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Made-in-China B2B Sourcing & Supplier Finder

Made-in-China.com is where Chinese factories and trading companies publish products, prices, certifications, audit badges, and company profiles. This actor turns those public pages into structured sourcing data: six modes, multi-keyword search, category browsing, product and supplier URLs, deep detail enrichment, and a computed lead score. No account, cookies, or proxy setup is needed.

### What this actor does

- **Six modes:** `searchProducts`, `searchSuppliers`, `categoryBrowse`, `productDetails`, `supplierDetails`, `supplierProducts`
- **Multi-input runs:** several keywords, categories, product URLs/IDs, or supplier storefronts per run
- **Faceted product search:** Chinese province, business type, R\&D/production capability, certification, price range, minimum order quantity, sample availability, and supplier trust badges
- **Detail enrichment:** description, specifications, price tiers, images, video, categories, FAQ, HS code, origin, packaging, and supplier firmographics
- **Supplier enrichment:** membership tier, years on platform, audit agency/report, plant area, employees, capital, trade terms, production capacity, markets, product groups, and contact-page details
- **Numeric commerce fields:** `priceMin`, `priceMax`, `priceCurrency`, `priceTiers`, `minOrderQuantity`, and `minOrderUnit`, beside the legacy text fields
- **Lead score:** 0–100, computed from public trust, experience, trade, contact, and facility signals
- **Pagination and dedupe:** walks listing pages until `maxItems` or source exhaustion, dedupes canonical URLs, and persists crawl state
- **Omit-empty output:** a field appears only when the source published it; no nulls, blanks, or sentinel strings

### Modes

| Mode | What it does | Main inputs |
|---|---|---|
| `searchProducts` | Product keyword search with all filters | `searchQueries`, filters |
| `searchSuppliers` | Supplier/company keyword search | `searchQueries`, filters |
| `categoryBrowse` | Walk a Made-in-China catalog path | `categoryPaths` |
| `productDetails` | Scrape specific product URLs or IDs | `productUrls` |
| `supplierDetails` | Scrape supplier storefronts and profiles | `supplierUrls` |
| `supplierProducts` | Walk a supplier's own product catalog | `supplierUrls` |

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `searchProducts` | One of the six modes above. |
| `searchQueries` | string list | `["industrial pump"]` | Product or supplier keywords (`searchProducts`, `searchSuppliers`). |
| `categoryPaths` | string list | – | Catalog paths or full catalog URLs (`categoryBrowse`), e.g. `Agriculture-Food-Catalog/Beverage`. |
| `productUrls` | string list | – | Product URLs or bare product IDs (`productDetails`). |
| `supplierUrls` | string list | – | Storefront URLs or subdomains such as `allslorm` (`supplierDetails`, `supplierProducts`). |
| `province` | select | – | Chinese province/municipality/region filter. |
| `businessType` | select | – | Manufacturer/Factory, Trading Company, Group Corporation, or Other. |
| `goldSupplierOnly` | boolean | `false` | Gold/Diamond membership or higher. |
| `auditedSupplierOnly` | boolean | `false` | Supplier has an independent audit report. |
| `leadingFactoryOnly` | boolean | `false` | Supplier holds the Industry-leading Audited Factory badge. |
| `securedTradingOnly` | boolean | `false` | Listing offers Secured Trading. |
| `rdCapacity` | select | – | OEM, ODM, Own Brand, or Others. |
| `certification` | select | – | CE, ISO, RoHS, CCC, or ISO9001. |
| `maxMinOrder` | integer | – | Only products with an MOQ at or below this number. |
| `priceMin` | number | – | Lower USD price bound; set together with `priceMax`. |
| `priceMax` | number | – | Upper USD price bound; set together with `priceMin`. |
| `sampleAvailableOnly` | boolean | `false` | Supplier offers a paid sample order. |
| `maxItems` | integer | `50` | Maximum records across all inputs (1–10,000). |
| `maxPagesPerQuery` | integer | `20` | Listing pages per keyword/category/supplier (1–400). |
| `includeProductDetails` | boolean | `true` | Fetch product detail pages for deeper fields. |
| `includeSupplierProfile` | boolean | `true` | Fetch supplier storefront/about pages for firmographics. |
| `includeContactDetails` | boolean | `false` | Fetch the public supplier contact page where available. |

Legacy saved tasks that still send `keyword` or `categoryPath` keep working: the code maps them to `searchQueries` and `categoryPaths` when the new fields are absent.

#### Example: search products by keyword

```json
{
  "mode": "searchProducts",
  "searchQueries": ["industrial pump", "submersible pump"],
  "province": "Guangdong",
  "auditedSupplierOnly": true,
  "maxItems": 50,
  "maxPagesPerQuery": 2,
  "includeProductDetails": true
}
```

#### Example: search suppliers

```json
{
  "mode": "searchSuppliers",
  "searchQueries": ["office chair"],
  "includeSupplierProfile": true,
  "includeContactDetails": true,
  "maxItems": 20
}
```

#### Example: scrape product or supplier URLs

```json
{
  "mode": "productDetails",
  "productUrls": [
    "https://allslorm.en.made-in-china.com/product/bYDpSVyclXkh/China-Qmf-G-Spiral-Centrifugal-Pump-for-Industrial-Drainage.html"
  ],
  "maxItems": 10
}
```

```json
{
  "mode": "supplierProducts",
  "supplierUrls": ["allslorm"],
  "includeProductDetails": true,
  "maxItems": 30
}
```

### Product output

Identity and commerce:

`productId`, `title`, `productUrl`, `productSku`, `productMpn`, `modelNumber`, `price` (legacy text), `priceMin`, `priceMax`, `priceCurrency`, `priceValidUntil`, `priceTiers`, `minOrder` (legacy text), `minOrderQuantity`, `minOrderUnit`, `samplePrice`, `samplePriceCurrency`, `availability`, `description`.

Content:

`images`, `imageUrl`, `hasVideo`, `videoUrl`, `videoThumbnail`, `specifications`, `categories`, `faq`, `hsCode`, `origin`, `trademark`, `transportPackage`, `productionCapacity`, `customization`.

Supplier and provenance:

`supplierId`, `supplier`, `supplierUrl`, `supplierLogo`, `supplierDescription`, `supplierProvince`, `supplierCity`, `supplierCountry`, `supplierAddress`, `supplierLevel`, `goldSupplier`, `membership`, `memberSince`, `yearsOnPlatform`, `auditedSupplier`, `leadingFactory`, `securedTrading`, `auditAgency`, `auditReportId`, `foundingDate`, `employees`, `plantArea`, `registeredCapital`, `supplierRating`, `reviewHighlight`, `businessType`, `certifications`, `mainMarkets`, `paymentTerms`, `incoterms`, `leadTime`, `nearestPort`, `exportYear`, `productionLines`, `productionMachines`, `qaQcInspectors`, `rdEngineers`, `oemService`, `odmService`, `ownBrand`, `customizationOptions`, `repeatBuyersRate`, `supplyChainPartners`, `productGroups`, `leadScore`, `searchKeyword`, `page`, `position`, `isSponsored`, `recordType: "product"`, `scrapedAt`.

Price tiers are objects with `quantityRange`, `quantityMin`, `quantityMax`, `unit`, `price`, and `currency`. `priceMin` is the lowest tier price (usually the highest quantity), not necessarily the headline price.

### Supplier output

Identity and legacy fields:

`supplierId`, `supplier`, `supplierProvince`, `businessType`, `products` (legacy text), `mainProducts`, `certifications` (legacy text), `managementCertifications`, `productCertifications`, `rdCapacity`, `goldSupplier`, `auditedSupplier`, `supplierUrl`.

Firmographics and trade:

`supplierDescription`, `introduction`, `foundingDate`, `employees`, `plantArea`, `registeredCapital`, `supplierAddress`, `supplierCity`, `supplierCountry`, `postalCode`, `membership`, `memberSince`, `yearsOnPlatform`, `supplierRating`, `reviewCount`, `mainMarkets`, `paymentTerms`, `incoterms`, `leadTime`, `nearestPort`, `exportYear`, `productionLines`, `productionMachines`, `qaQcInspectors`, `rdEngineers`, `oemService`, `odmService`, `ownBrand`, `customizationOptions`, `repeatBuyersRate`, `supplyChainPartners`, `productGroups`, `productCount`, `sampleProducts`.

Audit, contact, and provenance:

`auditAgency`, `auditReportId`, `leadingFactory`, `securedTrading`, `contactPerson`, `contactPosition`, `contactPageUrl`, `aboutUrl`, `showroomUrl`, `logo`, `coverImage`, `companyVideoUrl`, `verifiedFields`, `leadScore`, `searchKeyword`, `page`, `position`, `isSponsored`, `recordType: "supplier"`, `scrapedAt`.

The `leadScore` is computed by this actor from public signals: audit status, membership tier, years on platform, buyer rating, certifications, main markets, export/trade terms, named contact, and facility data. It is not a Made-in-China score.

### Reliability and limits

- **Cookieless and keyless:** public pages only; no login, cookies, or API key.
- **Datacenter fallback:** if the desktop site challenges a datacenter IP, listing/search/category pages switch to the mobile site (`m.made-in-china.com`), while product and supplier pages stay on their supplier subdomains. Mobile detail templates publish fewer fields, so key attributes are also read from visible text and Open Graph metadata.
- **Filters under fallback:** province, membership/audit badges, price, and MOQ filters are applied to records client-side. Site-facet-only filters (business type, R\&D capacity, certification, sample availability) may not narrow results when the desktop host is challenged and the mobile fallback is in use.
- **Conditional fields:** Made-in-China suppliers publish different amounts of data. A field is omitted when the source does not publish it, so two suppliers can have different key sets.
- **Contact page:** the public contact page may show a contact person, position, postal code, and showroom. Phone, email, and fax are login-gated and are intentionally not scraped.
- **Price details:** the site's JSON-LD `offers.price` is usually the lowest tier, so this actor derives prices from the visible tier ladder. A product with no published numeric price has no `priceMin`/`priceMax`.
- **Pagination:** product search is deep; `maxItems` and `maxPagesPerQuery` are the cost controls. Listings can re-inject sponsored cards, so records are deduped by canonical URL.
- **No wall-clock cutoffs:** a run stops on `maxItems`, the page cap, source exhaustion, or a repeated page with no new URLs.

### FAQ

**Do I need a Made-in-China account, cookie, or proxy?**
No. The actor uses the public site and works without any user credentials or proxy configuration.

**Can I search several keywords in one run?**
Yes. Put them in `searchQueries`; `maxItems` applies across the whole run. The same multi-input pattern works for categories, product URLs, and supplier URLs.

**How do I scrape a product if I only have its ID?**
Use `productDetails` and put the bare ID in `productUrls`. The actor tries to resolve it through Made-in-China's own search; because product pages live on supplier subdomains, a full product URL is the reliable form and is recommended for scheduled runs.

**Why are some fields missing on a record?**
Made-in-China only publishes certain fields for certain suppliers and templates. Empty fields are omitted rather than filled with `N/A`, `null`, or guessed values.

**What does `priceMin` mean if a product has volume tiers?**
`priceMin` is the lowest price in the visible tier ladder (usually the largest quantity), and `priceMax` is the highest. Use `priceTiers` for the full quantity/price ladder.

**Why is `supplierRating` present on some products but not others?**
The buyer-review widget only appears for suppliers who have received reviews. The underlying source omits it for newer or unreviewed suppliers.

**Can I get supplier phone numbers or email addresses?**
No. Those are login-gated on Made-in-China. The actor returns the public contact page URL, named contact when shown, position, postal code, and showroom instead.

**What is included in `leadScore`?**
It is a sourcing helper computed from audit status, membership, years on platform, rating, certifications, markets, trade terms, contact availability, and facility data. Documented public signals only, never private account data.

**Does browsing a category return the same detail as keyword search?**
The card fields are the same; enable `includeProductDetails` or `includeSupplierProfile` to enrich category rows with detail-page and profile data.

**Is this affiliated with Made-in-China.com?**
No. It is an independent third-party actor that reads publicly available Made-in-China.com pages.

# Actor input Schema

## `mode` (type: `string`):

What to scrape from Made-in-China.com.

## `searchQueries` (type: `array`):

One or more product or supplier keywords. Used by 'Search products' and 'Find suppliers' modes (e.g. 'industrial pump', 'LED lights').

## `categoryPaths` (type: `array`):

Made-in-China.com catalog paths (or full catalog URLs) to browse in 'Browse a product category' mode, e.g. 'Agriculture-Food-Catalog/Beverage'.

## `productUrls` (type: `array`):

Product page URLs or product IDs to scrape in 'Scrape these product URLs/IDs' mode. A bare ID is resolved through the site's own search.

## `supplierUrls` (type: `array`):

Supplier storefront URLs or subdomains, e.g. 'allslorm.en.made-in-china.com' or just 'allslorm'. Used by 'Scrape these supplier storefronts' and 'Scrape a supplier's catalog'.

## `province` (type: `string`):

Only return listings whose supplier is located in this Chinese province, municipality, or region. Leave blank for no filter.

## `businessType` (type: `string`):

Only return suppliers of this business type. Leave blank for no filter. Used by product and supplier search modes.

## `goldSupplierOnly` (type: `boolean`):

Only return listings from suppliers with a Gold Member, Diamond Member, or higher paid membership badge.

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

Only return listings whose supplier carries an 'Audited Supplier' badge from an independent inspection agency.

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

Only return listings whose supplier holds an 'Industry-leading Audited Factory' badge.

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

Only return listings that offer Secured Trading (payment protection and after-sales support through Made-in-China.com).

## `rdCapacity` (type: `string`):

Only return products from suppliers with this R\&D or production capability. Leave blank for no filter.

## `certification` (type: `string`):

Only return products from suppliers who advertise this quality or safety certification. Leave blank for no filter.

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

Only return products whose Minimum Order Quantity is at or below this number. Leave blank for no filter.

## `priceMin` (type: `number`):

Only return products whose listed price is at or above this USD value. Must be used together with the maximum; a lone bound is ignored.

## `priceMax` (type: `number`):

Only return products whose listed price is at or below this USD value. Must be used together with the minimum; a lone bound is ignored.

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

Only return products whose supplier offers a paid sample order ('Buy Sample').

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

Maximum number of records to return across all keywords, categories, or URLs.

## `maxPagesPerQuery` (type: `integer`):

Maximum listing pages to walk for each keyword, category, or supplier catalog. Each page holds about 24-30 records.

## `includeProductDetails` (type: `boolean`):

Open each product page to add description, specifications, price tiers, images, video, categories, FAQ, and deeper supplier data. Adds one request per product.

## `includeSupplierProfile` (type: `boolean`):

Open supplier storefront and company-profile pages to add firmographics, trade terms, audit report, product groups, and verification data. Adds requests per supplier.

## `includeContactDetails` (type: `boolean`):

Open the public contact page in supplier modes to add contact person, position, postal code, and showroom URL. Phone and email are not public.

## Actor input object example

```json
{
  "mode": "searchProducts",
  "searchQueries": [
    "industrial pump"
  ],
  "categoryPaths": [],
  "productUrls": [],
  "supplierUrls": [],
  "province": "",
  "businessType": "",
  "goldSupplierOnly": false,
  "auditedSupplierOnly": false,
  "leadingFactoryOnly": false,
  "securedTradingOnly": false,
  "rdCapacity": "",
  "certification": "",
  "sampleAvailableOnly": false,
  "maxItems": 3,
  "maxPagesPerQuery": 1,
  "includeProductDetails": false,
  "includeSupplierProfile": false,
  "includeContactDetails": false
}
```

# Actor output Schema

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

Dataset containing product records (searchProducts, categoryBrowse, productDetails, supplierProducts) and supplier records (searchSuppliers, supplierDetails). Product rows include legacy title/price/minOrder plus numeric priceMin/priceMax, priceTiers, minOrderQuantity, specifications, images, video, categories, FAQ, supplier profile, audit data, and leadScore. Supplier rows include legacy supplier/products/certifications plus firmographics, trade terms, membership, audit report, contact page fields, product groups, verified fields, and leadScore.

# 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 = {
    "mode": "searchProducts",
    "searchQueries": [
        "industrial pump"
    ],
    "categoryPaths": [],
    "productUrls": [],
    "supplierUrls": [],
    "province": "",
    "businessType": "",
    "goldSupplierOnly": false,
    "auditedSupplierOnly": false,
    "leadingFactoryOnly": false,
    "securedTradingOnly": false,
    "rdCapacity": "",
    "certification": "",
    "sampleAvailableOnly": false,
    "maxItems": 3,
    "maxPagesPerQuery": 1,
    "includeProductDetails": false,
    "includeSupplierProfile": false,
    "includeContactDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspryva/chinese-b2b-supplier-and-product-finder").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 = {
    "mode": "searchProducts",
    "searchQueries": ["industrial pump"],
    "categoryPaths": [],
    "productUrls": [],
    "supplierUrls": [],
    "province": "",
    "businessType": "",
    "goldSupplierOnly": False,
    "auditedSupplierOnly": False,
    "leadingFactoryOnly": False,
    "securedTradingOnly": False,
    "rdCapacity": "",
    "certification": "",
    "sampleAvailableOnly": False,
    "maxItems": 3,
    "maxPagesPerQuery": 1,
    "includeProductDetails": False,
    "includeSupplierProfile": False,
    "includeContactDetails": False,
}

# Run the Actor and wait for it to finish
run = client.actor("dataspryva/chinese-b2b-supplier-and-product-finder").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 '{
  "mode": "searchProducts",
  "searchQueries": [
    "industrial pump"
  ],
  "categoryPaths": [],
  "productUrls": [],
  "supplierUrls": [],
  "province": "",
  "businessType": "",
  "goldSupplierOnly": false,
  "auditedSupplierOnly": false,
  "leadingFactoryOnly": false,
  "securedTradingOnly": false,
  "rdCapacity": "",
  "certification": "",
  "sampleAvailableOnly": false,
  "maxItems": 3,
  "maxPagesPerQuery": 1,
  "includeProductDetails": false,
  "includeSupplierProfile": false,
  "includeContactDetails": false
}' |
apify call dataspryva/chinese-b2b-supplier-and-product-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dataspryva/chinese-b2b-supplier-and-product-finder"
        }
    }
}
```

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/qhABZwuIp7K1Y60yB/builds/zv28gTyK3f45a1cP3/openapi.json
