Swiggy Instamart Products Search API
Search by keyword at a pincode or coordinates. Get pack prices, stock, match position, result type, filters and pagination.
- 1 credit per call
- Failed calls are free
- Updated
- swiggy-instamart.products.search
{ "next_offset": "im1.eyJzdG9yZV9pZCI6IjEzOTYyODQiLCJ2IjoxLCJzY29wZSI6IjlhZDQwMGM1NTNkMmFhYWZhYzA1MDY4MjExNGFhMmMzODE3MjBiYjE4NTllMjdkMzkyZTMyNDAxZWZlMzY0NjQ…", "pagination_status": "continuation_available", "available_filters": { "facets": { "rating": [ "3+", "4+" ], "brand": [ "Amul", "Akshayakalpa" ], "type": [ "Fresh Milk", "Tetra Milk" ] }, "sorts": [ { "key": "relevance", "label": "Relevance" }, { "key": "price_low_to_high", "label": "Price (Low To High)" } ] }, "store": { "delivery_eta": "12 MINS", "latitude": 12.9261382, "longitude": 77.62210910000002, "pincode": "560034", "place": "Bengaluru, Karnataka 560034, India", "primary_store_id": "1396284", "serviceability_status": "SERVICEABLE", "serviceability_type": "FAST_SERVICEABLE", "serviceable": true, "store_id": "1396284" }, "products": [ { "name": "Nandini Shubham Milk", "mrp": "108", "rating": "4.4", "rating_value": 4.4, "brand": "Nandini", "category": "Milk", "id": "CCX1XWR7GN", "image": "NI_CATALOG/IMAGES/ciw/2025/12/17/02bfb139-2185-4e4a-9419-29fd0af79fbb_J4ZRFJNQRO_MN_16122025.png", "image_url": "https://instamart-media-assets.swiggy.com/swiggy/image/upload/fl_lossy,f_auto,q_auto/NI_CATALOG/IMAGES/ciw/2025/12/17/02bfb139-2185-4e4a-94…", "in_stock": true, "max_per_order": 1, "mrp_paise": 10800, "offer_price": "108", "offer_price_paise": 10800, "position": 1, "product_url": "https://www.swiggy.com/instamart/item/CCX1XWR7GN", "quantity": "500 ml x 4", "rating_count": "118k", "result_type": "match", "sku": "SS8P89LI92", "source_widget_type": "type.googleapis.com/swiggy.im.v1.ItemCollectionCard", "store_id": "1396284", "badges": [ "Bestseller" ] }, { "name": "Nandini Shubham Milk", "mrp": "54", "rating": "4.4", "rating_value": 4.4, "brand": "Nandini", "category": "Milk", "id": "CCX1XWR7GN", "image": "NI_CATALOG/IMAGES/ciw/2025/12/17/02bfb139-2185-4e4a-9419-29fd0af79fbb_J4ZRFJNQRO_MN_16122025.png", "image_url": "https://instamart-media-assets.swiggy.com/swiggy/image/upload/fl_lossy,f_auto,q_auto/NI_CATALOG/IMAGES/ciw/2025/12/17/02bfb139-2185-4e4a-94…", "in_stock": true, "max_per_order": 3, "mrp_paise": 5400, "offer_price": "54", "offer_price_paise": 5400, "position": 2, "product_url": "https://www.swiggy.com/instamart/item/CCX1XWR7GN", "quantity": "500 ml x 2", "rating_count": "118k", "result_type": "match", "sku": "TK6K7BDQRM", "source_widget_type": "type.googleapis.com/swiggy.im.v1.ItemCollectionCard", "store_id": "1396284", "badges": [ "Bestseller" ] } ]}
| # | Product | Pack | Price (paise) | MRP (paise) | In stock | Store | Position | Result kind | Sponsored | Mrp |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Nandini Shubham Milk | 500 ml x 4 | 10,800 | 10,800 | true | 1396284 | 1 | match | 108 | |
| 2 | Nandini Shubham Milk | 500 ml x 2 | 5400 | 5400 | true | 1396284 | 2 | match | 54 | |
| 3 | Nandini Shubham Milk | 500 ml | 2700 | 2700 | true | 1396284 | 3 | match | 27 | |
| 4 | Arokya Toned Milk | 500 ml x 2 | 5200 | 5200 | true | 1396284 | promoted | true | 52 | |
| 5 | Arokya Toned Milk | 500 ml | 2600 | 2600 | true | 1396284 | promoted | true | 26 | |
| 6 | Akshayakalpa High Protein Cow Milk Elaichi | 250 ml | 10,000 | 10,000 | true | 1396284 | promoted | true | 100 | |
| 7 | Nandini Pasteurised Toned Milk | 500 ml x 4 | 9600 | 9600 | true | 1396284 | 4 | match | 96 | |
| 8 | Nandini Pasteurised Toned Milk | 500 ml x 2 | 4800 | 4800 | true | 1396284 | 5 | match | 48 | |
| 9 | Nandini Pasteurised Toned Milk | 500 ml | 2400 | 2400 | true | 1396284 | 6 | match | 24 | |
| 10 | Akshayakalpa High Protein Cow Milk Elaichi | 250 ml | 10,000 | 10,000 | true | 1396284 | promoted | 100 |
What you send
The input
object of the request, with every field the endpoint accepts.
- Send a six-digit pincode, or latitude and longitude together. If you send both, the pincode wins. Instamart picks the store from that location, and the response names the store it used. A store ID is optional: if you add one, it must be the store serving that location, or the call is refused. Keep the returned store and delivery point; one pincode does not stand for every address in its area.
- Send a search term of up to 200 characters. Use the returned next-page value to go on; there is no result limit to set.
- Sort by relevance, price low to high, price high to low or biggest discount. Price and discount sorts order the packs on the returned page, not the whole catalogue. Pick brands and types from the filters each response offers, up to ten of each; the minimum rating can be 3, 4 or 4.5.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| query | string | yes | Product search text | milk |
| lat | number | one of | Latitude in decimal degrees. From -90 to 90. | |
| lng | number | one of | Longitude in decimal degrees. From -180 to 180. | |
| pincode | string | one of | 6-digit Indian PIN code; the store serving it is resolved automatically (alternative to store_id) | 560034 |
| store_id | string | one of | Instamart store ID (alternative to pincode; takes precedence when both are given) | |
| brands | array<string> | no | Selected brand values from available_filters | |
| min_rating | number | no | Minimum rating facet Allowed values: 3, 4, 4.5. |
3 · 4 · 4.5 |
| offset | string | no | Legacy page:items cursors remain accepted. | |
| primary_store_id | string | no | Primary store ID; defaults to store_id | |
| secondary_store_id | string | no | Secondary store ID when the location has one | |
| sort | string | no | Listing order; relevance is the default Allowed values: relevance, price_low_to_high, price_high_to_low, discount_high_to_low. |
relevance · price_low_to_high · price_high_to_l… |
| types | array<string> | no | Selected type values from available_filters |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| products[].name | string | Product or category name as Instamart returns it. | Nandini Shubham Milk |
| products[].quantity | string | Pack size text; compare equivalent packs. | 500 ml x 4 |
| products[].offer_price_paise | integer | Selling price in integer paise; divide by 100 for rupees. Missing means unknown. | 10,800 |
| products[].mrp_paise | integer | MRP in integer paise where known. | 10,800 |
| products[].in_stock | boolean | Availability reported for this pack at this store. An absent value is unknown. | true |
| products[].store_id | string | Store serving this location. | 1396284 |
| products[].position | integer | Rank assigned only to search match rows, not every returned row. | 1 |
| products[].result_type | string | Kind of search row: a match, a promoted row, a sold-out group or other. | match |
| products[].mrp | string | Maximum retail price printed on the pack, in rupees. | 108 |
| products[].rating | string | The product's rating. | 4.4 |
| products[].rating_value | number | The rating as a number. | 4.4 |
| products[].badges | array | Labels on the product, such as Bestseller. | Bestseller |
| products[].brand | string | The brand on the listing. | Nandini |
| products[].category | string | The product's category, such as Vegetables. | Milk |
| products[].id | string | Category identifier returned by the category list. | CCX1XWR7GN |
| products[].image | string | Instamart's image reference. | NI_CATALOG/IMAGES/ciw/2025/12/17/02bfb139-2185-4e4a-9419-29fd0a… |
| products[].image_url | string | Link to the product image. | https://instamart-media-assets.swiggy.com/swiggy/image/upload/f… |
| products[].max_per_order | integer | The most of this product one order can hold. | 1 |
| products[].offer_price | string | The price you pay now, in rupees. | 108 |
| products[].product_url | string | Link to the product on Instamart. | https://www.swiggy.com/instamart/item/CCX1XWR7GN |
| products[].rating_count | string | How many ratings, as Instamart shows it. | 118k |
| products[].sku | string | Instamart's stock code for the product. | SS8P89LI92 |
| products[].source_widget_type | string | The kind of section the product came from. | type.googleapis.com/swiggy.im.v1.ItemCollectionCard |
| available_filters | object | Filters and sort options Instamart offers for these results. | 2 fields |
| available_filters.facets | object | Filter values you can narrow by. | 3 fields |
| available_filters.facets.brand | array | The brand on the listing. | Amul, Akshayakalpa, Nandini |
| available_filters.facets.rating | array | The product's rating. | 3+, 4+, 4.5+ |
| available_filters.facets.type | array | The product types you can filter by. | Fresh Milk, Tetra Milk, Milk Powder |
| available_filters.sorts | array | Sort options, such as relevance. | 4 records |
| available_filters.sorts[].key | string | relevance | |
| available_filters.sorts[].label | string | Relevance | |
| next_offset | string | Send it back to get the next page. | im1.eyJzdG9yZV9pZCI6IjEzOTYyODQiLCJ2IjoxLCJzY29wZSI6IjlhZDQwMGM… |
| pagination_status | string | Whether another page can be read. | continuation_available |
| products | array | The products returned. | 64 records |
| store | object | The store that serves this location. | 10 fields |
| store.delivery_eta | string | Delivery time Instamart shows for the store. | 12 MINS |
| store.latitude | number | Latitude of the resolved or checked delivery point. | 12.93 |
| store.longitude | number | Longitude of the resolved or checked delivery point. | 77.62 |
| store.pincode | string | The pincode of the store's area. | 560034 |
| store.place | string | The place the store serves. | Bengaluru, Karnataka 560034, India |
| store.primary_store_id | string | Instamart's ID for the store serving this location. | 1396284 |
| store.serviceability_status | string | Whether Instamart delivers here, such as SERVICEABLE. | SERVICEABLE |
| store.serviceability_type | string | The kind of delivery available, such as fast delivery. | FAST_SERVICEABLE |
| store.serviceable | boolean | Whether this delivery point is served. | true |
| store.store_id | string | Store serving this location. | 1396284 |
What this endpoint covers
- Do price sums with the offer price, MRP and discount in paise, and divide by 100 to show rupees. A missing amount stays unknown, and a real zero stays zero. Compare the same SKU and pack size, and read stock apart from price.
- Send the next-page value back unchanged with the same location, store, query, sort, filters and layout. An empty page can still lead to more. The response says whether paging was complete; a limited or unknown answer does not mean you have the whole catalogue.
- Only matching rows get a position. Keep promoted rows, sold-out groups and other rows apart. A missing sponsorship flag is unknown, and missing from search is not out of stock. Confirm availability with the product endpoint at the same location.
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "swiggy-instamart.products.search", "input": { "pincode": "560034", "query": "milk" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "swiggy-instamart.products.search", "input": { "pincode": "560034", "query": "milk" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "swiggy-instamart.products.search", "input": { "pincode": "560034", "query": "milk" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
Using Upscrape, search Instamart for milk at PIN 560034. List brand, pack, price and stock. Show position only for match rows and keep promoted and other result kinds separate.
More from the Swiggy Instamart API
- Swiggy Instamart Product API1 credit
- Swiggy Instamart Categories API1 credit
- Swiggy Instamart Category Products API1 credit
- Swiggy Instamart Home Products API1 credit
- Swiggy Instamart Suggestions Search API1 credit
- Swiggy Instamart Suggest Locations API1 credit
- Swiggy Instamart Resolve Location API1 credit
- Swiggy Instamart Resolve Serviceability API1 credit
- Swiggy Instamart Delivery ETA API1 credit
The same data from other platforms
Swiggy Instamart Products Search API FAQ
The short answers. The docs have the long ones.
How much does the Swiggy Instamart Products Search API cost?
1 credit per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send query. The input fields below list every option with its type and limits.
Do I need a Swiggy Instamart login?
No. It reads public Swiggy Instamart data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds swiggy-instamart.products.search, checks its price and runs it with the same credits as the REST API.
Your first Swiggy Instamart call is free.
Up to 100 free credits to start, no card needed.