# TradeKey B2B Wholesale Scraper (`crawlerbros/tradekey-scraper`) Actor

Scrape TradeKey.com - a global B2B wholesale marketplace with millions of supplier product listings. Search products by keyword with country/sort/verified-supplier filters, or pull a supplier's full company profile and product catalog.

- **URL**: https://apify.com/crawlerbros/tradekey-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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/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

## TradeKey B2B Wholesale Scraper

Scrape [TradeKey.com](https://www.tradekey.com) — a global B2B wholesale marketplace connecting buyers with manufacturers and suppliers across 240+ countries. Search wholesale product listings by keyword with country / TrustPoints / verified-supplier filters, pull a supplier's full company profile and product catalog, or search live buyer sourcing requests (buy leads / RFQs). No login, no cookies required — Apify Proxy is engaged automatically only as a fallback if a run's datacenter IP gets connection-blocked/timed-out by tradekey.com, so most runs never touch it. If the first (auto) proxy pool is also blocked/timed-out, the actor escalates once more to a residential proxy session before giving up on a given page.

### What this actor does

- **Four modes:** `search` (keyword → wholesale product listings), `byCompanyUrls` (supplier profile + catalog), `byProductUrls` (full product-detail page: place of origin, packaging, supplying ability, payment type, full image gallery), and `buyLeads` (keyword → live buyer sourcing requests / RFQs posted by importers)
- **Filters:** supplier country, sort order (relevance / TrustPoints), verified-supplier-only, min/max order quantity range, title keyword
- **Real B2B data:** FOB price, minimum order quantity, delivery time, payment methods, supplier TrustPoints and verification badges, plus buyer-side sourcing requests with buyer company/country
- **Empty fields are omitted** — every field in a record is real, extracted data

### Output per product (mode=search)

- `productId`, `title`, `description`
- `imageUrl`, `imageUrls[]` (all product thumbnail images on the card), `productUrl`
- `companyName`, `companyUrl`, `companyCountry`
- `trustPoints` — supplier's TrustPoints score
- `modelNo`, `brandName`, `deliveryTime`, `supplyingAbility`
- `minOrderQty` (raw text), `minOrderQtyValue`, `minOrderUnit`
- `fobPrice` (raw text), `fobPriceValue`, `fobPriceUnit`
- `isVerifiedSupplier`, `verifiedBadge` (e.g. "Gold Key Plus")
- `paymentMethods[]`
- `sourceUrl`, `recordType: "product"`, `scrapedAt`

### Output per company (mode=byCompanyUrls)

- `companyName`, `companyUrl`, `companyId`, `country`
- `businessType`, `website`, `yearEstablished`, `numberOfEmployees`
- `mainMarkets`, `productsServices[]`, `factoryLocation`, `factorySize`
- `productionLines`, `totalAnnualPurchaseVolume`, `totalAnnualSalesVolume`
- `rdStaffCount`, `qcStaffCount`, `qualityControl`, `certificates`
- `contractManufacturing`, `registeredCapital`, `ownershipType`
- `legalRepresentative`, `exportPercentage`, `contactPerson`
- `productCount`, `products[]` — up to 25 catalog items with `title`/`url`/`imageUrl`
- `sourceUrl`, `recordType: "company"`, `scrapedAt`

### Output per product detail (mode=byProductUrls)

- `productId`, `title`, `description`, `productUrl`
- `imageUrl`, `imageUrls[]` (full gallery, not just search-card thumbnails)
- `companyName`, `companyUrl`, `supplierCountry`
- `modelNo`, `brandName`, `placeOfOrigin`, `packagingDetail`, `deliveryTime`, `supplyingAbility`, `paymentType`, `productGroup`
- `fobPrice` (raw text), `fobPriceValue`, `fobPriceUnit`
- `minOrderQty` (raw text), `minOrderQtyValue`, `minOrderUnit`
- `sourceUrl`, `recordType: "product"`, `scrapedAt`

### Output per buy lead (mode=buyLeads)

- `buyOfferId`, `title`, `description`
- `buyerCompany`, `buyerCountry`
- `lastUpdated` — when the buyer last updated their sourcing request
- `buyOfferUrl`, `sourceUrl`, `recordType: "buyLead"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byCompanyUrls` / `byProductUrls` / `buyLeads` |
| `searchQuery` | string | `phone case` | Keyword to search (mode=search) |
| `country` | select | any | Restrict to a supplier country (mode=search) |
| `sortBy` | select | `relevance` | `relevance` / `trustpoints` (mode=search) |
| `verifiedOnly` | bool | `false` | Only Gold Key / Gold Key Plus verified suppliers |
| `minOrderQty` | int | – | Drop products with MOQ below this |
| `maxOrderQty` | int | – | Drop products with MOQ above this |
| `containsKeyword` | string | – | Title must contain this substring |
| `companyUrls` | array | – | Supplier company page URLs (mode=byCompanyUrls) |
| `productUrls` | array | – | Product detail page URLs (mode=byProductUrls) |
| `buyLeadsQuery` | string | `led light` | Keyword to search buyer sourcing requests (mode=buyLeads) |
| `maxItems` | int | `50` | Hard cap on emitted records (1–1000) |

#### Example: verified US suppliers only, sorted by TrustPoints

```json
{
  "mode": "search",
  "searchQuery": "led light",
  "country": "223",
  "sortBy": "trustpoints",
  "verifiedOnly": true,
  "maxItems": 50
}
```

#### Example: supplier profile lookup

```json
{
  "mode": "byCompanyUrls",
  "companyUrls": ["https://www.tradekey.com/company/Suzhou-Hengshuo-Imp-and-Exp-Co-Ltd-14108037.html"]
}
```

#### Example: full product detail lookup

```json
{
  "mode": "byProductUrls",
  "productUrls": ["https://www.tradekey.com/product_view/Custom-Clear-Phone-Case-11729181.html"]
}
```

#### Example: buyer sourcing requests (buy leads) for a keyword

```json
{
  "mode": "buyLeads",
  "buyLeadsQuery": "led light",
  "maxItems": 20
}
```

### Use cases

- **Sourcing / procurement** — find wholesale suppliers by keyword, country, and minimum order size
- **Seller lead generation** — use `mode=buyLeads` to find live buyer sourcing requests (RFQs) for a product category and reach out with a quote
- **Dropshipping & import businesses** — compare FOB pricing and MOQ across suppliers
- **Supplier due diligence** — pull a company's business type, year established, employee count, and full product catalog before reaching out
- **Market research** — track TrustPoints and verified-badge distribution across a product category
- **Lead generation** — build supplier contact lists filtered by country and category

### FAQ

**Does this need a TradeKey account?**  No. All data comes from TradeKey's public search and company-profile pages.

**What is a "TrustPoint"?**  TradeKey's internal supplier reputation score, based on transaction history, verification level, and buyer feedback.

**What does "Gold Key Plus" mean?**  A paid verified-supplier tier TradeKey awards after business-license and factory-audit checks. Use `verifiedOnly: true` to restrict results to badge-holding suppliers.

**Why is `minOrderQtyValue` sometimes missing even though `minOrderQty` has text?**  A handful of listings show non-numeric MOQ text (e.g. "Negotiable"); the raw text is still included, but the parsed numeric field is omitted per the no-null-fields policy.

**Can I look up multiple companies in one run?**  Yes — pass multiple URLs in `companyUrls`; each yields one company record plus its catalog products list.

**What's the difference between a search-mode product record and a `byProductUrls` record?**  Search-mode cards give you a fast overview (price, MOQ, company, TrustPoints) for many products at once. `byProductUrls` fetches each product's own detail page for extra fields not shown on the results grid — place of origin, packaging detail, supplying ability, payment type, and the full image gallery.

**Why did I get 0 results?**  Either the keyword has no current listings on TradeKey, or an overly narrow filter (e.g. `country` + `minOrderQty`) excluded everything. Widen the filters and retry.

**Is pricing final?**  FOB prices on B2B marketplaces are frequently negotiable and MOQ-dependent; treat `fobPrice` as an indicative starting quote, not a fixed retail price.

**What's a "buy lead"?**  A sourcing request posted by a buyer/importer looking for a supplier — the mirror image of a `search`-mode product listing. Use `mode=buyLeads` to find buyers actively looking for what you sell.

### Limitations

- TradeKey's `/search/index.html` results page typically yields 4-6 pages (roughly 60-100 cards) of distinct results for a given keyword/filter combination before the site starts repeating cards; the actor detects an identical repeated page and stops cleanly instead of emitting duplicates. Use more specific/varied keywords, or combine with `country`/`sortBy`, to gather larger volumes beyond that.
- Per-product detail pages are supported via `mode=byProductUrls` (place of origin, packaging, supplying ability, payment type, full image gallery). Per-SKU price-break tiers and buyer reviews are not exposed by TradeKey's server-rendered markup and are out of scope.
- `mode=buyLeads` returns the single keyword-listing page TradeKey serves per query (typically ~20 buy leads); the site does not expose reliable pagination for this listing, so `maxItems` above ~20 will not yield more records for a single keyword. Quantity-required and full buyer contact details live behind a login-gated "Quote Now" action and are out of scope.

### About the data source

This actor targets TradeKey.com, a large, fully server-rendered B2B wholesale marketplace. (Note: DHgate.com was evaluated first but is blocked at the Akamai edge for all client types — plain HTTP, browser-impersonation, and real headless-browser requests all receive a 403 on every path including the homepage — so TradeKey was selected as a reliable, same-category alternative.)

# Actor input Schema

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

What to fetch.

## `searchQuery` (type: `string`):

Keyword to search wholesale product listings for, e.g. `phone case`, `led light`, `garden tools`.

## `country` (type: `string`):

Only return products from suppliers based in this country.

## `sortBy` (type: `string`):

Result ordering.

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

Only emit products from suppliers with a Gold Key / Gold Key Plus verified badge.

## `minOrderQty` (type: `integer`):

Drop products whose minimum order quantity is below this number (e.g. `100`). Products without a parseable MOQ are kept.

## `maxOrderQty` (type: `integer`):

Drop products whose minimum order quantity is above this number. Products without a parseable MOQ are kept.

## `containsKeyword` (type: `string`):

Case-insensitive substring the product title must contain.

## `companyUrls` (type: `array`):

TradeKey supplier company page URLs, e.g. `https://www.tradekey.com/company/Suzhou-Hengshuo-Imp-and-Exp-Co-Ltd-14108037.html`.

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

TradeKey product detail page URLs, e.g. `https://www.tradekey.com/product_view/Custom-Clear-Phone-Case-11729181.html`. Returns full product-detail fields (place of origin, packaging, supplying ability, payment type, full image gallery) not available on search-result cards.

## `buyLeadsQuery` (type: `string`):

Keyword to search buyer sourcing requests (RFQs / import requirements) for, e.g. `led light`, `phone case`, `aluminum ingots`. Returns real buyer-posted requirements from importer.tradekey.com, not seller listings.

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

Hard cap on emitted records (mode=search: one record per product; mode=byCompanyUrls: one record per resolved company, with that company's product catalog nested inside — `maxItems` caps the number of companies processed, not the nested product count; mode=byProductUrls: one record per resolved product URL; mode=buyLeads: one record per buyer sourcing request, capped at the ~20 leads a single keyword page returns).

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

Apify Proxy is used automatically as a fallback only if tradekey.com blocks/times-out a direct connection from the run's datacenter IP — most runs complete without touching it. Override only if you need a specific proxy group/country.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "phone case",
  "country": "",
  "sortBy": "relevance",
  "verifiedOnly": false,
  "companyUrls": [
    "https://www.tradekey.com/company/Suzhou-Hengshuo-Imp-and-Exp-Co-Ltd-14108037.html"
  ],
  "productUrls": [
    "https://www.tradekey.com/product_view/Custom-Clear-Phone-Case-11729181.html"
  ],
  "buyLeadsQuery": "led light",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `products` (type: `string`):

Dataset containing all scraped TradeKey products and/or company profiles.

# 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": "search",
    "searchQuery": "phone case",
    "country": "",
    "sortBy": "relevance",
    "verifiedOnly": false,
    "companyUrls": [
        "https://www.tradekey.com/company/Suzhou-Hengshuo-Imp-and-Exp-Co-Ltd-14108037.html"
    ],
    "productUrls": [
        "https://www.tradekey.com/product_view/Custom-Clear-Phone-Case-11729181.html"
    ],
    "buyLeadsQuery": "led light",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/tradekey-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 = {
    "mode": "search",
    "searchQuery": "phone case",
    "country": "",
    "sortBy": "relevance",
    "verifiedOnly": False,
    "companyUrls": ["https://www.tradekey.com/company/Suzhou-Hengshuo-Imp-and-Exp-Co-Ltd-14108037.html"],
    "productUrls": ["https://www.tradekey.com/product_view/Custom-Clear-Phone-Case-11729181.html"],
    "buyLeadsQuery": "led light",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/tradekey-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "search",
  "searchQuery": "phone case",
  "country": "",
  "sortBy": "relevance",
  "verifiedOnly": false,
  "companyUrls": [
    "https://www.tradekey.com/company/Suzhou-Hengshuo-Imp-and-Exp-Co-Ltd-14108037.html"
  ],
  "productUrls": [
    "https://www.tradekey.com/product_view/Custom-Clear-Phone-Case-11729181.html"
  ],
  "buyLeadsQuery": "led light",
  "maxItems": 20
}' |
apify call crawlerbros/tradekey-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/tradekey-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RrSqWe7gvDhvSoOvX/builds/QyMtCeWiFnukVsfXd/openapi.json
