Monitor Wholesale Prices in India with IndiaMart at Scale (2026)

Thirdwatch's IndiaMart Scraper makes Indian wholesale price monitoring a tracked time series at $0.002 per record — daily snapshot every supplier in a category, parse price strings, surface category-median moves and per-supplier deviations. Built for procurement teams, commodity researchers, and supply-chain ops who need structured Indian wholesale price data without subscribing to a commodity-data feed.

Why monitor Indian wholesale prices via IndiaMart

Indian wholesale prices move on a cadence that affects margins for every domestic manufacturer. According to the Office of the Economic Adviser's monthly WPI bulletins, the Indian wholesale price index moved across a 3-7% range in 2024 with regional and category-level dispersion much wider than the national headline. For a procurement manager or supply-chain analyst, the headline WPI is too aggregated to act on — the actionable signal lives at the category and supplier level. IndiaMart aggregates roughly 10 million Indian B2B supplier listings, each with prices and MOQs, into a structured directory; the actor returns it as time-series-ready data.

The job-to-be-done is concrete. A factory's procurement manager wants daily prices on stainless-steel pipes 304 grade across 50 suppliers, to time bulk-order placement for the lowest landed cost. A commodity-research analyst building an Indian wholesale-price dashboard needs categorical median prices tracked weekly. A textile manufacturer sourcing dyes and chemicals wants alerts when supplier prices in Maharashtra rise 15%+ within a month. All of these reduce to the same shape — daily IndiaMart snapshot × category × parse-and-aggregate. The Thirdwatch actor is the data layer.

How does this compare to the alternatives?

Three options for getting Indian wholesale price data:

Approach Cost per 1,000 records × daily Reliability Setup time Maintenance
Manual MCX/NCDEX exports + analyst spreadsheets Per-licence cost, hours of work High for tracked commodities only Days–weeks Daily manual exports
Paid commodity-data SaaS (Argus Media, Platts) $20K–$200K/year flat per category High but expensive Days to onboard Vendor lock-in
Thirdwatch IndiaMart Scraper $2 × daily × category = $730/year Production-tested, monopoly position on Apify Half a day Thirdwatch tracks IndiaMart changes

Paid commodity-data feeds are the right choice for tracked exchange-listed commodities. The IndiaMart Scraper actor page gives you the structured supplier-level data for the long tail of categories not tracked by exchanges; combine both for full coverage.

How to monitor Indian wholesale prices in 4 steps

Step 1: How do I authenticate against Apify?

Sign in at apify.com (free tier, no credit card), open Settings → Integrations, and copy your personal API token. Every example below assumes the token is in APIFY_TOKEN:

export APIFY_TOKEN="apify_api_xxxxxxxxxxxxxxxx"

Step 2: How do I take a daily snapshot for a watchlist of categories?

Pass each category as a query and run with consistent parameters across days for clean time series.

import os, requests, datetime, json, pathlib

ACTOR = "thirdwatch~indiamart-supplier-scraper"
TOKEN = os.environ["APIFY_TOKEN"]

CATEGORIES = [
    "stainless steel pipes 304",
    "stainless steel pipes 316",
    "GI seamless pipes",
    "ERW MS pipes",
    "copper coils",
]

resp = requests.post(
    f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items",
    params={"token": TOKEN},
    json={"queries": CATEGORIES, "maxResultsPerQuery": 100},
    timeout=900,
)
records = resp.json()
today = datetime.date.today().isoformat()
pathlib.Path(f"snapshots/indiamart-{today}.json").write_text(json.dumps(records))
print(f"{today}: {len(records)} listings across {len(CATEGORIES)} categories")

Five categories × 100 listings each = up to 500 records per daily snapshot, costing $1.

Step 3: How do I parse prices and compute category medians?

Build a regex parser for the price field, then aggregate.

import re, pandas as pd, glob

PRICE_RE = re.compile(r"(?:Rs|₹|INR)\s*([\d,]+(?:\.\d+)?)\s*(?:/|per)?\s*(Kg|Piece|Tonne|Roll|Meter|Litre|Box)?",
                      re.IGNORECASE)

def parse_price(s):
    if not s or "Get Latest" in s:
        return (None, None)
    m = PRICE_RE.search(s)
    if not m:
        return (None, None)
    return (float(m.group(1).replace(",", "")),
            (m.group(2) or "").strip() or None)

frames = []
for f in sorted(glob.glob("snapshots/indiamart-*.json")):
    date = pathlib.Path(f).stem.replace("indiamart-", "")
    for j in json.loads(pathlib.Path(f).read_text()):
        val, unit = parse_price(j.get("price"))
        if val is None:
            continue
        frames.append({
            "date": date,
            "category": (j.get("product_name") or "").lower(),
            "supplier": j.get("company_name"),
            "city": j.get("city"),
            "price": val,
            "unit": unit,
        })

df = pd.DataFrame(frames)
df["date"] = pd.to_datetime(df["date"])

# Category median price per day, restricted to one unit (Kg) for clean trend
kg = df[df.unit == "Kg"]
median_kg = (
    kg.groupby([pd.Grouper(key="date", freq="1D"), "category"])
      ["price"].median().reset_index(name="median_inr_per_kg")
)
print(median_kg.tail(20))

The median per category per day is the time-series headline — chartable directly with matplotlib or plotly.

Step 4: How do I detect supplier-level price moves and alert?

Compute per-supplier deviation from category median; alert when a supplier's price moves materially out of line with the category.

import requests as r

last_two = sorted(df.date.unique())[-2:]
yesterday, today = last_two
todays = df[df.date == today].copy()
yest = df[df.date == yesterday].set_index(["supplier", "category"])

