# Swiggy Instamart Scraper (`memo23/swiggy-instamart-scraper`) Actor

Track Swiggy Instamart prices and stock by location. Enter areas or PIN codes plus keywords and get one row per pack size: price, MRP, discount as the site shows it, unit price, stock, rating, search rank and sponsored flag, tagged with its dark store. Compare Instamart across cities.

- **URL**: https://apify.com/memo23/swiggy-instamart-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, AI, Agents
- **Stats:** 3 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Swiggy Instamart Scraper

Turn [Swiggy Instamart](https://www.swiggy.com/instamart), India's 10-minute grocery app, into structured product data for **any delivery location**. Search by keyword across areas, pincodes or coordinates and get one clean row per pack size with **price, MRP, discount, unit price, stock, rating, images, search rank and sponsored flag**, tagged with the location and dark store it was priced for.

Built for price monitoring, assortment tracking and quick-commerce market research across Indian cities.

#### How it works

![How the Swiggy Instamart Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-instamart.png)

#### ✨ Why use this scraper?

- **Real, location-specific prices.** Instamart prices and stock differ by dark store, so every row carries the location, coordinates and store ID it was scraped for. Run several areas or pincodes to compare.
- **One row per pack size.** "500 g" and "500 g x 2" are separate rows, each with its own price, MRP and stock, so nothing is averaged away.
- **Discounts as the site shows them.** `discountPercent` is rounded down exactly like Instamart's "25% OFF" label, and `discount` is the rupee amount off MRP.
- **Search rank and sponsored flag.** See where a product appears for a keyword and whether that slot is a paid placement.
- **Areas, pincodes or coordinates.** `Koramangala, Bengaluru`, `560034` and `12.9352,77.6245` all work; text is resolved through Swiggy's own maps.
- **No login, no browser, no captcha.** Talks to Instamart's JSON API directly; billed per product row.

#### 🎯 Use cases

| You are a… | Use it to… |
|---|---|
| Brand / FMCG team | Track your SKUs' prices, discounts and availability across cities on Instamart |
| Competitor analyst | Compare a keyword's results and price points between stores and cities |
| Retail media / marketing team | See which products hold the top ranks for a keyword and which slots are sponsored |
| Quick-commerce researcher | Measure assortment, discount depth and stock-outs over time |
| Pricing / revenue team | Feed live competitor prices into dynamic-pricing models |

#### 📥 Supported inputs

| Input | Example | What it does |
|---|---|---|
| Location (required) | `Koramangala, Bengaluru`, `560034` or `12.9352,77.6245` | Resolves the delivery store; everything is priced for it |
| Search keyword (required) | `milk`, `atta`, `chips` | Searches the keyword at each location, paginated to the end of the results |

**Not supported yet:** category URLs and product URLs (keyword search covers both: search the product or category name). Placing orders, cart or checkout and account-only data are out of scope; the actor reads only the public catalogue.

#### ⚙️ How it works

1. **Resolve** each location: free text and pincodes are geocoded through Swiggy's maps, then matched to the dark store that serves them. A location Instamart does not deliver to is reported by name and skipped.
2. **Search** every keyword at every location through Instamart's JSON API, page after page, until the results end or your limit is reached.
3. **Parse** each product into one row per pack size, with prices in ₹.
4. **Tag** every row with its location, store, keyword, rank and sponsored flag, de-duplicate per store, and emit.

#### ⚙️ Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `locations` | array | — | Areas, pincodes or `lat,lng` pairs. **Required** (Instamart prices are per store). |
| `searchQueries` | array | — | One product per entry (`milk`, `bread`, `atta`). A comma-separated line (`bread, milk`) is split and each product searched on its own. |
| `maxItems` | integer | `1000` | Hard cap on product rows for the whole run. |
| `maxItemsPerQuery` | integer | `1000` | Cap per keyword × location. |
| `maxConcurrency` | integer | `3` | Locations worked on in parallel. Each location runs one request at a time, because Instamart limits searches per store. |
| `maxRequestRetries` | integer | `12` | Retries when Instamart asks to slow down or a connection fails; the first wait is 15 seconds, later ones grow to 60. |
| `proxy` | object | built in | India residential routing is included. Set `proxyUrls` only to use your own proxies. |

#### 📊 Output overview

Each dataset record is **one pack-size variant of one product, priced for one location**. Run the same keyword across several `locations` to get one row per (variant × location), ready for cross-city price comparison. Money fields are in INR (₹).

#### 📦 Output sample

```json
{
  "rowType": "product",
  "productId": "XYI7MJ20OC",
  "parentProductId": "N2HH8THZI0",
  "variantId": "28FIB5CELA",
  "skuId": "BDOVVQ6XQJ",
  "productUrl": "https://www.swiggy.com/instamart/item/XYI7MJ20OC",
  "name": "Fortune Besan Flour",
  "brand": "Fortune",
  "description": "Perfect For Crispy Snacks",
  "mrp": 85,
  "sellingPrice": 63,
  "discount": 22,
  "discountPercent": 25,
  "unitPrice": "12.6/100 g",
  "offerText": "25% OFF",
  "packSize": "500 g",
  "weightInGms": 500,
  "inStock": true,
  "lowStockText": null,
  "maxAllowedQuantity": 6,
  "category": "Besan, Sooji and Maida",
  "subCategory": "Besan",
  "superCategory": "Atta, Rice and Dals",
  "rating": 4.5,
  "ratingCount": 46100,
  "images": [
    "https://instamart-media-assets.swiggy.com/swiggy/image/upload/fl_lossy,f_auto,q_auto,h_600/NI_CATALOG/IMAGES/ciw/2026/4/17/3c401aba-eda4-4556-ade0-35c2a9f88f54_28FIB5CELA_1_b10ba22c-ec83-4799-a702-282ae2bb89b9.png",
    "https://instamart-media-assets.swiggy.com/swiggy/image/upload/fl_lossy,f_auto,q_auto,h_600/NI_CATALOG/IMAGES/ciw/2026/4/17/78b7b251-d9aa-4ee4-8eed-95d03dc7bf64_28FIB5CELA_2_c628a401-4ae3-477b-88cd-df027cc0a274.png"
  ],
  "isSponsored": false,
  "searchRank": 91,
  "storeId": "1135720",
  "location": "Powai, Mumbai, Maharashtra, India",
  "latitude": 19.1175993,
  "longitude": 72.9059747,
  "sourceQuery": "atta",
  "scrapedAt": "2026-10-23T08:10:19.139Z"
}
```

#### 🗂 Key output fields

| Field | Type | Notes |
|---|---|---|
| `name` / `brand` / `description` | string | Product name, brand and Instamart's short description |
| `sellingPrice` / `mrp` | number | In ₹ |
| `discount` / `discountPercent` | number | ₹ off MRP, and the percentage rounded down as the site shows it |
| `unitPrice` / `offerText` | string | null | e.g. `12.6/100 g`, `25% OFF` |
| `packSize` / `weightInGms` | string / number | Pack details |
| `inStock` / `lowStockText` / `maxAllowedQuantity` | boolean / string / number | Stock at that store and the per-order limit |
| `category` / `subCategory` / `superCategory` | string | Instamart's category path |
| `rating` / `ratingCount` | number | `124.9k` on the site becomes `124900` |
| `images` | string\[] | Product image URLs |
| `searchRank` / `isSponsored` | number / boolean | Position of the product for the keyword, and whether it is a paid placement |
| `productUrl` / `productId` / `variantId` / `skuId` | string | Product page and IDs |
| `storeId` / `location` / `latitude` / `longitude` | string / number | The store and location this row was priced for |
| `sourceQuery` | string | The keyword that produced the row |

#### ❓ FAQ

**Why do I need a location?** Instamart is a delivery app: every product's price, discount and stock depend on the dark store serving the address. No location, no catalogue.

**Can I compare prices across cities?** Yes. Put several entries in `locations` and the same product comes back once per location, each with its local price and stock.

**How many products does a keyword return?** Typically 100 to 300 products, many with two or three pack sizes. Use `maxItemsPerQuery` to cap it.

**How long does a run take?** Instamart limits how fast one store can be searched, and the actor waits that limit out instead of failing. In testing, one location with six keywords paginated to the end (1,328 rows) took about four minutes; several locations run in parallel.

**What happens with a location Instamart does not serve?** The log names it ("Instamart does not deliver here") and the run continues with the others. Nothing is charged for it.

**Do I need to set up proxies?** No. India residential routing is built in.

**Is the same product charged twice if two keywords find it?** No. Each pack size is emitted once per store per run; `sourceQuery` holds the first keyword that found it.

#### 💬 Support

Found a bug or need an extra field? Open an issue on the [actor's Issues tab](https://apify.com/memo23/swiggy-instamart-scraper/issues) and it'll be looked at quickly.

#### 🛠 Additional services

Need category sweeps, a custom field, or a scheduled price-tracking feed into your warehouse? Custom scraping and pipeline work is available on request.

#### 🔎 Explore more scrapers

Running quick-commerce price comparisons? The same publisher maintains scrapers for the other two big apps, with matching column names so the datasets join cleanly:

- [Zepto Product Scraper](https://apify.com/memo23/zepto-product-scraper): prices, MRP and stock per delivery location
- [Blinkit Product & Price Scraper](https://apify.com/memo23/blinkit-scraper): multi-city stock and delivery ETA

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/swiggy-instamart-scraper`).

**Purpose:** Swiggy Instamart product rows for any delivery location in India, priced per dark store so the same product can be compared across areas and cities.

**Minimal input:**

```json
{
  "locations": ["Koramangala, Bengaluru"],
  "searchQueries": ["milk"],
  "maxItems": 50
}
```

**Output:** one row per pack-size variant × location: rowType, productId, parentProductId, variantId, skuId, productUrl, name, brand, description, mrp, sellingPrice, discount, discountPercent, unitPrice, offerText, packSize, weightInGms, inStock, lowStockText, maxAllowedQuantity, category, subCategory, superCategory, rating, ratingCount, images, isSponsored, searchRank, storeId, location, latitude, longitude, sourceQuery, scrapedAt. Money fields are in ₹.

**Behaviors an agent should know:**

- `locations` and `searchQueries` are both required; every keyword is searched once per location.
- Locations accept area text, 6-digit pincodes or `lat,lng`. Unserviceable locations are skipped with a log line, not an error.
- Set `maxItems` (whole run, default 1000) and `maxItemsPerQuery` (per keyword × location, default 1000).
- Instamart rate-limits per store; the actor waits it out, so a deep multi-keyword run can take several minutes. More locations in parallel do not slow each other down.
- Billing: one paid `product` event per row; see the Pricing tab on the actor page.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Swiggy Limited or any of its subsidiaries or affiliates. Swiggy and Instamart are trademarks of their respective owners.

The scraper accesses only publicly available Instamart product catalogue data: no login, no account-only features, no order placement. Users are responsible for ensuring their use complies with Swiggy's Terms of Service, applicable data-protection law (including India's DPDP Act, GDPR and CCPA where relevant) and any contractual obligations of their own organisation.

***

### SEO Keywords

instamart scraper, swiggy instamart scraper, scrape instamart, instamart price scraper, swiggy instamart api, instamart product data, quick commerce scraper india, instamart price tracker, grocery price scraper india, instamart search rank, instamart sponsored products, q-commerce price monitoring, instamart competitor analysis, indian grocery delivery scraper, instamart mrp discount scraper, zepto blinkit instamart data, dynamic pricing grocery india, instamart stock availability, scrape indian quick commerce, instamart bengaluru mumbai delhi prices

# Actor input Schema

## `locations` (type: `array`):

An area or landmark (e.g. `Koramangala, Bengaluru`, `Powai, Mumbai`), a 6-digit pincode (e.g. `560034`), or a `latitude,longitude` pair (e.g. `12.9352,77.6245`). Text is resolved through Swiggy's own maps. A location Instamart does not deliver to is reported in the log and skipped.

## `searchQueries` (type: `array`):

One product per line, e.g. `milk`, `atta`, `chips`. Each keyword is searched at every location and paginated to the end of the results. Several products on one line separated by commas (`bread, milk`) are split and searched one by one.

## `maxItems` (type: `integer`):

Hard cap on product rows across the run. Each row is one paid `product` event. Default 1000.

## `maxItemsPerQuery` (type: `integer`):

Cap per keyword at each location. An Instamart keyword typically returns 100-300 products, often with several pack sizes each. Default 1000.

## `maxConcurrency` (type: `integer`):

How many locations are worked on at the same time. Each location searches one request at a time, because Instamart limits searches per store, so this speeds up multi-location runs only. Default 3.

## `maxRequestRetries` (type: `integer`):

Retries when Instamart asks to slow down or a connection fails. The first wait is 15 seconds (a slow-down usually lasts 15-25 s) and later ones grow to 60 seconds, so the default rides out about nine minutes before a page is skipped. Default 12.

## `proxy` (type: `object`):

Leave empty: the actor already routes all traffic through its own built-in India residential proxy at no extra cost to you. Only set this to use your own proxy URLs.

## Actor input object example

```json
{
  "locations": [
    "Koramangala, Bengaluru"
  ],
  "searchQueries": [
    "milk"
  ],
  "maxItems": 1000,
  "maxItemsPerQuery": 1000,
  "maxConcurrency": 3,
  "maxRequestRetries": 12
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Koramangala, Bengaluru"
    ],
    "searchQueries": [
        "milk"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/swiggy-instamart-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": ["Koramangala, Bengaluru"],
    "searchQueries": ["milk"],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/swiggy-instamart-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Koramangala, Bengaluru"
  ],
  "searchQueries": [
    "milk"
  ]
}' |
apify call memo23/swiggy-instamart-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/swiggy-instamart-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Y260ONIS4zuEIwYou/builds/RnEtUvKJbIsQmxO5J/openapi.json
