Skip to main content
Thirdwatchthirdwatch
E-commerce & products

Scrape AJIO Products for India Fashion Pricing (2026 Guide)

Pull AJIO products with Thirdwatch — name, brand, price, MRP, discount, category, image. Reliance-owned India fashion catalog at scale, with Python recipes.

May 12, 2026 · 6 min read · 1,298 words
See the scraper →

Thirdwatch's AJIO Scraper returns AJIO product search and category-browse results — sku, product_name, brand, price, list_price, original_price (MRP), discount_percent, currency, image_url, url, category path, catalog_name, color_group and coupon flags. Built for India fashion researchers tracking Reliance Retail private-label pricing, ops teams monitoring competitor MRP and discount cycles, dropshipping operators sourcing trends, and analysts building India fashion-ecom datasets.

Why scrape AJIO for India fashion pricing

AJIO is Reliance Retail's flagship online fashion marketplace and the third pillar of India fashion ecom alongside Myntra and Nykaa. According to RedSeer's 2024 India online fashion report, the online fashion category alone was estimated at roughly $9–10B in GMV with Myntra, AJIO and Nykaa-Fashion together holding the majority share. AJIO has been gaining share on the back of Reliance's private-label push — house brands like AJIO Own, Netplay, Teamspirit and Performax give Reliance pricing levers that the third-party-led Myntra catalog can't match.

For an India fashion researcher, brand ops team, or pricing analyst, that makes AJIO a non-optional source. The job-to-be-done is structured: a fashion ops team tracks 500 SKUs across men's casuals and women's ethnic for daily MRP and discount diff. A private-label brand benchmarks its sale price against the same category on AJIO. A market researcher builds a longitudinal dataset of India's end-of-season-sale rhythm. A dropshipper looks for high-discount, high-margin categories to source upstream. All of these reduce to keyword or category pulls returning structured rows. The blocker has been systematic access — AJIO has no public catalog API for non-affiliates, and the site's anti-bot defences reject naive HTTP clients.

How does this compare to the alternatives?

Approach Reliability Setup time Maintenance
Manual AJIO browsing into Excel Low — doesn't scale beyond a few SKUs Continuous analyst time Continuous
Building your own AJIO scraper Brittle — AJIO's anti-bot blocks naive HTTP, breaks every release 2-3 engineer weeks Ongoing per AJIO change
Thirdwatch AJIO Scraper Production-tested with anti-bot tooling already in place 5 minutes from token to first dataset Thirdwatch tracks AJIO changes

There is no public AJIO Affiliate API equivalent to Flipkart's or Amazon's offerings — the only partner channels are inside the Reliance ecosystem. The AJIO Scraper actor gives you the public catalog at competitively priced pay-per-result, with no application process and no use-case gating. For a complete India fashion view, pair it with our Myntra Scraper and Flipkart Scraper.

How to scrape AJIO 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 pull a watchlist of fashion keywords?

Pass each fashion keyword as a query, optionally constrain by category, and set maxResults to your daily refresh size.

import os, json, datetime, pathlib
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])

WATCHLIST = [
    "men kurta", "women kurta set", "men casual shirt",
    "women dress", "men running shoes", "women heels",
    "laptop bag", "saree", "men tshirt",
]

run = client.actor("thirdwatch/ajio-scraper").call(run_input={
    "queries": WATCHLIST,
    "category": "all",
    "sortBy": "popularity",
    "maxResults": 100,
})

records = list(client.dataset(run["defaultDatasetId"]).iterate_items())
today = datetime.date.today().isoformat()
pathlib.Path("snapshots").mkdir(exist_ok=True)
pathlib.Path(f"snapshots/ajio-{today}.json").write_text(json.dumps(records))
print(f"{today}: {len(records)} products across {len(WATCHLIST)} keywords")

Nine keywords at 100 results each lands roughly 800–900 records after dedup — small enough to run daily, large enough to feed weekly category trend dashboards.

Step 3: How do I browse a whole category without a keyword?

Leave queries empty and set category to one of the enums. This is the right path for "show me what's selling in women's ethnic wear this week" workflows.

run = client.actor("thirdwatch/ajio-scraper").call(run_input={
    "queries": [],
    "category": "women-kurtas",
    "sortBy": "newest",
    "minPrice": 500,
    "maxPrice": 3000,
    "maxResults": 500,
})

items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(f"{len(items)} newest women-kurtas between ₹500 and ₹3000")

The sortBy enum accepts relevance, popularity, priceAsc, priceDesc, newest, rating and discount. For new-launch monitoring choose newest; for end-of-season-sale tracking choose discount. The minPrice / maxPrice filters map to AJIO's own price slider, so you get exactly the slice the AJIO UI would return.

Step 4: How do I parse INR prices and surface real discounts?

AJIO returns numeric price and original_price fields directly, but discount_percent is parsed from AJIO's display string (e.g. "(60% off)"). A few records arrive as null when AJIO didn't display a strike-through — handle those defensively.

import pandas as pd

df = pd.DataFrame(records)

# coerce numerics
for col in ("price", "original_price", "discount_percent"):
    df[col] = pd.to_numeric(df[col], errors="coerce")

# fallback: compute discount when AJIO didn't display one
mask = df.discount_percent.isna() & df.original_price.notna() & (df.original_price > 0)
df.loc[mask, "discount_percent"] = (
    (df.loc[mask, "original_price"] - df.loc[mask, "price"]) / df.loc[mask, "original_price"] * 100
).round(0)

# the canonical "real deal" filter for AJIO
deep_deals = df[
    df.discount_percent.notna()
    & (df.discount_percent >= 50)
    & df.brand.notna()
].sort_values("discount_percent", ascending=False)

