# IndiaMART Scraper - India B2B Suppliers, Manufacturers, Prices (`amitaviv/indiamart-supplier-scraper`) Actor

Scrape IndiaMART B2B suppliers, manufacturers and products by keyword, city, business type or category URL: price and unit, specs, company, business phone, city, state, GST verified, TrustSEAL, years on IndiaMART, response rate, rating. Verified-exporter search with MOQ. New-results monitoring.

- **URL**: https://apify.com/amitaviv/indiamart-supplier-scraper.md
- **Developed by:** [Amit Aviv](https://apify.com/amitaviv) (community)
- **Categories:** Lead generation, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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 Supplier & Product Scraper

Indian B2B suppliers and their products from IndiaMART, by keyword (with an optional city and business type) or from pasted IndiaMART category and search URLs: product, price and unit, specifications, supplier, business phone number, city and state, GST-verified and TrustSEAL flags, years on IndiaMART, response rate, rating. It reads IndiaMART's public listing data over plain HTTP (no browser, 256 MB), you pay only for products or suppliers delivered, and a run that delivers nothing because of an error or a block ends as Failed, never as a green empty run.

### What you get

- **Product:** name, product page URL, price as shown (`₹ 50/Kilogram`), price as a number, currency, unit, specifications as name/value pairs, short description, image URL, brochure (PDF) URL
- **Supplier:** company name, business phone number (IndiaMART's call-forwarding number for the business, with its extension when there is one), IndiaMART id, catalogue URL, city, locality, state (with a city filter, or in "Verified exporters only"), country
- **Trust signals:** GST verified, TrustSEAL, verified exporter, verified supplier, years on IndiaMART (`memberSince` "15 yrs" and `memberYears` 15), response rate (%), rating and number of ratings
- **Category:** the IndiaMART category the result is listed in, its id and URL, and the query and filters that found it
- **Suppliers output:** one record per supplier with the products IndiaMART shows for it in the listing (id, name, URL, price; at most 4) and their number, `productsShown` (not the size of the supplier's whole catalogue)
- **Verified exporters only:** minimum order quantity and unit, state, business type, year established, exporter since, IEC verified, and the countries the supplier exports to
- One record per product (or per supplier), as JSON, CSV or Excel, or through the API. A product or supplier is delivered and charged once per run, however often IndiaMART repeats it.
- A run summary (`OUTPUT_SUMMARY` in the run's key-value store): what was requested, delivered and charged, the category and city each keyword was matched to, how many suppliers IndiaMART lists there, which inputs failed or were ignored, and why the run stopped.

What it does not return: personal mobile numbers, contact persons' names, emails, full GST numbers, street addresses, buyer leads, reviews, anything behind a login. Minimum order quantity is only in "Verified exporters only": the category listing does not carry it.

### How to use

1. Type a product keyword into **Keywords or IndiaMART URLs** (`steel pipes`, `led bulb`, `basmati rice`), or paste an IndiaMART category URL such as `https://dir.indiamart.com/impcat/steelpipestubes.html` or `https://dir.indiamart.com/mumbai/steelpipestubes.html`. Several entries are fine.
2. Optionally set a **City** (`Mumbai`, `New Delhi`, `Shimla`) and a **Business type** (manufacturer, exporter, wholesaler, retailer).
3. Choose **Output**: Products (one row per product) or Suppliers (one row per supplier).
4. Set **Max results per keyword or URL** and press Start. Download the results from the Output tab, or read them from the API.

A keyword is matched to the product category IndiaMART itself files it under (`steel pipes` -> Steel Pipes, `led bulb` -> LED Bulb), and that category's supplier listing is read, the same list a visitor sees on IndiaMART's category page. When IndiaMART's own top guess is a narrow sub-category of a general category it names for the keyword (`cctv camera` -> "360-Degree CCTV Cameras", a few hundred suppliers), the general category is read instead ("CCTV Camera", tens of thousands); the summary then gives IndiaMART's guess as `narrowerGuess`. The run log and the summary name the category each keyword was matched to. A keyword that appears in neither the category's names nor IndiaMART's matching product titles is treated as having no category (0 results, nothing charged but the start), rather than taking whatever IndiaMART guesses.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `queries` | list of text | none (required) | Keywords, IndiaMART category URLs (`dir.indiamart.com/impcat/...html`, `dir.indiamart.com/<city>/...html`, the `m.indiamart.com` versions) or search URLs (`dir.indiamart.com/search.mp?ss=...&cq=<city>`). URLs without `https://` are accepted, duplicates are ignored, product pages, company pages and other sites are ignored and listed in the summary. A city in a keyword (`steel pipes mumbai`) filters to that city. |
| `city` | text | empty | Only suppliers listed for this city, for every keyword. A city IndiaMART has no page for in that category makes the keyword fail with a message. With `exportersOnly`, only cities IndiaMART's export search recognises (mostly larger ones) work; others fail with a message. |
| `businessType` | choice | any | `manufacturer`, `exporter`, `wholesaler` or `retailer`: IndiaMART's own business-type filter. |
| `mode` | choice | products | `products` or `suppliers`. |
| `includePhone` | yes/no | yes | Add the business phone number IndiaMART publishes (`phone`, `phoneExtension`). Off: both empty. |
| `maxItemsPerQuery` | number | 100 | Stop after this many products (or suppliers) for each entry, 1 to 10,000. |
| `exportersOnly` | yes/no | no | Use IndiaMART's export search instead: verified exporters only, ranked by relevance, at most 40 suppliers per keyword, with minimum order quantity, state and export details. Keywords only. |
| `splitLargeListings` | yes/no | yes | Read past the part of a listing IndiaMART shows in one view. See "Limits". |
| `onlyNew` | yes/no | no | Monitoring: return and charge only results earlier runs have not delivered. See "Monitoring". |
| `monitorKey` | text | empty | Name of the monitor memory, to keep two schedules apart. |
| `proxyConfiguration` | proxy | off | Not needed. See the FAQ. |

This input was run as `3UuMhOIsLeHU9FCLc` (80 suppliers: 40 in Mumbai for a keyword, 40 manufacturers from a New Delhi category URL):

```json
{
  "queries": ["steel pipes", "https://dir.indiamart.com/new-delhi/steelpipestubes.html?biz=10"],
  "city": "Mumbai",
  "mode": "suppliers",
  "maxItemsPerQuery": 40
}
```

### Example result

Products output, taken from run `CTYybm0EHjULCewcb` on 2026-10-20 ( input `{"queries": ["steel pipes"], "maxItemsPerQuery": 20}`), unedited:

```json
{
  "id": "2824555030",
  "productId": "2824555030",
  "productName": "Jindal Round Steel Pipes, Size: 1/2 inch",
  "productUrl": "https://www.indiamart.com/proddetail/steel-pipes-2824555030.html",
  "price": "₹ 50/Kilogram",
  "priceValue": 50,
  "currency": "INR",
  "priceUnit": "Kilogram",
  "minOrderQuantity": null,
  "minOrderUnit": null,
  "specifications": {
    "Shape": "Round",
    "Size": "1/2 inch",
    "Brand": "Jindal",
    "Steel Grade": "SS316",
    "Nominal Size": "1 inch, 2 inch, 3 inch, >3 inch, 3/4 inch, 1/2 inch",
    "Length": "3m, 6m, 30m, 100m"
  },
  "description": null,
  "imageUrl": "https://5.imimg.com/data5/SELLER/Default/2023/1/MY/SX/CZ/3672834/steel-pipes-1000x1000.jpg",
  "brochureUrl": "https://5.imimg.com/data5/SELLER/Doc/2023/2/RE/PP/IJ/3672834/steel-pipes.pdf",
  "supplierId": "3672834",
  "companyName": "Hitech Metal And Tubes (Iso 90012008 Certified Co.)",
  "phone": "+91-7942533250",
  "phoneExtension": null,
  "catalogUrl": "https://www.hitechtubes.net/",
  "city": "Mumbai",
  "locality": null,
  "state": null,
  "dealsInCity": null,
  "country": "India",
  "gstVerified": true,
  "trustSeal": true,
  "verifiedExporter": true,
  "verifiedSupplier": false,
  "iecVerified": null,
  "memberSince": "15 yrs",
  "memberYears": 15,
  "responseRate": 78,
  "rating": 4,
  "ratingCount": 119,
  "businessType": null,
  "yearEstablished": null,
  "exporterSince": null,
  "exportsTo": [],
  "category": "Steel Pipes",
  "categoryId": "7904",
  "categoryUrl": "https://dir.indiamart.com/impcat/steelpipestubes.html",
  "source": "category-listing",
  "query": "steel pipes",
  "cityFilter": null,
  "businessTypeFilter": null,
  "scrapedAt": "2026-10-20T14:30:48.310Z"
}
```

| Field | Meaning |
|---|---|
| `id` | IndiaMART's product id (`productId`); in Suppliers output, the supplier id (`supplierId`). Stable between runs. |
| `price`, `priceValue`, `priceUnit` | The price text as IndiaMART shows it, its number (the low end for a range such as `200-600`), and the unit after the `/`. `null` when the supplier lists no price (half of the 84 listings in our sample). |
| `phone`, `phoneExtension` | The number IndiaMART publishes for the business: its call-forwarding number (`+91-79…` / `+91-80…`), the same "Contact Number" IndiaMART's product pages show any visitor, which IndiaMART connects to the supplier. Some numbers come with an extension. `null` when IndiaMART gives none, when it is not a call-forwarding number, or with `includePhone` off. |
| `description`, `specifications` | Written by the seller. Personal mobile numbers, emails and WhatsApp links in them are replaced with `[removed]`. |
| `specifications` | The product's specification table as IndiaMART lists it. |
| `state` | Filled when you search a city (the city's state) and in "Verified exporters only"; `null` in all-India category listings, which do not carry it. |
| `locality` | The area IndiaMART lists next to the city (`Ghaziabad` for a New Delhi supplier), when it differs from the city. |
| `dealsInCity` | In a city search, IndiaMART also shows suppliers from elsewhere that deal in that city, without their own location. For them `city`, `locality` and `state` are `null` and `dealsInCity` names the city searched (run `bKYTfjzU7qF8rVzgi`: Vardhman Steel Co. in a Dehradun search). `null` for everyone else. |
| `gstVerified`, `trustSeal`, `verifiedExporter`, `verifiedSupplier` | IndiaMART's own flags. IndiaMART's card shows "Verified Exporter" for verified exporters and "TrustSEAL" for other TrustSEAL holders. |
| `memberSince`, `memberYears` | How long the supplier has been on IndiaMART, as shown and as a number. |
| `responseRate` | The response rate (%) IndiaMART shows; `null` when not shown. |
| `rating`, `ratingCount` | Average rating out of 5 and number of ratings; `rating` is `null` when there are none. |
| `productsShown`, `products` | Suppliers output: the products IndiaMART shows for the supplier in this listing (at most 4) and their number. |
| `minOrderQuantity`, `minOrderUnit`, `businessType`, `yearEstablished`, `exporterSince`, `exportsTo`, `iecVerified` | Filled in "Verified exporters only" (and `businessType` with a business-type filter). |
| `source` | `category-listing` or `export-search`. |

Fields IndiaMART does not provide for a given product are `null` (or empty), never missing. Some products shown on a supplier's card have no product page or image on IndiaMART; their `productUrl` or `imageUrl` is `null`.

### Pricing

Pay per event. You pay for what is delivered, not for time or memory.

| Event | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Actor start (once per run at the default 256 MB) | $0.003 | $0.003 | $0.003 | $0.003 |
| Product delivered (Products output) | $0.0018 | $0.0015 | $0.00135 | $0.0012 |
| Supplier delivered (Suppliers output) | $0.0036 | $0.003 | $0.0027 | $0.0024 |

Worked example on Bronze: 1 keyword, 500 products = 500 × $0.0015 + $0.003 = $0.753. The same keyword as Suppliers output, 200 suppliers = 200 × $0.003 + $0.003 = $0.603. A scheduled monitoring run that finds 3 new suppliers costs 3 × $0.003 + $0.003 = $0.012; a run that finds nothing new costs $0.003.

- Results that could not be delivered are not charged. A product or supplier met twice in a run is delivered and charged once.
- The maximum total charge you set for a run is respected: the actor stops before it would go over, keeps what was delivered, and says so (run `cXE2KCf4VRDTWpqMK`: limit $0.0135 = start + 7 products, 7 delivered and charged).
- Apify charges the start event once per GB of run memory: keep the default 256 MB.

### Reliability and failure behaviour

| What happened | Run status | Status message (run id where tested live) |
|---|---|---|
| Results delivered | Succeeded | `Scraped 20 products from 1 query` (`Lchy0jo7LZeDGBLBR`) |
| IndiaMART has no category for the keyword | Succeeded | `0 results: indiamart.com has no products for this query — IndiaMART files no product category under "zzqxvbnmkk"` (`hvwnasdTm9UOtVdYk`) |
| A city IndiaMART has no page for in that category | Failed (if it was the only entry) | `No products delivered: IndiaMART has no "Steel Pipes" listing for the city "Atlantis" (check the spelling, …)` (`kFsZ20f3Fa1hTaJQw`) |
| "Verified exporters only" with a city the export search does not recognise | Failed (if it was the only entry) | `No products delivered: IndiaMART's export search does not recognise the city "Shimla", so it cannot list verified exporters there; turn off "Verified exporters only" …` (`IY65xofDTQ1cAohiW`) |
| Some entries worked, some failed | Succeeded | `Scraped 120 products from 2 queries — 1 of 2 queries failed ("…": …)` (offline test) |
| Nothing delivered because of errors or blocking | **Failed** | `No products delivered: indiamart.com blocked every attempt; try again later. No results were charged (the start fee applies).` (offline test) |
| Input the actor cannot use | **Failed**, within seconds | `Nothing to do: none of the 2 entries in the input is usable (…). Add at least one entry to "queries", e.g. "steel pipes" …` (`clGrOjEaxqFiDoOKD`, 1 s) |
| Maximum charge reached | Succeeded | `Scraped 7 products from 1 query — stopped at the maximum charge set for this run` (`cXE2KCf4VRDTWpqMK`) |
| Run timeout close | Succeeded | `Scraped 2208 products from 1 query — stopped just before the run timeout; raise the timeout to get the rest` (`CwMe0wyknZCYGKP3J`, 20 s timeout) |

- Requests are retried up to 3 times with increasing pauses on network errors, HTTP 429 and 5xx.
- Results are saved page by page. A run that is aborted, times out or is resurrected keeps what was delivered and never delivers or charges the same result twice.
- In every test run of 2026-10-20 the charged products or suppliers equalled the delivered records (run ids in the changelog). The automatic switch to residential proxy when IndiaMART refuses a direct request (FAQ) happened in most runs of build 0.1.6-0.1.7 and delivered every time; the case where even that is refused (run Failed, "blocked every attempt") is covered by offline tests only.

### Limits

- **About 500 to 1,000 suppliers per listing view.** IndiaMART shows only the first part of a long category listing (LED Bulb: 73,645 suppliers listed, about 500 shown; Steel Pipes: about 1,000). With **Read past IndiaMART's 1,000-supplier view** on (default), the actor then reads the same listing's manufacturer, exporter, wholesaler and retailer views, skipping what it already delivered: run `tgdcDR41KhuhK91mq` delivered 3,000 unique LED bulb products that way in 43 s. For more, search city by city.
- **Verified exporters only** returns what IndiaMART's export search returns: at most 40 suppliers (about 200 products) per keyword, often fewer (basmati rice: 20 exporters, 85 products, `FvY54h5gedR2NbODr`).
- **A keyword means its category.** The actor reads the category IndiaMART files the keyword under, not a free-text match of product titles; a very specific keyword (`347h stainless steel pipe`) gets its specific category when IndiaMART has one. The summary names the category. A keyword that shares no word with the category or IndiaMART's matching product titles (a pure synonym, or a made-up word) gets 0 results. For exact control over which listing is read, paste the category URL (`https://dir.indiamart.com/impcat/<category>.html`).
- **Keywords** longer than 200 characters are cut to their first 200, with a warning.
- **Minimum order quantity and state** are not in the category listing (see "What you get").
- **Speed:** about 70 products per second when IndiaMART answers directly (3,000 in 43 s), about 20 per second through the residential proxy (1,200 in 60 s, `roVNqPIdRuE3W9Xgj`). A slow proxy connection can add up to a minute.
- India only; English text as IndiaMART lists it.

### Monitoring: only new results

1. Turn on **Only new results** and save the input as a task.
2. Schedule the task (daily or weekly).
3. The first run delivers what it finds (up to the maximum). Every later run delivers and charges only products (or suppliers) it has not delivered before for the same keyword, city, filters and output; a run with nothing new ends as Succeeded with `0 new …` and charges only the start event. Tested: `P8ex5J1PRlKVz93ey` delivered 23 suppliers of steel pipes in Shimla, `bdd2Sb2UQCPKMThWQ` the same input a minute later: `0 new suppliers in 1 monitored query (no results charged; the start fee applies)`.

The memory is a key-value store named `indiamart-supplier-scraper-monitor` in your own account (one record per query and monitor name, at most 10,000 ids each). Delete the store or change **Monitor name** to start over. IndiaMART does not sort listings by date, so "new" means "not delivered before", and a run whose maximum is lower than the listing delivers the next part of the listing on the following run (`v2a1RtiXdViICSqtO` then `fnmbx68go2L6bhr6x`, maximum 10: 10 products, then 10 different ones). To be notified, add an integration to the task (email, Slack, webhook) on "run succeeded".

### FAQ

**Do I need a proxy?** No, leave it off. The run first asks IndiaMART directly; when IndiaMART refuses (it did in most test runs from the afternoon of 2026-10-20 on), the run continues by itself through Apify's residential proxy in India. Proxy traffic is included in the price; you pay only the events. Apify's datacenter proxy is often refused by IndiaMART's category pages (HTTP 403), so do not choose it.

**Which phone number do I get?** The number IndiaMART publishes for the business, which its product pages show as "Contact Number" to any visitor. It is an IndiaMART call-forwarding number that rings the supplier, sometimes with an extension. Personal mobile numbers are not returned, and the ones sellers write into their descriptions are masked. Turn off **Include business phone number** if you do not want the column.

**Why fewer results than IndiaMART's headline count?** See "Limits": IndiaMART shows only part of a long listing per view. City searches and business types reach more.

**Products or Suppliers output?** Products for price research and catalogues (one row per product, charged per product); Suppliers for supplier lists and sourcing shortlists (one row per company with its products, charged per supplier).

**Can I run it from code?** Yes: the API, the Apify clients for JavaScript and Python, Make, Zapier, n8n. The Output tab shows the URLs.

**What happens when IndiaMART changes?** Runs fail loudly instead of returning empty data; report the run id under Issues.

### Legal and responsible use

This actor collects business listing data that IndiaMART shows publicly without a login: companies' product listings, prices, cities, the business's IndiaMART call-forwarding number and IndiaMART's own trust flags. It does not return personal data of private individuals as fields: no contact persons' names, no personal mobile numbers or emails, no full GST numbers (a sole proprietor's GST number contains the owner's personal PAN), no street addresses, no reviewer names. An owner's name IndiaMART appends to a company name ("(Prop - …)") is cut off, and mobile numbers, emails and WhatsApp links in seller-written text are masked. A sole proprietor's business name can still be a person's name, and seller-written text can still name people.

IndiaMART's terms of use govern the use of its content; read them before you reuse the data. You are responsible for how you use the data: respect IndiaMART's terms, copyright and database rights, and data-protection law (India's Digital Personal Data Protection Act, GDPR and others) in your country. Do not use the output for unsolicited marketing to individuals. If you are unsure, ask a lawyer before you build on it.

### Related actors

- [Europages Company Scraper](https://apify.com/amitaviv/europages-company-scraper): European B2B suppliers and manufacturers.
- [Yandex Maps Scraper](https://apify.com/amitaviv/yandex-maps-scraper): business listings with addresses and opening hours.

### Changelog

- 2026-10-24, build 0.1.12: a keyword whose top IndiaMART guess is a narrow sub-category now reads the general category IndiaMART names for it (`cctv camera`: CCTV Camera instead of 360-Degree CCTV Cameras; `a4 paper`: A4 Size Paper instead of one brand), with the guess in the summary as `narrowerGuess`; made-up words that begin with a category word (`plmqwz`) no longer match it; "Verified exporters only" applies the same check, so a made-up keyword gives 0 results there too; a restarted run (platform migration, resurrect) no longer goes over the maximum per query; keywords over 200 characters are cut with a warning; a non-text `monitorKey` is reported. Test runs: `5sbP2qPoPxK7OYE8e` (`cctv camera` -> CCTV Camera, `a4 paper` -> A4 Size Paper), `kOm9lAehqL3v3uucD` (`plmqwz`, 0 results), `EE8zoGoNyCkojtINT` (verified exporters, made-up keyword 0), `r8zbsLhG250e6gYF4` (prefill, then restarted: still 20 products charged), `7tyA42Ir7Gsw64lOi` (300 products), `y8C1ykXIfMk3xM2HK` (charge limit), `ZYeSPBdUQmcvBvBzV` / `79uUFemQhYKHJnVVd` (only new), `Tqzc8DLKBO8HvUflI` (50 Mumbai suppliers).
- 2026-10-24, build 0.1.11: wording of one input error ("not a URL on indiamart.com").
- 2026-10-24, build 0.1.10: a made-up keyword no longer returns an unrelated category (`qwzxkvjplm` gave 20 "PLM Services" products before; now 0 results: `f7XrOqeFnImK5TyE7`); the log names the category each keyword was matched to. Test runs: `spxbn8xEXauIypQLc` (prefill, no proxy, 20 products), `Vk89Pi0CnOYV1NBg9` (`ms pipe` -> MS Pipe, `stainles steel sheet` -> SS Sheet, 10 each).
- 2026-10-20, builds 0.1.6 and later: business phone number (`phone`, `phoneExtension`, on by default, `includePhone`); suppliers that only deal in the searched city get `dealsInCity` instead of a wrong city and state; "Verified exporters only" with a city now filters by that city or fails with a message; `productCount` renamed `productsShown`; price ranges give their low end; personal contact details in seller text masked; an unknown `biz=` value in a URL is ignored with a warning; slow proxy connections retried on a fresh connection. Test runs: `CTYybm0EHjULCewcb` (prefill, no proxy), `oat6huFnQOuqUCCPi` (50 Mumbai suppliers), `roVNqPIdRuE3W9Xgj` (1,200 products), `IY65xofDTQ1cAohiW` / `Y9BMv3nJWrGWQajlP` (exporters in Shimla / New Delhi), `bKYTfjzU7qF8rVzgi` (Dehradun, "deals in" supplier), `VEESkwDe924zJAlpi` (`biz=99`), `sBkeXUePV091SEw19` (bad input), `jWJIwLL0SwnYTkno2` (no category), `3ACKhz93zBdXAzmfw` (charge limit), `v2a1RtiXdViICSqtO` / `fnmbx68go2L6bhr6x` (only new), `YiFqcle5cZjHLNkgK` (phone off).
- 2026-10-20 0.1.5: first version. Test runs: `Lchy0jo7LZeDGBLBR` (prefill input, no proxy), `CMjc8amUqa41Ppg7y` (1,070 products), `tgdcDR41KhuhK91mq` (3,000 products through the business-type views), `3UuMhOIsLeHU9FCLc` (suppliers, city, business type), `FvY54h5gedR2NbODr` (verified exporters), `clGrOjEaxqFiDoOKD` (bad input), `hvwnasdTm9UOtVdYk` (no category), `cXE2KCf4VRDTWpqMK` (charge limit), `P8ex5J1PRlKVz93ey` / `bdd2Sb2UQCPKMThWQ` (only new), `CwMe0wyknZCYGKP3J` (20 s timeout), `D6SdVWxXe8UbSwyTI` (residential proxy).

### Support

Open an issue on the actor's **Issues** tab with the run id.

# Actor input Schema

## `queries` (type: `array`):

Product keywords as you would type them on IndiaMART (e.g. steel pipes, led bulb, cotton fabric), or pasted IndiaMART URLs: a category page (https://dir.indiamart.com/impcat/steelpipestubes.html), a city category page (https://dir.indiamart.com/mumbai/steelpipestubes.html) or a search URL (https://dir.indiamart.com/search.mp?ss=steel+pipes). A keyword is matched to the IndiaMART product category the site files it under (the general category when IndiaMART's own guess is a narrow sub-category of it), and that category's supplier listing is read; a keyword that shares no word with any matching category gives 0 results. Paste a category URL for exact control. A city in the keyword (steel pipes mumbai) filters to that city. Product and company pages are not supported.

## `city` (type: `string`):

Only suppliers listed for this Indian city, for every keyword (e.g. Mumbai, New Delhi, Bengaluru, Ahmedabad). Use the spelling IndiaMART uses; a city it has no listing for makes that keyword fail with a message. IndiaMART's city listings also show suppliers from elsewhere that deal in the city: they come with city empty and dealsInCity set. With "Verified exporters only", only cities IndiaMART's export search recognises work (mostly larger cities); others fail with a message. Leave empty for all of India. City category URLs carry their own city.

## `businessType` (type: `string`):

Only suppliers that list this business type on IndiaMART. Applies to keywords and category URLs (not to "Verified exporters only").

## `mode` (type: `string`):

Products: one record per product (price, unit, specifications, image, URL) with its supplier's details; charged per product. Suppliers: one record per supplier with the products IndiaMART shows for it in the listing (at most 4, counted in productsShown; not the size of its whole catalogue); charged per supplier.

## `maxItemsPerQuery` (type: `integer`):

Stop after this many products (or suppliers, in Suppliers output) for each keyword or URL, 1 to 10,000. You are charged only for delivered results.

## `exportersOnly` (type: `boolean`):

Use IndiaMART's export search instead of the category listing: only suppliers IndiaMART marks as verified exporters, ranked by relevance to the keyword, at most 40 suppliers (about 200 products) per keyword. Adds minimum order quantity, state, year established, business type, exporter since and export countries. Keywords only; Business type is not applied.

## `splitLargeListings` (type: `boolean`):

IndiaMART shows about 1,000 suppliers per category listing. When a listing has more and you ask for more, continue through its manufacturer, exporter, wholesaler and retailer views (results already delivered are skipped). Off: stop at the first 1,000.

## `includePhone` (type: `boolean`):

Add the phone number IndiaMART publishes for each supplier's business (an IndiaMART call-forwarding number, shown as Contact Number on its product pages to any visitor), with its extension when there is one. Turn off to leave phone and phoneExtension empty. Personal mobile numbers are never returned.

## `onlyNew` (type: `boolean`):

Return and charge only products (or suppliers) that earlier runs of this actor in your account have not delivered for the same keyword, city and output. The first run delivers everything it finds. The memory is a key-value store named indiamart-supplier-scraper-monitor in your account; delete it to start over.

## `monitorKey` (type: `string`):

Only with "Only new results". Runs with the same query and the same monitor name share one memory. Give two schedules different names to keep their memories apart.

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

Leave it off. The run asks IndiaMART directly first; when IndiaMART refuses, it continues through Apify's residential proxy in India by itself (proxy traffic is included in the price; you pay only the events). Apify's datacenter proxy is often refused by IndiaMART's category pages: leave the proxy off, or choose residential.

## Actor input object example

```json
{
  "queries": [
    "steel pipes"
  ],
  "businessType": "any",
  "mode": "products",
  "maxItemsPerQuery": 20,
  "exportersOnly": false,
  "splitLargeListings": true,
  "includePhone": true,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All delivered records as JSON, one object per item.

## `resultsCsv` (type: `string`):

All delivered records as a CSV file.

## `summary` (type: `string`):

What was requested, delivered and charged, which inputs failed or were ignored, and why the run stopped.

# 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 = {
    "queries": [
        "steel pipes"
    ],
    "maxItemsPerQuery": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("amitaviv/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 = {
    "queries": ["steel pipes"],
    "maxItemsPerQuery": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("amitaviv/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 '{
  "queries": [
    "steel pipes"
  ],
  "maxItemsPerQuery": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call amitaviv/indiamart-supplier-scraper --silent --output-dataset

```

## MCP server setup

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