# IndiaMART Supplier & Product Scraper (`straightforward_hydra/indiamart-supplier-scraper`) Actor

Scrape B2B suppliers and products from IndiaMART: product name, price and unit, specifications, plus the supplier's company, city, contact number, rating, years in business and GST verification. No API key.

- **URL**: https://apify.com/straightforward\_hydra/indiamart-supplier-scraper.md
- **Developed by:** [Dev D](https://apify.com/straightforward_hydra) (community)
- **Categories:** E-commerce, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## IndiaMART Supplier & Product Scraper

Scrape B2B suppliers and their products from
[IndiaMART](https://www.indiamart.com) — India's largest supplier directory.

Every row carries both sides of the listing: the **product** (name, price,
unit, specifications, brochure) and the **supplier** (company, city, contact
number, rating, years in business, GST verification, membership tier).

Paste a category URL, or just type what you are sourcing. No API key.

### Input

| Field | Meaning |
| --- | --- |
| `startUrls` | Category pages, e.g. `https://dir.indiamart.com/impcat/cnc-machines.html` |
| `searchTerms` | Plain phrases such as `submersible pump`, matched to a category |
| `maxProductsPerCategory` | Products per category (default 300) |
| `cityFanOut` | Visit the category city by city for depth (default on) |
| `maxCities` | How many cities per category (default 25, about 50 exist) |
| `proxyConfiguration` | **Required** — see below |

### Output

One row per supplier product:

```json
{
  "product_id": 2853643866130,
  "product_name": "Fabricated MS Pipe",
  "product_url": "https://www.indiamart.com/proddetail/fabricated-ms-pipe-2853643866130.html",
  "price": 100.0,
  "price_display": "₹ 100/Kg",
  "currency": "INR",
  "price_unit": "Kg",
  "specifications": {"Outer Diameter": "50 mm", "Material": "Mild Steel"},
  "supplier": "Manisha Steel Centre",
  "supplier_id": 79233012,
  "supplier_url": "https://www.indiamart.com/manishasteelcentre/",
  "contact_number": "7949340839",
  "city": "Mumbai",
  "country": "India",
  "membership": "STAR",
  "member_since": "7 yrs",
  "rating": 4.3,
  "rating_count": 106,
  "response_rate": 85.0,
  "gst_verified": true,
  "category": "MS Pipe",
  "listing_city": "all-india"
}
```

### How depth works — please read

An IndiaMART category page hands over **28 products and no next page**. Every
paging parameter — `pg`, `page`, `start`, `offset`, `bpos`, `pn` — is accepted
and ignored; each returns the same 28 with at most one swapped.

What does change the results is the **city**. The same category under each of
the ~50 cities in the page's own city list returns a largely different 28, so
`cityFanOut` walks them and de-duplicates by product ID. Eight cities already
give about 190 distinct products, and the full list gives roughly a thousand.

Two honest limits:

- Products are what IndiaMART chooses to feature per city, so a category with
  28,000 listings will not be exhausted. This gets you a broad, current
  cross-section, not the entire catalogue.
- Searching by keyword resolves to a **category page**, because IndiaMART's
  search redirects non-Indian traffic to a different, much thinner export
  site. Most phrases match; when one does not, the run tells you plainly
  instead of returning an empty dataset.

### Rate limiting and the proxy

IndiaMART blocks by address, using two different codes. An address it dislikes
gets an instant **403** on the first request. An address it has been tolerating
gets **429** once it passes a budget of roughly forty requests, and that block
then lasts minutes rather than seconds. Apify's default address is in the first
category: every proxy-less test run of this Actor came back with zero rows,
while the same search through the proxy returned a full dataset in 13 seconds.

**So the proxy is on by default and should stay on.** The Actor takes a pool of
a dozen proxy addresses and rotates through them — a 403 or 429 moves to the
next address and retries instead of ending the run, and addresses are rotated
proactively before the 40-request budget runs out. Only when every address in
the pool is blocked does the run stop, and even then it stops cleanly, keeps
everything already collected, and says so in the status message.

### Pay per event

| Event | When |
| --- | --- |
| `product` | One supplier product, with its supplier details |

Products returned by more than one city or category are de-duplicated by
`product_id` and charged once.

# Actor input Schema

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

IndiaMART category pages, e.g. https://dir.indiamart.com/impcat/cnc-machines.html for all of India, or https://dir.indiamart.com/mumbai/cnc-machines.html for one city. A search URL (dir.indiamart.com/search.mp?ss=...) is accepted too and is treated as the phrase it contains.

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

Plain phrases such as 'submersible pump'. Each is matched to an IndiaMART category page. If no category matches, the run says so rather than returning nothing silently.

## `maxProductsPerCategory` (type: `integer`):

How many products to collect per category. One IndiaMART page holds 28, so more than that is gathered by visiting the category in each city.

## `cityFanOut` (type: `boolean`):

IndiaMART serves 28 products per category page and has no next page. Visiting the same category city by city is the only way to go deeper. Turn this off for a single fast page of 28.

## `maxCities` (type: `integer`):

Cities to visit per category, taken from the category page's own city list (about 50 exist). IndiaMART rate-limits per address, so the proxy does the work of keeping a large fan-out alive.

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

IndiaMART blocks datacenter traffic outright, including Apify's default address — without a proxy a run returns nothing. Leave this on. Residential addresses work best.

## Actor input object example

```json
{
  "startUrls": [
    "https://dir.indiamart.com/impcat/cnc-machines.html",
    "https://dir.indiamart.com/impcat/led-lights.html"
  ],
  "searchTerms": [
    "submersible pump"
  ],
  "maxProductsPerCategory": 300,
  "cityFanOut": true,
  "maxCities": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `products` (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 = {
    "startUrls": [
        "https://dir.indiamart.com/impcat/cnc-machines.html",
        "https://dir.indiamart.com/impcat/led-lights.html"
    ],
    "searchTerms": [
        "submersible pump"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("straightforward_hydra/indiamart-supplier-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 = {
    "startUrls": [
        "https://dir.indiamart.com/impcat/cnc-machines.html",
        "https://dir.indiamart.com/impcat/led-lights.html",
    ],
    "searchTerms": ["submersible pump"],
}

# Run the Actor and wait for it to finish
run = client.actor("straightforward_hydra/indiamart-supplier-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 '{
  "startUrls": [
    "https://dir.indiamart.com/impcat/cnc-machines.html",
    "https://dir.indiamart.com/impcat/led-lights.html"
  ],
  "searchTerms": [
    "submersible pump"
  ]
}' |
apify call straightforward_hydra/indiamart-supplier-scraper --silent --output-dataset

```

## MCP server setup

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