print(deep_deals[[
    "product_name", "brand", "price", "original_price",
    "discount_percent", "category"
]].head(20))

A 50%+ discount on a known brand is AJIO's canonical end-of-season-sale signal — private-label SKUs run that deep year-round, third-party brand SKUs typically only during EOSS windows. Use brand as the segmentation axis: private-label vs branded discount patterns are operationally different.

Sample output

A single AJIO record looks like this. The shape is consistent across categories — fashion, footwear, bags, beauty all populate the same field set, with rating and rating_count frequently null on AJIO's listing surface.

[
  {
    "sku": "469823472",
    "product_name": "Solid Cotton Straight Kurta with Pocket",
    "brand": "AJIO Own",
    "price": 599,
    "list_price": 599,
    "original_price": 1999,
    "discount_percent": 70,
    "currency": "INR",
    "image_url": "https://assets.ajio.com/medias/sys_master/.../kurta.jpg",
    "url": "https://www.ajio.com/p/469823472",
    "category": "Men > Indian & Festive Wear > Kurtas",
    "catalog_name": "AJIO Own Kurtas",
    "color_group": "blue-cotton",
    "coupon_applicable": true,
    "rating": null,
    "rating_count": null,
    "planning_category": "MAPP_KURTA"
  },
  {
    "sku": "468701923",
    "product_name": "Embroidered A-Line Kurta with Trousers & Dupatta",
    "brand": "Anouk",
    "price": 1799,
    "list_price": 1799,
    "original_price": 4499,
    "discount_percent": 60,
    "currency": "INR",
    "image_url": "https://assets.ajio.com/medias/sys_master/.../anouk.jpg",
    "url": "https://www.ajio.com/p/468701923",
    "category": "Women > Indian & Fusion Wear > Kurta Sets",
    "catalog_name": "Anouk Kurta Sets",
    "color_group": "pink-rayon",
    "coupon_applicable": false,
    "rating": 4.3,
    "rating_count": 1247,
    "planning_category": "WAPP_KURTASET"
  }
]

url is the canonical natural key for cross-snapshot dedup; sku is AJIO-internal and stable across re-listings, so prefer it for joining historical snapshots. category is a > -separated three-level path (segment > vertical > brick), so split on > for hierarchical analytics. coupon_applicable: true means AJIO is layering an additional coupon on top of the displayed price — for fully-effective-cost analysis you'll want to model that separately from the headline discount_percent.

Common pitfalls

Three things go wrong in production AJIO pipelines. MRP vs effective price confusion — AJIO sometimes shows three numbers in its UI: MRP (original_price), buy price (list_price), and offer price after coupon (price). For "what does the customer actually pay" use price; for "what is the catalog discount" compute against original_price; don't mix the two. Private-label vs third-party brand mixing — AJIO Own, Netplay, Teamspirit, Performax behave as outlier discount engines because they're Reliance house brands; if you average discount across the catalog without segmenting on brand, the private-label tail will skew your numbers. Category-path drift — AJIO occasionally re-shuffles its segment/vertical taxonomy (Indian Wear vs Ethnic Wear, Fusion Wear vs Indo-Western); pin downstream analytics on planning_category (the internal stable code) rather than the human category string for time-series stability.

Thirdwatch's actor handles AJIO's anti-bot defences and proxy rotation transparently — production-tested at daily watchlist volumes. A 500-product daily snapshot completes in well under five minutes, small enough to run multiple times a day during EOSS windows.

Related use cases

Frequently asked questions

What fields does the AJIO scraper return?

Each product record contains sku, product_name, brand, price, list_price, original_price (MRP), discount_percent, currency, image_url, url, category path, catalog_name, color_group, coupon_applicable and planning_category. Rating and rating_count are present in the schema but AJIO often leaves them null on listing endpoints, so treat both as nullable in downstream analytics.

How does this differ from scraping Myntra or Nykaa?

AJIO is Reliance Retail's fashion arm and skews toward private-label brands (AJIO Own, Netplay, Teamspirit) plus Reliance Brands inventory. Myntra has broader third-party brand coverage and Nykaa is beauty-led. For full India fashion-pricing coverage, run all three actors and union on brand plus product_name. Each platform exposes different MRP and discount conventions.

Do I need a proxy to run this actor?

At small volumes you can rely on Apify default networking, but the actor's input prefills the recommended proxy configuration because AJIO's catalog API rate-limits unfamiliar IPs aggressively. For any production schedule above a few hundred products per day, keep the prefilled defaults to avoid empty responses.

How fresh is the price data?

Each run hits AJIO's live catalog endpoint at request time, so prices, MRPs and discount percentages reflect the current state when the actor runs. AJIO refreshes its end-of-season-sale prices intraday during big events (EOSS, Big Bold Sale); for those windows schedule the actor every 2 to 4 hours, daily is sufficient otherwise.

Can I scrape a category without a keyword?

Yes. Leave the queries array empty and set the category input to one of the enums (men, women, women-kurtas, men-tshirts, ethnic-wear and so on). The actor will browse that category page directly. You can layer subcategorySlug as a free-text refiner (cotton, casual) which is appended to the underlying query.

Why are some MRP fields null?

AJIO sometimes lists private-label SKUs without a separate MRP — the displayed price is the only price, no strike-through. The actor returns original_price as null in that case rather than copying the offer price. Treat null original_price as a no-discount signal in your discount-pct analytics; don't impute zero.

Related

Try it yourself

100 free credits, no credit card.

About 30 real searches. Add the MCP to Claude or Cursor in two minutes.