# IndiaMART Product Scraper — Specs, Prices, Suppliers by City (`yugenox/indiamart-product-scraper`) Actor

Scrape IndiaMART products with the full record: price, MOQ, specs, images, PDF catalogue, category, and the seller's GST status, turnover, employees, year established, ratings and export countries. Find suppliers in any Indian city and crawl related products. No login; pay only for products saved.

- **URL**: https://apify.com/yugenox/indiamart-product-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

$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/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 Product Scraper — full product & supplier records, suppliers by city, related products

Scrape **IndiaMART** products with the complete record behind each listing: price, minimum order, full specification table, every image, PDF catalogue, category path, and a detailed **seller profile** (GST verification, annual turnover band, employee count, year established, legal status, ratings with delivery / quality / response scores, export countries, IndiaMART phone number, website).

Start from product links, keywords or category pages, add **cities** to find suppliers in Mumbai, Delhi, Bengaluru, Surat or anywhere else in India, and let the actor **follow IndiaMART's own "similar products" recommendations** to discover hundreds of related sellers from a handful of seeds.

No IndiaMART account, cookies or login needed.

**Never fails on you.** Whatever happens — blocked proxy IPs, IndiaMART changing a response, a product that no longer exists, a mistyped link — the run finishes successfully with everything it could collect and a status message that says what happened. You are charged only for product rows actually written; not-found rows and errors are free.

### What you get for every product

| Group | Fields |
|---|---|
| Product | name, short name, Hindi name, description, product ID, link, last updated |
| Price | price text (`₹ 250 / Piece`), numeric price, currency, unit, **minimum order quantity + unit**, FOB price |
| Specs & media | full specification table (name / value), all images (original size), PDF catalogue link, packaging, delivery time, production capacity, port of dispatch |
| Category | product category, parent category, category, industry, breadcrumb, alternate names, category page link |
| Seller | company name, IndiaMART storefront, own website, TrustSEAL link, logo, city, state, address, country |
| Seller facts | business type (manufacturer / exporter / wholesaler …), additional business types, legal status, year established, employees, **annual turnover**, member since, membership tier, certifications, banker |
| Verification | **GST verified**, GSTIN (masked for sole proprietors), GST registration year, GST turnover band, GST nature of business, import-export code, CIN (companies), e-mail / mobile verified |
| Reputation | rating, number of ratings, 5-to-1 star breakdown, **on-time delivery %, quality %, response %** |
| Trade | top export countries, preferred countries |
| Provenance | how the row was found (your link / search / category / city / related product) |

Optional: **related products** attached to every row (name, price, seller, city, link of up to 30 similar products), and the **raw IndiaMART fields**.

### How to use it

#### 1. Product details from links or IDs

Paste product links (`https://www.indiamart.com/proddetail/…-21084332162.html`, `m.` and `hindi.` links work too) or just the product IDs.

```json
{
  "productUrls": [
    "https://www.indiamart.com/proddetail/d-lock-leather-diary-21084332162.html",
    "2573588330"
  ]
}
```

#### 2. Suppliers of a product in specific cities

Give a keyword, a category or a product, and the cities you care about. The actor takes the product categories your input leads to and pulls **that category's suppliers in each city**.

```json
{
  "searchQueries": ["cotton kurti"],
  "cities": ["Surat", "Ahmedabad", "Jaipur"],
  "maxItems": 300
}
```

Keep **Only keep sellers in these cities** on (default) to get a clean city list, or turn it off to also keep the nationwide search results.

#### 3. Crawl related products (discover beyond the search results)

IndiaMART shows at most two pages of results per keyword. **Related products depth** follows the "similar products" IndiaMART recommends on every product page — each product leads to ~20 more from other sellers in the same category.

```json
{
  "productUrls": ["21084332162"],
  "fanOutDepth": 2,
  "maxItems": 500
}
```

#### 4. Category pages

```json
{
  "categoryUrls": [
    "https://dir.indiamart.com/impcat/dry-ice.html",
    "https://dir.indiamart.com/mumbai/leather-diaries.html"
  ],
  "fanOutDepth": 1
}
```

### Input

