# Blinkit Scraper (`solidcode/blinkit-scraper`) Actor

\[💰 $1.90 / 1K] Extract product prices, discounts, pack sizes, and availability from Blinkit, India's instant-grocery service. Search by keyword or URL and set a delivery location for accurate local pricing.

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

## Pricing

from $1.90 / 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

## Blinkit Scraper

Pull live product, price, and availability data from Blinkit — India's 10-minute instant-grocery service — including selling price, MRP, discount, pack size, in-stock status, delivery ETA, ratings, and product images, all priced for the exact delivery location you choose. Built for q-commerce competitive-intelligence teams, FMCG brands monitoring shelf price and stock, and grocery-price analysts who need accurate store-level Blinkit data across Indian cities without building and maintaining their own collector.

### Why This Scraper?

- **Location-accurate pricing for any delivery point** — Blinkit prices, stock, and delivery times change store-by-store; this actor returns the real local price for the city or coordinates you pick, verified across Delhi, Mumbai, and Bangalore (the same milk priced differently in each).
- **City picker with 10 named Indian metros** — Delhi, Mumbai, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Gurgaon, and Noida — no coordinate hunting required.
- **Pinpoint custom coordinates** — switch the city picker to Custom and enter an exact latitude/longitude to scrape a specific neighborhood's serving store.
- **Batch keyword search** — queue many search terms in one run (e.g. "milk", "amul butter", "maggi noodles"); each term runs as its own search with its own result cap.
- **Selling price, MRP, and discount on every row** — current price (₹), original MRP (₹), and a derived discount % (null when there's genuinely no discount, never a fake 0%).
- **Pack-size, availability, and a sortable delivery ETA** — exact unit ("450 ml", "1 kg", "6 pcs"), a true/false in-stock flag for the chosen store, and the live delivery estimate twice over: Blinkit's own wording ("Delivery in 9 minutes") plus a plain integer field you can sort and average on.
- **Ratings, image, product ID, and canonical URL** — average rating, rating count (parsed cleanly from Indian-style "13 lac"/"1.2k" formats), product image, Blinkit product ID, and a ready-to-open product link per row.
- **Paste Blinkit search or category URLs** — drop in any `blinkit.com/s/?q=...` search link or `/cn/.../cid/...` category page; in-URL filters are applied automatically.
- **Automatic deduplication** — results are deduped by product ID across pages, so overlapping loads never produce duplicate rows.

### Use Cases

**Q-commerce Competitive Intelligence**

- Track Blinkit's catalog and prices against Zepto, Instamart, and BigBasket
- Monitor instant-delivery ETAs by city to benchmark fulfillment speed
- Map which SKUs a competitor stocks in each metro
- Spot assortment gaps between dark stores in different cities

**FMCG Brand Price Monitoring**

- Watch your own products' selling price and MRP on Blinkit shelves
- Detect unauthorized discounting or price erosion across regions
- Verify in-stock status of your SKUs at store level
- Compare your pack sizes and pricing against rival brands

**Market & Pricing Research**

- Build product price datasets across Delhi, Mumbai, Bangalore, and 7 more metros
- Study regional brand presence (e.g. Nandini in Karnataka, Gokul in Maharashtra)
- Track discount depth and MRP-to-price gaps by category
- Feed dynamic-pricing models with real store-level grocery data

**Availability & Assortment Tracking**

- Monitor stock-outs of high-velocity SKUs by delivery area
- Track when new products appear in a category
- Measure delivery-time promises across neighborhoods
- Audit catalog breadth for a brand or category over time

### Getting Started

#### Simple Keyword Search

Search a single term in the default city (Delhi):

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

#### Compare One Product Across Cities

Run the same term in different metros to compare regional pricing — launch a run per city:

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

#### Category URL with Custom Coordinates

Paste a Blinkit category URL and target an exact neighborhood by coordinates:

```json
{
    "startUrls": ["https://blinkit.com/cn/dairy-bread-eggs/cid/14/922"],
    "city": "custom",
    "latitude": "12.9716",
    "longitude": "77.5946",
    "maxResults": 200
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchTerms` | string\[] | `["milk"]` | Products to search for, one per line (e.g. "milk", "amul butter", "maggi noodles"). Each term runs as its own search. |
| `startUrls` | string\[] | `[]` | Blinkit search or category URLs (e.g. `https://blinkit.com/s/?q=milk` or a category page link). Filters in the URL are applied automatically. Leave empty if you only use Search Terms. |

#### Delivery Location

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

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum number of products to collect for each search term or URL. Set to 0 for no limit. Start with 20-50 to test, then increase. |

### Output

Each product is one flat row in the dataset. Here's a representative result:

```json
{
    "name": "Country Delight Cow Milk",
    "brand": "Country Delight",
    "price": 46,
    "mrp": 48,
    "discountPercent": 4,
    "unit": "450 ml",
    "inStock": true,
    "deliveryTime": "Delivery in 9 minutes",
    "deliveryMinutes": 9,
    "imageUrl": "https://cdn.grofers.com/da/cms-assets/cms/product/b91b3590-34ae-4f9b-a53a-6951452fb937.png",
    "productId": "637875",
    "category": null,
    "rating": 4.49,
    "ratingCount": 19120,
    "searchTerm": "milk",
    "sourceUrl": null,
    "url": "https://blinkit.com/prn/country-delight-cow-milk/prid/2908418",
    "location": {
        "city": "Delhi",
        "latitude": 28.6304203,
        "longitude": 77.2177216
    },
    "scrapedAt": "2026-08-24T09:27:19.864752+00:00"
}
```

The row above came from a keyword search, so `category` is `null` and `sourceUrl`
is `null` — those two fill in when the row came from a category URL instead.

#### Product Fields

| Field | Type | Description |
|-------|------|-------------|
| `name` | string | Product display name |
| `brand` | string | null | Brand name |
| `price` | number | null | Current selling price in INR (₹) |
| `mrp` | number | null | Maximum Retail Price (original price) in INR (₹) |
| `discountPercent` | number | null | Discount percentage off MRP; null when there is no genuine discount |
| `unit` | string | null | Pack size / quantity (e.g. "500 ml", "1 kg", "6 pcs") |
| `inStock` | boolean | Whether the product is available at the chosen delivery location |
| `deliveryTime` | string | null | Delivery estimate for the chosen store, worded the way Blinkit shows it (e.g. "Delivery in 9 minutes"). Null when Blinkit publishes no estimate for that location |
| `deliveryMinutes` | integer | null | The same estimate as a plain number (e.g. `9`), so you can sort and compare without parsing the sentence. Null exactly when `deliveryTime` is null |
| `imageUrl` | string | null | Product image URL |
| `productId` | string | null | Blinkit product / variant ID |
| `category` | string | null | Category grouping, taken from the category URL you supplied (e.g. "fresh fruits"). Always null on keyword-search rows |
| `rating` | number | null | Average customer rating |
| `ratingCount` | integer | null | Number of ratings |
| `searchTerm` | string | null | The search term that first returned this product (null for URL inputs) |
| `sourceUrl` | string | null | The input URL that produced this row (null for keyword inputs) |
| `url` | string | null | Canonical Blinkit product URL |
| `location` | object | The delivery location used for this row: `city`, `latitude`, `longitude`. `city` reads "Custom location" when you supplied your own coordinates |
| `scrapedAt` | string | UTC timestamp of collection, ISO 8601 with microseconds and a `+00:00` offset (e.g. "2026-08-24T09:27:19.864752+00:00") |

### Tips for Best Results

- **Set the city closest to your target market** — Blinkit prices, stock, and delivery times are store-specific, so the delivery location you pick determines the data you get.
- **Run the same term across multiple cities to compare regional pricing** — launch one run per city (e.g. Delhi vs. Mumbai vs. Bangalore) and join the results on product name to see local price gaps and regional-only brands.
- **Use Custom coordinates for a precise neighborhood** — set City to Custom and paste an exact latitude/longitude (right-click a spot in Google Maps to copy them) when a city-center point isn't where you want to measure.
- **Start small, then scale** — set `maxResults` to 20-50 on your first run to confirm the data matches your needs, then raise it or set 0 for no limit.
- **Batch your keywords** — list many search terms at once; `maxResults` applies per term, so a 3-term run at 50 each returns up to 150 rows. Every product is listed once per run even when two of your terms both match it, so you're never charged twice for the same item.
- **Read `discountPercent` correctly** — it's null (not 0) when the selling price equals MRP, so filtering on a non-null value gives you only genuinely discounted products.
- **Mix keywords and URLs** — combine Search Terms and Blinkit category/search URLs in a single run; the `searchTerm` and `sourceUrl` fields tell you which input produced each row.

### Pricing

**From $1.90 per 1,000 results** — no compute charges to track, and Apify's loyalty discounts lower the rate further as you grow.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.23 | $0.21 | $0.20 | $0.19 |
| 1,000 | $2.25 | $2.15 | $2.00 | $1.90 |
| 10,000 | $22.50 | $21.50 | $20.00 | $19.00 |
| 100,000 | $225.00 | $215.00 | $200.00 | $190.00 |

A "result" is any product row in the output dataset. **You only pay per result returned.** Discount tiers above take effect on 8 September 2026; until then all runs are billed at $1.90 per 1,000 results.

### 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 APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate price research, competitive analysis, and market intelligence on publicly available product listings. Users are responsible for complying with applicable laws and Blinkit's Terms of Service. Do not use extracted data for spam, harassment, or any illegal purpose. Extract only publicly visible catalog data and respect personal-data regulations.

# Actor input Schema

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

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

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

Paste Blinkit search or category URLs (e.g. https://blinkit.com/s/?q=milk or a category page link). Filters in the URL are applied automatically. Leave empty if you only use Search Terms above.

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

Blinkit 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.

## `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. Tip: start with 20-50 to test, then increase.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "startUrls": [],
  "city": "delhi",
  "maxResults": 100
}
```

# Actor output Schema

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

Table of Blinkit 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": "delhi",
    "latitude": "",
    "longitude": "",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/blinkit-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": "delhi",
    "latitude": "",
    "longitude": "",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/blinkit-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": "delhi",
  "latitude": "",
  "longitude": "",
  "maxResults": 100
}' |
apify call solidcode/blinkit-scraper --silent --output-dataset

```

## MCP server setup

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