# IndiaMART Scraper: B2B Products, Prices, Suppliers (`automation_craft/indiamart-scraper`) Actor

Scrape IndiaMART, no login: keywords, search, category, product or supplier links, read city by city through IndiaMART's own filters. Price and unit, MOQ, specs, GSTIN, TrustSEAL, rating, response rate, call number, lead score; add company profiles, reviews. JSON, CSV, Excel, API; pay per product.

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

## Pricing

from $0.95 / 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.
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 Products, Prices, Suppliers

**IndiaMART scraper** for indiamart.com: B2B products and Indian suppliers from keywords, IndiaMART search links, category pages, product links or supplier catalogues, with price and unit, minimum order (MOQ), specifications, the supplier's GST number (GSTIN) and GST verification, city, district and state, years on IndiaMART, rating, response rate, business type, TrustSEAL, IndiaMART's call number for the supplier and a lead score. No login and no IndiaMART account: nothing from you but the input. Deep search goes past IndiaMART's first page through its own city, business type and price filters. Add the supplier's company profile, the product page details, buyer reviews, or a monitor that delivers only new rows.

### Quick start

1. Open the Actor's **Input** tab. The prefilled input reads the first 20 products of an "ms pipe" search.
2. Replace the words in **Keywords**, or paste **IndiaMART links** (a search page, a category page, a category page of one city, a product page or a supplier catalogue), or write **IndiaMART categories** by name (`ms-pipe`, `led-bulb`).
3. Narrow it if you like: **Cities**, **States**, **Business types**, a price range, **Minimum supplier rating**, **Minimum response rate**, **Minimum years on IndiaMART**, **GST verified suppliers only**, **Verified exporters only**, **TrustSEAL suppliers only**, **Only rows with a call number**, **Minimum lead score**, **Keyword in the product title**.
4. Choose the **Search depth** (Deep by default, or First page only) and set **Max products per keyword** (100 when left out, up to 5,000).
5. Turn on the add-ons you need: **Supplier profile**, **Product details**, **Buyer reviews**, and **Personal data** if you need the names of people. Click **Start**.
6. Download the dataset as JSON, CSV, Excel or HTML, or read it through the Apify API. The **Products**, **Supplier profiles**, **Reviews** and **Coverage of each input** views show the columns of each kind of row; to export one kind only, filter on `type`.

### What you get

