# TradeIndia Scraper — B2B Products, Prices & Suppliers (`yugenox/tradeindia-scraper`) Actor

Scrape TradeIndia.com by keyword, category, city or URL: product name, price per unit in INR, MOQ, specifications, trade terms (payment, delivery, packaging), supplier company, city, state, business type, year established, TrustStamp and membership. Optional employees, turnover, GST. No login.

- **URL**: https://apify.com/yugenox/tradeindia-scraper.md
- **Developed by:** [Yugenox Corp](https://apify.com/yugenox) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## TradeIndia Scraper — B2B products, prices and suppliers from TradeIndia.com

Scrape **TradeIndia.com**, India's long-running B2B marketplace, by **keyword, category, city or link**. Every row is a product with its **price per unit in INR**, **minimum order quantity**, specifications and **trade terms** (payment terms, delivery time, supply ability, packaging, port of dispatch, export markets, certifications), plus the **supplier**: company name, city, state, **business type** (manufacturer, exporter, supplier, distributor…), **year established**, years on TradeIndia, **TrustStamp** and membership tier.

Turn on **product details** for the description, all photos and the supplier's full address, **number of employees**, **annual turnover**, GST number, working days and payment modes.

No TradeIndia account, cookies or login needed.

**Never fails on you.** Whatever happens (refused proxy IPs, a page TradeIndia changed, a keyword with no category, a typo in a link), the run finishes successfully with everything it collected. The status message tells you what happened. You pay only for rows actually saved to your dataset.

### What you get

| Group | Fields |
|---|---|
| Product | product ID, name, long title, link, image, brand, specifications (name / value), in stock, stock quantity, made in India, description\*, all images\* |
| Price | price text (`13126 INR (Approx.)`), price, price range high end, currency (INR), price unit, approximate flag, **minimum order quantity + unit** |
| Trade terms | payment terms, delivery time, supply ability, packaging details, port of dispatch, sample available / policy, main export markets, main domestic market, certifications |
| Category | product category, category page, breadcrumb |
| Supplier | company name, TradeIndia company page, logo, **city, state**, country, full address\* |
| Supplier facts | **business type(s)**, **year established**, years on TradeIndia, membership (Super Seller, Premium Seller…), **TrustStamp** + link, TI-verified, employees\*, **annual turnover\***, GST verified + GSTIN\* (masked for sole proprietors), working days\*, payment modes\*, company profile text\* |
| Provenance | how the row was found: keyword, category or city page, position |

\* with **Include product details**

### How to use it

#### 1. By keyword

Each keyword opens its TradeIndia category page (`tradeindia.com/manufacturers/<keyword>.html`). If there is no exact page, the closest TradeIndia categories are used, and the status message names them.

```json
{
  "searchTerms": ["solar led flood light", "ball valve"],
  "maxItemsPerQuery": 150,
  "maxItems": 300
}
```

#### 2. Suppliers in specific cities

```json
{
  "categories": ["led flood light"],
  "cities": ["Pune", "Ahmedabad", "Bengaluru"],
  "trustSealOnly": true
}
```

#### 3. Lead lists with company size and turnover

```json
{
  "categories": ["https://www.tradeindia.com/manufacturers/ball-valve-flanged-end.html"],
  "businessTypes": ["Manufacturer", "Exporter"],
  "includeDetails": true,
  "maxItems": 100
}
```

#### 4. Specific products

```json
{
  "startUrls": [{ "url": "https://www.tradeindia.com/products/50w-solar-flood-light-system-kent-model-c8536233.html" }]
}
```

### Input

| Field | What it does |
|---|---|
| **Products / keywords** | What to find. Also accepted as `keywords` / `queries`. |
| **Categories** | TradeIndia category names or links (`/manufacturers/<name>.html`). |
| **Cities** | Only suppliers in these cities. Alternate names work (Bangalore/Bengaluru, Gurgaon/Gurugram, Bombay…). |
| **TradeIndia URLs** | Category, city (`/<city>/<name>-city-<id>.html`) or product pages. |
| **Max products** | Total cap (default 100, 0 = no limit). Also accepted as `maxResults` / `limit`. |
| **Max products per keyword / category** | Default 100. |
| **Go past the first page through city pages** | On by default. A category page lists about 28 products; each of its city pages lists more suppliers. |
| **Max city pages per category** | Default 40 (the actor also stops when city pages stop adding new products). |
| **Match keywords to TradeIndia categories** | On by default. |
| **Include product details** | One extra page per product. |
| **Min / Max price (INR)**, **TrustStamp only**, **TI-verified only**, **In stock only**, **Business types** | Filters. Skipped products are never charged. |
| **Parallel queries** | Default 3. |
| **Proxy configuration** | Apify automatic datacenter proxies by default. If TradeIndia refuses them, the run switches to Apify residential (India) on its own, if your plan includes it. |

### Output example

```json
{
  "productId": "9950593",
  "url": "https://www.tradeindia.com/products/pp-ball-valve-flange-end-9950593.html",
  "name": "PP Ball Valve Flange End",
  "longName": "Pp Ball Valve Flange End - Application: Industrial & Water Application",
  "priceText": "315.00 INR (Approx.)",
  "price": 315,
  "currency": "INR",
  "priceUnit": "Unit/Units",
  "minOrderQuantity": 100,
  "minOrderUnit": "Unit/Units",
  "specifications": [
    { "name": "Pressure", "value": "Medium Pressure PSI" },
    { "name": "Structure", "value": "Ball" }
  ],
  "paymentTerms": "Cash Advance (CA), Cash in Advance (CID), Cheque, Others",
  "deliveryTime": "1 Week",
  "productionCapacity": "500 Per Week",
  "packagingDetails": "Bag & Box Packing",
  "portOfDispatch": "Ahmedabad",
  "mainExportMarkets": "Asia, Australia, Central America, North America, …",
  "certifications": "ISO & Material Test Certificate",
  "inStock": true,
  "productCategory": "Ball Valves",
  "breadcrumb": ["Ball Valves", "Ball Valve Flanged End"],
  "seller": {
    "companyName": "GOKUL POLY VALVES PRIVATE LIMITED",
    "storefrontUrl": "https://www.tradeindia.com/gokul-poly-valves-private-limited-3169056/",
    "city": "Ahmedabad",
    "state": "Gujarat",
    "businessType": "Exporter, Manufacturer, Service Provider, Supplier",
    "yearEstablished": 2006,
    "memberFor": "7 Years",
    "trustSeal": true,
    "employees": "100",
    "annualTurnover": "Rs 30 Lakhs",
    "gstVerified": true,
    "gstin": "24AAHCG5647H1ZI",
    "workingDays": "Monday - Saturday"
  },
  "source": { "type": "category", "query": "ball valve flanged end", "section": "listing", "position": 1 },
  "scrapedAt": "2026-10-01T20:20:23.169Z"
}
```

### Pricing

Pay per result: you pay for each product saved, plus a small fee per run. Product details are a separate, optional charge per product. Rows skipped by your filters, duplicates and failed pages are never charged. Set a maximum cost per run in Apify and the actor stops exactly there.

### FAQ

**Do I need a TradeIndia account or cookies?** No. There is no login, account, cookie or token. The actor reads the same public pages any visitor sees.

**How many products can I get per keyword?** A category page lists about 28 products. TradeIndia's robots.txt doesn't allow its numbered result pages, so the actor goes deeper through the category's city pages (`/mumbai/…`, `/delhi/…`), which list different suppliers. Big categories give hundreds of products this way. The actor stops by itself when city pages stop adding new products.

**My keyword says "No TradeIndia category".** TradeIndia organises products into about 110,000 categories. The actor tries the exact category, its singular/plural form, then the closest categories in TradeIndia's category list. If nothing matches, try other words or paste a `tradeindia.com/manufacturers/…` link.

**Why are some prices empty?** Many suppliers show "Ask Price" instead of a price. Those rows have `price: null` and keep everything else.

**Does it respect robots.txt?** Yes. It reads TradeIndia's robots.txt at the start of every run and never requests a disallowed address. That is why it never uses search pages or `?page=` links.

**Is it legal to scrape TradeIndia?** This actor collects only information TradeIndia shows publicly to any visitor without logging in: product listings and the business profile each supplier chose to publish. Most rows describe businesses, but some can still contain personal data — for example the business name or address of a sole proprietor. If you store or use that data, follow the data-protection laws that apply to you (GDPR, PIPEDA, CCPA, India's DPDP Act) and TradeIndia's terms of use, and use it for a legitimate purpose. If you are unsure, check with a lawyer. Background reading: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**Does it access any private data?** No. It never logs in and uses no TradeIndia account, cookies or tokens. It also leaves out personal details even where TradeIndia shows them: the owner's or contact person's name and designation are never collected (and are removed from company texts), no phone numbers or e-mail addresses are collected, and GST numbers that contain a sole proprietor's personal PAN are masked.

**What happens if TradeIndia blocks the run?** The actor first retries on fresh IPs, then moves to residential proxies if your plan has them. If the site still refuses, the run stops cleanly with the products it already saved and says so in the status message. It never tries to get around a captcha or a login page.

# Actor input Schema

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

What to find, e.g. "solar led flood light", "ball valve", "cotton yarn". Each keyword opens its TradeIndia category page (tradeindia.com/manufacturers/<keyword>.html); if there is none, the closest TradeIndia categories are used and named in the status message.

## `categories` (type: `array`):

TradeIndia category names or links, e.g. "led signboard" or https://www.tradeindia.com/manufacturers/led-signboard.html.

## `cities` (type: `array`):

Only suppliers in these cities, e.g. "Mumbai", "Ahmedabad", "Bengaluru". Each category is read from its city pages (e.g. /mumbai/…-city-207486.html) and the category's own page is filtered to these cities.

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

TradeIndia category pages (/manufacturers/…html), city pages (/<city>/…-city-<id>.html) or product pages (/products/…html).

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

Stop after this many products in total (0 = no limit).

## `maxItemsPerQuery` (type: `integer`):

Cap for each keyword, category or city link (0 = as many as the category and its city pages list).

## `includeCityPages` (type: `boolean`):

A category page lists about 28 products. With this on, the actor continues through the category's city pages (each lists different suppliers) until it has enough products. TradeIndia's robots.txt doesn't allow its numbered result pages, so this is how the actor goes deeper.

## `maxCityPages` (type: `integer`):

Upper bound on city pages read for one category (it also stops by itself when city pages stop adding new products).

## `findCategories` (type: `boolean`):

When a keyword has no exact category page, look it up in TradeIndia's category list (its public sitemaps, ~1 MB, cached for a week) and use the closest categories.

## `includeDetails` (type: `boolean`):

Open each product page for the description, all photos, the supplier's full address, number of employees, annual turnover, GST number (masked for sole proprietors), working days, payment modes and company profile text. One extra page per product (charged per product).

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

Skip products priced below this (products without a price are skipped too when set).

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

Skip products priced above this (products without a price are skipped too when set).

## `trustSealOnly` (type: `boolean`):

Only products whose supplier has TradeIndia's TrustStamp.

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

Only products whose supplier is marked TradeIndia-verified.

## `inStockOnly` (type: `boolean`):

Skip products marked out of stock.

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

Only suppliers of these types.

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

How many keywords / categories are scraped at the same time.

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

Apify automatic datacenter proxies work and are the default. If TradeIndia refuses them, the run switches to Apify residential proxies (India) by itself when your account has them.

## Actor input object example

```json
{
  "searchTerms": [
    "solar led flood light"
  ],
  "maxItems": 20,
  "maxItemsPerQuery": 100,
  "includeCityPages": true,
  "maxCityPages": 40,
  "findCategories": true,
  "includeDetails": false,
  "trustSealOnly": false,
  "verifiedOnly": false,
  "inStockOnly": false,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped products with their suppliers.

## `report` (type: `string`):

What the run did: queries, pages, filters, proxy and timing (RUN_REPORT).

## `run` (type: `string`):

Status and statistics for this run.

# 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": [
        "solar led flood light"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/tradeindia-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": ["solar led flood light"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/tradeindia-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": [
    "solar led flood light"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/tradeindia-scraper --silent --output-dataset

```

## MCP server setup

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