# ECER Scraper & API - China Suppliers, Products, MOQ & Prices (`rel8ble/ecer-scraper`) Actor

ECER scraper and API for Chinese B2B suppliers and products by keyword. One result = one product + supplier: price, MOQ, payment terms, supply ability, lead time, specs, business type, revenue, employees, year founded, address, certificates. No login, no start fee. $1.00 per 1,000.

- **URL**: https://apify.com/rel8ble/ecer-scraper.md
- **Developed by:** [Giovanni Rich](https://apify.com/rel8ble) (community)
- **Categories:** Lead generation, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 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

## ECER Scraper - China Suppliers, Products, MOQ & Prices

**ECER scraper** for importers, sourcing agents, Amazon / Shopify sellers and B2B lead-gen teams: enter a product keyword such as `yoga mat`, `led strip light` or `cnc machine` and get Chinese manufacturers and their products from **ECER.com** (a China B2B marketplace run by the ECER group) as clean JSON, CSV or Excel. Each row is one product with its **price, MOQ, payment terms, supply ability, delivery time, packaging and specs**, plus the supplier behind it: **verified badge, business type, annual revenue, employees, year established, address, certificates and website**. Use it as a **China supplier finder**, a **Made-in-China / Alibaba alternative for supplier research**, or an unofficial **ECER API** from your own code, Make, Zapier or n8n.

It works over plain HTTP, with **no browser and no login**. The 20-product default with full product pages took about 10 seconds locally and 44 seconds in a cloud run (30 October 2026).

### What you get

- **Product**: ECER product ID and code, name, product page URL, main image plus gallery, snippet, category breadcrumb, brand, model number, certification, place of origin, all other specs (label -> value), description, video flag.
- **Trade terms**: **MOQ** as a number with its unit, **price** as listed plus `priceMin` / `priceMax` / `currency` / `priceUnit` numbers when the supplier publishes one, a "negotiable" flag when it does not, **payment terms**, **supply ability**, **delivery time**, packaging details.
- **Supplier card** (from the product page, no extra request): company name, ECER company ID and code, showroom URL, membership ("Verified Supplier"), **business types** (manufacturer, exporter, trading company ...), **annual revenue** range, **employee** range, **year established**, **address**, company certificates (ISO 9001, CE, UL, patents ...), own website when published. Contact-person names are not collected.

### Sample output

Real rows from a run with the default input (`yoga mat`, 20 results):

| Product | Price | MOQ | Payment terms | Delivery | Supplier | Established | Employees |
|---|---|---|---|---|---|---|---|
| Durable Anti Slip Yoga Mat , Easy Carry Lightweight Soft PVC Yoga Mat | To be negociated with details | 1 | T/T, D/P, L/C, Western Union | 10days after Contract | Qingdao Rapid Health Technology Co.Ltd. | 1992 | 100~200 |
| Inflatable Yoga Mat 3x1x0.1m PVC Tarpaulin Blow Up Tumble Track for Home Gym | $99 - $999/PC | 1piece | T/T, Western Union, Paypal, Cash | 5-10 days | Guangzhou Planet Inflatables Ltd. | 2009 | 50~100 |
| Yoga Gym Everyday Exercise Yoga Mats 6MM Cushy Floor Mats | By Negotiation | 500~1000 sqms | T/T | 10 days after received the deposit | CHANGZHOU TAIHUI SPORTS MATERIAL CO.,LTD | 2014 | >100 |
| Yoga Mat Cover Suede Microfiber Anti Slip Black Hot Yoga Mat Towel | Negotiable | 100pcs | T/T, L/C, D/A, D/P, Western Union | 15-25Days | Hefei Aqua Cool Co., Ltd. | 2010 | 40~50 |
| Inflatable Air Yoga Mat / Yoga Sup Board Floating Water Eco Friendly | 50-99 | 1 Piece | T/T, Paypal, Western Union | 7-15 Working Days | Guangzhou Barry Industrial Co., Ltd | 1997 | 100~200 |

Fill rates on those 20 rows: supplier, membership, business type, employees, address, images 100%; MOQ and year established 95%; payment terms and delivery time 85%; supply ability and annual revenue 75%; company certificates 60%; numeric price 50% (the rest quote "Negotiable"); website 15%.

### Use cases

- **Supplier discovery**: build a shortlist of Chinese manufacturers for a product, with size (employees, revenue), age and certificates.
- **Price and MOQ benchmarking**: compare listed prices, MOQs and lead times across suppliers before you send RFQs.
- **B2B lead generation**: one row per supplier (`uniqueSuppliers`) gives a lead list of factories with address, business type and website.
- **Catalog export**: paste a supplier showroom URL to export that supplier's whole catalog with trade terms.
- **AI agents**: an agent can call this actor with a keyword and read back structured supplier data (see the MCP note below).

### Pricing

**$1.00 per 1,000 results** (pay per result), with **product pages included**: trade terms, supplier card, address and certificates cost nothing extra. Filtered rows, duplicates and failed requests are never charged, and there is no start fee. Apify platform usage and proxies are included: the price above is all you pay. A 20-row run costs $0.02.

| You scrape | You pay |
|---|---|
| 20 products (the prefill) | $0.02 |
| 1,000 products | $1.00 |
| 10,000 products | $10.00 |

The Apify free plan's $5 monthly credit covers about 5,000 products. This is the only ECER scraper on the Apify Store (checked 5 November 2026).

#### Why this one

- **The only ECER scraper on the Store**: the searches "ecer", "ecer scraper" and "ecer.com" return no other actor (5 November 2026).
- **Trade terms and supplier card on one row**: MOQ, price, payment terms and lead time next to business type, revenue, employees and certificates, with no extra charge for product pages.
- **Lead-list filters**: verified only, manufacturers only, years in business and one row per supplier.
- **No login and no browser**: plain HTTP requests to public pages.

### FAQ

**Why do many products say "Negotiable"?**
Many ECER suppliers quote on request. The actor keeps the text in `priceText`, sets `priceNegotiable: true`, and leaves the numeric fields null. Use `onlyWithPrice` to keep only products with a listed number.

**How many results does one keyword give?**
ECER shows between about 100 and 1,000+ products per keyword (20 per page). Turn on `expandRelatedKeywords` to continue with the related keywords ECER suggests, or add more keywords.

**Does it collect e-mails or phone numbers?**
No. ECER routes contact through its inquiry form, and contact-person names are deliberately not collected. You get the company address, business type, size and website when published.

**How is this different from the EveryChina Scraper?**
EveryChina and ECER belong to the same group but list different products and suppliers (only about a quarter of the suppliers on a typical ECER results page also appear on EveryChina's). Run both for wider coverage.

**Is this an official ECER API?**
No. It is an independent tool, not affiliated with ECER. ECER's buyer tools are its website and inquiry form; this actor reads the same public product pages any visitor sees and returns them as JSON, with no login or API key.

**How much does a typical job cost?**
A 100-supplier shortlist for one product is $0.10. 10 keywords x 100 products is $1.00. A weekly price and MOQ check on 5 keywords at 100 rows is about $2.15 a month.

**For AI agents (MCP):** input is a list of keywords or ECER URLs plus optional filters; output is one JSON row per product with its supplier card; typical cost is $0.02 for 20 rows; use it when you need Chinese manufacturers or wholesale trade terms for a product.

### Example inputs for common jobs

Products with trade terms and supplier card (default):

```json
{ "searchTerms": ["yoga mat"], "maxResultsPerSearch": 20 }
```

A supplier lead list: verified manufacturers in business 10+ years, one row per supplier:

```json
{
  "searchTerms": ["led strip light", "cnc machine"],
  "maxResultsPerSearch": 50,
  "uniqueSuppliers": true,
  "verifiedOnly": true,
  "manufacturersOnly": true,
  "minYearsInBusiness": 10
}
```

Small-batch sourcing: priced products with MOQ up to 100 and unit price up to $10:

```json
{ "searchTerms": ["led strip light"], "maxResultsPerSearch": 100, "onlyWithPrice": true, "maxMoq": 100, "maxPrice": 10 }
```

Go deeper than one keyword: keep going with ECER's related keywords until 300 rows:

```json
{ "searchTerms": ["yoga mat"], "maxResultsPerSearch": 300, "expandRelatedKeywords": true }
```

A category, one supplier's catalog, or single products:

```json
{
  "searchTerms": [
    "https://www.ecer.com/21011000-led-batten.html",
    "https://www.ecer.com/corp/uuu4wff-gymequipment-parts.html",
    "https://www.ecer.com/corp/details-uuu3wfk-puasehx-inflatable-air-yoga-mat-yoga-sup-board-floating-water-eco-friendly.html"
  ],
  "maxResultsPerSearch": 0
}
```

Fastest card-only export (name, price, MOQ, supplier, verified badge, year established; no product pages):

```json
{ "searchTerms": ["bamboo cutting board"], "maxResultsPerSearch": 200, "scrapeDetails": false }
```

### How to use

1. Open the actor and type one or more product keywords (English) or paste ECER URLs into **Products**.
2. Set **Max results per search** (default 20; 0 = everything ECER lists for that keyword).
3. Optionally set filters (verified only, manufacturers only, years in business, price, MOQ, one row per supplier) or turn on related keywords.
4. Click **Start**. Download the dataset as JSON, CSV, Excel or HTML, or read it through the API.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchTerms` | array | `["yoga mat"]` | Keywords, search URLs (`https://www.ecer.com/china-yoga-mat`), category URLs, product URLs or supplier showroom URLs. |
| `maxResultsPerSearch` | integer | 20 | Rows per keyword / URL. 0 = everything (20 per page). |
| `scrapeDetails` | boolean | true | Read product pages (trade terms, specs, supplier card, address, certificates). |
| `expandRelatedKeywords` | boolean | false | When a keyword runs out, continue with ECER's related keywords. |
| `uniqueSuppliers` | boolean | false | Keep only the first product per supplier. |
| `verifiedOnly` | boolean | false | Only "Verified Supplier" members. |
| `manufacturersOnly` | boolean | false | Only suppliers whose business type says manufacturer / factory. |
| `minYearsInBusiness` | integer | 0 | Only companies established at least this many years ago. |
| `onlyWithPrice` | boolean | false | Skip "Negotiable" products with no number. |
| `maxPrice` | number | - | Skip products whose lowest unit price is above this (listed currency, nearly always USD). |
| `maxMoq` | integer | - | Skip products whose MOQ is above this. |
| `maxConcurrency` | integer | 8 | Parallel requests. |
| `maxRequestRetries` | integer | 8 | Retries per failed request, each on a new proxy session. |
| `proxyConfiguration` | object | Apify Proxy | Datacenter proxy works; switch to RESIDENTIAL only if the log shows repeated blocks. |

Inputs that are not ECER keywords or URLs (other sites, video pages, paths ECER's robots.txt disallows) are skipped and listed in the `RUN_SUMMARY` record; they are never charged. A product URL that ECER has removed is reported in the log and not charged.

### Output example

One real row (description and lists shortened):

```json
{
  "searchTerm": "yoga mat",
  "position": 12,
  "productId": "11196413",
  "productCode": "puasehx",
  "productName": "Inflatable Air Yoga Mat / Yoga Sup Board Floating Water Eco Friendly",
  "productUrl": "https://www.ecer.com/corp/details-uuu3wfk-puasehx-inflatable-air-yoga-mat-yoga-sup-board-floating-water-eco-friendly.html",
  "hasVideo": true,
  "category": "Yoga Mats",
  "brand": "Barry",
  "modelNumber": "BY-HAT-040",
  "certification": "CE, EN14960, , SCT, EN71",
  "placeOfOrigin": "China",
  "moq": 1,
  "moqUnit": "piece",
  "moqText": "1 Piece",
  "priceText": "50-99",
  "priceMin": 50,
  "priceMax": 99,
  "paymentTerms": "T/T, Paypal, Western Union",
  "supplyAbility": "500 Pices/Month",
  "deliveryTime": "7-15 Working Days",
  "packagingDetails": "Product is packed by strong PVC bag and carton for blower, pump and other accessories",
  "specs": { "Warranty": "1 year", "Material": "PVC and Special Drop Stitch Fabric", "Length": "3m,4m,5m,6m,7m,8m,9m,10m,12m" },
  "description": "Inflatable air yoga mat on water Yoga sup board floating yoga mat ...",
  "images": ["https://img1.ecerimg.com/f4/53/09dbbfdbcfb9/product/20971929_s-w400xh400.jpg"],
  "supplierName": "Guangzhou Barry Industrial Co., Ltd",
  "supplierId": "4019",
  "supplierCode": "uuu3wfk",
  "supplierUrl": "https://www.ecer.com/corp/uuu3wfk-nflatablestoy",
  "memberType": "Verified Supplier",
  "businessTypes": ["Manufacturer", "Distributor/Wholesaler", "Exporter", "Seller"],
  "annualRevenue": "15000000-20000000",
  "employees": "100~200",
  "yearEstablished": 1997,
  "address": "No.3A07,Fanghua Road, Xinghangguoji Renhe Town,Baiyun District,Guangzhou China",
  "certificates": [],
  "website": "https://inflatables-toy.com/",
  "detailScraped": true,
  "sourceUrl": "https://www.ecer.com/china-yoga-mat",
  "scrapedAt": "2026-10-30T18:06:09.950Z"
}
```

The dataset has three table views in the Apify console: **Overview** (product, price, MOQ, terms, supplier), **Supplier leads** (supplier card) and **Pricing & MOQ** (numbers for comparison). A `RUN_SUMMARY` record lists per-keyword counts, pages read, ignored inputs and stop reasons.

### 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 changes, or on `supplierCode` to build a supplier CRM.

This actor is not affiliated with ECER. It reads public pages that ECER's robots.txt allows (file read 5 November 2026).

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. "yoga mat", "led strip light", "cnc machine", or ecer.com URLs: a search (https://www.ecer.com/china-yoga-mat), a category (https://www.ecer.com/21011000-led-batten.html), one product (https://www.ecer.com/corp/details-....html) or a supplier showroom (https://www.ecer.com/corp/uuu4wff-gymequipment-parts.html) to export that supplier's catalog. Default \["yoga mat"] (demo).

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

Optional. Products saved per keyword / URL, integer >= 0. Default 20; 0 = everything. ECER shows roughly 100 to 1,000+ products per keyword (20 per page); turn on "Continue with related keywords" to go further. You pay per row.

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

Default true. Reads each product page and adds payment terms, supply ability, delivery time, packaging, brand, model, certification, origin, all specs, description, images, category and the supplier card (business type, annual revenue, employees, year established, address, certificates, website). Off = fastest card-only export (name, price, MOQ, supplier, verified badge, year established).

## `expandRelatedKeywords` (type: `boolean`):

Optional. When a keyword runs out of results before "Max results per search", keep going with the related keywords ECER lists on the first results page (e.g. "yoga mat" -> "heat yoga mat", "big play mat"). Default false.

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

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

## `verifiedOnly` (type: `boolean`):

Optional. Keep only "Verified Supplier" members. Default false.

## `manufacturersOnly` (type: `boolean`):

Optional. Keep only suppliers whose business type says manufacturer / factory (reads the product page). Default false.

## `minYearsInBusiness` (type: `integer`):

Optional. Keep only companies established at least this many years ago. Default 0.

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

Optional. Skip products quoted as "Negotiable" with no number. Default false.

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

Optional. Skip products whose lowest listed unit price is above this (in the listed currency, nearly always USD). Products without a price are kept unless "Only products with a price" is on.

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

Optional. Skip products whose minimum order quantity is above this number, e.g. 100 for small-batch buying. Products without a listed MOQ are kept.

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

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

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

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

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

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

## Actor input object example

```json
{
  "searchTerms": [
    "yoga mat"
  ],
  "maxResultsPerSearch": 20,
  "scrapeDetails": true,
  "expandRelatedKeywords": false,
  "uniqueSuppliers": false,
  "verifiedOnly": false,
  "manufacturersOnly": false,
  "minYearsInBusiness": 0,
  "onlyWithPrice": false,
  "maxConcurrency": 8,
  "maxRequestRetries": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per product: price, MOQ, payment terms, supply ability, lead time, specs and the supplier card.

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

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

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

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

```

## MCP server setup

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