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

Extract public IndiaMART products, suppliers, displayed prices, locations, ratings, verification signals, and specifications for sourcing research.

- **URL**: https://apify.com/automation-lab/indiamart-supplier-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (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

Pay per event

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/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 and Product Scraper

Extract public IndiaMART product and supplier listings for repeatable sourcing, vendor comparison, category research, and data-pipeline workflows.

The Actor accepts category terms such as `cotton fabric` or real IndiaMART category URLs. It returns one typed row per product card with the supplier, displayed price, city, rating, verification signals, specifications, and source links.

It uses an India residential browser session because direct and datacenter access to IndiaMART category pages is blocked. Images, fonts, and media transfers are disabled to reduce runtime and proxy cost without removing fields from the rendered listings.

### What can you extract from IndiaMART?

Each result can include:

| Field | Meaning |
| --- | --- |
| `productId` | Stable identifier parsed from the product URL |
| `productName` | Displayed product title |
| `productUrl` | Public IndiaMART product detail URL |
| `imageUrl` | Product image URL shown in the card |
| `displayedPrice` | Price text as IndiaMART displays it |
| `price` | Parsed numeric price when available |
| `currency` | `INR` when the rupee symbol is displayed |
| `unit` | Pricing unit such as Meter or Watt |
| `supplierName` | Displayed company or supplier name |
| `supplierUrl` | Public supplier catalog or company URL |
| `location` | Displayed supplier city |
| `yearsInBusiness` | Displayed supplier tenure |
| `rating` | Displayed rating from zero to five |
| `ratingCount` | Number of displayed ratings |
| `responseRate` | Displayed response percentage |
| `badges` | TrustSEAL, verification, or supplier badges |
| `isVerified` | Normalized verification flag |
| `specifications` | Product attributes as key/value pairs |
| `category` | Category heading on the source page |
| `searchQuery` | Original category term, when supplied |
| `sourceUrl` | Category page used for extraction |
| `scrapedAt` | UTC extraction timestamp |

Fields can be null when IndiaMART does not display that fact on a listing.

### Who is this IndiaMART scraper for?

- Procurement teams building an initial supplier shortlist.
- Importers comparing displayed prices and product specifications.
- Manufacturers researching competing offers in a B2B category.
- Sales operations teams segmenting public suppliers by location or trust signal.
- Analysts collecting repeatable category snapshots for change comparison.
- Data engineers loading public marketplace records into spreadsheets, warehouses, or BI tools.

The Actor does not require an IndiaMART login and does not expose private account data.

### Why use this Actor?

- Search by familiar product or category terms.
- Target a real category or city/category URL precisely.
- Apply rating, location, and verification filters before saving rows.
- Receive consistent typed records instead of raw HTML.
- Deduplicate products by their stable IndiaMART product ID.
- Rotate bounded browser sessions on upstream blocks or timeouts.
- Stop at the configured limit; only saved rows trigger the item event.
- Export results in JSON, CSV, Excel, XML, RSS, or HTML through Apify.

Unlike a generic page extractor, this Actor understands IndiaMART product cards and supplier trust signals.

### How to scrape IndiaMART suppliers and products

1. Open the Actor in Apify Console.
2. Add one or more values to **Product or category searches**.
3. Optionally add exact IndiaMART category URLs.
4. Set the maximum number of products.
5. Optionally filter by supplier location, rating, or verification.
6. Keep the default India residential proxy unless you have tested another compatible proxy.
7. Click **Start**.
8. Open the **Products and suppliers** dataset view.
9. Export or integrate the resulting records.

A good first run is:

```json
{
  "searchQueries": ["cotton fabric"],
  "maxItems": 10
}
```

### Input parameters

#### `searchQueries`

An array of IndiaMART category terms.

The Actor converts each term to a public category slug. For example, `cotton fabric` becomes:

`https://dir.indiamart.com/impcat/cotton-fabric.html`

IndiaMART controls category names. If a phrase does not map to a real category, use an exact URL in `startUrls` instead.

#### `startUrls`

Optional public pages on `dir.indiamart.com`.

Supported paths are:

- `/impcat/<category>.html`
- `/<city>/<category>.html`

Search result pages, supplier private dashboards, and non-IndiaMART URLs are rejected.

#### `maxItems`

Maximum unique records saved across all sources.

Allowed range: 1–500.

#### `location`

Case-insensitive substring matched against the displayed supplier city.

Example: `Ahmedabad`.

#### `minRating`

Minimum displayed supplier rating from 0 to 5.

Listings without a rating are excluded when this filter is active.

#### `verifiedOnly`

When true, keeps listings with a displayed verification or TrustSEAL badge.

#### `maxRequestRetries`

Number of new browser/proxy sessions attempted after a block, timeout, or unrecognized page.

Allowed range: 0–3. Default: 2.

#### `proxyConfiguration`

Defaults to Apify residential proxies in India.

Disabling or replacing the proxy is supported for advanced users, but direct and datacenter routes were blocked during implementation testing.

### Output example