| Field | What it does |
|---|---|
| **Product links or IDs** | Product pages or IDs to scrape. |
| **Search keywords** | Keywords; up to ~95 products each from IndiaMART's result pages. |
| **Category links** | Category pages (`/impcat/<name>.html`, `/<city>/<name>.html`) or just the category name slug. |
| **Cities** | Indian cities to find suppliers in. Common alternate spellings work (Bangalore, Bombay, Gurugram…). |
| **Only keep sellers in these cities** | On by default when cities are set. |
| **Related products depth** | 0 = only what you asked for; 1–3 = follow IndiaMART's similar-product recommendations. |
| **Max products** | Stop after this many products (default 100). Also accepted as `maxResults` / `limit`; keywords as `keywords` / `queries`, links as `urls` / `startUrls`, cities as `city`. |
| **Attach related products to each row** | Adds a `relatedProducts` list to each row. |
| **Include raw IndiaMART fields** | Adds the original field names/values under `raw`. |
| **Search pages per keyword** | 1 or 2. |
| **Max concurrency** | Parallel requests (default 8). |
| **Proxy configuration** | Datacenter by default (cheapest). If datacenter IPs keep getting refused, the actor switches to residential (India) automatically when your plan includes it. |

### Output example

```json
{
  "status": "ok",
  "displayId": "21084332162",
  "url": "https://www.indiamart.com/proddetail/21084332162.html",
  "name": "D Lock Leather Diary, Size: B6",
  "priceText": "₹ 250 / Piece",
  "price": 250,
  "currency": "INR",
  "priceUnit": "Piece",
  "minOrderQuantity": 100,
  "minOrderUnit": "Piece",
  "productCategory": "Leather Diaries",
  "parentCategory": "Diaries",
  "category": "Files, Folders & Notebooks",
  "breadcrumb": ["Files, Folders & Notebooks", "Diaries", "Leather Diaries"],
  "specifications": [
    { "name": "Size", "value": "B6" },
    { "name": "Cover Material", "value": "Leather" },
    { "name": "Color", "value": "Brown" }
  ],
  "imageUrl": "https://5.imimg.com/data5/OV/XG/KD/SELLER-13727276/leather-d-lock-dairey.jpg",
  "images": ["https://5.imimg.com/…/leather-d-lock-dairey.jpg", "https://5.imimg.com/…/d-lock-leather-diary.jpg"],
  "catalogPdfUrl": "https://5.imimg.com/data5/SELLER/Doc/2023/1/NN/PX/AR/13727276/d-lock-leather-diary.pdf",
  "lastUpdated": "2025-12-19T18:10:29.000Z",
  "seller": {
    "companyName": "M.S. Hilal International",
    "storefrontUrl": "https://www.indiamart.com/mshilalinternational/",
    "website": "https://www.mshilalinternational.in/",
    "city": "Jaipur",
    "state": "Rajasthan",
    "businessType": "Manufacturer",
    "legalStatus": "Individual - Proprietor",
    "yearEstablished": 2014,
    "employees": "26 to 50 People",
    "annualTurnover": "Rs. 2 - 5 Crore",
    "memberSince": "2015-01-30",
    "gstVerified": true,
    "gstin": "08**********1ZT",
    "gstAnnualTurnover": "40 L - 1.5 Cr",
    "contactNumber": "+91-8047642377",
    "rating": 4.5,
    "ratingCount": 72,
    "ratingBreakdown": { "five": 50, "four": 8, "three": 2, "two": 3, "one": 9 },
    "onTimeDeliveryPct": 81,
    "qualityPct": 86,
    "responsePct": 82,
    "topExportCountries": ["United States Of America", "United Kingdom", "Sri Lanka", "Canada", "Australia"]
  },
  "source": { "type": "product", "input": "https://www.indiamart.com/proddetail/d-lock-leather-diary-21084332162.html" },
  "dataSource": "api",
  "scrapedAt": "2026-09-24T07:10:00.000Z"
}
```

A product ID that no longer exists on IndiaMART comes back as `{ "status": "not_found", "displayId": "…" }` so you can clean your list — it is not charged.

### Use cases

- **Sourcing & procurement** — compare prices, MOQs and specifications across dozens of suppliers of the same product.
- **Supplier shortlists by city** — every GST-verified manufacturer of X in Surat or Ludhiana, with turnover band, employee count and ratings.
- **Sales prospecting** — build lists of manufacturers / exporters in a category with their IndiaMART phone number and website.
- **Market & price research** — track price ranges per category and city, and how they change over time.
- **Catalogue enrichment** — pull full specs, images and PDF catalogues for products you already know.

### FAQ

**How many products can I get?** IndiaMART shows ~95 products per keyword and 28 per category page. Cities multiply that (each category × city is a separate list), and **Related products depth** keeps discovering new sellers through recommendations — hundreds to thousands per run.

**Why is `contactNumber` not the seller's personal mobile?** It is the number IndiaMART publishes on the listing, which forwards calls to the seller. Personal names of sole proprietors are never included, and GST / import-export numbers that contain a proprietor's personal PAN are masked.

