# Blinkit Grocery Scraper (`axlymxp/blinkit-grocery-scraper`) Actor

Scrape Blinkit products by keyword, category or URL for any delivery location in India — name, brand, unit, MRP, selling price, discount, live stock, merchant, delivery ETA and images, priced per store. Residential proxy built in. Pay only for the results you get.

- **URL**: https://apify.com/axlymxp/blinkit-grocery-scraper.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** E-commerce, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 dataset items

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/platform/actors/running/actors-in-store#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

## Blinkit Grocery Scraper

**Extract Blinkit product data — prices, MRP, discounts, live stock, unit,
delivery ETA and images — by keyword, category or product URL, for any delivery
location in India.** Inventory and pricing on Blinkit are store-specific, so
every result is priced for the exact delivery point you ask for. One clean row
per product per location, ready for Sheets, a database, or your BI stack.

Built on Blinkit's own web API, with an **Apify Residential proxy wired in by
default** (Indian exit) to pass Blinkit's Cloudflare protection — no proxy setup
required, it works straight out of the box.

***

### Who uses this

- **Price & discount intelligence** (FMCG brands, D2C, retailers, analysts) —
  monitor competitor pricing, MRP vs selling price, discount depth and stock-outs
  across cities.
- **Quick-commerce / q-commerce analytics builders** — a reliable assortment and
  pricing feed to power dashboards and models.
- **Category & catalog teams** — pull an entire Blinkit category for a location to
  map assortment and share-of-shelf.
- **Market researchers** — compare catalogs and pricing across Indian metros.

### What you get — output fields

| Field                    | Type    | Description                                                 |
| ------------------------ | ------- | ----------------------------------------------------------- |
| `product_id`             | integer | Blinkit product id                                          |
| `name`                   | string  | Product name                                                |
| `brand`                  | string  | Brand                                                       |
| `unit`                   | string  | Pack size / unit (e.g. `1 ltr`, `450 ml`)                   |
| `price`                  | number  | Current selling price (INR)                                 |
| `mrp`                    | number  | Maximum retail price (INR)                                  |
| `discount_pct`           | number  | Discount % (MRP vs selling price)                           |
| `currency`               | string  | Always `INR`                                                |
| `in_stock`               | boolean | In stock at this store                                      |
| `inventory`              | integer | Inventory count (`0` = out of stock)                        |
| `merchant_id`            | integer | Serving store / merchant id                                 |
| `merchant_type`          | string  | Merchant type (`express`, `longtail`, …)                    |
| `eta`                    | string  | Delivery ETA identifier                                     |
| `group_id`               | integer | Variant group id                                            |
| `image_url`              | string  | Primary image URL                                           |
| `images`                 | array   | Full image gallery (product-URL rows)                       |
| `product_url`            | string  | Canonical product page URL                                  |
| `store_id`               | integer | Store the product was priced for                            |
| `city_name`              | string  | City of the serving store                                   |
| `location_label`         | string  | Your input label for the delivery point                     |
| `latitude` / `longitude` | number  | Coordinates the product was priced for                      |
| `source_query`           | string  | What produced the row (`search:…` / `category:…` / `url:…`) |
| `scraped_at`             | string  | ISO-8601 scrape timestamp                                   |

### High-value use cases

1. **Competitor price tracking** — schedule daily runs on your key SKUs across
   several cities and diff `price` / `discount_pct` / `in_stock` over time.
2. **Stock-out & availability monitoring** — alert when `in_stock` flips to false
   for priority products at specific stores.
3. **Assortment / share-of-shelf** — list whole categories per location to see
   which brands and packs Blinkit carries where.
4. **Multi-city price comparison** — pass several `locations` in one run to compare
   the same products' price and ETA across metros.
5. **Catalog enrichment** — feed product URLs/IDs to pull authoritative names and
   full image galleries for your own catalog.

### Input parameters

