# IndiaMART Supplier Catalog Scraper — Products, Specs & Reviews (`yugenox/indiamart-supplier-catalog-scraper`) Actor

Scrape full IndiaMART supplier storefronts: every public product with price, MOQ, specs, images and brochures, full review history and the factsheet (turnover, employees, year founded, GST/IEC verification, TrustSEAL, export countries, rating). Find suppliers by keyword, category or city. No login.

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

## Pricing

from $1.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

## IndiaMART Supplier Catalog Scraper

Scrape **complete IndiaMART supplier storefronts**, not just search snippets. For every supplier you get:

- **The whole product catalog.** Every product IndiaMART shows publicly, in every category, with price, currency and unit, minimum order quantity, the full specification table, description, delivery time, production capacity, payment terms, packaging, port of dispatch, all images, brochure PDF and video.
- **The full review history.** Stars, comment, date, the product that was reviewed, what the buyer liked (quality, response, delivery), the buyer's country and the supplier's reply.
- **The supplier factsheet.** Annual turnover band, number of employees, year established, legal status, business type, GST and IEC verification, TrustSEAL, member since, exporting since, top export countries, the rating with its star histogram and quality / response / delivery scores, HSN codes, website and IndiaMART call number.

No IndiaMART account or login is needed.

It works best with Apify's residential proxies in India (the default). If your Apify plan has no residential proxies, it uses datacenter IPs instead, which IndiaMART often refuses, so runs are slower.

### How to find suppliers

Mix any of these:

