Docs / API reference

POST/v1/data/instamart/products

Instamart Products

Search Instamart products or browse one collection for a delivery location.

Execution model

Live request

Runtime depends on endpoint, target, pagination, rendering mode, and active plan limits.

Credit weight

Live catalog

Current weights are managed from the Data API Weights admin table and shown on pricing before use.

Instamart Products Endpoint

Search products or browse one collection in a selected delivery area.

Getting Started

Send your API key as a bearer token. Start with the smallest request below.

Search a Fixed Location

Use a query and supported location_key.

curl -X POST "https://api.datablue.dev/v1/data/instamart/products" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "query": "coffee",
  "location_key": "blr_koramangala",
  "num_results": 20
}'
Example response
{
  "success": true,
  "source": "instamart",
  "query": "coffee",
  "location_key": "blr_koramangala",
  "requested_location": "Koramangala, Bengaluru",
  "city": "Bengaluru",
  "store_id": "1396284",
  "primary_store_id": "1396284",
  "serviceable": true,
  "page": 1,
  "pages_fetched": 1,
  "time_taken": 1.21
}

Search Modes

Browse a Collection

Send collection_id instead of a query.

curl -X POST "https://api.datablue.dev/v1/data/instamart/products" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "collection_id": "collection_123",
  "location_key": "blr_koramangala"
}'
Example response
{
  "success": true,
  "source": "instamart",
  "query": "coffee",
  "location_key": "blr_koramangala",
  "requested_location": "Koramangala, Bengaluru",
  "city": "Bengaluru",
  "store_id": "1396284",
  "primary_store_id": "1396284",
  "serviceable": true,
  "page": 1,
  "pages_fetched": 1,
  "time_taken": 1.21
}

Batch Queries

Search several terms in one run. Batch is always asynchronous, so it takes two steps. queries cannot be combined with query or collection_id.

Start a Batch Job

Send queries instead of query for up to 25 terms. Every request containing queries is queued, so this returns 202 with a job to poll and reserves one credit per query.

curl -X POST "https://api.datablue.dev/v1/data/instamart/products" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "queries": [
    "coffee",
    "green tea"
  ],
  "num_results": 5,
  "location_key": "blr_koramangala"
}'
Example response
{
  "success": true,
  "job_id": "3f9c1a24-8b7e-4f52-9a10-6c2d8e5b4771",
  "status": "queued",
  "platform": "instamart",
  "operation": "products",
  "status_url": "/v1/data/jobs/3f9c1a24-8b7e-4f52-9a10-6c2d8e5b4771",
  "credits_reserved": 2
}

Check Batch Status

Poll the returned status_url until status is completed, then read result. It holds one flat products list across every term plus a per-query breakdown in query_results. Every product carries search_query, so a row traces back to the term that produced it.

curl -X GET "https://api.datablue.dev/v1/data/jobs/3f9c1a24-8b7e-4f52-9a10-6c2d8e5b4771" \
  -H "Authorization: Bearer YOUR_API_KEY"
Example response
{
  "success": true,
  "job_id": "3f9c1a24-8b7e-4f52-9a10-6c2d8e5b4771",
  "status": "completed",
  "platform": "instamart",
  "operation": "products",
  "status_url": "/v1/data/jobs/3f9c1a24-8b7e-4f52-9a10-6c2d8e5b4771",
  "credits_reserved": 2,
  "created_at": "2026-07-30T09:15:04Z",
  "started_at": "2026-07-30T09:15:04Z",
  "completed_at": "2026-07-30T09:15:11Z",
  "error": null,
  "result": {
    "success": true,
    "source": "instamart",
    "query": "coffee",
    "queries": [
      "coffee",
      "green tea"
    ],
    "query_count": 2,
    "location_key": "blr_koramangala",
    "requested_location": "Koramangala, Bengaluru",
    "city": "Bengaluru",
    "store_id": "1396284",
    "primary_store_id": "1396284",
    "page": 1,
    "pages_fetched": 2,
    "time_taken": 2.34,
    "products": [
      {
        "position": 1,
        "search_query": "coffee",
        "product_id": "123456",
        "name": "Instant Coffee",
        "title": "Instant Coffee",
        "brand": "Example Brand",
        "price": 199,
        "mrp": 249,
        "currency": "INR",
        "quantity": "100 g",
        "inStock": true,
        "sla": "4 MINS",
        "delivery_eta_minutes": 4,
        "availability": "in_stock",
        "is_sponsored": false
      },
      {
        "position": 1,
        "search_query": "green tea",
        "product_id": "789012",
        "name": "Green Tea Bags",
        "title": "Green Tea Bags",
        "brand": "Example Tea Co",
        "price": 245,
        "mrp": 280,
        "currency": "INR",
        "quantity": "25 bags",
        "inStock": true,
        "sla": "4 MINS",
        "delivery_eta_minutes": 4,
        "availability": "in_stock",
        "is_sponsored": false
      }
    ],
    "query_results": [
      {
        "query": "coffee",
        "success": true,
        "result_count": 5,
        "pages_fetched": 1
      },
      {
        "query": "green tea",
        "success": true,
        "result_count": 5,
        "pages_fetched": 1
      }
    ]
  }
}

