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
}'{
"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"
}'{
"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"
}'{
"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"
{
"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"
}'{
"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"
}'{
"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"
}'{
"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
}'{
"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
}Sponsored Rows
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
}'{
"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
}'{
"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.
