Zepto Products Endpoint
Search products in a fixed or coordinate-based Zepto delivery area.
Getting Started
Send your API key as a bearer token. Start with the smallest request below.
Search a Fixed Location
Use a product query and supported location_key.
curl -X POST "https://api.datablue.dev/v1/data/zepto/products" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "milk",
"location_key": "mum_bandra",
"num_results": 20
}'{
"success": true,
"source": "zepto",
"query": "milk",
"location_key": "mum_bandra",
"requested_location": "Bandra, Mumbai",
"city": "Mumbai",
"serviceable": true,
"store_id": "store_123",
"page": 1,
"pages_fetched": 1,
"time_taken": 1.14,
"products": [
{
"position": 1,
"store_product_id": "sp_123",
"product_id": "prod_123",
"variant_id": "var_123",
"product_variant_id": "var_123",
"title": "Toned Milk",
"brand": "Example Dairy",
"category": "Dairy",
"primary_category_name": "Dairy, Bread & Eggs",
"primary_subcategory_name": "Milk"
}
]
}Batch Queries
Search several terms in one run. Batch is always asynchronous, so it takes two steps.
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/zepto/products" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"queries": [
"milk",
"curd"
],
"num_results": 5,
"location_key": "mum_bandra"
}'{
"success": true,
"job_id": "3f9c1a24-8b7e-4f52-9a10-6c2d8e5b4771",
"status": "queued",
"platform": "zepto",
"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": "zepto",
"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": "zepto",
"query": "milk",
"queries": [
"milk",
"curd"
],
"query_count": 2,
"location_key": "mum_bandra",
"requested_location": "Bandra, Mumbai",
"city": "Mumbai",
"serviceable": true,
"store_id": "store_123",
"page": 1,
"pages_fetched": 2,
"time_taken": 2.07,
"products": [
{
"position": 1,
"search_query": "milk",
"store_product_id": "sp_123",
"product_id": "prod_123",
"title": "Toned Milk",
"brand": "Example Dairy",
"price": 28,
"mrp": 30,
"currency": "INR",
"pack_size": "500 ml",
"sub_category": "Milk",
"availability": "in_stock",
"is_sponsored": null
},
{
"position": 1,
"search_query": "curd",
"store_product_id": "sp_456",
"product_id": "prod_456",
"title": "Fresh Curd",
"brand": "Example Dairy",
"price": 35,
"mrp": 40,
"currency": "INR",
"pack_size": "400 g",
"sub_category": "Curd & Yogurt",
"availability": "in_stock",
"is_sponsored": null
}
],
"query_results": [
{
"query": "milk",
"success": true,
"result_count": 5,
"pages_fetched": 1
},
{
"query": "curd",
"success": true,
"result_count": 5,
"pages_fetched": 1
}
]
}
}Results and Pages
Control Pagination
Set the maximum products, provider page cap, and starting page.
curl -X POST "https://api.datablue.dev/v1/data/zepto/products" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "milk",
"num_results": 50,
"max_pages": 3,
"page": 2,
"location_key": "mum_bandra"
}'{
"success": true,
"source": "zepto",
"query": "milk",
"location_key": "mum_bandra",
"requested_location": "Bandra, Mumbai",
"city": "Mumbai",
"serviceable": true,
"store_id": "store_123",
"page": 1,
"pages_fetched": 1,
"time_taken": 1.14,
"products": [
{
"position": 1,
"store_product_id": "sp_123",
"product_id": "prod_123",
"variant_id": "var_123",
"product_variant_id": "var_123",
"title": "Toned Milk",
"brand": "Example Dairy",
"category": "Dairy",
"primary_category_name": "Dairy, Bread & Eggs",
"primary_subcategory_name": "Milk"
}
]
}Delivery Location
Search a Locality by Name
Send city and location on their own. DataBlue geocodes the locality and resolves the serving store, so no coordinates are needed.
curl -X POST "https://api.datablue.dev/v1/data/zepto/products" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "milk",
"location_key": null,
"city": "Bengaluru",
"location": "Shampura"
}'{
"success": true,
"source": "zepto",
"query": "milk",
"location_key": "mum_bandra",
"requested_location": "Bandra, Mumbai",
"city": "Mumbai",
"serviceable": true,
"store_id": "store_123",
"page": 1,
"pages_fetched": 1,
"time_taken": 1.14,
"products": [
{
"position": 1,
"store_product_id": "sp_123",
"product_id": "prod_123",
"variant_id": "var_123",
"product_variant_id": "var_123",
"title": "Toned Milk",
"brand": "Example Dairy",
"category": "Dairy",
"primary_category_name": "Dairy, Bread & Eggs",
"primary_subcategory_name": "Milk"
}
]
}Custom Coordinates
Send latitude and longitude together when you already know them. This skips geocoding.
curl -X POST "https://api.datablue.dev/v1/data/zepto/products" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "milk",
"location_key": null,
"latitude": 19.0607,
"longitude": 72.8362,
"city": "Mumbai",
"location": "Bandra"
}'{
"success": true,
"source": "zepto",
"query": "milk",
"location_key": "mum_bandra",
"requested_location": "Bandra, Mumbai",
"city": "Mumbai",
"serviceable": true,
"store_id": "store_123",
"page": 1,
"pages_fetched": 1,
"time_taken": 1.14,
"products": [
{
"position": 1,
"store_product_id": "sp_123",
"product_id": "prod_123",
"variant_id": "var_123",
"product_variant_id": "var_123",
"title": "Toned Milk",
"brand": "Example Dairy",
"category": "Dairy",
"primary_category_name": "Dairy, Bread & Eggs",
"primary_subcategory_name": "Milk"
}
]
}Request Controls
Provider Timeout
Set the source timeout between 3,000 and 60,000 milliseconds.
curl -X POST "https://api.datablue.dev/v1/data/zepto/products" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "milk",
"location_key": "mum_bandra",
"timeout_ms": 30000
}'{
"success": true,
"source": "zepto",
"query": "milk",
"location_key": "mum_bandra",
"requested_location": "Bandra, Mumbai",
"city": "Mumbai",
"serviceable": true,
"store_id": "store_123",
"page": 1,
"pages_fetched": 1,
"time_taken": 1.14,
"products": [
{
"position": 1,
"store_product_id": "sp_123",
"product_id": "prod_123",
"variant_id": "var_123",
"product_variant_id": "var_123",
"title": "Toned Milk",
"brand": "Example Dairy",
"category": "Dairy",
"primary_category_name": "Dairy, Bread & Eggs",
"primary_subcategory_name": "Milk"
}
]
}Sponsored Rows
is_sponsored has three states, because Zepto only publishes a positive ad marker. A query with ad inventory marks some rows and leaves the rest false; a query with no ads anywhere returns null on every row, meaning the status was not captured rather than that the rows are organic. Marked rows are interleaved through the results at scattered positions, 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 unmarked rows in that same response return false.
curl -X POST "https://api.datablue.dev/v1/data/zepto/products" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "protein powder",
"location_key": "mum_bandra",
"num_results": 3
}'{
"success": true,
"source": "zepto",
"query": "protein powder",
"location_key": "mum_bandra",
"requested_location": "Bandra, Mumbai",
"serviceable": true,
"store_id": "store_123",
"page": 1,
"pages_fetched": 1,
"time_taken": 1.18,
"products": [
{
"position": 1,
"search_query": "protein powder",
"product_id": "prod_881",
"title": "Whey Protein Isolate 1 kg",
"brand": "Example Nutrition",
"price": 2799,
"mrp": 3499,
"currency": "INR",
"availability": "in_stock",
"is_sponsored": true
},
{
"position": 2,
"search_query": "protein powder",
"product_id": "prod_882",
"title": "Plant Protein 500 g",
"brand": "Example Foods",
"price": 1249,
"mrp": 1599,
"currency": "INR",
"availability": "in_stock",
"is_sponsored": false
},
{
"position": 3,
"search_query": "protein powder",
"product_id": "prod_883",
"title": "Whey Protein Concentrate 2 kg",
"brand": "Example Nutrition",
"price": 4299,
"mrp": 5499,
"currency": "INR",
"availability": "in_stock",
"is_sponsored": true
}
]
}Response
Read serviceable before consuming normalized rows from products. 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 Zepto, Could not find a location matching '<name>'. Check the city or area name, or send latitude and longitude instead., No results found for this query on Zepto, No search queries supplied, Zepto is temporarily unavailable, please retry, and Zepto did not respond in time, please retry. The first two are both location failures but need different fixes: a name that cannot be geocoded is a typo you can correct, while an unserviceable pin is outside Zepto's delivery footprint. Only the last two are worth retrying. Handle 401 for authentication, 422 for invalid input, and 429 for limits.
