IndiaMART Find Suppliers in a City

Site indiamart.comTask findsuppliers-xzrhdtVersion v1Updated Jul 13, 2026Category b2b-marketplace

Search IndiaMART (dir.indiamart.com) for suppliers of a given product in a given Indian city, returning company name, product title, price, location, verification badges, rating, and storefront URL for each card on the search results page. This skill was captured from a live agent session on indiamart.com and publishes here verbatim, exactly as an agent receives it.

NoteSelectors and URL schemes drift as sites change. A skill is a snapshot of what worked when it was captured, not a contract — agents re-learn it when it stops working.

Purpose

Search IndiaMART (dir.indiamart.com) for suppliers/manufacturers of a given product in a given Indian city — returning each supplier card's company name, product title, price (or "Get Latest Price"), city/state, GST/verification badge, years on platform, response rate, rating + review count, and the canonical supplier-storefront URL. Read-only; never sends RFQs ("Get Best Price") or reveals phone numbers behind the contact-supplier flow.

For the canonical example used during skill development: query="shredders", city="Coimbatore" → the GET URL is https://dir.indiamart.com/search.mp?ss=shredders&cq=Coimbatore.

When to Use

  • Sourcing a specific product (e.g. "shredders", "industrial pumps", "cotton bales") in a specific Indian city.
  • Aggregating supplier listings for procurement / lead-gen / price-discovery workflows where IndiaMART is the dominant B2B directory in India.
  • Building a city-scoped supplier shortlist before reaching out off-platform.

Workflow

IndiaMART has no public JSON / GraphQL endpoint. Search lives on dir.indiamart.com as a server-rendered HTML page. The skill is browser-only, with one mandatory infrastructure requirement: the request must egress from an Indian residential IP. Any non-India IP (including the default Browserbase egress in us-west-2 and ap-southeast-1) triggers a 302 redirect to https://export.indiamart.com/search.php?ss=..., which is the international-exporter site and returns 403 Forbidden to browser traffic (see Site-Specific Gotchas → "Geo wall"). Cookie spoofing (r=in, iploc=gcniso%3DIN…) does not override the redirect — it's enforced at the edge based on the real source IP.

  1. Run the flow through a browserless_agent call with an India-geolocated residential proxy. Set proxy: { proxy: "residential", proxyCountry: "in" } at the top level (Mumbai/Delhi/Bengaluru pop ok) and repeat it on every call — the session persists across calls, keyed by proxy/profile, so the same proxy reconnects to the same session (dropping or changing it lands you in a different, blank session). The agent's built-in stealth covers the front-page (light Akamai-like) fingerprinting and soft challenges:

    {
      "proxy": { "proxy": "residential", "proxyCountry": "in" },
      "commands": [/* goto ipinfo → verify → goto search → extract, all below */],
    }

    Confirm the egress IP with a first goto https://ipinfo.io/json command before navigating to IndiaMART — country: "IN" is the precondition. If the IP is anywhere else, abort: the rest of the flow will redirect to export.indiamart.com and return 403. If the account/plan doesn't include residential proxies the proxy arg may be silently dropped (egress stays in the default datacenter region) — verify with ipinfo.io first; do not assume.

  2. Open the search URL directly — do not fight the homepage form (autocomplete dropdown + JS validator). The form's action is https://dir.indiamart.com/search.mp? with input name="ss" and a hidden prdsrc=1. The canonical search URL is:

    https://dir.indiamart.com/search.mp?ss={query}&cq={city}
    • ss — product/service query (URL-encoded, spaces as +).
    • cq — city filter (capitalized, e.g. Coimbatore, Mumbai, New+Delhi). The "City Quotient" filter; the dir-search page also supports it as a left-sidebar facet but appending it to the URL skips a click.
    • Optional: prdsrc=1 (product-search-flag; appears to be a passive analytics tag).
    • Optional: mcatId={n} — micro-category ID (numeric). Discoverable from the category breadcrumb on a result page.
  3. Wait for the result list to render, then scrape supplier cards. Each card is a <div> (class names rotate but the structural pattern is stable):

    • Company name + storefront URL — main <a> tag in the card header. URL shape: https://www.indiamart.com/{supplier-slug}/.
    • Product title<h2> or <p class="producttitle"> inside the card body.
    • Price<p class="price"> containing either an absolute INR amount ("₹ 12,500 / Piece") or the literal string "Get Latest Price" (price hidden until RFQ). Treat "Get Latest Price" as a sentinel, not a real value.
    • Location<p class="newLocationUi"> or text node ending in , {state}. Format: "{City}, {State}". Cross-check against the cq= filter — IndiaMART sometimes includes nearby-metro suppliers when the city has few exact-match listings.
    • Verification + tenure — look for the "TrustSEAL Verified" / "GST" / "{N} Years" pill stack near the company name. Capture as boolean flags + years_on_platform: number.
    • Rating + reviews<span class="bo">{rating}</span> followed by ({review_count} Reviews).
    • Response rate / time — sometimes present, e.g. "84% Response Rate" / "Replies within 2 hours". Optional field.
  4. Paginate. Result page typically renders ~20 cards. Pagination is via the bottom <a> links: &start={offset} where offset increments by ~20. Confirm total_results from the page header (e.g. "About 1,234 products available from 234 suppliers in Coimbatore").

  5. Stop at the listing screen. Do not click "Get Best Price" (opens RFQ modal → submits a lead), do not click phone-reveal (triggers OTP), do not follow into the supplier storefront unless an explicit per-supplier deep-fetch is requested.

