# IndiaMART B2B Product Listings by City & State (`nimbryxo-studio/indiamart-b2b-product-listings-by-city-and-state`) Actor

Search IndiaMART's product listings by keyword, optionally narrowed to an Indian state or city, with price, MOQ, supplier name/location, rating, and response rate per listing.

- **URL**: https://apify.com/nimbryxo-studio/indiamart-b2b-product-listings-by-city-and-state.md
- **Developed by:** [Nimbryxo-studio](https://apify.com/nimbryxo-studio) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 33.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 B2B Product Listings by City & State

Scrape **IndiaMART**, India's largest B2B marketplace, for products and suppliers by keyword or category. Narrow results to an Indian city or state, or look up public product and supplier pages directly. Get prices, minimum order quantities, specifications, images, supplier location, ratings, response rates, and verified company details where IndiaMART publishes them.

### What this actor does

- **Four modes:** `searchProducts`, `browseCategory`, `productDetails`, `supplierProfile` (legacy `categoryBrowse` and `searchSuppliers` values are accepted)
- **Location filters:** city and state/union-territory narrowing for keyword and category searches
- **Commercial filters:** minimum/maximum price, minimum supplier rating, verified suppliers only
- **Product enrichment:** optional detail-page pass for description, full specifications, MOQ, contact number, GST, IEC and company background
- **Supplier records:** company name, profile URL, city/state, address, rating, response rate, GST, IEC, exports, employees, legal status, payment and shipment modes
- **Deeper coverage:** category pages are paginated and expanded through related categories and city routes when a request needs more rows
- **Empty fields are omitted** — no nulls, blanks or placeholder strings in the dataset

### Output per product

- `productId` — IndiaMART product identifier
- `title` — product name
- `price` — normalised price string, e.g. `INR 70/Meter`
- `priceValue`, `priceCurrency`, `priceUnit`, `priceText` — numeric price, currency, unit and the original displayed text
- `minOrder` — minimum order quantity with unit
- `moqValue`, `moqUnit` — numeric MOQ and its unit
- `supplier` — company name
- `supplierId`, `supplierUrl` — IndiaMART company ID and profile URL
- `supplierWebsite` — the supplier's own website when IndiaMART publishes a real external URL (IndiaMART-hosted alias URLs are omitted)
- `supplierCity`, `supplierState` — supplier location
- `supplierAddress`, `supplierPincode` — address details when published
- `supplierRating`, `rating`, `reviewCount` — star rating and number of ratings
- `responseRate` — supplier's call response rate
- `phone` — IndiaMART's public call-routing number
- `gstNumber`, `iecNumber` — GSTIN and Import-Export Code when published
- `gstVerified`, `verifiedExporter`, `badge` — verification and trust signals
- `memberSince`, `yearEstablished`, `employees`, `natureOfBusiness`, `legalStatus`, `ceo` — company background
- `exportsTo`, `gstTurnover`, `gstRegistrationDate` — export and GST details
- `category`, `categoryId` — IndiaMART category
- `specifications` — product attributes as key/value pairs
- `description` — product description when the detail-page enrichment is enabled
- `imageUrl`, `images` — main image and additional product images
- `catalogueUrl` — product brochure or catalogue PDF when published
- `searchQuery` — keyword that produced the record
- `deliveryAvailable`, `industryLeader`, `supplierAlias` — additional listing signals
- `recordType: "product"`, `scrapedAt` — record type and UTC collection time

### Output per supplier

- `supplierId`, `supplier`, `supplierUrl` — company identity and profile
- `supplierCity`, `supplierState`, `supplierAddress`, `supplierPincode` — location
- `supplierWebsite` — the supplier's own website when IndiaMART publishes a real external URL (IndiaMART-hosted alias URLs are omitted)
- `supplierRating`, `rating`, `reviewCount`, `responseRate` — reputation signals
- `phone` — IndiaMART's public call-routing number when published
- `gstNumber`, `gstRegistrationDate`, `iecNumber`, `gstVerified`, `verifiedExporter`, `badge` — statutory and verification details
- `memberSince`, `yearEstablished`, `employees`, `natureOfBusiness`, `legalStatus`, `ceo` — company background
- `additionalBusiness`, `exportsTo`, `exportPercentage` — trade profile
- `banker`, `paymentModes`, `shipmentModes` — commercial terms when published
- `products`, `productCount` — product range found on the profile
- `searchQuery` — keyword that produced the record, when applicable
- `recordType: "supplier"`, `scrapedAt` — record type and UTC collection time

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `searchProducts` | `searchProducts` / `browseCategory` / `productDetails` / `supplierProfile` (legacy `categoryBrowse` and `searchSuppliers` values are mapped) |
| `keyword` | string | `cotton fabric` | Product or material keyword (mode=searchProducts) |
| `category` | string | – | Category slug or URL, e.g. `cotton-fabric` (mode=browseCategory) |
| `city` | string | – | Indian city, e.g. `Surat`, `Mumbai`, `Jaipur` |
| `state` | string | – | Indian state or union territory |
| `productUrls` | array | – | Product URLs or numeric IDs (mode=productDetails) |
| `supplierUrls` | array | – | Supplier URLs, company IDs or aliases (mode=supplierProfile) |
| `maxItems` | integer | `20` | Maximum records across all inputs (1–1000) |
| `expandRelatedCategories` | boolean | `true` | Collect related categories when a keyword or category has too few listings |
| `enrichWithProductDetails` | boolean | `false` | Open each product page for description, full specs, MOQ, contact, GST and IEC |
| `minPrice` | integer | `0` | Drop listings below this INR price; 0 means no minimum |
| `maxPrice` | integer | `0` | Drop listings above this INR price; 0 means no maximum |
| `minRating` | number | `0` | Drop suppliers below this star rating (0–5) |
| `verifiedSuppliersOnly` | boolean | `false` | Keep only TrustSEAL, verified-exporter or GST-verified suppliers |

#### Example: keyword search in a manufacturing hub

```json
{
    "mode": "searchProducts",
    "keyword": "cotton fabric",
    "city": "Surat",
    "state": "Gujarat",
    "maxItems": 50
}
```

#### Example: category browse with commercial filters

```json
{
    "mode": "browseCategory",
    "category": "industrial-pumps",
    "minPrice": 5000,
    "maxPrice": 200000,
    "minRating": 3.5,
    "verifiedSuppliersOnly": true,
    "maxItems": 100
}
```

#### Example: look up product pages

```json
{
    "mode": "productDetails",
    "productUrls": [
        "https://www.indiamart.com/proddetail/cotton-fabric-27595399997.html",
        "27595399997"
    ],
    "maxItems": 10
}
```

#### Example: look up supplier profiles

```json
{
    "mode": "supplierProfile",
    "supplierUrls": [
        "https://www.indiamart.com/gautam-fabric/",
        "https://www.indiamart.com/company/76488165/"
    ],
    "maxItems": 10
}
```

### Use cases

- **India sourcing** — find manufacturers and wholesalers for textiles, engineering goods, chemicals, packaging or food products
- **Supplier shortlisting** — compare prices, MOQs, ratings and response rates before contacting suppliers
- **Regional sourcing** — target manufacturing hubs by city or state, such as Surat for textiles or Coimbatore for machinery
- **B2B lead generation** — collect company names, profile URLs, locations, GSTINs and public call-routing numbers
- **Export sourcing** — identify verified exporters and see which countries they already ship to
- **Price benchmarking** — compare listed prices and minimum order quantities across suppliers for the same product

### FAQ

**Do I need an IndiaMART account, cookies or an API key?**
No. The actor reads publicly visible listing and company pages and does not ask for credentials.

**Do I need to set up a proxy?**
No. The actor chooses a working connection to IndiaMART automatically. Fill in the input and run it.

**Why do some products have a price and others do not?**
IndiaMART suppliers choose whether to publish a price. When a listing has no public price, the price fields are omitted rather than filled with a placeholder.

**Why is `minOrder` missing on some products?**
Minimum order quantity is published for some listings and not others. The detail-page enrichment pass fills it when IndiaMART shows it.

**Is the phone number a direct mobile number?**
No. IndiaMART publishes a call-routing number that connects to the supplier. Personal mobile numbers and email addresses are not published on the site, so this actor does not return them.

**Are GST and IEC numbers always available?**
They are returned when the supplier publishes them on a product or company page. Coverage is higher for exporters and verified suppliers.

**Why do I get fewer records than the number of listings IndiaMART shows?**
IndiaMART limits how deep anonymous search and category pages go, and “Show More Results” requires a login. The actor paginates up to four category pages, expands related categories and city routes, and uses the public search API to get as close to `maxItems` as the source allows. Deeper category pages repeat heavily and add new IDs unpredictably, so the actor widens the search instead of assuming a fixed page pool. A single broad query may still stop short of 1,000 rows; split it by city, state or narrower category to collect more. The actor reports the shortfall in the terminal run status message and the run log instead of padding the dataset.

**Why is `supplierWebsite` missing on some rows?**
IndiaMART sometimes publishes its own `indiamart.com/<alias>/` profile URL in the website slot instead of the supplier's real site. Those IndiaMART-hosted URLs are not returned as `supplierWebsite`; the field contains only an external supplier website when one is published.

**Can I get reviews, email addresses, mobile numbers or UDYAM numbers?**
No. Review pages redirect to the company profile or a login wall, and IndiaMART does not publish emails, personal mobiles or UDYAM numbers to anonymous visitors. The `phone` field is the public call-routing number. These are hard limits of the public site, not missing parser fields.

**Can I collect more than 1,000 records in one run?**
`maxItems` is capped at 1,000. The anonymous IndiaMART pool can also be smaller than that for one broad query. Run several city, state or category slices and combine the datasets if you need more coverage.

**How fresh is the data?**
Every record carries `scrapedAt` in UTC. Prices, ratings and stock signals are captured at run time and can change on IndiaMART afterwards.

**My saved task uses an older mode name. Will it still run?**
Yes. The legacy `categoryBrowse` and `searchSuppliers` values are accepted and mapped to product search, so saved tasks keep working.

**Is this affiliated with IndiaMART?**
No. This is an independent actor that reads publicly visible IndiaMART pages and is not operated or endorsed by IndiaMART.

# Actor input Schema

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

Choose what to collect from IndiaMART.

## `keyword` (type: `string`):

Product or material keyword, e.g. 'cotton fabric', 'industrial pump', 'basmati rice'. Required for mode=searchProducts.

## `category` (type: `string`):

IndiaMART category slug or category URL, e.g. 'cotton-fabric' or 'https://dir.indiamart.com/impcat/cotton-fabric.html'. Required for mode=browseCategory.

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

Keep only suppliers in this Indian city, e.g. 'Surat', 'Mumbai', 'Jaipur'. Works with searchProducts and browseCategory.

## `state` (type: `string`):

Keep only suppliers in this Indian state or union territory. Leave empty for all of India.

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

IndiaMART product URLs or numeric product IDs. Used only for mode=productDetails.

## `supplierUrls` (type: `array`):

IndiaMART supplier profile URLs, company IDs, or company aliases. Used only for mode=supplierProfile.

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

Maximum number of records to return across all keywords and inputs.

## `expandRelatedCategories` (type: `boolean`):

When a keyword or category has too few listings, also collect IndiaMART's related product categories. Results are de-duplicated.

## `enrichWithProductDetails` (type: `boolean`):

Open each product page to add description, full specifications, MOQ, contact number, GST, IEC and company details. Adds one request per product.

## `minPrice` (type: `integer`):

Drop listings priced below this amount. Use 0 for no minimum.

## `maxPrice` (type: `integer`):

Drop listings priced above this amount. Use 0 for no maximum.

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

Drop suppliers rated below this star rating (0 to 5). Use 0 for no minimum.

## `verifiedSuppliersOnly` (type: `boolean`):

Keep only suppliers with an IndiaMART verification signal such as TrustSEAL, verified exporter or verified GST.

## Actor input object example

```json
{
  "mode": "searchProducts",
  "keyword": "cotton fabric",
  "category": "",
  "city": "",
  "state": "",
  "productUrls": [],
  "supplierUrls": [],
  "maxItems": 3,
  "expandRelatedCategories": true,
  "enrichWithProductDetails": false,
  "minPrice": 0,
  "maxPrice": 0,
  "minRating": 0,
  "verifiedSuppliersOnly": false
}
```

# Actor output Schema

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

Dataset containing all scraped IndiaMART product and supplier records.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "searchProducts",
    "keyword": "cotton fabric",
    "category": "",
    "city": "",
    "state": "",
    "productUrls": [],
    "supplierUrls": [],
    "maxItems": 3,
    "expandRelatedCategories": false,
    "enrichWithProductDetails": false,
    "minPrice": 0,
    "maxPrice": 0,
    "minRating": 0,
    "verifiedSuppliersOnly": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("nimbryxo-studio/indiamart-b2b-product-listings-by-city-and-state").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 = {
    "mode": "searchProducts",
    "keyword": "cotton fabric",
    "category": "",
    "city": "",
    "state": "",
    "productUrls": [],
    "supplierUrls": [],
    "maxItems": 3,
    "expandRelatedCategories": False,
    "enrichWithProductDetails": False,
    "minPrice": 0,
    "maxPrice": 0,
    "minRating": 0,
    "verifiedSuppliersOnly": False,
}

# Run the Actor and wait for it to finish
run = client.actor("nimbryxo-studio/indiamart-b2b-product-listings-by-city-and-state").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 '{
  "mode": "searchProducts",
  "keyword": "cotton fabric",
  "category": "",
  "city": "",
  "state": "",
  "productUrls": [],
  "supplierUrls": [],
  "maxItems": 3,
  "expandRelatedCategories": false,
  "enrichWithProductDetails": false,
  "minPrice": 0,
  "maxPrice": 0,
  "minRating": 0,
  "verifiedSuppliersOnly": false
}' |
apify call nimbryxo-studio/indiamart-b2b-product-listings-by-city-and-state --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nimbryxo-studio/indiamart-b2b-product-listings-by-city-and-state"
        }
    }
}
```

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/l0XeUyh2eHRNbU3M0/builds/XP3b8zL2i711xmbbR/openapi.json
