# IndiaMART Scraper - B2B Suppliers, Phones, GST & Prices (`scrapewise/indiamart-scraper`) Actor

Scrape IndiaMART without login: B2B products and suppliers by product, city and business type, with company, published business phone, GST verified, rating, price, specs and MOQ. Up to thousands of suppliers per product. US$ 1.40 per 1,000.

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

## Pricing

from $0.85 / 1,000 product delivereds

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

## IndiaMART Scraper: B2B suppliers, business phones, GST and prices

Scrape [IndiaMART](https://dir.indiamart.com/), India's largest B2B marketplace, **without an account, cookies or a
browser**. Type a product ("led bulb", "cotton fabric", "office chair") or paste an IndiaMART list link and get the
product listings with their suppliers: **company name, published business phone, city and state, business type
(manufacturer, wholesaler, retailer, exporter), GST verified flag, TrustSEAL, rating and number of ratings, years in
business, website**, plus the product's **price, unit, minimum order quantity, specs, description and photos**.

Filter by **city** and **business type**, keep only **GST-verified** or **TrustSEAL** suppliers, set a **minimum
rating**, or ask for **one row per company** to get a clean supplier list. Common products return **thousands of
different suppliers**, not just the 28 shown on the first page.

Built for sourcing and procurement teams, importers looking for Indian manufacturers, B2B sales and lead generation,
distributors mapping competitors, and market researchers pricing Indian goods.

**US$ 1.00 per 1,000 listings. No start fee, no monthly fee. Error rows, duplicates and listings outside your filters
are free.**

### At a glance

- **Price per 1,000 listings, Free plan:** US$ 1.00 (down to US$ 0.85 on Gold and above)
- **Fee per run start:** None
- **Suppliers per product beyond the first 28:** Yes, city x business-type lists (thousands)
- **City and business-type filters:** Yes (113 cities built in, any city by name)
- **One row per company:** Yes
- **Resumes after a platform restart without charging twice:** Yes

### What you can do with it

- **Find manufacturers for a product.** `searchTerms: ["cotton fabric"]`, `businessTypes: ["manufacturer"]`,
  `onePerCompany: true` gives one row per manufacturer, with phone, city, GST flag and rating.
- **Build a local supplier list.** Add `cities: ["Surat", "Ahmedabad"]` to keep only suppliers based there.
- **Compare prices across India.** Every row has the listed price, unit and minimum order quantity, with the
  product specs as key/value pairs.
- **Vet suppliers before you call.** GST verified, TrustSEAL, IndiaMART rating and number of ratings, year
  established and years on IndiaMART come in the same row.
- **Reuse an IndiaMART page you already have.** Paste `https://dir.indiamart.com/impcat/led-bulb.html` or a city page
  like `https://dir.indiamart.com/mumbai/led-bulb.html`; a `?biz=10` filter in the link is kept.
- **Feed a CRM or a spreadsheet.** Export CSV, Excel or JSON, or call it through the Apify API and schedule it.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | Product names, one per line (led bulb, cotton fabric, office chair, ss pipes). Each is matched to its IndiaMART category. |
| `startUrls` | IndiaMART list links: `/impcat/<product>.html`, `/<city>/<product>.html`, `m.indiamart.com/city/<city>/<product>.html`, with optional `?biz=`. |
| `cities` | Keep suppliers based in these cities (Mumbai, New Delhi, Ahmedabad...). Empty = all of India. |
| `businessTypes` | `manufacturer`, `wholesaler`, `retailer`, `exporter` (IndiaMART's own filter). Empty = all. |
| `maxResultsPerSearch` | Listings per product term or link. Default 100, up to 20,000. |
| `maxItems` | Hard cap on charged listings for the whole run. |
| `onePerCompany` | One row per supplier (the first product found for each company). |
| `gstVerifiedOnly` | Only suppliers with a verified GST registration. |
| `trustSealOnly` | Only suppliers with an IndiaMART TrustSEAL or Verified badge. |
| `withPhoneOnly` | Only listings that publish a business phone. |
| `minRating` | Only suppliers rated at least this (0 to 5). |
| `excludeKeywords` | Skip products whose name has any of these words (free). |

Example: 500 different LED bulb manufacturers with a verified GST registration, one row per company.

```json
{
  "searchTerms": ["led bulb"],
  "businessTypes": ["manufacturer"],
  "gstVerifiedOnly": true,
  "onePerCompany": true,
  "maxResultsPerSearch": 500
}
```

An empty input runs a small example (20 listings for "led bulb"), so the Actor never fails on a blank form.

### Output

One real row from a local test run on 2026-09-29 (search "led bulb", description shortened):

```json
{
  "type": "product",
  "productId": "2859174918233",
  "productName": "18W LED Bulb",
  "productUrl": "https://www.indiamart.com/proddetail/18w-led-bulb-2859174918233.html",
  "price": "₹ 95/Piece",
  "priceInr": 95.0,
  "priceUnit": "Piece",
  "minOrderQuantity": "100 Piece",
  "specs": {"Wattage": "18W", "Base Type": "B22", "Light Color": "Cool White", "Brand": "Dr Tronic"},
  "description": "We are engaged in offering 18W LED Bulb to our clients. ...",
  "imageUrl": "https://5.imimg.com/data5/SELLER/Default/2026/5/607362850/EN/YA/MG/251545806/18w-led-bulb-500x500.jpg",
  "imageUrlLarge": "https://5.imimg.com/data5/SELLER/Default/2026/5/607362850/EN/YA/MG/251545806/18w-led-bulb-1000x1000.jpg",
  "categoryName": "LED Bulb",
  "categoryId": "30613",
  "categoryUrl": "https://dir.indiamart.com/impcat/led-bulb.html",
  "companyName": "DR Tronic Electricals Private Limited",
  "companyId": "251545806",
  "companyUrl": "https://www.indiamart.com/dr-tronic-electricals/",
  "website": null,
  "phone": "+91 8048205884",
  "phoneType": "IndiaMART virtual number (PNS)",
  "city": "Ghaziabad",
  "locality": null,
  "state": "Uttar Pradesh",
  "businessType": "Manufacturer",
  "legalEntityType": "Company",
  "gstVerified": true,
  "gstNumber": "09AALCD8029J1Z6",
  "trustSeal": "TrustSEAL",
  "membershipTier": "LEADER",
  "yearEstablished": 2025,
  "memberSince": "1 yr",
  "rating": 3.0,
  "ratingCount": 2,
  "emailVerified": true,
  "mobileVerified": true,
  "logoUrl": null,
  "searchTerm": "led bulb",
  "cityFilter": null,
  "businessTypeFilter": null,
  "position": 2,
  "source": "term:led bulb",
  "scrapedAt": "2026-09-29T23:43:49Z",
  "errorCode": null,
  "error": null
}
```

- `phone` is the business number the listing publishes. On IndiaMART this is usually a **PNS virtual number** that
  forwards to the supplier (`phoneType` says so).
- `gstNumber` is returned for companies, firms and other entities. For **proprietorships and HUFs** it is left empty
  (their GSTIN contains the owner's personal PAN); `gstVerified` and `legalEntityType` still tell you what you need.
- `businessType` is the supplier's primary business on IndiaMART; `cityFilter` and `businessTypeFilter` tell you which
  IndiaMART list the row came from.

The run also saves `SEARCH_SUMMARY` in its key-value store: for each term or link, the IndiaMART category, how many
listings IndiaMART has for it, how many list pages were read and how many rows were delivered (free).

#### Error rows (never charged)

| errorCode | When |
|---|---|
| `NO_RESULTS` | The term matches no IndiaMART product category, or the list is empty with your filters. |
| `NOT_FOUND` | The IndiaMART list link does not exist. |
| `INVALID_URL` | The link is not an IndiaMART product list link. |
| `BLOCKED` | IndiaMART refused every attempt for that search. |
| `INVALID_INPUT` | A field has a value the Actor cannot use (the message says which). |
| `UNEXPECTED` | Anything else; the rest of the run continues. |

### Pricing

Pay per event, no start fee:

| Event | Price per 1,000 (Free plan) | Charged for |
|---|---|---|
| Product delivered | **US$ 1.00** | each unique product listing with its supplier |

Examples: 1,000 listings cost US$ 1.00. A list of 300 manufacturers with `onePerCompany` costs US$ 0.30. Error rows,
duplicates and filtered-out listings are free, and `maxItems` is a hard stop.

### How it works and limits

- It reads the same public product lists the IndiaMART website serves, over plain HTTP, through the Apify datacenter
  proxy with a fresh IP for every page (an Indian residential IP only as a reserve). No login, no browser.
- IndiaMART shows **28 listings per public list page** and asks visitors to log in with a phone number to see more.
  This Actor does not log in. Instead it reads the other public lists of the same product: the national list, the
  lists of **113 commercial cities** and the **business-type lists** (manufacturers, wholesalers, retailers,
  exporters), and removes duplicates. In our tests that gave 3,000 different "cotton fabric" listings from 2,772
  companies in 148 s, and 4,129 "led bulb" listings from 3,577 companies.
- With a city filter, each city gives up to about 140 listings (28 per business type). Add more cities for more.
- The order is IndiaMART's own ranking inside each list.
- **Only business data.** The Actor returns what the listing publishes as the supplier's business contact (the
  phone shown on the listing and the company website). It never returns contact-person names, email addresses,
  street addresses, PIN codes or map coordinates, and it does not enrich rows from other sources. Emails and phone
  numbers written inside product descriptions are replaced by `[contact removed]`.

### FAQ

**Do I need an IndiaMART account?** No. Everything comes from public pages.

**Why is the phone number not the supplier's own mobile?** IndiaMART publishes a PNS virtual number for most paid
suppliers; calls to it reach the supplier. That is the number every visitor sees.

**How many suppliers can I get for one product?** For common products, thousands (see the tests above). Niche
products have fewer listings on IndiaMART itself; `SEARCH_SUMMARY` shows how many exist.

**What if the run is restarted by the platform?** Listings already in the dataset are not charged again: the Actor
reads its own dataset when it starts and skips what was delivered.

**How fast is it?** In our tests: 300 listings in 10 s, 3,000 listings in 2.5 minutes.

### Changelog

- **0.1 (2026-09-29):** first version: product terms and list links, city and business-type lists, GST, TrustSEAL,
  rating and phone filters, one row per company, resume after restart.

Independent tool, not affiliated with IndiaMART InterMESH Ltd.

# Actor input Schema

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

Product names, one per line, as a buyer would type them, for example led bulb, cotton fabric, office chair or ss pipes. Each term is matched to its IndiaMART product category and returns up to 'Max results per search' product listings with their suppliers (company, city, phone when published, GST and TrustSEAL flags, rating, price). Each listing is charged once as 'Product delivered'.

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

IndiaMART product list links, one per line, for example https://dir.indiamart.com/impcat/led-bulb.html, a city list such as https://dir.indiamart.com/mumbai/led-bulb.html, or the mobile https://m.indiamart.com/city/mumbai/led-bulb.html. A ?biz=10 (manufacturers), 20 (exporters), 30 (wholesalers) or 40 (retailers) in the link is kept.

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

Only suppliers based in these cities, one per line, for example Mumbai, New Delhi, Ahmedabad or Ludhiana. Empty = all of India: the Actor reads the national list and then 113 commercial cities to reach more suppliers.

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

IndiaMART's own business-type filter: Manufacturers, Wholesalers or distributors, Retailers, Exporters. Pick one or more. Empty = all types.

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

How many product listings to take from each product term or link, from 1 to 20,000. Empty = 100. IndiaMART shows 28 listings per public list page; the Actor combines the city and business-type lists to go further (thousands of suppliers for common products). You pay per listing delivered.

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

Hard cap on charged listings for the whole run, across all terms and links, for example 500. Empty or 0 = no cap besides 'Max results per search'.

## `onePerCompany` (type: `boolean`):

Off (default). On: keep only the first product of each supplier, so every row is a different company, a clean lead list. Skipped listings are not charged.

## `gstVerifiedOnly` (type: `boolean`):

Off (default). On: keep only suppliers whose GST registration IndiaMART marks as verified. Skipped listings are not charged.

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

Off (default). On: keep only suppliers with an IndiaMART TrustSEAL or Verified badge. Skipped listings are not charged.

## `withPhoneOnly` (type: `boolean`):

Off (default). On: keep only suppliers that publish a business phone on the listing. Skipped listings are not charged.

## `minRating` (type: `string`):

Keep only suppliers rated at least this on IndiaMART, a number from 0 to 5, for example 4 or 4.2. Unrated suppliers are left out when set. Empty = any.

## `excludeKeywords` (type: `array`):

Words to leave out, one per line, for example used or repair. Listings with any of them in the product name are skipped and not charged. Empty = keep all products.

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

Apify datacenter proxy is the default and works for IndiaMART. Every page is fetched from a fresh IP; refused requests are retried on another IP, then on an Indian residential IP, with no extra charge. Change it only to use your own proxies.

## Actor input object example

```json
{
  "searchTerms": [
    "led bulb"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (type: `string`):

No description

# 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": [
        "led bulb"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/indiamart-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": ["led bulb"],
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/indiamart-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/y2BHyTGa6RVSzlfRe/builds/838Gt4jg8BdIb6Wzu/openapi.json
