Monitor Myntra Deals and Discounts at Scale (2026)
Track Myntra End-of-Reason-Sale, Big Fashion Days and steady-state discounts with Thirdwatch. Real-deal alerts, sale-window analytics, Python recipes inside.

Thirdwatch's Myntra Scraper returns live MRP, current price and computed discount_percent for every product, making it the workhorse data layer for an India fashion deal-tracking pipeline. Built for ops teams running price-alert services, dropshippers timing inventory buys, consumer-app builders running deal-feed products, and brand teams monitoring their own discount frequency.
Why monitor Myntra deals at scale
Myntra runs the most aggressive promotional cycle of any India fashion marketplace. End-of-Reason-Sale (EORS) is the country's anchor fashion sale event — Economic Times reports routinely cite EORS as Myntra's largest revenue window, with discounts reaching 50-80% off MRP across apparel, footwear and beauty. Between EORS windows, Big Fashion Days run every 4-6 weeks, Republic Day Sale anchors January, Independence Day Sale anchors August, and category-specific events run year-round. For deal-tracking services, dropshippers, and brand-protection teams, this cycle is the entire job-to-be-done.
The job-to-be-done is structured. A consumer-facing deal-alert app needs hourly discount sweeps during sale windows and daily sweeps the rest of the year. A dropshipper buys clearance inventory at 70%+ off MRP for resale on Meesho or Amazon. A brand-protection team watches for unauthorised resellers running deeper discounts than the brand's own approved channels. A pricing analyst studies seasonal discount cycles for category-level forecasting. All reduce to longitudinal MRP + price + discount_percent capture against a watchlist of SKUs or categories.
How does this compare to the alternatives?
Three options for systematic Myntra discount monitoring:
| Approach | Reliability | Setup time | Maintenance |
|---|---|---|---|
| Browse Myntra manually + spreadsheet | Low — can't scale beyond a few SKUs, misses intraday windows | Continuous | Doesn't scale |
| Deal aggregator scraping (Desidime, GrabOn) | Medium — community-driven, variable freshness, opinionated curation | 1-2 days | Aggregator schema changes |
| Thirdwatch Myntra Scraper | Production-tested with production-grade anti-bot tooling | 5 minutes | Thirdwatch tracks Myntra changes |
Deal aggregators are downstream consumers, not primary sources — many of them use scrapers like ours as their upstream input. The Myntra Scraper actor page gives you the raw MRP + price + discount fields at transparent per-result pricing, so you can build your own deal-detection logic rather than inherit someone else's curation.
How to monitor Myntra deals in 4 steps
Step 1: How do I run a sale-window sweep?
During EORS or Big Fashion Days, sweep a broad watchlist hourly. Sort by discount to put the deepest cuts first.
export APIFY_TOKEN="apify_api_xxxxxxxxxxxxxxxx"import os, requests, datetime, json, pathlib
ACTOR = "thirdwatch~myntra-scraper"
TOKEN = os.environ["APIFY_TOKEN"]
CATEGORIES = ["men-tshirts", "men-shirts", "men-jeans",
"women-tops", "women-dresses", "women-kurtas-kurtis",
"men-footwear", "women-footwear",
"sportswear", "beauty-personal-care"]
resp = requests.post(
f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items",
params={"token": TOKEN},
json={
"queries": CATEGORIES,
"sortBy": "discount",
"maxResults": 200,
},
timeout=900,
)
records = resp.json()
stamp = datetime.datetime.utcnow().isoformat()[:13] + "Z"
pathlib.Path(f"sweeps/myntra-{stamp}.json").write_text(json.dumps(records))
print(f"{stamp}: {len(records)} records across {len(CATEGORIES)} categories")sortBy: "discount" returns the deepest discounts first within each category, so the first 50 records per category cover the visible sale anchors. Ten categories × 200 records each = 2,000 records per hourly sweep — affordable for a 48-hour EORS hot window.
Step 2: How do I filter to genuinely deep discounts?
Compute discount-percent against a 30-day median price rather than MRP. MRP inflation makes raw discount-percent unreliable as a deal signal.
import pandas as pd, glob
frames = []
for f in sorted(glob.glob("sweeps/myntra-*.json")):
stamp = pathlib.Path(f).stem.replace("myntra-", "")
for j in json.loads(pathlib.Path(f).read_text()):
frames.append({
"stamp": stamp,
"sku": j.get("sku"),
"brand": j.get("brand"),
"product_name": j.get("product_name"),
"price": j.get("price"),
"mrp": j.get("original_price"),
"rating": j.get("rating"),
"rating_count": j.get("rating_count"),
"url": j.get("url"),
})
ts = pd.DataFrame(frames).dropna(subset=["sku", "price"])
ts["stamp"] = pd.to_datetime(ts.stamp, format="%Y-%m-%dT%H")
ts = ts.sort_values("stamp")
# 30-day median per SKU
ts["price_30d_median"] = (
ts.groupby("sku")["price"]
.transform(lambda s: s.rolling("30D", on=ts.stamp).median())
)
ts["delta_pct"] = (ts.price - ts.price_30d_median) / ts.price_30d_median * 100
real_deals = ts[
(ts.delta_pct <= -15)
& (ts.rating >= 4.0)
& (ts.rating_count >= 100)
].sort_values("delta_pct")
print(real_deals[["brand", "product_name", "price",
"price_30d_median", "delta_pct", "rating"]].head(20))A 15%+ drop below the SKU's own 30-day median, on a 4.0+ rated product with 100+ reviews, is the canonical "real deal" filter — robust against MRP inflation, low-quality clearance and review-bombed listings.
Step 3: How do I alert on first detection only?
Persist a seen-deals state so you alert once per (sku, deal_event) rather than every hour.
import sqlite3, pathlib
DB = pathlib.Path("seen_deals.sqlite")
con = sqlite3.connect(DB)
con.execute("""CREATE TABLE IF NOT EXISTS seen_deals
(sku TEXT, alerted_at TEXT, last_price INTEGER,
PRIMARY KEY (sku))""")
import requests as r
for _, row in real_deals.iterrows():
cur = con.execute("SELECT last_price FROM seen_deals WHERE sku = ?", (row.sku,))
seen = cur.fetchone()
if seen and abs(seen[0] - row.price) / seen[0] < 0.05:
continue # already alerted at roughly this price
msg = (f":fire: *{row.brand} {row.product_name[:60]}* — "
f"₹{int(row.price):,} (₹{int(row.price_30d_median):,} 30d median, "
f"{row.delta_pct:+.1f}%) — {row.url}")
r.post("https://hooks.slack.com/services/.../...",
json={"text": msg}, timeout=10)
con.execute("REPLACE INTO seen_deals VALUES (?,?,?)",
(row.sku, datetime.datetime.utcnow().isoformat(),
int(row.price)))
con.commit()Step 4: How do I produce a sale-event recap?
After an EORS window closes, aggregate by brand and category for a post-mortem.
event_window = ts[(ts.stamp >= "2026-06-01") & (ts.stamp <= "2026-06-12")]
brand_recap = (
event_window.groupby("brand")
.agg(deals=("sku", "nunique"),
median_disc=("delta_pct", "median"),
max_disc=("delta_pct", "min"))
.sort_values("deals", ascending=False)
.head(20)
)
print("Top brands by EORS deal volume:")
print(brand_recap)Brand-level recaps are the most actionable artefact — they reveal which brands push deepest discounts (typically private labels and clearance-heavy international brands) versus which hold price (premium-tier brands).
Sample output
A single record during EORS for a heavily-discounted product looks like the example below. discount_percent is computed by the actor from original_price and price.
{
"sku": "29384721",
"product_name": "HRX by Hrithik Roshan Men's Active Tshirt",
"brand": "HRX by Hrithik Roshan",
"price": 379,
"original_price": 1499,
"discount_amount": 1120,
"discount_percent": 74.7,
"currency": "INR",
"rating": 4.3,
"rating_count": 8420,
"image_url": "https://assets.myntassets.com/.../29384721.jpg",
"url": "https://www.myntra.com/tshirts/hrx-by-hrithik-roshan/.../buy",
"article_type": "Tshirts",
"primary_colour": "Olive",
"sizes": ["S", "M", "L", "XL", "XXL"],
"color_variants_count": 4
}discount_percent of 74.7 means this listing is at one-quarter of MRP — typical for HRX during EORS day one. The 8,420-rating count is meaningful: a high-volume rated SKU at this discount level is genuine inventory clearance, not a low-quality outlier. For deal-alert services, rating_count is the strongest quality filter alongside the 30-day median check.
Common pitfalls
Three things go wrong in production deal-monitoring pipelines. MRP inflation — brands routinely set MRP at 2-3x the steady-state price specifically to support discount-claim marketing; never use discount_percent against MRP as your sole signal. Compare against the SKU's own rolling median price instead. Alert fatigue — without dedup state, a 200-record hourly sweep that's mostly the same SKUs at the same prices fires thousands of duplicate alerts; persist a seen-deals table and only alert on first-detection. Sale-window skew in 30-day medians — if your 30-day window includes a previous EORS, the median itself is depressed; either exclude past sale windows from the median calculation or compute a separate "steady-state median" using only non-sale days.
Thirdwatch's actor handles the anti-bot work and India-region routing to stay reliable through EORS-scale traffic — even a 2,000-record hourly sweep typically completes in single-digit minutes. Pair Myntra with AJIO and Flipkart for a cross-marketplace India deal pipeline. A subtle fourth pitfall worth flagging: Myntra Insider tier members see prices 5-10% below the public price; the actor returns the public number, which is the right signal for non-Insider users but understates the deal depth for premium-tier customers.
Related use cases
Frequently asked questions
When are Myntra's big sale events?
Myntra runs End-of-Reason-Sale (EORS) twice a year in June and December, Big Fashion Days every 4-6 weeks, Republic Day Sale in January, Independence Day Sale in August, and category-specific events year-round. Discounts during EORS typically reach 50-80% off MRP; steady-state discounts sit around 30-50% for most apparel.
How do I separate real discounts from MRP inflation?
Persist the median price for each SKU over the trailing 30 days and treat any discount where current_price drops more than 15% below the 30-day median as a real event. Discounts measured against MRP alone are noisy because Myntra brands commonly set MRP 2-3x the steady-state price specifically to support discount-claim marketing.
What's the right cadence for sale-event monitoring?
Hourly during the first 24-48 hours of EORS and Big Fashion Days — the deepest discounts usually drop on day one and restock cycles change the catalogue intraday. After day three, daily cadence is sufficient. For steady-state discount tracking outside named events, daily is fine and stays cheap.
What fields tell me a product is on sale?
Three: original_price (MRP), price (current selling price), and discount_percent (computed from the two). A product with original_price = price and discount_percent = 0 is at full price. discount_percent above 50 typically indicates a sale-event listing or clearance SKU.
Can I track the same SKU over time?
Yes — the sku field (also exposed as product_id) is Myntra's stable product identifier and is the right natural key for cross-snapshot dedup and time-series joins. The url field is the human-readable equivalent. Both survive across sale events and price changes.
How does this compare to deal aggregator sites?
Aggregators like Desidime or GrabOn surface community-submitted deals — high recall but variable freshness and curation. The Myntra Scraper gives you a deterministic, structured discount-detection layer keyed off live MRP-vs-price data. Many aggregators use scrapers like this as the input layer to their public-facing dealfeeds.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.