```json
{
  "productId": "12345678901",
  "productName": "Industrial Cotton Fabric",
  "productUrl": "https://www.indiamart.com/proddetail/industrial-cotton-fabric-12345678901.html",
  "imageUrl": "https://5.imimg.com/data5/EXAMPLE/product-500x500.jpg",
  "displayedPrice": "₹ 130 / Meter",
  "price": 130,
  "currency": "INR",
  "unit": "Meter",
  "supplierName": "Example Textiles Private Limited",
  "supplierUrl": null,
  "location": "Ahmedabad",
  "yearsInBusiness": 9,
  "rating": 4.6,
  "ratingCount": 125,
  "responseRate": 88,
  "badges": ["Verified Exporter"],
  "isVerified": true,
  "specifications": {
    "Material": "Cotton",
    "Color": "Blue"
  },
  "category": "Cotton Fabric",
  "searchQuery": "cotton fabric",
  "sourceUrl": "https://dir.indiamart.com/impcat/cotton-fabric.html",
  "scrapedAt": "2026-08-10T12:00:00.000Z"
}
```

The example is anonymized. Actual records contain facts currently displayed on public IndiaMART cards.

### Filtering and vendor comparison

Filters are applied consistently to category terms and explicit URLs.

For a trust-focused shortlist:

```json
{
  "searchQueries": ["cotton fabric", "solar panels"],
  "verifiedOnly": true,
  "minRating": 4,
  "maxItems": 40
}
```

Save recurring runs to separate datasets, then join records by `productId` to compare price, rating, badge, supplier, or specification changes.

The Actor does not provide built-in alerts or historical storage. Apify schedules, webhooks, integrations, and your own destination provide those workflow layers.

### How much does it cost to scrape IndiaMART supplier records?

The Actor uses pay-per-event pricing:

- one `start` event per run;
- one `item` event for each product-and-supplier row saved.

The start event costs **$0.0025**. Item prices use six decreasing volume tiers: FREE $0.0022716, BRONZE $0.0019753, SILVER $0.0015407, GOLD $0.0011852, PLATINUM $0.00079012, and DIAMOND $0.00055308 per saved row. Residential proxy and browser infrastructure are included rather than billed as a separate Actor event.

At BRONZE pricing, the total is approximately $0.0045 for 1 row, $0.0124 for 5, $0.0223 for 10, $0.0519 for 25, or $0.2000 for 100. A filter that saves no rows incurs the start event but no item events.

### Tips for reliable sourcing runs

- Prefer the category wording used on IndiaMART.
- Use exact category URLs when a search term returns a 404.
- Split unrelated categories into separate scheduled tasks when you want independent snapshots.
- Keep India residential proxy geography for stable access.
- Start with 10–25 records before increasing the limit.
- Use `verifiedOnly` as a trust signal, not as a guarantee of supplier performance.
- Verify critical commercial facts directly with the supplier before purchasing.
- Treat displayed prices as marketplace observations, not binding quotations.

### Limits and failure behavior

- IndiaMART can change category routes, page markup, and visible fields.
- A category page currently exposes a bounded set of product cards; the Actor does not claim exhaustive marketplace coverage.
- Some products omit price, rating, tenure, response rate, or verification.
- A category term that does not map to a real slug can return 404.
- Challenge pages and unrelated static decoy listings are rejected.
- The run fails after bounded retries if no recognizable cards can be extracted.
- Valid filters can naturally produce a successful run with zero rows.
- The Actor does not click contact buttons or reveal gated phone numbers or email addresses.

### Export IndiaMART data

Every run writes primary results to the default Apify dataset.

You can export it as:

- JSON for applications and AI workflows;
- CSV or Excel for sourcing teams;
- XML or RSS for compatible automation systems;
- HTML for quick human review.

Use dataset field selection and unfolding options in Apify Console to customize exports.

### Schedule supplier research

Create an Apify Task with stable input, then set a schedule.

Example workflow:

1. Run every Monday.
2. Export results to a dated destination table.
3. Join on `productId`.
4. Compare price, supplier, rating, and badge fields.
5. Route material changes to a reviewer.

This supports recurring comparison without claiming that the Actor itself stores history or sends alerts.

### Use webhooks and integrations

After a successful run, an Apify webhook can:

- start another Actor;
- call an HTTPS endpoint;
- notify Slack or email through an integration;
- send the dataset to Make, Zapier, Google Sheets, or a database;
- trigger enrichment or internal supplier-review logic.

Use the run's default dataset ID to retrieve exactly that run's rows.

### Run with the Apify API using cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~indiamart-supplier-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQueries": ["cotton fabric"],
    "maxItems": 10
  }'
```

For synchronous use, call `run-sync-get-dataset-items` when your client can wait for completion.

Never commit your Apify token to source control.

### Run with JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/indiamart-supplier-scraper').call({
    searchQueries: ['solar panels'],
    verifiedOnly: true,
    maxItems: 20,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/indiamart-supplier-scraper').call(run_input={
    'searchQueries': ['cotton fabric'],
    'minRating': 4,
    'maxItems': 20,
})

items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use IndiaMART data with MCP and AI agents

Add the Actor to Claude Code through Apify MCP:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/indiamart-supplier-scraper"
```

