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.
How is category browsing different from keyword search?
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 returnedZepto 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 returnedCategory 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?
| Endpoint | Input | Price | Best for |
|---|---|---|---|
| Instamart Category | Category + sub-category | $0.001 / product | Full assortment sweep of one category |
| Zepto Category | Category + sub-category | $0.001 / product | Same, on Zepto's smaller taxonomy |
| Instamart Search | Keyword | $0.001 / product | Finding 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.