| Input | What it does |
|---|---|
| **Supplier links** | Scrape specific suppliers in full. Accepts `https://www.indiamart.com/westernmetal/`, `export.indiamart.com` and `m.indiamart.com` links, product page links (scrapes that product's supplier), bare names (`westernmetal`) or numeric supplier IDs. |
| **Search keywords** | Find suppliers for a product, e.g. `turmeric powder`. IndiaMART's keyword search shows at most 20 suppliers, so each keyword is also expanded into its best-matching product categories to find many more. |
| **Category links** | Find suppliers from a category page such as `https://dir.indiamart.com/impcat/turmeric-powder.html` or `https://dir.indiamart.com/mumbai/turmeric-powder.html`. |
| **Cities** | Split category listings by city (`mumbai`, `delhi`, `ahmedabad`...) or enter `all` to go through the category's top cities. |
| **Business types** | Only manufacturers, exporters, wholesalers, retailers or service providers. Each type is its own listing, so this also reaches more suppliers. |

Every supplier is scraped only once per run, however many keywords or categories it turns up in.

### Input example

```json
{
  "suppliers": ["https://www.indiamart.com/westernmetal/"],
  "searchQueries": ["turmeric powder", "stainless steel bolts"],
  "cities": ["mumbai", "ahmedabad"],
  "businessTypes": ["manufacturer", "exporter"],
  "maxSuppliers": 50,
  "includeProducts": true,
  "maxProductsPerSupplier": 0,
  "includeReviews": true,
  "maxReviewsPerSupplier": 100
}
```

Turn **Scrape product catalogs** off for a fast supplier directory (one row per supplier with the full factsheet and rating).

Common field aliases are accepted too when calling via API: `startUrls` / `urls` for `suppliers`, `keywords` / `queries` for `searchQueries`, `maxResults` / `limit` for `maxItems`, `maxProducts`, `maxReviews`, `concurrency`. A link pasted into the wrong field (a category page under `suppliers`, a storefront under `searchQueries`) is routed to the right place. Inputs that cannot be understood become free `type: "error"` rows so you can see them in bulk jobs.

### What happens when things go wrong

The run always finishes as **succeeded** with whatever it collected and a status message that says why it stopped: IndiaMART blocking (after retries on fresh IPs), the run's time limit (results are flushed ~90 s before it, cut-short catalogs carry `productsTruncated: true`), your spending limit, or `maxItems`. You are only ever charged for supplier, product and review rows that were actually saved; error rows are free.

### Output

One dataset. Each row has a `type`: `supplier`, `product` or `review`. The dataset has a separate view for each type, and you can export them together or filter on `type`.

**Supplier**

```json
{
  "type": "supplier",
  "supplierId": "632820",
  "alias": "hathi-masala",
  "name": "Gandhi Spices Private Limited",
  "url": "https://www.indiamart.com/hathi-masala/",
  "website": "https://www.gandhispices.in/",
  "businessType": "Manufacturer",
  "mainCategory": "Cooking Spices and Masala",
  "city": "Rajkot",
  "state": "Gujarat",
  "pinCode": "360001",
  "yearEstablished": 1952,
  "employees": "101 to 500 People",
  "legalStatus": "Limited Company (Ltd./Pvt.Ltd.)",
  "annualTurnover": "Rs. 100 - 500 Crore",
  "gstNumberMasked": "24**********1ZR",
  "gstVerified": true,
  "iecVerified": true,
  "trustSeal": true,
  "memberSince": "20 yrs",
  "exportingSince": "20+ years",
  "topExportCountries": ["United States Of America", "Canada", "South Africa", "United Kingdom", "Singapore"],
  "callNumber": "+91-7942872774",
  "rating": 4.1,
  "ratingCount": 251,
  "ratingHistogram": { "1": 42, "2": 10, "3": 21, "4": 24, "5": 154 },
  "ratingFactors": { "response": 83, "quality": 85, "delivery": 89 },
  "productCount": 98,
  "productsCollected": 98,
  "catalogCoverage": 1,
  "catalogCapped": false,
  "categories": [{ "name": "Turmeric Powder", "productCount": 4, "url": "https://www.indiamart.com/hathi-masala/turmeric-powder.html" }],
  "reviewsCollected": 100,
  "discoveredVia": { "type": "search", "input": "turmeric powder" }
}
```

**Product**

```json
{
  "type": "product",
  "supplierId": "632820",
  "supplierName": "Gandhi Spices Private Limited",
  "displayId": "16800316291",
  "name": "Rajagra Flour (Amaranth Aatta)",
  "category": "Amaranth Flour",
  "price": "₹ 145/Kg",
  "priceValue": 145,
  "currency": "INR",
  "priceUnit": "Kg",
  "minOrderUnit": "Kg",
  "specifications": { "Net Weight": "500 g", "Packaging Type": "Pouch", "Brand": "Hathi", "Speciality": "Gluten Free" },
  "description": "Rajgara flour is commonly eaten while fasting, it has high nutritional value...",
  "deliveryTime": "15-20 Working Days",
  "paymentTerms": "L/C (Letter of Credit),T/T (Bank Transfer),D/P",
  "portOfDispatch": "Mundra, Kandla, Nava Sheva, Ahmedabad",
  "image": "https://5.imimg.com/data5/SELLER/Default/2024/3/396169353/ER/QJ/TO/632820/rajagra-flour-amaranth-flour-500x500.jpg",
  "images": ["..."],
  "brochureUrl": "https://5.imimg.com/data5/SELLER/Doc/2022/12/GN/DR/TE/632820/rajagra-flour-amaranth-flour-.pdf",
  "videoUrl": "https://www.youtube.com/watch?v=SMUO84tX1O4",
  "url": "https://www.indiamart.com/proddetail/rajagra-flour-amaranth-aatta-16800316291.html"
}
```

**Review**

```json
{
  "type": "review",
  "supplierId": "3178930",
  "supplierName": "Western Metal India",
  "reviewId": "12785468",
  "rating": 5,
  "comment": "Consistent communication with me.",
  "date": "2024-11-11",
  "product": "M36 Bolt Precision Bolt",
  "productCategory": "Forged Bolt",
  "likedFor": ["Response"],
  "buyerCountry": "Philippines",
  "supplierReply": null
}
```

Reviews include the buyer's country only. Buyer names and companies are not collected, and GST numbers appear only in the masked form IndiaMART shows publicly.

**Add product details** (optional) adds `longDescription`, `productCategory`, `productGroup`, `productSubGroup`, `mcatNames` and `lastUpdated` to each product, at one extra request per product.

### Good to know

- **Very large catalogs.** An IndiaMART storefront shows at most 40 products per category. That covers the whole catalog for most suppliers, 70-98% for big ones and less for suppliers with thousands of products in a few categories. Every supplier row states `productCount` (what the supplier lists), `productsCollected`, `catalogCoverage` (the share IndiaMART shows publicly) and `catalogCapped`.
- **Keyword search depth.** IndiaMART's keyword search stops at 20 suppliers. Leave **Categories to explore per keyword** at 1 or more, and add cities or business types, to go further.
- **Speed.** A 2,000-product storefront takes about 20 seconds. A supplier directory of 70 suppliers without products takes under a minute.
- **Reliability.** Blocked requests are retried automatically on a fresh connection. If a run gets close to its timeout it stops, saves what it has and finishes successfully.

### Use cases

- **Procurement and vendor due diligence.** Turnover, headcount, years in business, verification flags, TrustSEAL and the full review history in one table.
- **Competitor catalog and price monitoring.** Schedule runs on competitors' storefronts and compare prices, MOQs and new products over time.
- **Export sourcing.** Find manufacturers and exporters by product, city and business type, with export countries and ports of dispatch.
- **B2B lead lists.** Build supplier lists for a category with ratings, turnover band and a business call number.
- **Market research.** Price ranges, specifications and pack sizes across every supplier of a product.

### FAQ

**Do I need an IndiaMART account?** No.

**Which proxy should I use?** The default (Apify Residential, India) works best. If you choose another pool and it gets blocked, the scraper switches to residential automatically.

**My Apify plan has no residential proxies. Will it still work?** Yes, more slowly. The scraper uses Apify's datacenter IPs instead, which IndiaMART refuses about half the time, so it retries each request on new IPs and waits out longer blocks. If IndiaMART keeps refusing, the run stops with what it collected and its status message tells you what to change. You are only charged for rows you receive.

**How am I charged?** Per row saved: one price per supplier, per product and per review, plus an add-on per product when **Add product details** is on (charged only for products that were saved with their details). See the Pricing tab. Rows for inputs that could not be found (`type: "error"`) are free, and so is anything the run could not deliver.

**Is it legal to scrape IndiaMART?** This scraper collects only data that IndiaMART shows publicly to every visitor without logging in: supplier storefronts, product listings, the supplier factsheet and published reviews. Scraping publicly available data is generally legal, but what you do with it matters. Some rows can relate to a person: a sole proprietorship's business name is often the owner's own name, and review comments are free text. If you store or use such data, follow the data protection laws that apply to you (GDPR, PIPEDA, CCPA, India's DPDP Act) and IndiaMART's terms. If you are not sure your use case is legitimate, check with a lawyer. More background: [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 account, cookies or anything behind a login, only the pages and data IndiaMART shows every visitor. It also leaves out some public fields on purpose: contact person names and designations, personal mobile numbers, the buyer's name, company and city on reviews, and unmasked GST numbers. The only phone number in the output is the IndiaMART call number shown on the storefront, and GST numbers appear only in IndiaMART's masked form.

**Why is `minOrderQuantity` empty for some products?** The supplier did not enter one. The same goes for delivery time, payment terms and other optional product fields.

**Can I scrape a supplier's own website domain?** Use their IndiaMART link instead (for example `https://www.indiamart.com/<name>/`). Any of their product page links on indiamart.com also works.

# Actor input Schema

## `suppliers` (type: `array`):

IndiaMART suppliers to scrape in full. Paste storefront links (https://www.indiamart.com/westernmetal/), export.indiamart.com or m.indiamart.com links, product page links (the product's supplier is scraped), bare names (westernmetal) or numeric supplier IDs. Suppliers listed here are always scraped, whatever "Max suppliers" says.

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

Find suppliers by product keyword, e.g. "turmeric powder" or "stainless steel bolts". IndiaMART's keyword search returns at most 20 suppliers per keyword, so each keyword is also expanded into its matching product categories (see below) to find more.

## `categoryUrls` (type: `array`):

IndiaMART category pages to find suppliers from, e.g. https://dir.indiamart.com/impcat/turmeric-powder.html or a city page like https://dir.indiamart.com/mumbai/turmeric-powder.html. Each page lists up to 28 suppliers; use the city and business-type filters below to reach more.

## `categoriesPerQuery` (type: `integer`):

After a keyword's search results, also list suppliers from this many of its best-matching product categories. 0 = keyword search only (max 20 suppliers per keyword).

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

Only find suppliers in these cities (for keywords' categories and category links without a city), e.g. mumbai, delhi, ahmedabad, new-delhi. Each city is a separate supplier listing. Enter "all" to go through India first and then the category's top cities (up to 50). Leave empty for all of India.

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

Only find suppliers of these types. Each type is a separate supplier listing, so this also finds more suppliers. Leave empty for all types.

## `maxSuppliers` (type: `integer`):

Maximum number of suppliers to find from keywords and categories. 0 = no limit. Supplier links you paste above are always scraped on top of this.

## `maxSearchPagesPerQuery` (type: `integer`):

Keyword search pages to read (10 suppliers each). IndiaMART shows at most 2 pages.

## `includeProducts` (type: `boolean`):

One row per product: price, currency, unit, minimum order, specifications, description, delivery time, production capacity, payment terms, packaging, images, brochure, video and category. Turn off for a quick supplier directory (one row per supplier).

## `maxProductsPerSupplier` (type: `integer`):

0 = every product IndiaMART shows publicly. IndiaMART displays at most 40 products per category in a storefront, so very large catalogs are partly hidden - each supplier row reports this as catalogCoverage.

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

Adds the long description, product category/group, all category names and last-updated date to each product. One extra request per product, so it is slower and billed as an add-on.

## `includeReviews` (type: `boolean`):

One row per buyer review: stars, comment, date, reviewed product, what the buyer liked (quality / response / delivery), buyer country and the supplier's reply.

## `maxReviewsPerSupplier` (type: `integer`):

Newest first. 0 = all reviews.

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

Stop after this many dataset rows in total (suppliers + products + reviews). Leave empty for no limit.

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

Parallel requests. The default is fast and reliable.

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

Residential proxies in India are recommended - IndiaMART often blocks datacenter IPs. If you pick another pool, the scraper switches to residential automatically when it gets blocked. If your Apify plan has no residential proxies, the scraper uses datacenter IPs instead (slower).

## `_noResidential` (type: `boolean`):

Internal (canaries): behave exactly like an account without the RESIDENTIAL proxy group.

## Actor input object example

```json
{
  "suppliers": [
    "https://www.indiamart.com/westernmetal/"
  ],
  "searchQueries": [
    "turmeric powder"
  ],
  "categoriesPerQuery": 1,
  "maxSuppliers": 3,
  "maxSearchPagesPerQuery": 2,
  "includeProducts": true,
  "maxProductsPerSupplier": 50,
  "includeProductDetails": false,
  "includeReviews": true,
  "maxReviewsPerSupplier": 20,
  "maxConcurrency": 12,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  },
  "_noResidential": false
}
```

# Actor output Schema

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

Supplier profiles and factsheets.

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

Product catalog rows.

## `reviews` (type: `string`):

Buyer reviews.

## `all` (type: `string`):

Every row with all fields.

# 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 = {
    "suppliers": [
        "https://www.indiamart.com/westernmetal/"
    ],
    "searchQueries": [
        "turmeric powder"
    ],
    "maxSuppliers": 3,
    "maxProductsPerSupplier": 50,
    "maxReviewsPerSupplier": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "IN"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/indiamart-supplier-catalog-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 = {
    "suppliers": ["https://www.indiamart.com/westernmetal/"],
    "searchQueries": ["turmeric powder"],
    "maxSuppliers": 3,
    "maxProductsPerSupplier": 50,
    "maxReviewsPerSupplier": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "IN",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/indiamart-supplier-catalog-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 '{
  "suppliers": [
    "https://www.indiamart.com/westernmetal/"
  ],
  "searchQueries": [
    "turmeric powder"
  ],
  "maxSuppliers": 3,
  "maxProductsPerSupplier": 50,
  "maxReviewsPerSupplier": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}' |
apify call yugenox/indiamart-supplier-catalog-scraper --silent --output-dataset

```

## MCP server setup

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