**Does "Delhi" include Noida, Gurugram or Ghaziabad?** No — cities are matched on the seller's own town. Add `Noida`, `Gurugram`, `Ghaziabad`, `Faridabad` as extra cities for the whole NCR (same for `Navi Mumbai`, `Thane`, `Pimpri Chinchwad`…), or turn off **Only keep sellers in these cities** to keep IndiaMART's wider city results.

**Some fields are empty.** Sellers fill in their profiles themselves — turnover, employees or year of establishment are simply missing on some listings. Everything IndiaMART shows is collected.

**Do I need a proxy?** The default Apify datacenter proxy works. The actor checks each IP and keeps the ones that respond; if none do, it falls back to residential (India) if your plan includes it. If every IP is refused, the run ends with 0 results and no charge.

**Is it fast?** Around 10 products per second on the default settings.

**Is it legal to scrape IndiaMART?** This actor collects only information IndiaMART shows publicly to any visitor without logging in: product listings and the business profile each seller chose to publish. Most rows describe businesses, but some can still contain personal data — for example the business name, address or IndiaMART contact number 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 IndiaMART'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 IndiaMART account, cookies or tokens — it reads only public product and seller pages, the same ones any visitor sees. It also leaves out personal details even where IndiaMART shows them: sole proprietors' personal names are not included (and are removed from descriptions), GST and import-export numbers that contain a proprietor's personal PAN are masked, CEO / partner names and the registered address are dropped, and no e-mail addresses are collected. The phone number is the IndiaMART call-forwarding number published on the listing.

# Actor input Schema

## `productUrls` (type: `array`):

IndiaMART product pages (any www / m. / hindi. link that contains /proddetail/) or the product ID — the long number at the end of the link. Each one returns the full product + seller record.

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

Keywords to search IndiaMART for, e.g. "leather diary" or "dry ice". Each keyword returns up to ~95 products (IndiaMART shows 2 result pages). Use "Related products depth" or "Cities" to go further.

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

IndiaMART category pages, e.g. https://dir.indiamart.com/impcat/leather-diaries.html or a city page like https://dir.indiamart.com/mumbai/leather-diaries.html. You can also type just the category slug (leather-diaries).

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

Find sellers in these Indian cities (e.g. Mumbai, Delhi, Bengaluru, Jaipur). For every product category your links / keywords / categories lead to, the actor also pulls that category's suppliers in each city.

## `onlyInCities` (type: `boolean`):

When cities are set, drop products whose seller is located elsewhere. Turn off to keep everything the search finds plus the city suppliers.

## `fanOutDepth` (type: `integer`):

0 = only the products you asked for. 1 = also products IndiaMART recommends on each of those pages (similar products from other sellers, ~20 each). 2-3 = keep following recommendations. Always stops at "Max products".

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

Stop after saving this many products. You only pay for products saved. Also accepted as maxResults / limit.

## `includeRelatedProducts` (type: `boolean`):

Add a "relatedProducts" list (name, price, seller, city, link) of up to 30 similar products to every row. One extra request per product.

## `includeRawFields` (type: `boolean`):

Also add the original IndiaMART field names and values under "raw" (business fields only).

## `maxPagesPerQuery` (type: `integer`):

IndiaMART shows at most 2 pages of search results (~45 products each).

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

Parallel requests. The default is fast and gentle; raise it for very large runs.

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

Datacenter proxy is the default and the cheapest; the actor tests each IP and keeps the ones IndiaMART accepts. If datacenter IPs keep getting refused it switches to residential (India) automatically when your plan has it.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.indiamart.com/proddetail/d-lock-leather-diary-21084332162.html",
    "https://www.indiamart.com/proddetail/dry-ice-slice-2573588330.html"
  ],
  "onlyInCities": true,
  "fanOutDepth": 1,
  "maxItems": 20,
  "includeRelatedProducts": false,
  "includeRawFields": false,
  "maxPagesPerQuery": 2,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped products.

## `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 = {
    "productUrls": [
        "https://www.indiamart.com/proddetail/d-lock-leather-diary-21084332162.html",
        "https://www.indiamart.com/proddetail/dry-ice-slice-2573588330.html"
    ],
    "fanOutDepth": 1,
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/indiamart-product-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 = {
    "productUrls": [
        "https://www.indiamart.com/proddetail/d-lock-leather-diary-21084332162.html",
        "https://www.indiamart.com/proddetail/dry-ice-slice-2573588330.html",
    ],
    "fanOutDepth": 1,
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/indiamart-product-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 '{
  "productUrls": [
    "https://www.indiamart.com/proddetail/d-lock-leather-diary-21084332162.html",
    "https://www.indiamart.com/proddetail/dry-ice-slice-2573588330.html"
  ],
  "fanOutDepth": 1,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/indiamart-product-scraper --silent --output-dataset

```

## MCP server setup

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