Results and Stores

Control Results

Set the product count and starting page.

curl -X POST "https://api.datablue.dev/v1/data/instamart/products" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "query": "coffee",
  "num_results": 50,
  "page": 2,
  "location_key": "blr_koramangala"
}'
Example response
{
  "success": true,
  "source": "instamart",
  "query": "coffee",
  "location_key": "blr_koramangala",
  "requested_location": "Koramangala, Bengaluru",
  "city": "Bengaluru",
  "store_id": "1396284",
  "primary_store_id": "1396284",
  "serviceable": true,
  "page": 1,
  "pages_fetched": 1,
  "time_taken": 1.21
}

Select Store IDs

Use explicit store IDs only when your application already has them.

curl -X POST "https://api.datablue.dev/v1/data/instamart/products" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "query": "coffee",
  "store_id": "1396284",
  "primary_store_id": "1396284",
  "secondary_store_id": "1396285,1396286"
}'
Example response
{
  "success": true,
  "source": "instamart",
  "query": "coffee",
  "location_key": "blr_koramangala",
  "requested_location": "Koramangala, Bengaluru",
  "city": "Bengaluru",
  "store_id": "1396284",
  "primary_store_id": "1396284",
  "serviceable": true,
  "page": 1,
  "pages_fetched": 1,
  "time_taken": 1.21
}

Delivery Location

Custom Coordinates

Send coordinates together and add optional city or area labels.

curl -X POST "https://api.datablue.dev/v1/data/instamart/products" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "query": "coffee",
  "location_key": null,
  "latitude": 12.9352,
  "longitude": 77.6245,
  "city": "Bengaluru",
  "location": "Koramangala"
}'
Example response
{
  "success": true,
  "source": "instamart",
  "query": "coffee",
  "location_key": "blr_koramangala",
  "requested_location": "Koramangala, Bengaluru",
  "city": "Bengaluru",
  "store_id": "1396284",
  "primary_store_id": "1396284",
  "serviceable": true,
  "page": 1,
  "pages_fetched": 1,
  "time_taken": 1.21
}

Request Controls

Provider Timeout

Set the source timeout between 3,000 and 60,000 milliseconds.

curl -X POST "https://api.datablue.dev/v1/data/instamart/products" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "query": "coffee",
  "location_key": "blr_koramangala",
  "timeout_ms": 30000
}'
Example response
{
  "success": true,
  "source": "instamart",
  "query": "coffee",
  "location_key": "blr_koramangala",
  "requested_location": "Koramangala, Bengaluru",
  "city": "Bengaluru",
  "store_id": "1396284",
  "primary_store_id": "1396284",
  "serviceable": true,
  "page": 1,
  "pages_fetched": 1,
  "time_taken": 1.21
}

is_sponsored has three states: true for a row Instamart marked as an ad, false when the source marked the row organic or marked another row in the same response, and null when no ad marker was present at all, meaning the status was not captured rather than that the row is organic. Marked rows are interleaved through the results — the first one commonly lands at position 2 — so read the field per row instead of assuming the ads sit at the top.

Identify Paid Placements

On a query that carries ads, marked rows return true and the rest of that same response return false.