| Field                    | Type    | Default  | Description                                                                                       |
| ------------------------ | ------- | -------- | ------------------------------------------------------------------------------------------------- |
| `searchQueries`          | array   | `[]`     | Keywords; one paginated search per keyword.                                                       |
| `categoryUrls`           | array   | `[]`     | Category page URLs (`/cn/<slug>/cid/<l0>/<l1>`) or `l0/l1` id pairs to list in full.              |
| `productUrls`            | array   | `[]`     | Product URLs (`/prn/<slug>/prid/<id>`) or bare numeric IDs to enrich with detail + gallery.       |
| `locations`              | array   | Gurugram | Delivery points: `{label, latitude, longitude}` or `{location}` (Indian city name / `"lat,lon"`). |
| `maxPagesPerQuery`       | integer | `5`      | Pages per keyword/category (search ≈ 12/pg, category ≈ 15/pg).                                    |
| `maxItems`               | integer | `500`    | Global cap on total rows.                                                                         |
| `includeRecommendations` | boolean | `false`  | Also collect Blinkit's post-match "similarity" recommendations.                                   |
| `proxyConfiguration`     | object  | Residential (IN) | Defaults to Apify Residential proxy (Indian exit) — required, as Blinkit blocks datacenter IPs. Override or bring your own. |

At least one of `searchQueries`, `categoryUrls`, or `productUrls` is expected; if
none is given the actor runs a `milk` search so you always get sample data. If no
`locations` are given it defaults to Gurugram (Delhi-NCR).

### Example input

```json
{
    "searchQueries": ["milk", "amul butter"],
    "categoryUrls": ["https://blinkit.com/cn/milk/cid/14/922"],
    "locations": [
        {
            "label": "Gurugram",
            "latitude": 28.4131564,
            "longitude": 77.0726806
        },
        { "label": "Mumbai", "location": "mumbai" }
    ],
    "maxPagesPerQuery": 3,
    "maxItems": 300
}
```

### Example output

```json
{
    "product_id": 14639,
    "name": "Amul Gold Full Cream Milk",
    "brand": "Amul",
    "unit": "1 ltr",
    "price": 72,
    "mrp": 72,
    "discount_pct": 0.0,
    "currency": "INR",
    "in_stock": true,
    "inventory": 50,
    "merchant_id": 31719,
    "merchant_type": "express",
    "eta": "12 mins",
    "image_url": "https://cdn.grofers.com/cdn-cgi/image/f=auto/app/images/products/sliding_image/14639.jpg",
    "product_url": "https://blinkit.com/prn/amul-gold-full-cream-milk/prid/14639",
    "store_id": 31719,
    "city_name": "HR-NCR",
    "location_label": "Gurugram",
    "latitude": 28.4131564,
    "longitude": 77.0726806,
    "source_query": "search:milk",
    "scraped_at": "2026-08-02T00:00:00.000000+00:00"
}
```

### Scheduling & integrations

- **Schedule** daily/hourly runs from the Apify Console to track prices and stock
  over time.
- **Webhooks** fire on run completion into Make, Zapier, n8n or your own endpoint.
- **Export** the dataset as JSON, CSV, Excel or via the Apify API, or push straight
  to Google Sheets, Airtable, S3 or a database.

### Use with AI agents (MCP)

The dataset is clean, flat JSON, so an LLM agent can consume it directly. Run this
actor through the Apify MCP server (`apify/actors-mcp-server`) to let assistants
like Claude or ChatGPT pull live Blinkit prices, stock and ETAs on demand — e.g.
"compare the price of Amul butter on Blinkit in Mumbai vs Delhi."

### FAQ

**Do I need a proxy?** It's already built in. Blinkit blocks datacenter IPs, so
the actor routes through Apify Residential proxy (Indian exit) by default — you
don't need to configure anything. You can override the proxy group/country or
supply your own residential proxy in the input.

