# Made-in-China Scraper: Products, Price Tiers & MOQ (`cleanpull/made-in-china-scraper`) Actor

Scrape Made-in-China.com wholesale offers by search term, category or offer URL: every quantity price tier, MOQ, price range, supplier type, Gold or Diamond membership, audit badge, years and rating. $1 per 1,000 offers with price tiers, trust filters, offer details and new-offers-only monitoring.

- **URL**: https://apify.com/cleanpull/made-in-china-scraper.md
- **Developed by:** [CleanPull](https://apify.com/cleanpull) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 offers

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/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 Scraper reads [Made-in-China.com](https://www.made-in-china.com) wholesale offers by search term, category page or offer URL and returns one row per offer with **every quantity price tier** (100–499 pieces at $0.54, 500–5,999 at $0.50, 6,000+ at $0.46), the MOQ, the price range and the supplier: business type, Gold or Diamond membership, audit badge, years on the site, province and rating. Use it as a Made in China scraper or made-in-china.com API for China wholesale suppliers, from **$1 per 1,000 offers** with the price tiers included.

### What you can do with it

- **"Find silicone baking mat suppliers with an MOQ under 500 and a unit price under $1."** Search by product, set `maxMoq` and `maxPrice`, and get each offer's quantity breaks to see what you pay at your order size.
- **"Only audited Diamond members that are factories."** Combine `auditedOnly`, `memberLevel: "diamond"` and `supplierType: "manufacturer"` to shortlist suppliers before you send an inquiry.
- **"Give me lead time, HS code, packaging and payment terms for these offers."** Turn on `includeOfferDetails` and paste offer URLs or run a search.
- **"Tell me when new suppliers list LED strip lights, or when a supplier changes its price tiers."** Schedule a run with `onlyNew`: you get only offers not seen before (`changeType: "added"`) and offers whose tiers, price range or MOQ changed (`changeType: "updated"`, with the earlier values).
- **"Pull a whole category into a spreadsheet."** Give a category page as a start URL and up to 600 offers are read page by page; export as CSV or Excel.
- **"Feed an AI sourcing agent."** Choose only the fields it needs with `fields` (for example `title`, `priceTiers`, `moq`, `supplier.name`).

### Why this actor

- **Price tiers on every row.** Each offer's own page is read, so `priceTiers` holds every quantity break the supplier set (or the single price from the MOQ), not just a range.
- **Trust filters that work on any search.** Supplier type, Gold or Diamond membership, audited suppliers, samples available, price and MOQ. Offers left out by a filter are never charged.
- **Monitoring built in.** `onlyNew` remembers what earlier runs of the same input delivered and returns only new offers and real price or MOQ changes.
- **Clear about what it could not read.** A search with no offers, a filter that leaves nothing, or an address that cannot be read gets a free row saying why. A site check page is reported as a refusal, never as "no results".
- **Built for AI agents.** Numbers as numbers, ISO dates, stable field names, a field picker, a dataset schema and output views, and a run summary (`RUN_SUMMARY`) with counts and reasons that an agent can read.

### Input

| Field                  | Type                                     | What it does                                                                                                                                                                                                           |
| ---------------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `searchTerms`          | array of strings                         | Products to search, one per line ("silicone baking mat"). Read page by page, 30 offers a page.                                                                                                                         |
| `startUrls`            | array of URLs                            | Search pages, category pages (`/…-Catalog/….html`) and offer pages (`<supplier>.en.made-in-china.com/product/…`).                                                                                                      |
| `maxResultsPerSearch`  | integer                                  | Offers per search or listing address (default 30, up to 600).                                                                                                                                                          |
| `maxResults`           | integer                                  | Optional cap across the whole run.                                                                                                                                                                                     |
| `minPrice`, `maxPrice` | number (USD)                             | Keep offers with a unit price in this range at any quantity break.                                                                                                                                                     |
| `maxMoq`               | integer                                  | Keep offers whose MOQ is at most this.                                                                                                                                                                                 |
| `supplierType`         | `any`, `manufacturer`, `trading-company` | The supplier's own business type (suppliers that are both match either).                                                                                                                                               |
| `auditedOnly`          | boolean                                  | Only suppliers audited by an independent inspection agency.                                                                                                                                                            |
| `memberLevel`          | `any`, `gold`, `diamond`                 | Gold or Diamond members, or Diamond only.                                                                                                                                                                              |
| `samplesOnly`          | boolean                                  | Only offers whose supplier sells samples.                                                                                                                                                                              |
| `includeOfferDetails`  | boolean                                  | Add lead time, HS code, certifications, packaging, sample price, payment terms, Incoterms, capacity, highlights, images and the supplier profile (a separate event).                                                   |
| `onlyNew`              | boolean                                  | Only offers new since earlier runs of the same input, plus offers whose tiers, price range or MOQ changed. Watches the first `maxResultsPerSearch` offers of each search; unchanged ones are not delivered or charged. |
| `fields`               | array of strings                         | Keep only these fields (dotted paths such as `supplier.name`).                                                                                                                                                         |
| `includeRaw`           | boolean                                  | Add the page's own structured product data as `raw`.                                                                                                                                                                   |

The filters are applied by this actor to what the pages show: the site's own filter pages are closed to automated readers by its robots.txt. With filters, enough result pages are read to fill `maxResultsPerSearch` when a third of the offers match (three times as many offers, plus one page). At most 40 pages are read per search or address in any case, so with filters a request above 390 offers, or a filter that keeps fewer than a third, can deliver fewer.

#### Example inputs

Search with trust filters and details:

```json
{
  "searchTerms": ["silicone baking mat"],
  "maxResultsPerSearch": 60,
  "maxPrice": 2,
  "auditedOnly": true,
  "memberLevel": "gold",
  "includeOfferDetails": true
}
```

A category and two offers, new and changed offers only (schedule it daily):

```json
{
  "startUrls": [
    {
      "url": "https://www.made-in-china.com/Light-Industry-Daily-Use-Catalog/browse-Silicone-Baking-Mat-18200100000009.html"
    },
    {
      "url": "https://kingod.en.made-in-china.com/product/opiRDeEcCBVK/China-Wholesale-High-Quality-Silicone-Baking-Mats-with-OEM-Support.html"
    }
  ],
  "onlyNew": true
}
```

### Output

One row per offer. Fields:

| Field                                      | What it is                                                                                                                                                                                         |
| ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`, `url`, `title`, `image`, `category`  | The offer, its page, its main image and the site's category path                                                                                                                                   |
| `priceTiers`                               | Every quantity break: `minQty`, `maxQty` (null: and up), `price` in USD, and `priceMax` when the price depends on the option chosen                                                                |
| `unitPriceMin`, `unitPriceMax`, `currency` | The price range in USD                                                                                                                                                                             |
| `moq`, `unit`                              | Minimum order quantity and its unit                                                                                                                                                                |
| `supplier`                                 | `name`, `url`, `type`, `level` (Gold Member, Diamond Member), `audited`, `years`, `location` (province), `rating`, `ratingCount`                                                                   |
| `specs`                                    | The attribute table as the supplier filled it in                                                                                                                                                   |
| `samplesAvailable`, `securedTrading`       | Samples sold; orderable with the site's Secured Trading service                                                                                                                                    |
| `position`, `searchTerm`, `sourceUrl`      | Where the offer was found (1-based across pages)                                                                                                                                                   |
| `pageRead`                                 | Whether the offer page was read (false: price and MOQ are as the listing shows them)                                                                                                               |
| `scrapedAt`                                | ISO date and time                                                                                                                                                                                  |
| With `includeOfferDetails`                 | `leadTime`, `hsCode`, `certifications`, `packaging`, `samples`, `paymentTerms`, `incoterms`, `productionCapacity`, `modelNumber`, `trademark`, `origin`, `highlights`, `images`, `supplierProfile` |
| With `onlyNew`                             | `changeType` (`added`, `updated`), `changedFields`, `previous` (the earlier tiers, prices, MOQ and when they were seen)                                                                            |

Fields the page does not show are `null`, never guessed. Views in the Output tab: Overview, Price tiers, Suppliers and Offer details.

#### Sample record

From a run on 2026-10-27 (`includeOfferDetails` on; lists shortened):

```json
{
  "recordType": "offer",
  "id": "CwqapiyOrrAl",
  "url": "https://infullcutlery.en.made-in-china.com/product/CwqapiyOrrAl/China-Heat-Resistant-Silicone-Pastry-Mat-Table-Placemat-for-Dinner-Baking.html",
  "title": "Heat Resistant Silicone Pastry Mat Table Placemat for Dinner Baking",
  "image": "https://image.made-in-china.com/2f0j00sqnlYJZmiMRK/Heat-Resistant-Silicone-Pastry-Mat-Table-Placemat-for-Dinner-Baking.webp",
  "category": "Light Industry & Daily Use > Kitchen Implements > Bakeware",
  "priceTiers": [
    {
      "minQty": 100,
      "maxQty": 499,
      "price": 0.54
    },
    {
      "minQty": 500,
      "maxQty": 5999,
      "price": 0.5
    },
    {
      "minQty": 6000,
      "maxQty": null,
      "price": 0.46
    }
  ],
  "unitPriceMin": 0.46,
  "unitPriceMax": 0.54,
  "currency": "USD",
  "moq": 100,
  "unit": "pieces",
  "supplier": {
    "name": "GuangDong Infull Industrial Co., Ltd.",
    "url": "https://infullcutlery.en.made-in-china.com",
    "type": null,
    "level": "Diamond Member",
    "audited": true,
    "years": 4,
    "location": "Guangdong, China",
    "rating": 5,
    "ratingCount": 1
  },
  "specs": [
    {
      "name": "Model NO.",
      "value": "IFS35"
    },
    {
      "name": "Type",
      "value": "Baking Tools & Accessories"
    },
    {
      "name": "Material",
      "value": "Silicone"
    },
    {
      "name": "Logo",
      "value": "Customized"
    }
  ],
  "samplesAvailable": true,
  "securedTrading": true,
  "position": 8,
  "searchTerm": "silicone baking mat",
  "sourceUrl": "https://www.made-in-china.com/products-search/hot-china-products/Silicone_Baking_Mat.html",
  "pageRead": true,
  "scrapedAt": "2026-10-27T01:38:21.845Z",
  "leadTime": "Peak Season Lead Time: 1-3 months; Off Season Lead Time: one month",
  "hsCode": "3924100000",
  "certifications": [],
  "packaging": {
    "transportPackage": "Neutral Packing",
    "packageSize": "20.00cm * 10.00cm * 10.00cm",
    "grossWeight": "250.000kg"
  },
  "samples": {
    "available": true,
    "price": 0.7,
    "unit": "piece"
  },
  "paymentTerms": ["LC", "T/T", "PayPal", "Western Union"],
  "incoterms": ["FOB", "EXW", "CFR", "CIF", "DDP", "FCA"],
  "productionCapacity": "50000 PCS/ Month",
  "modelNumber": "IFS35",
  "trademark": "Infull",
  "origin": "China",
  "highlights": [
    "Customized Logo: Laser, silk screen, printing, and embossing available for logo customization.",
    "Customized Design: Shape, material, and process can be customized according to requirements."
  ],
  "images": [
    "https://image.made-in-china.com/2f0j00sqnlYJZmiMRK/Heat-Resistant-Silicone-Pastry-Mat-Table-Placemat-for-Dinner-Baking.webp",
    "https://image.made-in-china.com/2f0j00yqNVRUsKkCGZ/Heat-Resistant-Silicone-Pastry-Mat-Table-Placemat-for-Dinner-Baking.webp"
  ],
  "supplierProfile": {
    "Address": "616 Guangda Live Center Ii, No. 300 Qingcha Road, Shijing Street, Baiyun, Guangzhou, Guangdong, China",
    "Terms of Payment": "LC, T/T, PayPal, Western Union",
    "International Commercial Terms(Incoterms)": "FOB, EXW, CFR, CIF, DDP, FCA",
    "Average Lead Time": "Peak Season Lead Time: 1-3 months; Off Season Lead Time: one month",
    "Main Products": "Cutlery & Flatware , Dinnerware&Tableware , Tray&Lunch Plate , Ceramic Dinnerware , Kitchenware , Baking & Pastry Tools , Kitchen Knife , Kitchen Gadgets , Barware , Drinkware",
    "Export Year": "2005-07-01"
  }
}
```

### Pricing

Pay per event: you pay only for offers delivered.

| Event                                                            | Free / Bronze   | Silver          | Gold            |
| ---------------------------------------------------------------- | --------------- | --------------- | --------------- |
| Offer with its price tiers (`offer`)                             | $1.00 per 1,000 | $0.90 per 1,000 | $0.80 per 1,000 |
| Offer details (`offer-details`, only with `includeOfferDetails`) | $0.80 per 1,000 | $0.72 per 1,000 | $0.64 per 1,000 |

Plus Apify's small start fee per run. Offers left out by filters, unchanged offers in `onlyNew` mode and the free rows that explain an entry that gave nothing are not charged. An offer whose page could not be read is delivered from the listing (`pageRead: false`) and its details are not charged; when a filter cannot be checked from the listing, it is left out and counted as unread, not as filtered. The run stops at your spending limit before a row it cannot pay for.

### Limits

- Prices are in US dollars as the site shows them; a price in another currency is left empty with a note.
- Shipping cost is "contact the supplier" on the site, so it is not part of the output.
- Some suppliers do not publish a business type; with `supplierType` set, their offers are left out.
- No sign-in and no CAPTCHA solving: pages the site refuses on every route are reported in the run summary.

### Changelog

#### 0.1 (2026-10-27)

- First release: search terms, search, category and offer URLs; every quantity price tier, MOQ and supplier trust fields; price, MOQ, supplier type, membership, audit and sample filters; offer details; new and changed offers only.

# Actor input Schema

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

Products to search on Made-in-China.com, one per line, as a buyer would type them ("silicone baking mat", "LED strip light"). Each search is read page by page (30 offers a page) up to Max results per search. Leave empty to use Start URLs only; with neither, the run uses the example.

## `startUrls` (type: `array`):

Optional. Made-in-China.com addresses: search pages (/products-search/…), category pages (/…-Catalog/….html) and offer pages on a supplier's site (<supplier>.en.made-in-china.com/product/…). Search and category pages are followed to their next pages. Filtered pages (/multi-search/…) are closed to automated readers by the site's robots.txt: give the plain page and use the filters below. An address that cannot be read is skipped with a free row saying why.

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

Offers delivered per search term or listing address (default 30 = one page; up to 600 = 20 pages). Offers left out by the filters do not count, so with filters enough pages are read to fill the request when a third of the offers match (three times as many offers plus one page). At most 40 pages are read per search or address in any case, so with filters a request above 390 offers, or a filter keeping fewer than a third, can deliver fewer.

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

Optional. Stop once this many offers are delivered across all searches and addresses. Empty: no overall cap (Max results per search still applies).

## `minPrice` (type: `number`):

Optional. Keep offers with a unit price at or above this, in US dollars, at any quantity break. Applied by this actor to what the pages show (the site's own filter pages are closed to automated readers), so filtered-out offers are never charged.

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

Optional. Keep offers with a unit price at or below this, in US dollars, at any quantity break (the cheapest break counts). Applied by this actor after reading; never charged when left out.

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

Optional. Keep offers whose minimum order quantity is at most this many units. Applied by this actor after reading; offers that show no MOQ are left out.

## `supplierType` (type: `string`):

Keep offers from manufacturers or from trading companies, as the supplier's own business type says. Many suppliers are both; they match either choice. Applied by this actor after reading (category pages do not show the type, so it is taken from the offer page).

## `auditedOnly` (type: `boolean`):

Keep only suppliers audited by an independent inspection agency (the site's Audited Supplier badge). Applied by this actor after reading.

## `memberLevel` (type: `string`):

Keep suppliers by their Made-in-China.com membership: Gold or Diamond, or Diamond only. Applied by this actor after reading.

## `samplesOnly` (type: `boolean`):

Keep only offers whose supplier sells samples (the listing's sample flag or the offer page's Request Sample box). Applied by this actor after reading.

## `includeOfferDetails` (type: `boolean`):

Add what the offer page says beyond prices: lead time, HS code (where given), certifications, packaging (package, size, gross weight), sample price, payment terms, Incoterms, production capacity, model number, trademark, origin, product highlights, all images and the supplier's profile (employees, year founded, export markets, nearest port…). Charged as a separate event per offer that has them.

## `onlyNew` (type: `boolean`):

Monitoring: deliver only offers not delivered by earlier runs of the same searches, addresses and filters (changeType "added"), plus offers whose quantity breaks, price range or MOQ changed (changeType "updated", with the earlier values in "previous" and the changed fields in "changedFields"). Unchanged offers are not delivered or charged. The run watches the same offers a normal run would read (the first Max results per search of each search or address), so each scheduled run reads the same pages. Schedule it to watch a product category.

## `fields` (type: `array`):

Optional. Keep only these fields in each row, for example \["title", "priceTiers", "moq", "supplier.name"]; dotted paths reach inside objects and lists. recordType, id and url always stay. Empty: every field.

## `includeRaw` (type: `boolean`):

Add "raw": the offer page's own structured product data (schema.org Product), as the page has it. For checking or for fields this actor does not name.

## Actor input object example

```json
{
  "searchTerms": [
    "silicone baking mat",
    "yoga mat"
  ],
  "startUrls": [
    {
      "url": "https://www.made-in-china.com/products-search/hot-china-products/Yoga_Mat.html"
    },
    {
      "url": "https://kingod.en.made-in-china.com/product/opiRDeEcCBVK/China-Wholesale-High-Quality-Silicone-Baking-Mats-with-OEM-Support.html"
    }
  ],
  "maxResultsPerSearch": 90,
  "maxResults": 200,
  "minPrice": 0.5,
  "maxPrice": 2,
  "maxMoq": 500,
  "supplierType": "any",
  "auditedOnly": false,
  "memberLevel": "any",
  "samplesOnly": false,
  "includeOfferDetails": false,
  "onlyNew": false,
  "fields": [
    "title",
    "priceTiers",
    "moq",
    "supplier.name"
  ],
  "includeRaw": false
}
```

# Actor output Schema

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

One row per offer with its quantity price breaks, MOQ and supplier (and free rows for entries that gave nothing).

## `overview` (type: `string`):

No description

## `tiers` (type: `string`):

No description

## `suppliers` (type: `string`):

No description

## `details` (type: `string`):

No description

## `runSummary` (type: `string`):

Outcome (COMPLETE, PARTIAL, NO_CHANGES, EMPTY, FAILED), counts, filters applied, warnings and every entry that could not be read, with the reason.

# 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": [
        "silicone baking mat"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleanpull/made-in-china-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": ["silicone baking mat"] }

# Run the Actor and wait for it to finish
run = client.actor("cleanpull/made-in-china-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": [
    "silicone baking mat"
  ]
}' |
apify call cleanpull/made-in-china-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cleanpull/made-in-china-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/x80PDRSSovn2fKomG/builds/uRUO2pqFTJxMCwx72/openapi.json