curl -X POST "https://api.datablue.dev/v1/data/instamart/products" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "query": "protein powder",
  "location_key": "blr_koramangala",
  "num_results": 3
}'
Example response
{
  "success": true,
  "source": "instamart",
  "query": "protein powder",
  "location_key": "blr_koramangala",
  "requested_location": "Koramangala, Bengaluru",
  "store_id": "1396284",
  "serviceable": true,
  "page": 1,
  "pages_fetched": 1,
  "time_taken": 1.34,
  "products": [
    {
      "position": 1,
      "search_query": "protein powder",
      "product_id": "774101",
      "title": "Whey Protein Isolate 1 kg",
      "brand": "Example Nutrition",
      "price": 2799,
      "mrp": 3499,
      "currency": "INR",
      "inStock": true,
      "availability": "in_stock",
      "is_sponsored": false
    },
    {
      "position": 2,
      "search_query": "protein powder",
      "product_id": "774102",
      "title": "Plant Protein 500 g",
      "brand": "Example Foods",
      "price": 1249,
      "mrp": 1599,
      "currency": "INR",
      "inStock": true,
      "availability": "in_stock",
      "is_sponsored": true
    },
    {
      "position": 3,
      "search_query": "protein powder",
      "product_id": "774103",
      "title": "Whey Protein Concentrate 2 kg",
      "brand": "Example Nutrition",
      "price": 4299,
      "mrp": 5499,
      "currency": "INR",
      "inStock": true,
      "availability": "in_stock",
      "is_sponsored": false
    }
  ]
}

Handle Rows With No Ad Marker

When a response carries no ad-marking signal at all, every row returns null. That means the status was not captured for this response — it does not mean the rows are organic.

curl -X POST "https://api.datablue.dev/v1/data/instamart/products" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "query": "rock salt",
  "location_key": "blr_koramangala",
  "num_results": 1
}'
Example response
{
  "success": true,
  "source": "instamart",
  "query": "rock salt",
  "location_key": "blr_koramangala",
  "store_id": "1396284",
  "serviceable": true,
  "page": 1,
  "pages_fetched": 1,
  "time_taken": 1.02,
  "products": [
    {
      "position": 1,
      "search_query": "rock salt",
      "product_id": "774220",
      "title": "Rock Salt 1 kg",
      "brand": "Example Foods",
      "price": 45,
      "mrp": 55,
      "currency": "INR",
      "inStock": true,
      "availability": "in_stock",
      "is_sponsored": null
    }
  ]
}

Response

Read normalized product rows from products and the resolved delivery context from the top-level fields. Batch runs also include per-query status in query_results, and every row carries search_query. To count paid placements, match is_sponsored === true and treat null as not captured — filtering on falsy would silently count unknown rows as organic.

Error Handling

A failed request returns success: false and an error drawn from exactly six messages: This location is not serviceable by Instamart, No results found for this query on Instamart, A search query is required, No search queries supplied, Instamart is temporarily unavailable, please retry, and Instamart did not respond in time, please retry. Only the last two are worth retrying. Handle 401 for authentication, 422 for invalid input, and 429 for limits.

Parameters

NameTypeRequirementDescription
query / searchQuerystringOptionalProduct search query. Required unless queries or collection_id is supplied.
queriesstring[]OptionalActor-style batch queries. Use this instead of query for multi-keyword runs. Max 25 queries. Always runs as a queued job.
collection_id / collectionIdstringOptionalInstamart collection/category id for collection browse mode.
num_results / maxResultsnumberOptionalMaximum products to return (1-200).
pagenumberOptionalStarting Instamart result page (1-5).
location_keystringOptionalFixed launch location. Supported: blr_koramangala, blr_indiranagar, mum_bandra, del_connaught_place.
store_idstringOptionalExplicit decoded Instamart store ID for advanced store-specific requests.
primary_store_idstringOptionalExplicit primary store ID. Requires store_id.
secondary_store_idstringOptionalComma-separated secondary store IDs for advanced decoded-store replay.
latitude / latnumberOptionalCustom delivery latitude. Must be sent with longitude.
longitude / lonnumberOptionalCustom delivery longitude. Must be sent with latitude.
citystringOptionalOptional custom city label.
locationstringOptionalOptional custom area or address label.
timeout_msnumberOptionalProvider timeout in milliseconds (3000-60000).