Claude Desktop, Cursor, and VS Code can use the same MCP server JSON configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/indiamart-supplier-scraper"
    }
  }
}
```

Example prompts:

- “Find 20 verified solar panel supplier listings on IndiaMART and summarize price units by city.”
- “Extract cotton fabric products rated at least 4 and create a vendor comparison table.”
- “Run my saved IndiaMART sourcing task and flag product IDs whose displayed prices changed.”

An AI-generated shortlist still requires human commercial verification.

### Responsible use and legality

This Actor extracts facts displayed on public IndiaMART category pages.

You are responsible for:

- complying with applicable laws, contracts, and platform terms;
- using personal and business data for a lawful purpose;
- respecting intellectual property and database rights;
- limiting collection to what your workflow needs;
- securing exports and controlling retention;
- avoiding spam, harassment, discrimination, or deceptive outreach;
- verifying suppliers and commercial claims independently.

Do not use the Actor to bypass authentication, access private accounts, or automate contact actions.

### Troubleshooting

#### Why did my category return 404?

IndiaMART category slugs do not always match a general phrase. Open the public category page in a browser and provide its exact `dir.indiamart.com/...html` URL through `startUrls`.

#### Why are there zero records?

The page may be valid while your location, rating, or verification filters exclude every card. Remove filters and run a small test. If the run reports a block or unrecognized shape instead, keep the default India residential proxy and retry later.

#### Why is a displayed price null?

Some suppliers ask buyers to request a quote. The Actor keeps the useful product and supplier row while leaving price fields null.

#### Can this Actor reveal phone numbers or emails?

No. It does not click gated contact controls or claim access to private contact data.

#### Does it support IndiaMART login?

No login is required or accepted. The Actor uses public category pages only.

### FAQ

#### Can I scrape one exact category?

Yes. Add its public category URL to `startUrls` and set `searchQueries` to an empty array.

#### Can I filter by city?

Yes. Use `location`, or supply a real city/category URL when available.

#### Can I compare multiple categories?

Yes. Add multiple category terms or URLs. `maxItems` applies across the full run.

#### Are verification badges guarantees?

No. They are public marketplace signals. Perform your own supplier due diligence.

#### Is the data real time?

Rows reflect what the category page displayed during the run. The Actor does not guarantee when IndiaMART last updated each fact.

#### Can I run it on a schedule?

Yes. Save the input as an Apify Task and attach a schedule.

### Related automation-lab Actors

- [DHgate Product & Supplier Scraper](https://apify.com/automation-lab/dhgate-product-supplier-scraper) for DHgate wholesale products and sellers.
- [Made-in-China Scraper](https://apify.com/automation-lab/made-in-china-scraper) for another B2B supplier marketplace.
- [AliExpress Products & Seller Catalog Scraper](https://apify.com/automation-lab/aliexpress-products-scraper) for AliExpress product and seller catalog research.

Use separate Actors for separate sources, then normalize records downstream for cross-market comparison.

### Support

If a current public category repeatedly fails with the default proxy, include:

- the exact Actor run URL;
- the input with secrets removed;
- the affected category URL;
- the expected and observed behavior.

That evidence helps distinguish a category mapping issue from an upstream page change.

# Actor input Schema

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

IndiaMART category terms such as cotton fabric, solar panels, or packaging machines.

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

Optional dir.indiamart.com category or city/category pages ending in .html.

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

Maximum unique product and supplier records saved across all inputs.

## `location` (type: `string`):

Keep suppliers whose displayed city contains this value, for example Ahmedabad.

## `minRating` (type: `number`):

Keep only products from suppliers with at least this displayed rating.

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

Keep only suppliers displaying a verification or TrustSEAL badge.

## `maxRequestRetries` (type: `integer`):

Browser session rotations after an upstream block or timeout.

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

India residential proxy is used by default because IndiaMART blocks direct and datacenter access.

## Actor input object example

```json
{
  "searchQueries": [
    "cotton fabric"
  ],
  "startUrls": [
    {
      "url": "https://dir.indiamart.com/impcat/solar-panels.html"
    }
  ],
  "maxItems": 20,
  "verifiedOnly": false,
  "maxRequestRetries": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Default dataset containing all accepted IndiaMART product and supplier records.

# 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 = {
    "searchQueries": [
        "cotton fabric"
    ],
    "startUrls": [
        {
            "url": "https://dir.indiamart.com/impcat/solar-panels.html"
        }
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/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 = {
    "searchQueries": ["cotton fabric"],
    "startUrls": [{ "url": "https://dir.indiamart.com/impcat/solar-panels.html" }],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/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 '{
  "searchQueries": [
    "cotton fabric"
  ],
  "startUrls": [
    {
      "url": "https://dir.indiamart.com/impcat/solar-panels.html"
    }
  ],
  "maxItems": 20
}' |
apify call automation-lab/indiamart-supplier-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/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/3eTZoCUh4kUwBx4yj/builds/h7S5tDLFH46PaKz01/openapi.json
