Docs / API reference

POST/v1/data/zepto/products

Zepto Products

Search Zepto products for a fixed or custom 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.

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
}'
Example response
{
  "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"
}'
Example response
{
  "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"
Example response
{
  "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"
}'
Example response
{
  "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"
}'
Example response
{
  "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"
}'
Example response
{
  "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
}'
Example response
{
  "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"
    }
  ]
}

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
}'
Example response
{
  "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.

Parameters

NameTypeRequirementDescription
query / keyword / startUrlstringOptionalProduct query, actor keyword alias, or Zepto search URL containing ?query=. Required unless queries 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.
num_results / results_wantednumberOptionalMaximum products to return (1-100).
max_pagesnumberOptionalMaximum Zepto provider pages to fetch (1-5); also caps results to max_pages * 20.
pagenumberOptionalStarting Zepto result page (1-5).
location_keystringOptionalFixed launch location. Supported: blr_koramangala, mum_bandra, del_connaught_place.
citystringOptionalCity name, e.g. Bengaluru. Send with location to search a named locality without coordinates.
locationstringOptionalLocality or area name, e.g. Shampura. Geocoded to coordinates, then resolved to the serving store.
latitudenumberOptionalCustom delivery latitude. Must be sent with longitude. Skips geocoding.
longitudenumberOptionalCustom delivery longitude. Must be sent with latitude. Skips geocoding.
timeout_msnumberOptionalProvider timeout in milliseconds (3000-60000).

Response fields

FieldTypeDescription
successbooleanWhether the Zepto request completed successfully.
querystringThe normalized search query. 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.
products[].search_querystringThe query that produced the row. Use it to attribute products in a batch response.
location_key / requested_locationstringDelivery context used for the request.
serviceableboolean | nulltrue when a Zepto 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.
store_idstringResolved Zepto store identifier when available.
products[].identityobjectstore_product_id, product_id, variant_id/product_variant_id, title/name, and brand.
products[].store / taxonomyobjectstore_id plus primary category/subcategory names and IDs.
products[].sub_categorystring | nullSub-category name for the row, aligned with the sub_category field on the other quick-commerce sources. Previously only the numeric primary_subcategory_id was exposed.
products[].image_urlsstring[] | nullEvery product image the source exposes, with image_url as the first entry. null when the source ships no images.
products[].is_sponsoredboolean | nullPaid-placement status. true when Zepto marked the row as an ad; false when this response marked at least one other row and not this one; null when the response carried no ad markers anywhere, so the status is not captured. Do not read null as organic.
products[].pack / stockobjectpack_size, formatted_packsize, packsize, unit_of_measure, inventory/available_quantity/catalog_quantity, max_allowed_quantity, out_of_stock, and source activity flags.
products[].pricingobjectprice/original_price plus mrp, selling_price, discounted_selling_price, discount amount/percent, super-saver price, and zepto_pass_price.
products[].contentobjectimage, rating/rating_average/rating_count, country_of_origin, manufacturer_name, FSSAI license, shelf life, weight, product type, description, and scraped_at.
pages_fetchednumberNumber of provider pages fetched.
time_takennumberAPI response time in seconds.

Request and response

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": 10,
  "page": 1
}'
Example response
{
  "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",
      "sub_category": "Milk",
      "image_url": "https://cdn.zeptonow.com/...",
      "image_urls": [
        "https://cdn.zeptonow.com/..."
      ],
      "pack_size": "500 ml",
      "formatted_packsize": "500 ml",
      "packsize": 500,
      "unit_of_measure": "ml",
      "price": 28,
      "original_price": 30,
      "mrp": 30,
      "selling_price": 28,
      "discounted_selling_price": 28,
      "zepto_pass_price": 27,
      "currency": "INR",
      "inventory": 8,
      "available_quantity": 8,
      "max_allowed_quantity": 6,
      "availability": "in_stock",
      "is_sponsored": null,
      "rating_average": 4.4,
      "manufacturer_name": "Example Dairy Pvt Ltd"
    }
  ]
}