Response fields

FieldTypeDescription
successbooleanWhether the Instamart request completed successfully.
querystringNormalized product query or collection:<id> marker for collection browse mode. For a batch request this echoes the first query.
queries / query_countstring[] | numberBatch requests only: the normalized query list and how many terms ran.
query_resultsarrayBatch requests only: per-query rows with query, success, result_count, pages_fetched, and error.
location_keystringFixed launch location key used for the request.
store_id / primary_store_id / secondary_store_idstringDecoded Instamart store identifiers used for the request when available.
pages_fetchednumberNumber of Instamart provider pages fetched.
productsarrayProduct rows with product_id, title/name, brand, image_url/imageUrl, price, MRP, discount, savings, price_per_unit/pricePerUnit, quantity, category/superCategory, sub_category, shortDescription, rating/ratingCount, inStock, scrapedAt, and availability.
products[].veg_classifierstringVegetarian classification as published by the source, e.g. VEG or NONVEG.
products[].weight_in_gramsnumberNet weight in grams, useful for normalising price per kilogram across pack sizes.
products[].image_urlsstring[]Every product image the source exposes. image_url remains the first entry.
products[].cart_allowed_quantity / low_stock_textnumber | stringStock depth signals: maximum quantity addable to cart, and the source's low-stock notice when present.
products[].max_saver_price / discount_value / is_super_savernumber | booleanAdditional pricing tiers and savings amount published alongside price and MRP.
products[].offersstring[]Promotional callouts attached to the product row, e.g. bank offers or bestseller badges.
products[].slastringDelivery estimate for the product from the serving store, e.g. 15 MINS.
products[].delivery_eta_minutesnumber | nullThe sla estimate in whole minutes, e.g. 4 for "4 MINS". Store-level rather than per item: Instamart publishes no per-item ETA, so every row carries the serving store's estimate.
products[].is_sponsoredboolean | nullPaid-placement status. true when Instamart marked the row as an ad; false when the source marked it organic or marked at least one other row in the same response; null when no ad marker was present anywhere, so the status is not captured. Do not read null as organic.
products[].search_querystringThe query that produced the row. Use it to attribute products in a batch response.
serviceableboolean | nulltrue when an Instamart store was resolved, false when the pin is outside the delivery footprint, null when the store lookup did not answer. A failed lookup is reported as null, never as an unserviceable location, so null means undetermined rather than not served.
products[].pod_idstringIdentifier of the dark store that fulfilled the row, which can differ from the requested store.
time_takennumberAPI response time in seconds.
errorstringError message when the provider request fails.

Request and response

curl -X POST "https://api.datablue.dev/v1/data/instamart/products" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "searchQuery": "coffee",
  "location_key": "blr_koramangala",
  "maxResults": 5,
  "page": 1
}'
Example response
{
  "success": true,
  "source": "instamart",
  "query": "coffee",
  "location_key": "blr_koramangala",
  "requested_location": "Koramangala, Bengaluru",
  "city": "Bengaluru",
  "store_id": "1396284",
  "primary_store_id": "1396284",
  "serviceable": true,
  "page": 1,
  "pages_fetched": 1,
  "time_taken": 1.21,
  "products": [
    {
      "position": 1,
      "search_query": "coffee",
      "product_id": "123456",
      "name": "Instant Coffee",
      "title": "Instant Coffee",
      "brand": "Example Brand",
      "image_url": "https://media-assets.swiggy.com/...",
      "imageUrl": "https://media-assets.swiggy.com/...",
      "price": 199,
      "mrp": 249,
      "currency": "INR",
      "discount": "20% OFF",
      "savings": 50,
      "quantity": "100 g",
      "price_per_unit": "199/100 g",
      "pricePerUnit": "199/100 g",
      "category": "Coffee",
      "superCategory": "Tea, Coffee and More",
      "shortDescription": "Rich instant coffee granules",
      "rating": 4.4,
      "ratingCount": 96200,
      "is_sponsored": false,
      "inStock": true,
      "sla": "4 MINS",
      "delivery_eta_minutes": 4,
      "scrapedAt": "2026-07-22T17:33:03Z",
      "availability": "in_stock"
    }
  ]
}