# Zepto Scraper (`solidcode/zepto-scraper`) Actor

\[💰 $1.30 / 1K] Extract Zepto product data — prices, discounts, pack sizes, ratings, and availability from India's 10-minute grocery delivery. Search by keyword or URL and set a delivery location for accurate local prices.

- **URL**: https://apify.com/solidcode/zepto-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 15 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Zepto Scraper

Pull live grocery product data from Zepto, India's 10-minute quick-commerce service — selling price vs MRP, discount percentage, promotional offer labels, pack sizes, stock levels, ratings, and dark-store delivery ETAs for any serviceable delivery area. Because Zepto prices and availability change from one dark store to the next, every result reflects the real catalogue of the delivery area you choose. Built for pricing analysts, FMCG brand teams, and q-commerce market researchers who need accurate, location-true grocery data across India without stitching together store-by-store lookups by hand.

### Why This Scraper?

- **10 prefilled Indian metro cities plus pinpoint coordinates** — Bangalore, Mumbai, Delhi, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Gurgaon, and Noida one-click ready, or drop in exact latitude/longitude for any serviceable pincode to match a specific neighborhood's dark store.
- **MRP versus selling price on every row** — printed maximum retail price alongside the live discounted price, plus a derived discount percentage and rupee discount amount, so you can size every promotion at a glance.
- **On-shelf promo labels land next to the price** — the campaign badge Zepto prints on the product card (combo deals, "Buy 2 Save More", limited-time offer tags) is captured in `offerText` on the same row as the discount, so you can tie a price drop to the promotion that caused it.
- **Live stock and order-limit signals** — an in-stock flag, available inventory count, and the per-order maximum quantity tell you what's actually buyable at that dark store right now.
- **Sponsored-listing detection** — every product is flagged when it appears as a paid/ad placement, so you can separate organic shelf position from promoted slots.
- **Search by keyword or by Zepto link** — run any product query, or paste Zepto search and category page URLs directly; both feed the same clean output.
- **Star ratings with review counts** — average rating plus a defensively parsed rating count that handles Indian formats like "13 lac" and "1.2 cr".
- **Delivery ETA in minutes on demand** — opt in to attach the dark store's promised delivery time to every product for that location.
- **Around 30 fields per product, deduplicated** — pack size, unit, weight in grams, brand, category hierarchy, product images, offer text, and resolved store coordinates, with duplicate SKUs removed across every page, search term and link in the run — a product two of your searches both return is delivered once, not twice.

### Use Cases

**Pricing & Promotion Intelligence**

- Track selling price against MRP to measure real discount depth by SKU
- Watch discount depth swing across the day as dark-store pricing updates
- Capture offer text and promo labels as campaigns go live
- Benchmark a product's price across different metro dark stores

**Brand & MAP Monitoring**

- Manufacturers checking how their SKUs are priced and discounted on Zepto
- Confirm minimum advertised price compliance across cities
- See where your products sit as sponsored versus organic listings
- Watch stock-outs and order limits on your own catalogue

**Competitive Assortment Tracking**

- Map a competitor's full range within a category page
- Compare pack sizes, weights, and unit pricing head-to-head
- Detect newly listed SKUs entering an aisle
- Track which rival products carry promoted placements

**Demand & Availability Research**

- Flag out-of-stock SKUs and per-order quantity caps
- Watch inventory signals across high-demand categories
- Compare delivery ETAs between neighborhoods

**Market Research Across Cities**

- Compare assortment and pricing across 10 metros in one workflow
- Study regional brand presence (Nandini in Bangalore, Heritage in Hyderabad)
- Feed location-true grocery data into dynamic-pricing models

### Getting Started

#### Simple Keyword Search

Search a single term in the default Bangalore delivery area:

```json
{
    "searchTerms": ["milk"],
    "maxResults": 50
}
```

#### Multiple Products in a Chosen City

```json
{
    "searchTerms": ["amul butter", "maggi noodles", "lay's chips"],
    "city": "mumbai",
    "maxResults": 100
}
```

#### Pinpoint Coordinates with Delivery ETA

```json
{
    "searchTerms": ["chocolate"],
    "city": "custom",
    "latitude": "28.6139",
    "longitude": "77.2090",
    "includeEta": true,
    "maxResults": 200
}
```

#### Zepto URLs and Keywords Together

```json
{
    "searchTerms": ["bread"],
    "startUrls": [
        "https://www.zeptonow.com/search?query=cold+drinks"
    ],
    "city": "hyderabad",
    "maxResults": 0
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchTerms` | string\[] | `["milk"]` | Products to search for on Zepto, one per line. Each term runs as its own search. |
| `startUrls` | string\[] | `[]` | Paste Zepto search or category page URLs. Leave empty if you only use search terms. |

