# Blinkit API for agents

> API for Agents · https://apiforagents.dev/platforms/blinkit · HTML twin: https://apiforagents.dev/platforms/blinkit

A product's price and stock at one dark store, right now, from Blinkit.

Endpoint: `POST https://apiforagents.dev/v1/blinkit`. One op per call. Quote first with `"estimateOnly": true`.

## Prices (USD per record, pay as you go)

| Record | Per record |
|---|---|
| category | $0.0009 |
| products | $0.0009 |
| search | $0.0009 |

## Operations

### products

Full product detail at one store. Price, MRP, discount, stock count, rating, seller, manufacturer, specifications. By product URL.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) | Product URLs at that store. |
| store | yes | object |  |
| store.storeId | no | string | The dark store's own id, when a previous answer or a store URL gave you one. The most exact way to name a store; wins over the others. |
| store.city | no | string | The city the pincode is in ("Agra"). Helps the pincode resolve to the right store; ignored when storeId or lat/lon are given. |
| store.pincode | no | string | A 6-digit Indian postal code ("282003"); the nearest serving store is used. Give city too when the pincode is ambiguous. |
| store.lat | no | number | Latitude in decimal degrees, with lon: the store serving that point. |
| store.lon | no | number | Longitude in decimal degrees; only read together with lat. |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| productId | string |
| variantId | string |
| storeScope | string |
| storeId | string |
| vendorProductId | string |
| productName | string |
| brand | string |
| price | number |
| mrp | number |
| discountPct | number |
| packSize | string |
| inStock | boolean |
| stockCount | integer |
| rating | number |
| ratingCount | integer |
| category | string |
| rank | integer |
| sponsored | boolean |
| images | list of string |
| productUrl | string |
| description | string |
| countryOfOrigin | string |
| manufacturer | string |
| seller | string |
| specifications | any |
| latitude | number |
| longitude | number |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/blinkit \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"products","subjects":["https://blinkit.com/prn/<product-name>/prid/<id>"],"store":{"city":"Bengaluru","pincode":"560001"}}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "productName": "Toned Milk",
    "brand": "Dairyfield",
    "price": 27,
    "mrp": 28,
    "discountPct": 4,
    "packSize": "500 ml",
    "inStock": true,
    "category": "Dairy & Breakfast",
    "rank": 1,
    "rating": 4.3,
    "ratingCount": 1200,
    "productId": "2109488896",
    "variantId": "939572139",
    "storeId": "267557837",
    "vendorProductId": "1840821662",
    "images": [
      "https://img.blinkit.com/toned-milk.jpg"
    ],
    "productUrl": "https://blinkit.com/toned-milk-1000",
    "details": {}
  },
  {
    "productName": "Brown Bread",
    "brand": "Bakehouse",
    "price": 45,
    "mrp": 50,
    "discountPct": 10,
    "packSize": "400 g",
    "inStock": true,
    "category": "Bakery",
    "rank": 2,
    "rating": 4.3,
    "ratingCount": 1200,
    "productId": "3344686621",
    "variantId": "799874867",
    "storeId": "612408852",
    "vendorProductId": "478340074",
    "images": [
      "https://img.blinkit.com/brown-bread.jpg"
    ],
    "productUrl": "https://blinkit.com/brown-bread-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=blinkit&op=products (sign in first).

### search

Search the app as a shopper at that store would. Listings with price, MRP, stock and rank.

| Field | Required | Type | Meaning |
|---|---|---|---|
| query | yes | string (≤300 chars) |  |
| store | yes | object |  |
| store.storeId | no | string | The dark store's own id, when a previous answer or a store URL gave you one. The most exact way to name a store; wins over the others. |
| store.city | no | string | The city the pincode is in ("Agra"). Helps the pincode resolve to the right store; ignored when storeId or lat/lon are given. |
| store.pincode | no | string | A 6-digit Indian postal code ("282003"); the nearest serving store is used. Give city too when the pincode is ambiguous. |
| store.lat | no | number | Latitude in decimal degrees, with lon: the store serving that point. |
| store.lon | no | number | Longitude in decimal degrees; only read together with lat. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| productId | string |
| variantId | string |
| storeScope | string |
| storeId | string |
| vendorProductId | string |
| productName | string |
| brand | string |
| price | number |
| mrp | number |
| discountPct | number |
| packSize | string |
| inStock | boolean |
| stockCount | integer |
| rating | number |
| ratingCount | integer |
| category | string |
| rank | integer |
| sponsored | boolean |
| images | list of string |
| productUrl | string |
| description | string |
| countryOfOrigin | string |
| manufacturer | string |
| seller | string |
| specifications | any |
| latitude | number |
| longitude | number |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/blinkit \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"search","query":"Amul butter","store":{"city":"Bengaluru","pincode":"560001"},"limit":20}'
```

Example response rows (real rows, business data; a live row carries every field above):

```json
[
  {
    "productId": "212722",
    "variantId": "212722",
    "storeScope": "pin:560034",
    "storeId": "44371",
    "vendorProductId": "212722",
    "productName": "Nestle KitKat 4 Fingers Choco Coated Wafer Bar",
    "brand": "Nestle KitKat",
    "price": 30,
    "mrp": 30,
    "discountPct": 0,
    "packSize": "38.5 g",
    "inStock": true,
    "stockCount": 50,
    "rating": 4.7,
    "ratingCount": 500000,
    "category": "Wafer Chocolate",
    "rank": 2,
    "sponsored": false,
    "images": [
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1786506151062-353.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1786426172675-233.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1786426172675-234.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1786426172675-236.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1786426172675-237.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1786426172675-235.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1786426172675-238.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1786426172675-239.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1786426172675-240.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1786593189552-187.png?bg_token=color.surface.quaternary"
    ],
    "productUrl": "https://blinkit.com/prn/x/prid/212722",
    "latitude": 27.1956,
    "longitude": 78.0092,
    "details": {}
  },
  {
    "productId": "536255",
    "variantId": "536255",
    "storeScope": "pin:560034",
    "storeId": "44371",
    "vendorProductId": "536255",
    "productName": "Cadbury Nutties Milk Chocolate Pack",
    "brand": "Cadbury Nutties",
    "price": 130,
    "mrp": 135,
    "discountPct": 3.7,
    "packSize": "30 g",
    "inStock": true,
    "stockCount": 43,
    "rating": 4.5,
    "ratingCount": 92044,
    "category": "Milk Chocolate Pack",
    "rank": 1,
    "sponsored": true,
    "images": [
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1778243110777-1497.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1778243110777-1498.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1778243110777-1499.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1778243110777-1500.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1778243110777-1501.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1778243110777-1502.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1778243110777-1503.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1778243110777-1504.png?bg_token=color.surface.quaternary",
      "https://cdn.grofers.com/da/cms-assets/cms/product/rc-upload-1778243110777-1505.png?bg_token=color.surface.quaternary"
    ],
    "productUrl": "https://blinkit.com/prn/x/prid/536255",
    "latitude": 27.1956,
    "longitude": 78.0092,
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=blinkit&op=search (sign in first).

### category

One category page at one store. Names must be the app's own menu names; a name that is not on the menu is refused and nothing is charged.

| Field | Required | Type | Meaning |
|---|---|---|---|
| category | yes | string (≤80 chars) | The top-level aisle as the app names it ("Dairy, Bread & Eggs"). |
| subCategory | yes | string (≤80 chars) | The shelf inside it, again as the app names it ("Milk"). Both are required: the listing is one shelf at one store. |
| store | yes | object |  |
| store.storeId | no | string | The dark store's own id, when a previous answer or a store URL gave you one. The most exact way to name a store; wins over the others. |
| store.city | no | string | The city the pincode is in ("Agra"). Helps the pincode resolve to the right store; ignored when storeId or lat/lon are given. |
| store.pincode | no | string | A 6-digit Indian postal code ("282003"); the nearest serving store is used. Give city too when the pincode is ambiguous. |
| store.lat | no | number | Latitude in decimal degrees, with lon: the store serving that point. |
| store.lon | no | number | Longitude in decimal degrees; only read together with lat. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| productId | string |
| variantId | string |
| storeScope | string |
| storeId | string |
| vendorProductId | string |
| productName | string |
| brand | string |
| price | number |
| mrp | number |
| discountPct | number |
| packSize | string |
| inStock | boolean |
| stockCount | integer |
| rating | number |
| ratingCount | integer |
| category | string |
| rank | integer |
| sponsored | boolean |
| images | list of string |
| productUrl | string |
| description | string |
| countryOfOrigin | string |
| manufacturer | string |
| seller | string |
| specifications | any |
| latitude | number |
| longitude | number |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/blinkit \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"category","category":"Atta, Rice & Dal","subCategory":"Atta","store":{"city":"Delhi","pincode":"110001"},"limit":50}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "productName": "Fresh Paneer",
    "brand": "Dairyfield",
    "price": 90,
    "mrp": 95,
    "discountPct": 5,
    "packSize": "200 g",
    "inStock": true,
    "category": "Dairy & Breakfast",
    "rank": 1,
    "rating": 4.3,
    "ratingCount": 1200,
    "productId": "4192785922",
    "variantId": "123170715",
    "storeId": "3026289712",
    "vendorProductId": "128062296",
    "images": [
      "https://img.blinkit.com/fresh-paneer.jpg"
    ],
    "productUrl": "https://blinkit.com/fresh-paneer-1000",
    "details": {}
  },
  {
    "productName": "Greek Yogurt, Plain",
    "brand": "Cultura",
    "price": 60,
    "mrp": 65,
    "discountPct": 8,
    "packSize": "100 g",
    "inStock": true,
    "category": "Dairy & Breakfast",
    "rank": 2,
    "rating": 4.3,
    "ratingCount": 1200,
    "productId": "793487613",
    "variantId": "3782716101",
    "storeId": "1999865175",
    "vendorProductId": "248104020",
    "images": [
      "https://img.blinkit.com/greek-yogurt-plain.jpg"
    ],
    "productUrl": "https://blinkit.com/greek-yogurt-plain-1001",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=blinkit&op=category (sign in first).

### history (free)

The stored price/stock series of products already held at a store. Free.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) |  |
| store | yes | object |  |
| store.storeId | no | string | The dark store's own id, when a previous answer or a store URL gave you one. The most exact way to name a store; wins over the others. |
| store.city | no | string | The city the pincode is in ("Agra"). Helps the pincode resolve to the right store; ignored when storeId or lat/lon are given. |
| store.pincode | no | string | A 6-digit Indian postal code ("282003"); the nearest serving store is used. Give city too when the pincode is ambiguous. |
| store.lat | no | number | Latitude in decimal degrees, with lon: the store serving that point. |
| store.lon | no | number | Longitude in decimal degrees; only read together with lat. |
| metric | no | enum |  Values: price, mrp, discount_pct, stock_count, rating, rating_count. |
| days | no | integer (1-730) |  |

Request shape:

```json
{
  "op": "history",
  "subjects": [
    "example"
  ],
  "store": {
    "pincode": "560001"
  }
}
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=blinkit&op=history (sign in first).

## Notes for the agent

Measured Blinkit data, one operation per call. A product's price and stock at ONE dark store, right now. Every op takes `store`: a storeId, or a pincode (with city), or lat/lon. Prices, MRP, discounts and stock are per store and every fetch adds a point to that product's price history at that store. ops: products (full detail for up to ten blinkit.com product URLs at the store. Price, MRP, discount, stock count, rating, seller, manufacturer, specifications), search (what a shopper at that store sees for a query. Listings with price, stock and rank), category (one page of the app's own menu at that store; names must match the app exactly, e.g. category "Atta, Rice & Dal", subCategory "Atta". The pair must belong together), history (stored price/stock series for products already held, free). Ops are independent. Issue several as PARALLEL tool calls. Fresh fetches are charged per record; your own answer is free while fresh.