Every product row (`type: "product"`) is one IndiaMART product offer with its supplier, charged as one Product event. A supplier link gives one supplier row (`type: "supplier"`) with the company profile, charged as one Supplier profile. Review rows (`type: "review"`) come only with **Buyer reviews**. Each keyword, search link and category input also gets one free `coverage` row (IndiaMART's result count, answers read, distinct products and suppliers seen, products delivered, repeats, filtered rows, cities where IndiaMART lists no supplier of the keyword, every filter answer read, and why the walk stopped), misses and input problems get free `status` rows, and every run ends with a free `summary` row, also stored as `RUN-SUMMARY` in the run's key-value store. The summary's `complete` is true only when every input was read to its end and every link, file and add-on you asked for was read; a run the platform restarted counts the whole run's rows and is never reported complete. When IndiaMART itself fails (it refuses or does not answer), the run still succeeds, nothing is charged for what was not read, and its status message says IndiaMART was failing and to try again later. An input given twice (a keyword and its pasted search link, a category twice) is read once.

#### Main fields and measured fill rates

Measured by running the Actor's own parsers and row builder over IndiaMART answers saved on 2026-10-15: 17,453 search rows and 12,468 category page rows, as IndiaMART served them (repeats included). Field names are exactly what the dataset holds.

| Field | What it holds | Search rows | Category rows |
|---|---|---|---|
| `productId`, `productName` | IndiaMART's product id and the product name | 100 percent | 100 percent |
| `productUrl` | The product page link | 100 percent | 92.8 percent |
| `price`, `priceText` | Price in rupees and IndiaMART's own price text ("₹ 60/Kg") | 95.1 percent | 91.3 percent |
| `priceUnit` | The unit the price is for (Kg, Piece, Meter) | 95.0 percent | 72.6 percent |
| `currency` | `INR` | 98.9 percent | 91.3 percent |
| `minOrderQuantity`, `minOrderUnit` | Minimum order (MOQ) and its unit | 53.0 and 52.7 percent | not on category pages |
| `specifications` | Name and value pairs ("Thickness": "5 mm") | 98.2 percent | 91.0 percent |
| `description` | The product's short description | 99.9 percent | 11.5 percent |
| `imageUrl`, `images` | The product photo | 100 percent | 98.7 percent |
| `videoUrl`, `brochureUrl` | Video and PDF brochure links | 20.4 and 41.0 percent | not shown and 10.6 percent |
| `categoryName`, `categoryId`, `categoryNames` | IndiaMART's category of the product | 100 percent | 100 percent |
| `supplierId`, `supplierName` | IndiaMART's supplier id and the company name | 100 percent | 100 percent |
| `supplierCatalogUrl`, `supplierAlias` | The supplier's IndiaMART catalogue and its name in the link | 100 and 99.6 percent | 99.8 and 44.8 percent |
| `supplierWebsite` | The supplier's own domain where IndiaMART hosts its catalogue there | 61.4 percent | 54.8 percent |
| `city`, `country` | The supplier's city and country | 100 percent | 100 and 99.9 percent |
| `district`, `state` | District and state | 100 percent | not on category pages |
| `locality` | Area within the city | 9.7 percent | 34.8 percent |
| `gstNumber` | The supplier's full GSTIN | 100 percent | not on category pages (they show only whether the supplier is GST registered) |
| `gstVerified`, `gstRegistered` | IndiaMART's GST verified mark and whether a GST registration is shown | 100 percent (true on 100) | 100 percent (true on 97.0 and 97.6) |
| `memberSince`, `yearsOnIndiaMart` | Membership date and years on IndiaMART | 100 percent | years only, 100 percent |
| `supplierRating`, `ratingCount` | The supplier's stars and number of ratings | 92.0 percent | 91.9 and 100 percent |
| `responseRate` | The supplier's response rate in percent | 96.0 percent | 87.1 percent |
| `phone`, `phoneType` | IndiaMART's call routing number (PNS) for the supplier: a virtual number that connects to the supplier, never the supplier's own mobile; `phoneType` says so on every row | 100 percent | 100 percent (12,466 of 12,468) |
| `emailVerified`, `mobileVerified` | IndiaMART's verified e-mail and verified mobile marks (the address and the mobile are not shown) | 99.8 percent | 100 percent |
| `businessTypes` | Manufacturer, Wholesaler, Retailer, Service Provider, and Exporter for IndiaMART's verified exporters | 99.5 percent | 11.7 percent (Exporter only) |
| `verifiedExporter`, `iecRegistered` | IndiaMART's verified exporter mark and whether the supplier holds an import export code | 100 percent (true on 19.5) and 13.6 percent | 100 percent (true on 11.7) and not shown |
| `trustSeal` | IndiaMART's TrustSEAL | 100 percent (true on 88.7) | 100 percent (true on 79.4) |
| `membershipCode`, `membershipName` | IndiaMART's own customer type of the listing, as a number and as IndiaMART's name for it (LEADER, STAR, TSCATALOG, CATALOG) | 100 and 98.9 percent | 100 percent |
| `supplierBadge` | IndiaMART's "Leading Supplier" or "Star Supplier" banner | 22.0 percent | 36.6 percent |
| `premiumListing` | IndiaMART's own listing code (KWPL, KWILP) | 3.9 percent | not on category pages |
| `leadScore` | 0 to 100, see below | 100 percent (median 84) | 100 percent (median 80) |
| `keywordInTitle` | Whether the product name holds every word of the keyword | every row of a keyword or search link | rows of a keyword's category pages (empty for a category input) |
| `matchedWords`, `matchesAllWords` | IndiaMART's own match of the search words on the row: how many words it matched, and whether it matched all of them (rows matching none are never delivered) | every search row | not on category rows (`null` there, and on product and supplier rows) |
| `searchKeyword`, `searchCity`, `searchBusinessType`, `searchPriceBand`, `foundBy`, `position`, `isMoreResult`, `input`, `source` | Which input and which IndiaMART filter answer found the row, and its place in that answer | every row | every row |

The category row figures are of IndiaMART's all India category pages. Deep city by city category walks fill less: on 1,152 category rows of three runs on the platform (2026-10-21) `productUrl` 66.9, `price` 75.1, `specifications` 67.8, `supplierRating` 71.3 and `responseRate` 59.7 percent.

Also on every product row: `supplierProfile`, `supplierProfileStatus`, `supplierReviewSummary`, `reviewsDelivered`, `productDetails`, `productDetailsStatus` (filled by the add-ons, else `not_requested`) and `scrapedAt`. IndiaMART shows up to three more products of each supplier under its first one; with **Include more products of each supplier** on (the default) they are rows of their own, and they were 71.6 percent of the search rows and 66.1 percent of the category rows measured.

#### Lead score

`leadScore` adds up what IndiaMART shows on the row, from 0 to 100:

- GST verified: 20 points.
- Years on IndiaMART: 2 points a year, up to 20.
- Supplier rating: 4 points per star, up to 20, only with 5 ratings or more.
- Response rate: 0.15 points per percent, up to 15.
- Verified exporter: 5 points.
- Price shown, specifications shown, minimum order shown, photo shown: 5 points each.

The total is rounded to a whole number. Use **Minimum lead score** to keep only rows at or above a score.

#### Example row (real, trimmed)

A product of the "ms pipe" search, built by the Actor's own row builder from IndiaMART's answer saved on 2026-10-15 (description shortened; the add-on, search and bookkeeping fields left out):

```json
{
  "type": "product",
  "productId": "2857588221288",
  "productName": "6 inches 8 Inch Ms Pipe",
  "productUrl": "https://www.indiamart.com/proddetail/8-inch-ms-pipe-2857588221288.html",
  "price": 60,
  "priceText": "₹ 60/Kg",
  "currency": "INR",
  "priceUnit": "Kg",
  "minOrderQuantity": 100,
  "minOrderUnit": "Kg",
  "specifications": [
    { "name": "Unit Pipe Length", "value": "6 m" },
    { "name": "Surface Treatment", "value": "Galvanized" },
    { "name": "Thickness", "value": "5 mm" },
    { "name": "Size", "value": "6 inches" }
  ],
  "description": "Mild Steel Round Pipes are cylindrical hollow sections made from low carbon steel...",
  "imageUrl": "http://5.imimg.com/data5/ANDROID/Default/2025/6/515806581/KP/TP/WE/180670593/product-jpeg-500x500.jpg",
  "categoryName": "MS Pipe",
  "categoryId": "33646",
  "supplierId": "180670593",
  "supplierName": "Shri Mahadev Enterprises",
  "supplierCatalogUrl": "https://www.indiamart.com/shrimahadev-enterprises/",
  "city": "Raigad",
  "district": "Raigad",
  "state": "Maharashtra",
  "country": "India",
  "gstNumber": "27AYMPD1620M1ZE",
  "gstVerified": true,
  "gstRegistered": true,
  "memberSince": "2022-12-04",
  "yearsOnIndiaMart": 3,
  "supplierRating": 4,
  "ratingCount": 13,
  "responseRate": 64,
  "phone": "+91-8047840826",
  "phoneType": "IndiaMART call routing number (PNS)",
  "emailVerified": true,
  "mobileVerified": true,
  "businessTypes": ["Service Provider"],
  "verifiedExporter": false,
  "trustSeal": true,
  "membershipCode": 179,
  "membershipName": "STAR",
  "supplierBadge": "Star Supplier",
  "keywordInTitle": true,
  "leadScore": 72,
  "foundBy": "search",
  "position": 9,
  "isMoreResult": false
}
```

#### Search depth and speed

IndiaMART shows a visitor without a login the first page of any search only (about 35 to 40 products). **Deep** mode (the default) reads that first answer and then one answer per business type, per price band of the answer, per city (IndiaMART's own city list for the keyword first, then up to 60 more Indian cities) and per city and business type, each of which IndiaMART answers with its own first page. A search whose words already name a city is not split by city. A walk stops at **Max products per keyword**, at **Max answers per keyword** (120 when left out), or after 12 answers in a row without a new product.

Measured on the platform on 2026-10-15 with 60 filter answers per keyword:

| Keyword | Distinct products from search answers | With category pages too |
|---|---|---|
| ms pipe | 976 | 2,079 |
| led bulb | 792 | 1,962 |
| cotton fabric | 949 | 1,925 |
| solar panel | 850 | 1,899 |
| hydraulic press machine | 776 | 1,814 |

IndiaMART answers about one search every 6 seconds per address, so the Actor asks for one search answer about every 6.5 seconds on one proxy session and waits out a refusal on that session rather than switching addresses to go faster. The first answer of a keyword comes back in seconds; a deep keyword of 1,000 products takes about 5 to 8 minutes (282 seconds for 1,000 products of "ms pipe" on the platform). Category pages are not under that limit and are read faster. **First page only** reads IndiaMART's first answer per keyword (about 35 to 40 products) and no filter answers.

**Also read category pages** goes on, after the search, through IndiaMART's category page of the keyword, all India and then city by city, which added about as many products again in the table above. **Categories per keyword** (1 when left out, up to 20) reads more of the categories IndiaMART lists for the words, its main category first; rows from those related categories say so in `foundBy` (`related_category_page`) and often do not carry the keyword (see `keywordInTitle`). Category rows carry the GST registration as a yes or no, not the GSTIN, and no minimum order.

### Supplier profile (add-on)

Turn on **Supplier profile** and the Actor reads each supplier's company page and its catalogue home page (for its HSN codes) once per run and nests it as `supplierProfile` in that supplier's first delivered row (one Supplier profile event per supplier). A pasted supplier link gives the same profile as a supplier row of its own. Measured on 25 saved company pages (18 on www.indiamart.com, 7 on suppliers' own IndiaMART hosted domains):

| Field | Filled |
|---|---|
| `natureOfBusiness`, `additionalBusiness`, `legalStatus`, `employees`, `gstNumber`, `gstRegistrationYear`, `pincode`, `rating`, `ratingCount`, `responseRate`, `phone`, `companyDescription`, `productCategories` | 25 of 25 |
| `banker`, `logoUrl` | 24 of 25 |
| `registeredAddress` (city, district and state on www pages; the full street address with PIN on suppliers' own domains) | 23 of 25 |
| `contactTitle` | 19 of 25 |
| `yearEstablished`, `yearsOnIndiaMart`, `paymentModes`, `shipmentModes`, `membershipCode`, `membershipName`, `businessType` | 18 of 25 (www pages) |
| `udyamNumber` (masked as IndiaMART shows it) | 13 of 25 |
| `iecCode` | 9 of 25 |
| `gstRegistrationDate`, `annualTurnover`, `exportPercentage`, `latitude`, `longitude` | 7 of 25 (suppliers' own domains; www pages show the GST year and no turnover) |
| `exportCountries` | 4 of 25 |
| `tanNumber`, `cinNumber` | 3 and 1 of 25 |
| `hsnCodes` (code and description, IndiaMART's "Deals in HSN Code" table of the supplier's catalogue home page; `hsnCodesStatus` says `included`, `not_found`, `failed`, `left_out_allowance`, `not_read_run_stopped`, `page_shows_another_supplier`, or `not_on_own_domain` for suppliers on their own domains, whose IndiaMART template shows no HSN table; the Supplier profile event is charged as usual when only the HSN read did not succeed, and the run is then not reported complete) | 2 of 2 saved www home pages (2 and 5 codes); 5 of 6 www suppliers read live on 2026-10-21; an empty list when the supplier lists none |
| `ceoName`, `contactPerson`, `promoter`, `gstPartnerName` | names of people: filled only with **Personal data** on |

Also where IndiaMART shows them: `premises` (size, location type, building, space around), `qualityMeasures`, `customizedPackaging`, `industry`, `primaryCompetitiveAdvantage`, `estimatedDeliveryTime`, `trustSeal`, `gstVerified`, `verifiedExporter`. A company page that could not be read is not charged (`supplierProfileStatus` says why); the supplier's later rows in the same run say `on_earlier_row`.

### Product details (add-on)

Turn on **Product details** and the Actor reads each delivered product's own page and nests it as `productDetails` (one Product detail event per row that carries it): `descriptionFull` (14 of 15 saved product pages), `images` (every image, 15 of 15), `specifications` (15 of 15), `categoryPath` (15 of 15), `brand` (4 of 15), `videoUrl` (3 of 15), `brochureUrl` (5 of 15), `minOrderQuantity` and `minOrderUnit` (0 of 15: empty on every saved product page; search rows carry the minimum order instead), and a `supplier` block: `yearEstablished`, `employees`, `legalStatus`, `banker`, `gstNumber`, `gstRegistrationYear`, `rating`, `ratingCount`, `satisfaction` (IndiaMART's response, quality and delivery scores), `responseRate`, `phone`, `memberSince` and the verified marks 15 of 15, `annualTurnover` 14 of 15, `iecCode` 11 of 15, `exportCountries` 10 of 15, and `contactFirstName` with **Personal data** on. A pasted product link is read from its page and delivered with these details included in its Product charge. A page that could not be read is not charged (`productDetailsStatus` says why).

### Buyer reviews (add-on)

Turn on **Buyer reviews** and the Actor reads each supplier's reviews page once per run. The supplier's first row gets `supplierReviewSummary` (its rating, number of ratings, the 1 to 5 star breakdown in percent and IndiaMART's response, quality and delivery scores), and its first reviews, up to 20 (IndiaMART's own first reviews page), become review rows (one Review event each): `reviewId`, `supplierId`, `supplierName`, `supplierCatalogUrl`, `rating`, `date`, `productName`, `text`, `sellerReply`, `aspects`, `photos`, `reviewerName`, `reviewerLocation`, `reviewerCountry`, `position`. Measured on 140 reviews of 7 saved review pages: `rating` and `date` 140, `reviewerLocation` 134, `productName` 132, `reviewerCountry` 80, `aspects` 49, `text` 7 (most IndiaMART reviews are stars without words), `photos` 2, `sellerReply` 0; the summary 7 of 7 pages.

### Monitor: new rows only

Set **Monitor name** and schedule the run. The Actor remembers what it delivered under that name in a key-value store it creates itself. Products, supplier profiles and reviews delivered by an earlier run with the same name are skipped and free: a known product is skipped before anything more is read for it, so a scheduled run delivers and charges only new ones. **Reset the monitor** forgets the memory and starts again.

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

You pay per event, per 1,000 events, by your Apify plan:

| Event | What it is | FREE | BRONZE | SILVER | GOLD |
|---|---|---|---|---|---|
| Product (primary) | One IndiaMART product row with its supplier | $1.33 | $1.22 | $1.10 | $0.95 |
| Supplier profile | One supplier's company page (add-on, or a supplier link) | $2.80 | $2.60 | $2.40 | $2.20 |
| Product detail | One product's own page (add-on) | $2.50 | $2.30 | $2.10 | $1.90 |
| Review | One buyer review row (add-on) | $0.80 | $0.70 | $0.60 | $0.50 |

Platinum and Diamond plans pay the Gold price. The Actor start is $0.01 per run, one flat fee on every plan with no discount; it is charged per GB of run memory, and this Actor runs at 256 MB, so a run pays it once.

The Store pricing card shows these same prices per 1,000 events: "$0.95 / 1,000" on the Product row means one product costs $0.00095, less than a tenth of a cent.

#### Worked examples (GOLD)

- **The prefilled run, 20 products**: 20 x $0.00095 = $0.019, plus the $0.01 start = **$0.029** (on the FREE plan: $0.0266 + $0.01 = $0.0366).
- **1,000 products of one deep keyword**: 1,000 x $0.00095 = $0.95, plus the $0.01 start = **$0.96**.
- **100 products from 30 suppliers with Supplier profile**: $0.095, plus 30 x $0.0022 = $0.066, plus the $0.01 start = **$0.171**.
- **One supplier link with 20 reviews**: $0.0022 for the profile, plus 20 x $0.0005 = $0.01 for the reviews, plus the $0.01 start = **$0.0222**.

#### What is free

Searches IndiaMART did not find as typed (it shows results for a respelling, and a free row names it), searches whose answer matches none of the words on any product (`search_not_recognised`), rows on which IndiaMART matched none of the search words, product and supplier links IndiaMART does not have, with a city filter, answers in which IndiaMART shows other cities instead, products left out by your filters, products found twice in a run, products, supplier profiles and reviews a monitor delivered before, failed calls, company, product and reviews pages that could not be read, pages read for suppliers that do not pass an export country filter, product and supplier links that do not pass your filters, and every `status`, `coverage` and `summary` row. If you set a maximum charge for the run, add-on events are cut first and the run stops before it passes the limit. A run whose inputs keep delivering nothing stops itself with a free row once its allowance of unpaid work is spent; an add-on page that the add-ons' own allowance cannot pay is left out of its row (`left_out_allowance`, free) while the row is delivered.

### Input

An input that names nothing to read runs the sample: the first 20 products of an "ms pipe" search.

#### What to read

- `keywords`: search words, one search per entry (up to 200), each up to 100 characters.
- `startUrls`: IndiaMART links (up to 1,000): a search page (`https://dir.indiamart.com/search.mp?ss=ms+pipe`, its city `cq=`, business type `biz=` and price range kept unless you set your own; a search link with any other IndiaMART filter is refused, since the run cannot check it), a category page (`https://dir.indiamart.com/impcat/ms-pipe.html`) or the same category in one city (`https://dir.indiamart.com/mumbai/ms-pipe.html`), a product page (`https://www.indiamart.com/proddetail/...-12345678.html`) or a supplier catalogue (`https://www.indiamart.com/<supplier>/`). A link to a .txt or .csv file, a Google Sheet or a Google Drive file that lists such links is read too (up to 2,000 links and 2 MB a file).
- `categories`: IndiaMART category names as its category links write them (`ms-pipe`, `led-bulb`, `cotton-fabric`), up to 200, read all India and then city by city in deep mode.
- `industry`: an industry group (`industrial-machinery`, `building-construction`, `electronics-electrical`, `chemicals-dyes`, `medical-pharma`, `agriculture-food`, `automotive-parts`, `apparel-textiles`, `metals-alloys`, `packaging-supplies`, `office-supplies`, `safety-gear`, `home-supplies`, `gifts-crafts`, `services-it`; `all` by default) whose words go in front of every keyword; with no keyword, the words alone are searched. `requireKeywordInTitle` still asks only your own keyword's words of the title. IndiaMART has no such groups of its own, so this narrows the search by words, not by an IndiaMART filter.

#### Filters

`cities` (up to 100; IndiaMART's own exact city filter, with its spellings matched as one city: Delhi and New Delhi, Gurgaon and Gurugram, Bombay and Mumbai), `states` (up to 40, as IndiaMART writes them; the search goes city by city through the state's cities), `businessTypes` (`manufacturer`, `exporter` for IndiaMART's verified exporters, `wholesaler`, `retailer` with IndiaMART's own filter; `service_provider` checked on the row), `membershipNames` (IndiaMART's customer type names: LEADER, STAR, TSCATALOG, CATALOG, PORTAL, FREE-VERIFIED, OLDCATALOG, FREECATALOG, FREELIST, TEMPBLOCK, Catalog Email Defaulter, Catalog PNS Defaulter, BL Paid VFCP, OthersPAID VFCP, BL Paid FCP, OthersPAID FCP, Qualified FCP, Travel FCP, Demoted FCP, BL Paid NoFCP, OthersPAID NoFCP, BL Paid PNS Defaulter, BL Paid Email Defaulter, OthersPAID PNS Defaulter, FCP PNS Defaulter, Disable Company), `exportCountries` (needs **Supplier profile** or **Product details**; only suppliers IndiaMART marks as verified exporters or import export code holders are read for it), `minPrice` and `maxPrice` (rupees, in the unit IndiaMART shows for the product; a product without a price does not pass), `onlyWithPrice`, `minRating` (0 to 5), `minResponseRate` (0 to 100), `minYearsOnIndiaMart` (0 to 40), `gstVerifiedOnly`, `verifiedExporterOnly`, `trustSealOnly`, `withPhoneOnly`, `minLeadScore` (0 to 100), `requireKeywordInTitle` and `requireAllWords` (only rows on which IndiaMART matched every word). Every filter is checked on every row before it is delivered, rows of product and supplier links included; rows that do not pass are free, and a walk stops after 6 answers in a row without a match. A supplier link is judged by the fields of its company page. A filter a kind of input cannot be judged by refuses the run with a free row, before anything is read: `requireKeywordInTitle` and `requireAllWords` beside product links, supplier links or category pages (they carry no search words), `requireAllWords` beside `includeCategoryPages` (category rows carry no word match), a search link whose business type (`biz=`) is not exporter beside `includeCategoryPages`, `businessTypes` other than `exporter` beside category pages or `includeCategoryPages` (category rows carry no business type), and price, `onlyWithPrice`, `minLeadScore` or the word filters beside supplier links (a supplier row has no price); in a file of links, the links of such a kind are skipped with one free row.

#### How much to read

`searchMode` (`deep` or `first_page`), `includeCategoryPages`, `categoriesPerKeyword` (1 to 20, 1 when left out), `maxItemsPerKeyword` (1 to 5,000, 100 when left out), `maxPagesPerKeyword` (IndiaMART answers per keyword or category, 1 to 300, 120 when left out), `maxItems` (the whole run, 1 to 100,000), `includeMoreProducts` (on when left out) and `oneRowPerSupplier` (only the first product of each supplier in the run: a supplier list).

#### Add-ons and personal data

`includeSupplierProfile`, `includeProductDetails`, `includeReviews` (a supplier IndiaMART shows no rating for has no reviews and its reviews page is not read), `maxReviewsPerSupplier` (1 to 20, 20 when left out) and `includePersonalData`. **Personal data** is off by default. On, rows also carry the names of private persons IndiaMART shows publicly: a company page's CEO, contact person, promoter and GST partner, and a product page's contact first name. Off, those fields are empty. Texts are delivered as IndiaMART serves them, switch on or off: a plain text exactly, a text IndiaMART serves as HTML as its page shows it (tags removed, line breaks kept, no character changed), descriptions cut at 5,000 characters. A review's author is the content's author and is always delivered. A supplier's business data (its company name, IndiaMART call number, address and GST number) is always delivered. You are responsible for using personal data lawfully (GDPR and India's DPDP Act included).

#### Monitor

`monitorName` and `resetMonitor`.

#### Run settings

`maxRequestRetries` (1 to 5, 3 when left out), `requestTimeoutSecs` (5 to 60, 20 when left out), `maxConcurrency` (how many products have their add-on pages read at the same time, 1 to 3, 3 when left out; search answers are always read one at a time) and `proxyConfiguration` (leave it as it is: Apify datacenter sessions for IndiaMART's search and category pages, Apify residential sessions in India for its company, product and reviews pages, a refused session replaced by itself; your own proxy links are used as given; a run with every proxy turned off is refused, because IndiaMART refuses the platform's own addresses on category and product pages).

#### Examples

Manufacturers in two cities, GST verified, with a price:

```json
{ "keywords": ["led bulb"], "cities": ["Delhi", "Mumbai"], "businessTypes": ["manufacturer"], "gstVerifiedOnly": true, "onlyWithPrice": true, "maxItemsPerKeyword": 300 }
```

A supplier list with company profiles:

```json
{ "keywords": ["solar panel"], "states": ["Gujarat"], "oneRowPerSupplier": true, "includeSupplierProfile": true, "maxItemsPerKeyword": 100 }
```

Supplier catalogues with their reviews:

```json
{ "startUrls": [{ "url": "https://www.indiamart.com/shrimahadev-enterprises/" }], "includeReviews": true }
```

New suppliers of a category every week (schedule it):

```json
{ "categories": ["ms-pipe"], "monitorName": "ms-pipe-weekly", "maxItemsPerKeyword": 1000 }
```

### Use it from the API

The Actor id is `automation_craft/indiamart-scraper` (`automation_craft~indiamart-scraper` in REST paths). Each call runs the Actor and returns its dataset: product rows plus the free coverage and summary rows, so filter on `type`. Replace `<YOUR_APIFY_TOKEN>` with your Apify API token.

The input also accepts other names for the same settings: `queries`, `searchQueries`, `searchTerms` (lists) and `searchQuery`, `query`, `keyword` (one text) for `keywords`, read when `keywords` itself is left out; `categoryUrls`, `productUrls` and `supplierUrls` for `startUrls`, merged into it; `maxResultsPerQuery` and `maxItemsPerQuery` for `maxItemsPerKeyword`; `maxResults` for `maxItems`. A free `note` row says which names were read.

#### curl

The synchronous endpoint waits up to 300 seconds, so keep these runs small (First page only answers fastest) or start a normal run for deep ones.

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~indiamart-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"keywords": ["ms pipe"], "searchMode": "first_page", "maxItemsPerKeyword": 40}'
```

#### Node.js

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('automation_craft/indiamart-scraper').call({
    keywords: ['cotton fabric'],
    cities: ['Surat'],
    maxItemsPerKeyword: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const products = items.filter((row) => row.type === 'product');
console.log(products.length, products[0]?.gstNumber);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("automation_craft/indiamart-scraper").call(
    run_input={"keywords": ["hydraulic press machine"], "businessTypes": ["manufacturer"], "minRating": 4, "maxItemsPerKeyword": 100}
)
rows = client.dataset(run["defaultDatasetId"]).list_items().items
products = [row for row in rows if row["type"] == "product"]
print(len(products))
```

### For AI agents and automation

An AI agent connected to Apify's MCP server can call this Actor by its name, `automation_craft/indiamart-scraper`, with the same input JSON. The fields to set: `keywords` (or `startUrls`, `categories`), `cities` or `states`, `businessTypes`, `maxItemsPerKeyword`, `searchMode` (`first_page` for a quick answer), `oneRowPerSupplier` for a supplier list, and the add-on switches. The dataset's field descriptions and views tell the agent what each column holds, and the free coverage row tells it what was read and why each walk stopped.

### FAQ

#### Does IndiaMART have an API for product and supplier data?

This Actor works as one: call it through the Apify API with keywords, IndiaMART links or category names and read the rows as JSON, CSV or Excel. It needs no IndiaMART account, login or key; the API examples above show the calls.

#### How to get phone numbers from IndiaMART?

Every product and supplier row carries `phone`, the number IndiaMART shows for calling the supplier: its call routing number (PNS), a virtual number that connects to the supplier, never the supplier's own mobile, and `phoneType` says so. It was on 100 percent of the search rows measured; IndiaMART shows a supplier's own mobile only after a sign in, which this Actor never does.

#### How can I download IndiaMART supplier data to Excel?

Put keywords, IndiaMART links or category names into the input, turn on **One row per supplier** for a supplier list, and start the run. Open the **Products** or **Supplier profiles** view of the dataset and export it as CSV or Excel: one row per product or supplier with price, minimum order, GST number, city, rating and call number.

#### How do I find a supplier's GST number on IndiaMART?

Keyword search rows carry the supplier's full GSTIN in `gstNumber` (100 percent of the search rows measured) with IndiaMART's GST verified mark in `gstVerified`; turn on **GST verified suppliers only** to keep only verified ones. Category rows show only whether the supplier is GST registered, and **Supplier profile** reads the number and the GST registration year from the company page.

#### Is it legal to scrape IndiaMART?

This Actor reads only what IndiaMART shows any visitor without a login: no account, no sign in, no OTP. Personal data (names of people) is off by default; whether your use of the data is lawful depends on your purpose and your country, and you are responsible for it.

#### Why does this Actor run with limited permissions?

It follows least privilege: it only writes its own run's dataset and key-value store. When you set a **Monitor name**, its memory is a named key-value store the Actor creates itself under your account.

### What this Actor does NOT do

- **No e-mail addresses**: IndiaMART shows none to visitors, only its verified e-mail mark (`emailVerified`).
- **No WhatsApp numbers**: IndiaMART's search answers carry a placeholder number or its call routing number in that place, not the supplier's WhatsApp.
- **No supplier's own mobile number**: `phone` is IndiaMART's call routing number; the supplier's own mobile is behind IndiaMART's sign in.
- **Nothing behind a login or an OTP**: no search pages after the first (depth comes from IndiaMART's own filters instead), no buyer leads or enquiries, no account data.
- **No sponsored flag**: IndiaMART shows no "Sponsored" label on its listings.
- **No public membership tier**: `membershipName` is IndiaMART's own customer type name and `supplierBadge` its "Leading Supplier" or "Star Supplier" banner; IndiaMART sets them per listing, so one supplier can carry different ones in different searches.
- **No more than 20 reviews per supplier**: the Actor reads IndiaMART's own first reviews page of each supplier.
- **No GSTIN on category rows**: category pages show only whether a supplier is GST registered; search rows and **Supplier profile** carry the number.
- **No filters IndiaMART's answer cannot prove**: no turnover, GST age, specification, locality or credential filters; a search link that carries one is refused.
- **No sort order**: rows come in the order of IndiaMART's own answers.
- **No links to a supplier's own website**: paste the supplier's www.indiamart.com catalogue link instead.

### Changelog

See the Changelog tab. 0.1 (2026-10-15): first release.

### More data tools by Automation Craft

- [Amazon Product Scraper - Search, Best Sellers](https://apify.com/automation_craft/amazon-data-scraper)
- [Amazon Sponsored Products Scraper - Ads by Keyword](https://apify.com/automation_craft/amazon-sponsored-products-scraper)
- [LinkedIn Company Scraper - Details, No Login](https://apify.com/automation_craft/linkedin-company-scraper)
- [LinkedIn Company Employees Scraper - No Login](https://apify.com/automation_craft/linkedin-company-employees-scraper)
- [US New Business Registrations Scraper - LLC Leads](https://apify.com/automation_craft/us-new-business-registrations-scraper)
- [UK Find a Tender Scraper: Tenders, Awards, Buyers](https://apify.com/automation_craft/uk-find-a-tender-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/indiamart-scraper/changelog.md

# Actor input Schema

## `keywords` (type: `array`):

Words to search on IndiaMART, one search per entry (ms pipe, led bulb, cotton fabric, solar panel). Each search delivers up to Max products per keyword. When IndiaMART does not find the words as typed and shows results for a respelling, that search delivers nothing and is not charged; a free status row names the respelling.

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

Links copied from IndiaMART: a search page (https://dir.indiamart.com/search.mp?ss=ms+pipe, with its city cq=, business type biz= and price range kept unless you set your own below), a category page (https://dir.indiamart.com/impcat/ms-pipe.html) or the same category in one city (https://dir.indiamart.com/mumbai/ms-pipe.html), a product page (https://www.indiamart.com/proddetail/...-12345678.html, delivered with its full page) or a supplier catalogue (https://www.indiamart.com/<supplier>/, delivered as one supplier row with its company profile). You can also link a .txt or .csv file or a Google Sheet that lists such links.

## `categories` (type: `array`):

IndiaMART category names as its category links write them: the part before .html in https://dir.indiamart.com/impcat/ms-pipe.html, so ms-pipe, led-bulb, cotton-fabric. Each is read from IndiaMART's category page, all India, then city by city in deep mode. Category rows carry the GST registration as a yes or no, not the GST number (turn on Supplier profile for it).

## `industry` (type: `string`):

Optional: words of an industry group put in front of every keyword (Industrial machinery with the keyword textile searches "industrial machinery textile"); with no keyword, the words alone are searched. IndiaMART has no such top level groups of its own, so this narrows the search by words, not by an IndiaMART filter.

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

Only suppliers in these cities (Mumbai, Delhi, Ahmedabad, Surat). Each city is searched with IndiaMART's own exact city filter and checked on every row; IndiaMART's spellings are matched as the same city (Delhi and New Delhi, Gurgaon and Gurugram, Bombay and Mumbai). A city where IndiaMART lists no supplier of the keyword gets a free note in the coverage row.

## `states` (type: `array`):

Only suppliers in these Indian states or union territories, as IndiaMART writes them (Maharashtra, Gujarat, Tamil Nadu, Delhi). The search goes city by city through the cities of these states. Checked on every row.

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

Only suppliers of these business types. Manufacturer, exporter, wholesaler and retailer use IndiaMART's own business type filter; exporter means IndiaMART's verified exporters; service provider is checked on the row. Several values match any of them. Category page rows carry only the verified exporter mark, so a type other than exporter beside category pages or includeCategoryPages refuses the run, free.

## `membershipNames` (type: `array`):

Only suppliers whose IndiaMART customer type (its own package name, the membershipName column) is one of these: LEADER, STAR, TSCATALOG, CATALOG and the others the README lists. The same supplier can carry different types in different searches, since IndiaMART sets it per listing.

## `exportCountries` (type: `array`):

Only suppliers whose IndiaMART company page or product page names one of these export countries (United States Of America, United Arab Emirates, United Kingdom), as IndiaMART writes them. Needs Supplier profile or Product details on (those add-ons read the pages that name them). Only suppliers IndiaMART marks as verified exporters or IEC holders are read for it; the pages read for suppliers that do not pass are free to you.

## `minPrice` (type: `number`):

Only products at this price or above, in rupees, in the unit IndiaMART shows for the product (per piece, per kg, per meter). A product without a price does not pass.

## `maxPrice` (type: `number`):

Only products at this price or below, in rupees, in the unit IndiaMART shows for the product. A product without a price does not pass.

## `onlyWithPrice` (type: `boolean`):

Leave out products that show no price ("Ask for price").

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

Only suppliers rated at least this many stars on IndiaMART (0 to 5, for example 4 or 4.3). A supplier without a rating does not pass.

## `minResponseRate` (type: `integer`):

Only suppliers whose response rate on IndiaMART is at least this percent (0 to 100).

## `minYearsOnIndiaMart` (type: `integer`):

Only suppliers who have been members of IndiaMART for at least this many years.

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

Only suppliers whose GST registration IndiaMART marks as verified.

## `verifiedExporterOnly` (type: `boolean`):

Only suppliers IndiaMART marks as verified exporters.

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

Only suppliers with IndiaMART's TrustSEAL (the trustSeal column).

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

Only rows that carry IndiaMART's call number for the supplier.

## `minLeadScore` (type: `integer`):

Only rows whose lead score is at least this (0 to 100). The lead score adds up what IndiaMART shows on the row: GST verified, years on IndiaMART, rating, response rate, verified exporter, price, specifications, minimum order and photo (the README lists the points).

## `requireKeywordInTitle` (type: `boolean`):

Only products whose title holds every word of the keyword (a plural s is ignored). Every row says whether it does (keywordInTitle), so you can also filter afterwards. Keywords and search links only: beside product links, supplier links or category pages the run is refused, free.

## `requireAllWords` (type: `boolean`):

Only search rows on which IndiaMART matched every word of the keyword (its own word match, the matchesAllWords column). Rows on which IndiaMART matched none of the words are never delivered. Keywords and search links only: beside product links, supplier links, category pages or includeCategoryPages the run is refused, free.

## `searchMode` (type: `string`):

Deep reads IndiaMART's first answer and then one answer per business type, per price band, per city (IndiaMART's own city list for the keyword first) and per city and business type, until Max products per keyword or Max answers per keyword is reached. IndiaMART allows about one search answer every 6 seconds per address, so a deep keyword of 1,000 products takes about 5 to 8 minutes.

## `includeCategoryPages` (type: `boolean`):

After the search, also read IndiaMART's category page of the keyword (its own category for the words), all India and then city by city. This adds suppliers the search does not show (up to about twice as many products per keyword in our tests). Category rows carry the GST registration as a yes or no, not the number.

## `categoriesPerKeyword` (type: `integer`):

With Also read category pages on: how many of IndiaMART's categories for the keyword are read, its main category first, then the related categories IndiaMART lists for the words (1 to 20; 1 when left out). Rows from related categories say so (foundBy related_category_page) and often do not carry the keyword (see keywordInTitle).

## `maxItemsPerKeyword` (type: `integer`):

The most products one keyword, search link or category delivers (1 to 5,000; 100 when left out).

## `maxPagesPerKeyword` (type: `integer`):

The most IndiaMART answers (search answers and category pages) one keyword or category reads (1 to 300; 120 when left out).

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

The most products the whole run delivers (1 to 100,000). Left out, only the per keyword limit applies.

## `includeMoreProducts` (type: `boolean`):

IndiaMART shows up to three more products of each supplier under its first one; they are delivered as rows of their own (true when left out). Turn it off for one product per supplier per answer.

## `oneRowPerSupplier` (type: `boolean`):

Deliver only the first product of each supplier in the run: a list of suppliers rather than products.

## `includeSupplierProfile` (type: `boolean`):

Read each supplier's company page and its catalogue home page once and add its profile to the supplier's first row: HSN codes, nature of business, GST number and registration date, legal status, employees, annual turnover where shown, registered address, banker, IEC code, export countries and share where shown, payment and shipment modes, UDYAM and CIN where shown, and (with Personal data on) the CEO and contact person. Charged as one Supplier profile per supplier per run.

## `includeProductDetails` (type: `boolean`):

Read each delivered product's own page and add its full description, every image, every specification, the brand, video and brochure links, and the supplier block of that page (year of establishment, employees, turnover, legal status, export countries, delivery, quality and response scores). Charged as one Product detail per product.

## `includeReviews` (type: `boolean`):

Read each supplier's reviews page once: its star breakdown and response, quality and delivery scores go on the supplier's first row, and its first reviews (up to 20, IndiaMART's own first page) become review rows (rating, date, product, text, the buyer's name and city). A supplier IndiaMART shows no rating for has no reviews, and its page is not read. Charged per review row.

## `maxReviewsPerSupplier` (type: `integer`):

The most reviews delivered per supplier (1 to 20; 20 when left out). IndiaMART shows the first 20 reviews of a supplier to a visitor.

## `includePersonalData` (type: `boolean`):

Off by default. On, rows also carry the names of private persons that IndiaMART shows publicly on a supplier's pages: the CEO, the contact person, the promoter and the GST partner of a company page, and the contact's first name of a product page; off, those fields are empty. Texts (descriptions, review texts) are always delivered as IndiaMART serves them, and a review's author is always delivered. You are responsible for using personal data lawfully (GDPR and India's DPDP Act included).

## `monitorName` (type: `string`):

Turns on a monitor that remembers between runs: products, supplier profiles and reviews delivered by an earlier run with this name are skipped and not charged again, so a scheduled run delivers only new ones. Use the same name in every scheduled run; the memory belongs to this Actor on your account.

## `resetMonitor` (type: `boolean`):

Forget everything the monitor remembers and start again (applied by a fresh run only).

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

Leave it as it is: the Actor uses Apify datacenter proxy sessions for IndiaMART's search and category pages and Apify residential sessions in India for its www pages, and replaces a refused session by itself. Your own proxy links are used as given for every page.

## `requestTimeoutSecs` (type: `integer`):

How long one request may take before it is asked again (5 to 60; 20 when left out).

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

How many times one request is asked again after a failure (1 to 5; 3 when left out).

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

How many products have their add-on pages (supplier profile, product page, reviews) read at the same time (1 to 3; 3 when left out). IndiaMART's search answers are always read one at a time, at its own pace.

## Actor input object example

```json
{
  "keywords": [
    "ms pipe"
  ],
  "industry": "all",
  "searchMode": "deep",
  "maxItemsPerKeyword": 20,
  "includeMoreProducts": true,
  "includePersonalData": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (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 = {
    "keywords": [
        "ms pipe"
    ],
    "maxItemsPerKeyword": 20,
    "includeMoreProducts": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/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 = {
    "keywords": ["ms pipe"],
    "maxItemsPerKeyword": 20,
    "includeMoreProducts": True,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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