Non-browser fallback (HTTP-only)

When residential-IN proxies are unavailable, there is no working non-browser path. Specifically:

  • A raw HTTP fetch (or an in-page browserless_function fetch) of https://dir.indiamart.com/search.mp?ss=shredders&cq=Coimbatore from a non-IN IP returns HTTP 302 to https://export.indiamart.com/search.php?ss=shredders, which returns HTTP 403. Confirmed during development (2026-05-21).
  • The export site (export.indiamart.com) is for international buyers and is hard-blocked to non-authenticated traffic — even with a stealth + residential-proxy session, the body is "403 Forbidden".
  • dir.indiamart.com/{city}/ (e.g. /coimbatore/) does serve a 200 from non-IN IPs (city yellow-pages directory) — but it's a generic landing page, not a product-search results page, and does not contain shredder listings or any product-filter parameter.
  • dir.indiamart.com/impcat/shredders.html is 404 — there's no national-category landing page for "shredders" under that path. The canonical category URL slug, if one exists, is not shredders.
  • IndiaMART's autocomplete suggestion endpoint (suggest.imimg.com/suggest.php) is 404 — either deprecated or moved behind auth.

If you must operate from outside India and an IN-residential proxy is genuinely unobtainable, the skill has no path forward — terminate and report the geo-block, do not silently scrape export.indiamart.com (it's 403, and the path differs from dir. even when it does respond).

Site-Specific Gotchas

  • Geo wall (IP-based 302 → 403) — confirmed 2026-05-21. Any GET to https://dir.indiamart.com/search.mp?ss=… from a non-Indian source IP returns 302 Location: https://export.indiamart.com/search.php?ss={query}, which serves a 1KB 403 Forbidden page. This is enforced at the load balancer / edge layer, not by user-agent fingerprint and not by r= or iploc cookies. Tested cookie spoofing of r=in and iploc=gcniso%3DIN%7C… from a US (Oregon, AWS) egress IP — both ignored, redirect persists. The only reliable bypass is an actual Indian egress IP.
  • A silently-dropped proxy is a tell — if your call set proxy: { proxy: "residential", proxyCountry: "in" } but the egress IP from ipinfo.io/json is still in a US datacenter region (e.g. Oregon/Boardman), the proxy wasn't applied. The request is accepted without error but the residential proxy doesn't take effect on accounts/plans that don't include it. Verify egress geolocation explicitly before each run; do not trust that the proxy config took.
  • export.indiamart.com is not a fallback — it's a separate property serving international exporters with a different navigation. The 403 returned to bots is not a soft challenge; there is no cf-clearance-style cookie to acquire. Don't waste turns trying.
  • City directory pages (dir.indiamart.com/{city}/) are accessible from any IP but useless for product search — they're city yellow-pages aggregators (titled e.g. "Coimbatore Yellow Pages - Directory of Companies") and list top categories by industry, not product-filtered supplier listings. They do confirm the city slug exists in IndiaMART's URL space (e.g. coimbatore, mumbai, new-delhi) — useful for sanity-checking the cq= value.
  • Cookie tells — IndiaMART sets r=g (region=global) for non-Indian IPs and would set r=in for Indian IPs. The iploc cookie carries the server-resolved geolocation: iploc=gcniso%3DUS%7Cgcnnm%3DUnited%20States%20Of%20America%7Cgctnm%3DBoardman%7C… — useful as a debug sentinel to confirm what IP the server thinks you have, but not writable to spoof.
  • Search-form action is a redirect target — the homepage form posts via GET to https://dir.indiamart.com/search.mp? with ss={query} and hidden prdsrc=1. Filling the form on www.indiamart.com and pressing Enter triggers the redirect. Bypass by GETting the full URL directly.
  • www.indiamart.com/search.html ≠ search results — it's an "Advanced Search" landing page (title: "Advanced Search - IndiaMART") with a search form. It's served 200 from any IP, has zero results content, and submits to the same geo-blocked dir.indiamart.com/search.mp.
  • Single-word vs. plural slugsdir.indiamart.com/coimbatore/shredders.html 301-redirects to /impcat/shredders.html (which is 404). …/shredder.html 301-redirects to /impcat/shredder.html (also 404). The city-product URL pattern only works when IndiaMART has pre-indexed a city-product pair as a landing page; for ad-hoc queries, use search.mp?ss=…&cq=… instead.
  • Result count is approximate — the "About 1,234 products" header is a rounded count; the actual supplier count differs from product count, and pagination eventually trails off into less-relevant cross-category results around the 200-supplier mark.
  • Phone reveal + "Get Best Price" are write actions — both fire backend events (/services/contactsupplier, /services/postbl) that count as a lead from the supplier's perspective and may trigger an SMS/call to the buyer. Read-only skill: stop at the listing card; do not click these CTAs.
  • Autocomplete suggest endpoint deprecatedhttps://suggest.imimg.com/suggest.php?text=… returns 404. If you need to canonicalize a query (e.g. "shredder" vs. "shredding machine"), there is no live suggest API as of 2026-05; use the result page's "Did you mean…" hint instead.

Expected Output

{
  "query": "shredders",
  "city": "Coimbatore",
  "state": "Tamil Nadu",
  "url": "https://dir.indiamart.com/search.mp?ss=shredders&cq=Coimbatore",
  "total_products_approx": 1234,
  "suppliers_returned": 20,
  "suppliers": [
    {
      "company_name": "Acme Recycling Machines Pvt. Ltd.",
      "storefront_url": "https://www.indiamart.com/acme-recycling-machines/",
      "product_title": "Industrial Paper Shredder, Capacity: 100 kg/hr",
      "price_inr": 125000,
      "price_label": "₹ 1,25,000 / Piece",
      "price_hidden": false,
      "city": "Coimbatore",
      "state": "Tamil Nadu",
      "trustseal_verified": true,
      "gst_verified": true,
      "years_on_platform": 12,
      "rating": 4.3,
      "review_count": 87,
      "response_rate_pct": 84,
      "response_time_label": "Replies within 2 hours",
      "product_image_url": "https://5.imimg.com/data5/…/shredder-125x125.jpg",
      "mcat_id": 3942
    },
    {
      "company_name": "Coimbatore Shredding Solutions",
      "storefront_url": "https://www.indiamart.com/coimbatore-shredding-solutions/",
      "product_title": "Heavy Duty Plastic Shredder",
      "price_inr": null,
      "price_label": "Get Latest Price",
      "price_hidden": true,
      "city": "Coimbatore",
      "state": "Tamil Nadu",
      "trustseal_verified": false,
      "gst_verified": true,
      "years_on_platform": 4,
      "rating": null,
      "review_count": 0,
      "response_rate_pct": null,
      "response_time_label": null,
      "product_image_url": "https://5.imimg.com/data5/…/heavy-duty-shredder-125x125.jpg",
      "mcat_id": 3942
    }
  ]
}

Outcome shapes:

  • ok — at least one supplier card rendered (shape above).
  • no_results — page header reads "No products found" / "Sorry, no matching results"; suppliers: [], total_products_approx: 0. Try broadening (drop cq=, try synonyms — shredder / shredding machine / paper shredder).
  • geo_blocked — final URL is https://export.indiamart.com/search.php?ss=… and body is "403 Forbidden". Report { "error": "geo_blocked", "egress_country": "<ISO2>", "remediation": "use India residential proxy" } and stop. This is the expected failure shape when the session is not on an Indian IP.
  • rate_limiteddir.indiamart.com returns 429 (observed once during development on a stealth + non-IN-proxy session). Back off ≥ 60s before retrying; rotating the egress IP also clears it.

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=indiamart.com&task=findsuppliers-xzrhdt