#### Delivery Location

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `city` | select | `Bangalore` | Delivery city. Choose from Delhi, Mumbai, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Gurgaon, Noida, or "Custom (use coordinates below)". |
| `latitude` | string | `""` | Exact delivery latitude (e.g. 28.6139). Only used when the city is set to Custom. |
| `longitude` | string | `""` | Exact delivery longitude (e.g. 77.2090). Only used when the city is set to Custom. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum products to collect for each search term or URL. Set to 0 for no limit. Start with 20-50 to test, then increase. |
| `includeEta` | boolean | `false` | Also fetch the estimated delivery time for your chosen location and add it to each product. One quick lookup per location, not per product. |

### Output

Each result is one product row for the delivery area you chose. Here's a representative result:

```json
{
    "productId": "8a1b9c2d-3e4f-5061-7a8b-9c0d1e2f3a4b",
    "skuId": "f0e1d2c3-b4a5-6978-8b9c-0d1e2f3a4b5c",
    "name": "Amul Taaza Toned Milk",
    "brand": "Amul",
    "variant": "Pouch",
    "packSize": "500 ml",
    "unit": "MILLILITRE",
    "weightGms": 515,
    "mrp": 28,
    "price": 27,
    "discountPercent": 4,
    "discountAmount": 1,
    "superSaverPrice": 27,
    "offerText": "Buy 2 Save More",
    "category": "Dairy, Bread & Eggs",
    "subcategory": "Milk",
    "categoryId": "c1d2e3f4-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
    "inStock": true,
    "inventoryAvailable": 42,
    "maxQuantity": 6,
    "storeId": "5ec071fd-2f6e-4f7a-9b0c-1d2e3f4a5b6c",
    "ratingValue": 4.6,
    "ratingCount": 13420,
    "isSponsored": false,
    "images": ["https://cdn.zeptonow.com/cms/product_variant/abc123.jpg"],
    "etaInMinutes": 9,
    "searchTerm": "milk",
    "url": "https://www.zepto.com/pn/amul-taaza-toned-milk/pvid/f0e1d2c3",
    "resolvedLocation": "Bangalore",
    "resolvedLatitude": 12.9352,
    "resolvedLongitude": 77.6245,
    "scrapedAt": "2026-06-03T10:15:00Z"
}
```

#### Identity

| Field | Type | Description |
|-------|------|-------------|
| `productId` | string | Zepto product identifier |
| `skuId` | string | SKU / variant identifier |
| `name` | string | Product name |
| `brand` | string | Brand name |
| `variant` | string | Variant label (e.g. flavour or pack type) when present |
| `packSize` | string | Formatted pack size (e.g. "500 ml", "1 L") |
| `unit` | string | Unit of measure as Zepto reports it — `MILLILITRE`, `LITER`, `GRAM`, `KILOGRAM`, `PIECE`, or `COMBO` |
| `weightGms` | number | Weight in grams when available |

#### Pricing

| Field | Type | Description |
|-------|------|-------------|
| `mrp` | number | Maximum retail price in rupees |
| `price` | number | Live selling price in rupees |
| `discountPercent` | number | Discount percentage; omitted when there is no genuine discount |
| `discountAmount` | number | Discount in rupees (MRP minus price) when discounted |
| `superSaverPrice` | number | Zepto's Super Saver marketplace price in rupees. Matches `price` for shoppers who aren't signed-in Zepto Pass members, so treat it as a confirmation of the listed price rather than a lower tier |
| `offerText` | string | Promotional offer label when present |

#### Availability

| Field | Type | Description |
|-------|------|-------------|
| `inStock` | boolean | Whether the product is buyable at the resolved dark store |
| `inventoryAvailable` | integer | Available inventory count when exposed |
| `maxQuantity` | integer | Maximum quantity allowed per order when exposed |
| `etaInMinutes` | integer | Dark-store delivery ETA in minutes (only when `includeEta` is on) |

#### Classification

| Field | Type | Description |
|-------|------|-------------|
| `category` | string | Top-level category name |
| `subcategory` | string | Sub-category name |
| `categoryId` | string | Category identifier |
| `ratingValue` | number | Average customer rating |
| `ratingCount` | integer | Number of ratings (handles "k", "lac", "cr" formats) |
| `isSponsored` | boolean | True when the product appears as a paid/ad placement |
| `images` | string\[] | Product image URLs |

#### Location & Meta

| Field | Type | Description |
|-------|------|-------------|
| `storeId` | string | Resolved dark-store identifier for the location |
| `resolvedLocation` | string | Human-readable resolved delivery area |
| `resolvedLatitude` | number | Latitude used for the request |
| `resolvedLongitude` | number | Longitude used for the request |
| `searchTerm` | string | The search term that produced this row (omitted for URL rows) |
| `url` | string | Source Zepto link for the product |
| `scrapedAt` | string | ISO-8601 timestamp when the row was collected |