**How fresh is the data?** It is pulled live from Blinkit at run time — prices,
stock and ETA reflect the moment of the request for that store.

**Why are prices different across locations?** Blinkit is store-scoped. Each
delivery point resolves to a store with its own catalog, pricing and stock. Pass
multiple `locations` to compare.

**What if a location isn't serviceable?** It's logged and skipped; the run
continues with the remaining locations.

**Can I scrape a whole category?** Yes — pass a category URL (or `l0/l1` id pair)
in `categoryUrls`. Category ids come from Blinkit's own category pages/sitemap.

**Is scraping this legal?** The actor collects publicly available product data.
You are responsible for using the output in line with Blinkit's terms and
applicable laws. No login or personal data is collected.

**How reliable is it?** The client self-heals expired Cloudflare/auth sessions and
backs off on rate limits, so long multi-location runs stay stable.

# Actor input Schema

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

Keywords to search on Blinkit (one paginated search per keyword). Returns the priced product grid for each delivery location.

## `categoryUrls` (type: `array`):

Blinkit category pages to list in full — either a URL like https://blinkit.com/cn/dairy-bread-eggs/cid/14/922 or a bare 'l0/l1' id pair like '14/922'. Category ids come from Blinkit's own category sitemap.

## `productUrls` (type: `array`):

Direct Blinkit product URLs (/prn/<slug>/prid/<id>) or bare numeric product IDs to fetch full detail (name + image gallery) for.

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

One or more delivery points to price products for. Each item is an object with an optional 'label' and either 'latitude'+'longitude' or a 'location' string (a known Indian city name or 'lat,lon'). Blinkit prices and stock vary by store, so each location produces its own rows.

## `maxPagesPerQuery` (type: `integer`):

How many pages to fetch per keyword search or category (search ≈ 12 products/page, category ≈ 15/page).

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

Global cap across all locations, queries, categories and URLs. The run stops once this many product rows are pushed.

## `includeRecommendations` (type: `boolean`):

Blinkit pads keyword results with loosely-related 'similarity' recommendations after the genuine matches. Leave off for exact matches only; turn on to also collect the recommended products.

## `proxyConfiguration` (type: `object`):

Blinkit's Cloudflare protection blocks datacenter IPs, so a residential proxy is required. Defaults to Apify Residential proxy with an Indian exit — no setup needed. Override the group/country here, or disable it if you route through your own residential IPs.

## Actor input object example

```json
{
  "searchQueries": [
    "milk",
    "amul butter",
    "maggi noodles"
  ],
  "categoryUrls": [
    "https://blinkit.com/cn/dairy-bread-eggs/cid/14/922",
    "14/922"
  ],
  "productUrls": [
    "https://blinkit.com/prn/amul-gold-full-cream-milk/prid/14639",
    "14639"
  ],
  "locations": [
    {
      "label": "Gurugram",
      "latitude": 28.4131564,
      "longitude": 77.0726806
    },
    {
      "label": "Mumbai",
      "location": "mumbai"
    }
  ],
  "maxPagesPerQuery": 5,
  "maxItems": 500,
  "includeRecommendations": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}
```

# 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 = {
    "searchQueries": [
        "milk"
    ],
    "locations": [
        {
            "label": "Gurugram",
            "latitude": 28.4131564,
            "longitude": 77.0726806
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "IN"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/blinkit-grocery-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 = {
    "searchQueries": ["milk"],
    "locations": [{
            "label": "Gurugram",
            "latitude": 28.4131564,
            "longitude": 77.0726806,
        }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "IN",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/blinkit-grocery-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "milk"
  ],
  "locations": [
    {
      "label": "Gurugram",
      "latitude": 28.4131564,
      "longitude": 77.0726806
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}' |
apify call axlymxp/blinkit-grocery-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=axlymxp/blinkit-grocery-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/gG7cGXuUHh3F5cPbc/builds/AsjEh9MEcfsvffIbT/openapi.json