todays["yest_price"] = todays.apply(
    lambda row: yest.price.get((row.supplier, row.category)),
    axis=1,
)
movers = todays.dropna(subset=["yest_price"]).copy()
movers["pct_change"] = (movers.price / movers.yest_price) - 1
movers = movers[movers.pct_change.abs() >= 0.05]

for _, row in movers.iterrows():
    arrow = ":chart_with_upwards_trend:" if row.pct_change > 0 else ":chart_with_downwards_trend:"
    r.post(
        "https://hooks.slack.com/services/.../...",
        json={"text": (f"{arrow} *{row.supplier}* ({row.city}): "
                       f"{row.category} ₹{row.yest_price:.0f} → ₹{row.price:.0f} "
                       f"({row.pct_change*100:+.1f}%)")},
        timeout=10,
    )
print(f"{len(movers)} supplier-level moves alerted")

A 5%+ daily move at a single supplier is rare enough to be signal — most days produce 0-3 alerts.

Sample output

A single record with the price, MOQ, and supplier-trust fields highlighted looks like this. The price-monitoring analysis stitches many such rows over time.

{
  "company_name": "Tata Steel Ltd.",
  "product_name": "Stainless Steel Pipes 304",
  "price": "Rs 180 / Kg",
  "moq": "500 Kg",
  "product_url": "https://www.indiamart.com/tata-steel/stainless-steel-pipes.html",
  "catalog_url": "https://www.indiamart.com/tata-steel/",
  "image_url": "https://5.imimg.com/data5/SELLER/Default/.../stainless-steel-pipes.jpg",
  "location": "Mumbai, Maharashtra",
  "city": "Mumbai",
  "state": "Maharashtra",
  "phone": "8044464742",
  "gst_number": "27AAACT2727Q1ZV",
  "supplier_rating": "4.5",
  "rating_count": "1240",
  "member_since": "1998"
}

A typical category time-series row looks like:

Date Category Median ₹/Kg IQR n suppliers
2026-04-21 stainless steel pipes 304 178 22 84
2026-04-22 stainless steel pipes 304 181 24 86
2026-04-23 stainless steel pipes 304 184 28 85

Median rising 3% with IQR widening from 22 to 28 within three days is exactly the canonical "category-wide upward move incoming" pattern.

Common pitfalls

Three things go wrong in IndiaMart-driven price-monitoring pipelines. Display-string price parsingprice arrives as text like "Rs 180 / Kg", "₹1,200 onwards", or "Get Latest Price"; the regex in Step 3 handles the first two patterns. Treat "Get Latest Price" rows as opaque rather than zero. Unit mismatch — same category may be sold in Kg or Piece or Roll across suppliers; always group by unit before computing medians. The actor preserves the raw moq and price strings precisely so downstream parsing has full information. Stale-listing artifacts — some IndiaMart listings haven't been touched by the supplier in months; their stable price isn't a real signal. Filter out rows where member_since is over 5 years ago AND the price hasn't changed across 30+ snapshots.

Thirdwatch's actor returns 15 fields per record so the parsing and filtering can stay in your code. The pure-HTTP architecture means a 500-listing daily snapshot completes in under five minutes and costs $1 — annual data sits at $365, an order of magnitude cheaper than any commodity-data subscription.

Related use cases

Frequently asked questions

How fresh is IndiaMart price data, and how often should I refresh?

Each run pulls live from IndiaMart at request time — there is no cache. Wholesale prices on IndiaMart update at supplier discretion; mainstream commodities (steel, plastic, paper) refresh weekly to monthly per supplier. Daily snapshots are the right cadence for active price-monitoring; weekly is fine for slower-moving categories. Hourly is wasted effort.

Can I parse the price field reliably?

About 70% of listings publish a parseable price like Rs 180 / Kg or ₹1,200 / Piece. The remaining 30% show Get Latest Price or use non-standard formats. Build a regex parser that extracts numeric value plus unit; treat "Get Latest Price" rows as opaque (still useful for supplier discovery, just not for price tracking). The actor preserves the raw price string for downstream parsing.

What should I monitor — price, MOQ, or both?

Both, but for different decisions. Price changes signal commodity-cycle movement and individual-supplier strategy. MOQ changes signal supplier-side capacity utilisation — a supplier raising MOQ usually means they're full and want larger orders only. Track both as a combined dataset; the combination tells you more than either alone.

How do I detect supplier-level price moves vs market-wide moves?

Compute the median price per category per snapshot, then per-supplier deviation from category median. A supplier with prices rising 10% while the category median is flat is making a margin move; one rising in lock-step with the category median is responding to commodity inflation. Most procurement decisions care about supplier-level deviations, not the absolute price.

How does IndiaMart price data compare to MCX or commodity exchange data?

Commodity-exchange data (MCX, NCDEX) is the gold standard for spot and futures prices on tracked commodities like gold, copper, steel, aluminium. IndiaMart prices are retail-wholesale supplier-listed, which lag MCX by hours to days for pure commodities but include the long tail of categories MCX doesn't price (specialised chemicals, regional textiles, processed materials). Use both — MCX for upstream commodity, IndiaMart for downstream B2B.

Can I forecast price moves from supplier-level signals?

Cautiously yes. The single best predictor is the spread between maximum and minimum prices in a category — a widening spread typically precedes a category-wide upward move by 1-2 weeks because top-pricing suppliers move first. Track the IQR (inter-quartile range) over time; an IQR rising 30%+ within a month is a credible leading indicator of a category-wide price increase.

Run the IndiaMart Scraper on Apify Store — pay-per-supplier, free to try, no credit card to test.