### Tips for Best Results

- **Match the delivery city to your target market** — Zepto prices, stock, and assortment differ by dark store, so set the city (or exact coordinates) to the area you actually care about before reading the numbers.
- **Start small, then scale** — set `maxResults` to 20-50 on a first run to confirm the data fits your needs, then raise it or set 0 for everything.
- **Use category URLs for full-aisle pulls** — pasting a category page URL captures a much wider assortment than a narrow keyword, ideal for competitive range mapping.
- **Use coordinates for neighborhood precision** — pick "Custom" and enter exact latitude/longitude (right-click a spot in Google Maps to copy them) when a single dark store matters more than the whole city.
- **Compare cities by running them separately** — run the same search terms once per city to build a clean side-by-side price and assortment table across metros.
- **Turn on `includeEta` only when you need it** — it adds one fast lookup per location, so leave it off for pure pricing pulls to keep runs lean.
- **Pair `discountPercent` with `offerText` to separate real cuts from badges** — a product can carry a promo label with no price change at all, so filter on a non-null `discountPercent` when you want genuine markdowns and read `offerText` when you're tracking campaign copy.

### Pricing

**From $1.30 per 1,000 results** — competitively priced below comparable Zepto data tools, with progressively lower rates for Bronze, Silver, and Gold subscribers. The table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.16 | $0.15 | $0.14 | $0.13 |
| 1,000 | $1.55 | $1.45 | $1.40 | $1.30 |
| 10,000 | $15.50 | $14.50 | $14.00 | $13.00 |
| 100,000 | $155.00 | $145.00 | $140.00 | $130.00 |

No compute or time-based charges — you pay per result, plus a small fixed per-run start fee. A "result" is one product row in the output dataset.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom workflows on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate pricing research, brand monitoring, and market analysis of publicly listed product information. Users are responsible for complying with applicable laws and Zepto's Terms of Service. Do not use collected data for any unlawful purpose. The actor extracts only publicly available product and pricing data — no personal or account information.

# Actor input Schema

## `searchTerms` (type: `array`):

Products to search for on Zepto, one per line (e.g. 'milk', 'amul butter', 'maggi noodles'). Each term runs as its own search.

## `startUrls` (type: `array`):

Paste Zepto search or category URLs (e.g. a https://www.zeptonow.com/search?query=milk link or a category page link). Leave empty if you only use Search Terms above.

## `city` (type: `string`):

Zepto prices and stock depend on the delivery area. Pick the city to scrape from — we use a real delivery location inside that city. Choose 'Custom (use coordinates below)' to enter exact coordinates instead. Tip: Bangalore is the fastest option and always available.

## `latitude` (type: `string`):

Exact delivery latitude (e.g. 28.6139). Only used when Delivery City is set to 'Custom'. Find coordinates by right-clicking a spot in Google Maps.

## `longitude` (type: `string`):

Exact delivery longitude (e.g. 77.2090). Only used when Delivery City is set to 'Custom'. Find coordinates by right-clicking a spot in Google Maps.

## `maxResults` (type: `integer`):

Maximum number of products to collect for each search term or URL. Set to 0 for no limit (collects everything Zepto returns for that search, up to a safety ceiling of about 60,000 products per search). Tip: start with 20-50 to test, then increase.

## `includeEta` (type: `boolean`):

Also fetch the estimated delivery time for your chosen location and add it to each product. This adds one quick lookup per location (not per product).

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "startUrls": [],
  "city": "bangalore",
  "maxResults": 100,
  "includeEta": false
}
```

# Actor output Schema

## `products` (type: `string`):

Table of Zepto products with name, brand, price, MRP, discount, pack size, and availability.

# 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 = {
    "searchTerms": [
        "milk"
    ],
    "startUrls": [],
    "city": "bangalore",
    "latitude": "",
    "longitude": "",
    "maxResults": 100,
    "includeEta": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/zepto-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 = {
    "searchTerms": ["milk"],
    "startUrls": [],
    "city": "bangalore",
    "latitude": "",
    "longitude": "",
    "maxResults": 100,
    "includeEta": False,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/zepto-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 '{
  "searchTerms": [
    "milk"
  ],
  "startUrls": [],
  "city": "bangalore",
  "latitude": "",
  "longitude": "",
  "maxResults": 100,
  "includeEta": false
}' |
apify call solidcode/zepto-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/zepto-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/O7ussCvdOAbqw1G3q/builds/Dhi2s80oAVksLhdLX/openapi.json
