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 parsing — price 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
- Find B2B suppliers in India with IndiaMart
- Build a procurement shortlist from IndiaMart
- Verify Indian suppliers' GST and MOQ at scale
- The complete guide to scraping business data
- All Thirdwatch use-case guides
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.