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

AI-ready IndiaMART B2B leads - one rich row per product: company, price (INR + USD), E.164 phone, GST factsheet, numeric turnover, export countries, images. Built for lead-gen, sourcing, KYC & AI/agent pipelines. Fast HTTP, residential proxy, charged per product.

- **URL**: https://apify.com/leaderly\_jackpine/indiamart-supplier-scraper.md
- **Developed by:** [William](https://apify.com/leaderly_jackpine) (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 $2.00 / 1,000 product scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

> **AI-ready B2B leads from India's largest marketplace.** Structured, agent-friendly rows you can drop straight into CRM, sourcing, KYC and AI/agent pipelines — with normalised INR + USD prices, E.164 phones, numeric GST turnover, export-destination signals, images and full business factsheets. Ideal for procurement, exporter discovery, market mapping and lead generation.

Surfaces **B2B supplier and product catalogue data** from [IndiaMART](https://www.indiamart.com/) (India's largest B2B marketplace) for supplier discovery, catalogue building and due diligence. Returns **one dataset row per product detail page**, enriched with company name, product title, price, images, category breadcrumb, location, IndiaMART member-since year, a GST/business factsheet, call response rate and supplier contact details.

You are **charged per successfully parsed product** (pay-per-event). Failed or blocked parses are pushed as free status rows.

### Why this actor

- **Schema richness.** Beyond the basics, every row carries a structured `businessFactsheet` (year established, nature of business, GST turnover range, legal status, additional NOB), `performance.callResponseRate`, a category breadcrumb, and a full image list, drawn from the page's embedded data and JSON-LD.
- **Reliability without a browser.** IndiaMART is fully server-rendered with no anti-bot wall, so the actor uses a fast HTTP CheerioCrawler (no Playwright). That means lower memory and fewer moving parts. Note: IndiaMART **blocks Apify datacenter IPs with HTTP 403**, so the actor runs on the Apify **residential** proxy by default (the main running cost).
- **Clean output shape.** Catalogue fields are top-level; contact is nested under `supplier.contact` so it is easy to include or exclude downstream.
- **Built for non-India buyers too.** Indian-market conventions are normalised so international sourcing/procurement teams can use the data directly: prices carry a numeric `priceAmount` (INR) **and** an approximate `priceUsd` (the `fxRate` + `fxRateAsOf` used are exposed so you can recompute with a live rate); GST turnover ("1.5 - 5 Cr") is parsed into absolute `gstTurnoverInr`/`gstTurnoverUsd` ranges; phone numbers are normalised to **E.164** (`+918043862189`, ready for Twilio/WhatsApp); `location.countryCode` is `IN`; and `supplier.exportCountries` flags registered export destinations. `supplier.businessFactsheet.gstNumber` and `iecCode` (exporter code) are included where the page exposes them.

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | string\[] | *(required)* | IndiaMART category URLs (`https://dir.indiamart.com/impcat/<slug>.html`) and/or product detail URLs (`https://www.indiamart.com/proddetail/<slug>-<id>.html`). Both may be mixed. |
| `maxProducts` | integer | `200` | Maximum product detail pages to parse. This is the **charged unit** and is enforced at the crawler level (1–5000). |
| `maxCategoryPages` | integer | `10` | Maximum category pages to paginate per category URL (1–100). |
| `proxyConfiguration` | proxy | `{ "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }` | Apify Proxy. **Residential required** (IndiaMART returns 403 to datacenter IPs). |

```json
{
  "startUrls": ["https://dir.indiamart.com/impcat/cctv-camera.html"],
  "maxProducts": 200,
  "maxCategoryPages": 10,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Output (one row per product)

```jsonc
{
  "type": "product",
  "query": "https://dir.indiamart.com/impcat/cctv-camera.html",
  "product": {
    "productId": "26236720097",
    "productCode": "191475680",
    "title": "90d Canon Camera",
    "slug": "90d-canon-camera-26236720097",
    "productUrl": "https://www.indiamart.com/proddetail/90d-canon-camera-26236720097.html",
    "price": "₹125500",
    "priceCurrency": "INR",
    "priceAmount": 125500,
    "priceUsd": 1493,
    "fxRate": 0.0119,
    "fxRateAsOf": "2026-08",
    "minOrderQuantity": null,
    "minOrderUnit": null,
    "images": ["https://5.imimg.com/data5/SELLER/Default/2022/7/SH/EU/HQ/4877750/01-1000x1000.jpg"],
    "category": { "primary": "Camera", "breadcrumb": ["IndiaMART", "Camera & Photography Equipments", "Camera"] }
  },
  "supplier": {
    "companyName": "Ajay Enterprises",
    "companyUrl": "https://www.indiamart.com/ajayenterprises-newdelhi-ind/",
    "memberSince": "Mar 2012",
    "location": { "city": "New Delhi", "state": "Delhi", "country": "India", "countryCode": "IN", "address": "New Delhi, Delhi" },
    "contact": { "phone": "+918043862189", "phoneRaw": "+91-8043862189", "phoneVerified": true },
    "businessFactsheet": {
      "yearEstablished": 2005,
      "natureOfBusiness": "Trader - Retailer",
      "legalStatus": "Proprietorship",
      "gstNumber": "07**********1Z9",
      "gstTurnover": "1.5 - 5 Cr",
      "gstTurnoverInr": { "min": 15000000, "max": 50000000 },
      "gstTurnoverUsd": { "min": 178500, "max": 595000 },
      "iecCode": null,
      "additionalNob": ["Retail Business", "Warehouse / Depot"]
    },
    "exportCountries": [],
    "performance": { "callResponseRate": 0.84 }
  },
  "scrapedAt": "2026-08-02T12:00:00.000Z"
}
```

Any field absent on the source page is `null`. Rows that fail to parse (or are blocked) are pushed as free `{ "type": "status", "status": "failed", ... }` rows.

### How it works

1. The actor seeds the request queue with `startUrls` (mixing category and product URLs is fine).
2. On a **category page** it discovers product-detail links (`a[href*="/proddetail/"]`) and enqueues them. It also looks for a static next-page link and follows it up to `maxCategoryPages` (see limitations below).
3. On a **product detail page** it extracts embedded JSON fields, the `g39-factsheet` DT/DD rows, JSON-LD (BreadcrumbList + ImageGallery), the title, the price and the company URL, then pushes one charged row.
4. Politeness: `maxConcurrency` 3, `maxRequestsPerMinute` 60 (≈1 request/second), 3 retries. IndiaMART returns **HTTP 403 to Apify datacenter IPs**, so residential proxy is mandatory.

### Pricing

Charged **per product** (pay-per-event). Set your USD price per result and optional total spend cap in the actor Console before running. A target of ~$0.002/result is competitive with the incumbent.

### Responsible use

Contact data is public business listing information intended for supplier discovery and due diligence; comply with applicable laws (including India's **DPDP Act 2023**) and IndiaMART's Terms. Do not use the data for unsolicited spam. You are responsible for how you use the output.

### Known limitations

- **Category pagination is JavaScript-driven.** Live IndiaMART category pages load additional products via a React "Show More Results" control (an internal XHR) rather than static `?page=N` links (verified: `?page=N` returns an identical product set on both desktop and mobile). This HTTP-only actor therefore parses the first page of products for each category URL (a desktop `impcat` page yields **~110–120 products**, verified at 118 for a typical category). To reach `maxProducts`, supply multiple category URLs (e.g. related subcategories) and/or direct product-detail URLs. Deeper pagination, and the full-GST-factsheet enrichment that lives on company pages, are reserved for a future hop.
- `priceCurrency` is `INR` (IndiaMART is an India-only marketplace).
- Selectors target the current server-rendered markup (`g39-factsheet-row`, `.priceff`, embedded JSON fields `MOBILE_PNS`/`PC_ITEM_CODE`/`MOBILE_VERIFIED`, JSON-LD blocks). IndiaMART markup changes will require selector updates; the parser is unit-tested against a real fixture to catch regressions.

# Actor input Schema

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

IndiaMART category URLs (https://dir.indiamart.com/impcat/<slug>.html) and/or product detail URLs (https://www.indiamart.com/proddetail/<slug>-<id>.html). Both may be mixed.

## `maxProducts` (type: `integer`):

Maximum product detail pages to parse. This is the charged unit and is enforced at the crawler level (1-5000).

## `maxCategoryPages` (type: `integer`):

Maximum category pages to paginate per category URL (1-100). Note: live IndiaMART category pages currently paginate via a JavaScript Show-More control rather than static page links, so each category URL yields its first page of products; deeper pagination is reserved for a future enhancement.

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

Apify Proxy. IndiaMART blocks Apify datacenter IPs with HTTP 403, so RESIDENTIAL proxy is required (the default). Keep RESIDENTIAL for reliable runs.

## Actor input object example

```json
{
  "startUrls": [
    "https://dir.indiamart.com/impcat/cctv-camera.html"
  ],
  "maxProducts": 200,
  "maxCategoryPages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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/cctv-camera.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("leaderly_jackpine/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/cctv-camera.html"] }

# Run the Actor and wait for it to finish
run = client.actor("leaderly_jackpine/indiamart-supplier-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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/cctv-camera.html"
  ]
}' |
apify call leaderly_jackpine/indiamart-supplier-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=leaderly_jackpine/indiamart-supplier-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/KNIHyvtCmQuzV2BrL/builds/RvasEqzwjujbbKe3P/openapi.json
