MindCase
Saurabh Shubham

Category and Search Data Across Quick-Commerce Apps

Before you can monitor a product's price, you have to find it. Here's how category browsing and keyword search actually work on Instamart and Zepto.

quick-commerceproduct
Category and search data across quick-commerce apps

Watching one product's price is easy once you have its URL. Finding every product in a category — or everything that matches a keyword — before you know any URLs is a different problem. Instamart and Zepto both expose that as two separate calls: browse a category top to bottom, or search by keyword. Neither is a general product-price lookup — that's covered elsewhere. This is about discovering what's actually in the catalog.

If you're an agent (or building one) reading this rather than a human, the full machine-readable schema for every endpoint below lives at mindcase.co/skills.md.

Category browsing returns everything under a category and sub-category — useful when you want a full assortment sweep, like every SKU in "Dairy" at one store, regardless of name. Keyword search returns whatever matches a query string — useful when you're looking for one thing and don't want to page through an entire category to find it. Both are store-scoped and return the same shape of row: same price/stock/rating fields either way, just a different way of arriving at the list.

The two solve different questions. Search answers "is this specific product listed here" — you already know the name. Category browsing answers "what does this store actually carry" — a brand checking whether its full line is stocked, not just the one SKU it happens to be watching, needs the category call. A category audit that only checks known product names will miss a delisted variant it never thought to search for, since you can't search for a product you don't know is missing.

How do you browse a full category?

Instamart Category and Zepto Category both take a required category and sub_category pair, plus a location:

curl -X POST "https://api.mindcase.co/v1/data/instamart/category/run?wait=true" \
-H "Authorization: Bearer $MINDCASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "params": {
    "category": "Cold Drinks and Juices",
    "sub_category": "Soft Drinks",
    "city": "Bangalore",
    "pincode": "560034",
    "maxResults": 50
  }
}'

# $0.001 per product returned

Zepto Category takes the same shape — category, sub_category, a location, maxResults — with one real difference: the taxonomies aren't the same size. Instamart splits its catalog into 36 top categories and 504 sub-categories; Zepto uses 23 top categories and 228 sub-categories. The same product can sit one level deeper on one platform than the other, so don't assume a category name that works on Instamart maps directly onto Zepto.

How do you find a product by keyword instead?

Instamart Search takes a query string instead of a category pair — everything else (location, maxResults) stays the same:

curl -X POST "https://api.mindcase.co/v1/data/instamart/search/run?wait=true" \
-H "Authorization: Bearer $MINDCASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "params": {
    "query": "Amul Butter",
    "city": "Bangalore",
    "pincode": "560034",
    "maxResults": 20
  }
}'

# $0.001 per product returned

Category and search return the same 25 fields on Instamart — productName, brand, price, mrp, discount, inStock, stockCount, rating, rank, sponsored, and 15 more. rank and sponsored are worth pulling out specifically: rank is the row's position in that category or result set, and sponsored flags whether a listing is a paid placement rather than an organic one — useful if you're studying shelf position rather than just price. If your own product's rank quietly slides down a category over a few pulls while a competitor's sponsored listing climbs, that's a shelf-position problem, not a pricing or review problem — a metric you'd never catch from a single-product price check, only from watching the whole category.

How do you know which category names are valid?

category and sub_category aren't free text — they're picked from a fixed list per platform, and passing a name that isn't on that list won't silently fall back to something close. If you don't already know the exact value, fetch the real list first:

GET https://api.mindcase.co/v1/data/instamart/category?expand=options
GET https://api.mindcase.co/v1/data/zepto/category?expand=options

That returns every valid category and sub_category string for that platform. Worth doing once and caching the result — the list doesn't need re-fetching on every run, just when you're building a new query or suspect the taxonomy changed.

What can't you get from Mindcase?

Two cases.

A category name in your own words. "Drinks" won't match "Cold Drinks and Juices" — the match is exact against the platform's own taxonomy, not a fuzzy search. Use expand=options to get the real string first, or use keyword search instead if you don't want to look it up.

Every store in a city from one call. Category and search results are both scoped to one store, one set of coordinates, or one pincode — there's no city-wide aggregate. Sweeping a city means calling once per store you care about, the same store-by-store shape covered for price monitoring.

Which endpoint should you use for which job?

EndpointInputPriceBest for
Instamart CategoryCategory + sub-category$0.001 / productFull assortment sweep of one category
Zepto CategoryCategory + sub-category$0.001 / productSame, on Zepto's smaller taxonomy
Instamart SearchKeyword$0.001 / productFinding a specific product by name

FAQ

No. City and pincode work on their own, or lat/lon coordinates. A store ID is only needed if you're re-checking the exact same store repeatedly.

This post covers Instamart Search specifically. Zepto's product-level lookup by keyword is covered separately — Zepto Category here only covers category browsing, not keyword search.

Its position in that specific category or search result set at the moment you called it. It moves between calls the same way the underlying app's shelf order does.

Live on every call. Neither platform is cached — a category or search call returns what that store is showing right now.