# List category products

List Zepto products from a category, subcategory or supported category URL with bounded filters, logical slices and cursor continuation.

- Platform: [Zepto](https://docs.upscrape.com/docs/platforms/zepto)
- Capability ID: `zepto.category.products`
- Cost: 1 credit per request
- Maximum runtime: 180 seconds
- Execute endpoint: `POST https://data.upscrape.com/execute`

## Request

Use the exact public capability ID in the shared execute envelope.

```bash
curl --request POST \
  --url https://data.upscrape.com/execute \
  --header "Authorization: Bearer $UPSCRAPE_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Prefer: wait=30" \
  --data '{
  "input": {
    "limit": 5,
    "max_pages": 1,
    "page": 0,
    "pincode": "560067",
    "subcategory_id": "09e63c15-e5f7-4712-9ff8-513250b79942"
  },
  "capability": "zepto.category.products"
}'
```

## Input

Use category_id, subcategory_id or a supported Zepto/Zeptonow category URL. Prefer IDs returned by zepto.categories when building a repeatable category workflow.

For location-specific results, provide store_id, a six-digit pincode, or both latitude and longitude. Do not combine pincode with coordinates.

limit accepts 1 to 100 matching products and max_pages accepts 1 to 20 native product pages. page is a zero-based logical slice; page_number is its one-based alias. Numbered requests may consume scan budget while skipping the prefix.

Optional filters are brand_ids, brand_names, min_price_paise, max_price_paise, min_discount and in_stock. sort is relevance, price_asc or price_desc, with price sorting limited to the bounded matching sample.

For sequential traversal, prefer the returned next_cursor. Reuse it with the same category, delivery context, filters, sort and limit, and omit page and page_number.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `brand_ids` | `array<string>` | No | Case-insensitive exact IDs; union with brand_names. |
| `brand_names` | `array<string>` | No | Trimmed case-insensitive exact names; union with brand_ids. |
| `category_id` | `string` | No | Zepto category ID to browse. |
| `cursor` | `string` | No | Use next_cursor unchanged with the same category, delivery context and limit. Omit page and page_number. |
| `in_stock` | `boolean` | No | Match observed stock state only; unknown stock never matches. |
| `latitude` | `number` | No | Latitude for location-based store resolution. From -90 to 90. |
| `limit` | `integer` | No | Maximum matching sample size. Sorting is limited to this sample. From 1 to 100. Default: `20`. |
| `longitude` | `number` | No | Longitude for location-based store resolution. From -180 to 180. |
| `max_pages` | `integer` | No | Maximum native product pages fetched, including continuation refetches and skipped prefixes. A zero-match slice can still have continuation. Location and category enrichment are separate bounded requests. From 1 to 20. Default: `10`. |
| `max_price_paise` | `integer` | No | Inclusive observed effective price maximum. From 0 to 1000000000. |
| `min_discount` | `integer` | No | Minimum known discount percentage. From 0 to 100. |
| `min_price_paise` | `integer` | No | Inclusive observed effective price minimum; unknown prices never match. From 0 to 1000000000. |
| `page` | `integer` | No | Zero-based logical slice (0-99); skips page multiplied by limit products within the native scan budget. Explicit page takes precedence over page_number. Cannot be combined with cursor. From 0 to 99. |
| `page_number` | `integer` | No | Optional one-based logical slice alias (1-100). page_number=2 equals page=1. Cannot be combined with cursor. From 1 to 100. |
| `pincode` | `string` | No | Six-digit Indian pincode. When provided, Upscrape resolves coordinates and the Zepto delivery store automatically. |
| `sort` | `string` | No | Price order applies only to the bounded returned matching sample; unknown prices last, ties by variant ID. Allowed values: `relevance`, `price_asc`, `price_desc`. |
| `store_id` | `string` | No | Zepto store ID. Defaults to the public Bangalore sample store. |
| `subcategory_id` | `string` | No | Zepto subcategory ID to browse. |
| `url` | `string` | No | Direct URL to a Zepto category page. |

### Example input

```json
{
  "limit": 5,
  "max_pages": 1,
  "page": 0,
  "pincode": "560067",
  "subcategory_id": "09e63c15-e5f7-4712-9ff8-513250b79942"
}
```

## Response

Successful output is returned in `results[0].data`.

Check has_more, next_cursor, rows_scanned, pages_fetched and stop_reason. page_budget can return fewer products, or zero matching rows, while continuation work remains.

sort_scope bounded_sample means price ordering applies only to the returned matching sample. Unknown prices sort last and equal prices use variant identity for deterministic ordering.

The page/page_number fields on cursor responses are batch labels; continue with next_cursor rather than treating those labels as random-access offsets.

### Illustrative sample output

This example shows one response. Values and optional fields vary with the data available.

```json
{
  "applied_filters": {
    "sort": "relevance"
  },
  "captured_at": "2026-10-02T00:01:22.602102145Z",
  "context": {
    "source": "resolved_location",
    "store_id": "e0e12ce6-3431-4ed8-a74b-b0de26426220"
  },
  "count": 5,
  "has_more": true,
  "location": {
    "eta_minutes": 9,
    "eta_serviceable": true,
    "is_nightly_store": true,
    "latitude": 12.9967012,
    "longitude": 77.758197,
    "pincode": "560067",
    "serviceable": true,
    "store_id": "e0e12ce6-3431-4ed8-a74b-b0de26426220",
    "store_ids": [
      "e0e12ce6-3431-4ed8-a74b-b0de26426220"
    ]
  },
  "location_eta_in_minutes": 9,
  "location_eta_serviceable": true,
  "location_is_nightly_store": true,
  "location_latitude": 12.9967012,
  "location_longitude": 77.758197,
  "location_serviceable": true,
  "location_store_id": "e0e12ce6-3431-4ed8-a74b-b0de26426220",
  "location_store_ids": [
    "e0e12ce6-3431-4ed8-a74b-b0de26426220"
  ],
  "next_cursor": "[redacted:token]",
  "page": 0,
  "page_number": 1,
  "pages_fetched": 1,
  "results": [
    {
      "discount_amount_paise": 6800,
      "unit_of_measure": "PIECE",
      "discounted_selling_price_paise": 7100,
      "product_type": "SELLABLESKU",
      "shelf_life_hours": 96,
      "weight_in_gms": 300,
      "country_of_origin": "INDIA",
      "store_product_id": "ff0a58fa-4826-58c4-bc09-2d3c310081c0",
      "manufacturer_name": "Bloom",
      "in_stock": true,
      "discount_percent": 48,
      "max_allowed_quantity": 6,
      "mrp_paise": 13900,
      "description": null,
      "name": "Bloom Pomegranate",
      "brand_id": "a67c4568-48d1-4044-a4b2-f75b22375104",
      "available_quantity": 1,
      "quantity": 1,
      "pack_size": 1,
      "category_id": "64374cfe-d06f-4a01-898e-c07c46462c36",
      "l3_category_id": "a6188214-3c39-4051-8fb8-5bedde5cb73b",
      "shelf_life_display": "4 days",
      "rank": 1,
      "brand": "Bloom by Zepto",
      "formatted_pack_size": "1 pc (250 - 300 g)",
      "manufacturer_address": "S.NO.17/1, PLOT NO.115,, ASHWAMEDH BANGALOW,, GANESH NAGAR, DANGE CHOWK,, THERGAON, CHINCHWAD, Pune, Maharashtra, 411033",
      "image_url": "https://cdn.zeptonow.com/production/tr:w-600,ar-1000-1000,pr-true,f-auto,q-80/cms/product_variant/d59f9b74-878f-43d8-a1c5-2cc9b147c80e.png",
      "product_variant_id": "a76d716e-26c6-48e5-b9d1-4bee5899c5d1",
      "store_id": "e0e12ce6-3431-4ed8-a74b-b0de26426220",
      "image_urls": [
        "https://cdn.zeptonow.com/production/tr:w-600,ar-1000-1000,pr-true,f-auto,q-80/cms/product_variant/d59f9b74-878f-43d8-a1c5-2cc9b147c80e.png"
      ],
      "is_primary": true,
      "primary_subcategory_id": "09e63c15-e5f7-4712-9ff8-513250b79942",
      "product_id": "297c49e4-6ec2-49cb-a355-eefb01df4821",
      "selling_price_paise": 7100,
      "is_active": true,
      "product_url": "https://www.zepto.com/pn/bloom-pomegranate/pvid/a76d716e-26c6-48e5-b9d1-4bee5899c5d1"
    },
    {
      "discount_amount_paise": 4100,
      "unit_of_measure": "PIECE",
      "discounted_selling_price_paise": 7800,
      "product_type": "SELLABLESKU",
      "shelf_life_hours": 120,
      "weight_in_gms": 200,
      "country_of_origin": "India",
      "store_product_id": "7feaeb74-0c1a-5722-bf67-705d0574a197",
      "in_stock": true,
      "discount_percent": 34,
      "max_allowed_quantity": 6,
      "mrp_paise": 11900,
      "description": null,
      "name": "Snacky Apple",
      "brand_id": "79f4561b-86d0-44d2-a8b2-c8b2b0f7db66",
      "available_quantity": 6,
      "quantity": 6,
      "pack_size": 2,
      "category_id": "64374cfe-d06f-4a01-898e-c07c46462c36",
      "l3_category_id": "8a45d639-d00f-4555-b944-cadada96792d",
      "shelf_life_display": "5 days",
      "rank": 2,
      "brand": "Exotic Picks",
      "formatted_pack_size": "2 pcs",
      "image_url": "https://cdn.zeptonow.com/production/tr:w-600,ar-1000-1000,pr-true,f-auto,q-80/cms/product_variant/d8545b1b-f870-403d-a3b0-62f5a3fa9e2a.jpg",
      "product_variant_id": "8de5b360-c890-4e1f-967c-4717f2867db9",
      "store_id": "e0e12ce6-3431-4ed8-a74b-b0de26426220",
      "image_urls": [
        "https://cdn.zeptonow.com/production/tr:w-600,ar-1000-1000,pr-true,f-auto,q-80/cms/product_variant/d8545b1b-f870-403d-a3b0-62f5a3fa9e2a.jpg"
      ],
      "is_primary": true,
      "primary_subcategory_id": "0a065d7d-ea57-4359-9900-b03425028d47",
      "product_id": "eb387ae4-1104-4ba9-bef7-23c45aa4b0b9",
      "selling_price_paise": 7800,
      "is_active": true,
      "product_url": "https://www.zepto.com/pn/snacky-apple/pvid/8de5b360-c890-4e1f-967c-4717f2867db9"
    },
    {
      "discount_amount_paise": 6600,
      "unit_of_measure": "GRAM",
      "how_to_use": [
        "Can be eaten as a fresh fruit or used in salads, smoothies, cookies, pies. Roast Apple peel into a crispy snack."
      ],
      "discounted_selling_price_paise": 10700,
      "product_type": "SELLABLESKU",
      "shelf_life_hours": 144,
      "weight_in_gms": 500,
      "country_of_origin": "India",
      "store_product_id": "997a1fc7-6965-5c12-8d6c-dbb17a7b475a",
      "in_stock": true,
      "discount_percent": 38,
      "max_allowed_quantity": 6,
      "mrp_paise": 17300,
      "description": null,
      "name": "Baby Apple Shimla",
      "brand_id": "d69ba762-dfca-47f4-8e52-d09a6d1ffbd0",
      "available_quantity": 6,
      "quantity": 6,
      "pack_size": 500,
      "category_id": "64374cfe-d06f-4a01-898e-c07c46462c36",
      "l3_category_id": "bc3cb763-2415-4e2f-8af4-c4e7d1179f4f",
      "shelf_life_display": "6 days",
      "rank": 3,
      "brand": "Unbranded",
      "formatted_pack_size": "500 g",
      "image_url": "https://cdn.zeptonow.com/production/tr:w-600,ar-1000-1000,pr-true,f-auto,q-80/cms/product_variant/230a60ee-0c65-4827-b09b-550e1eb5775f.jpg",
      "product_variant_id": "844d3994-59e2-4968-97e2-c21b822badbb",
      "store_id": "e0e12ce6-3431-4ed8-a74b-b0de26426220",
      "image_urls": [
        "https://cdn.zeptonow.com/production/tr:w-600,ar-1000-1000,pr-true,f-auto,q-80/cms/product_variant/230a60ee-0c65-4827-b09b-550e1eb5775f.jpg"
      ],
      "is_primary": true,
      "primary_subcategory_id": "09e63c15-e5f7-4712-9ff8-513250b79942",
      "badges": [
        {
          "name": "Product Discount",
          "type": "DISCOUNT"
        }
      ],
      "product_id": "2ecd1cfe-e7ce-4116-8b19-a21f5c9ee896",
      "selling_price_paise": 10700,
      "is_active": true,
      "product_url": "https://www.zepto.com/pn/baby-apple-shimla/pvid/844d3994-59e2-4968-97e2-c21b822badbb"
    }
  ],
  "rows_scanned": 32,
  "sample_size": 5,
  "sort_scope": "upstream",
  "stop_reason": "limit"
}
```
### Illustrative output fields

Derived from the sample above for orientation only. These fields are not a fixed response schema.

| Path | Observed type | Example |
| --- | --- | --- |
| `applied_filters` | `object` | 1 fields |
| `applied_filters.sort` | `string` | relevance |
| `captured_at` | `string` | 2026-10-02T00:01:22.602102145Z |
| `context` | `object` | 2 fields |
| `context.source` | `string` | resolved_location |
| `context.store_id` | `string` | e0e12ce6-3431-4ed8-a74b-b0de26426220 |
| `count` | `integer` | 5 |
| `has_more` | `boolean` | true |
| `location` | `object` | 9 fields |
| `location.eta_minutes` | `integer` | 9 |
| `location.eta_serviceable` | `boolean` | true |
| `location.is_nightly_store` | `boolean` | true |
| `location.latitude` | `number` | 12.9967012 |
| `location.longitude` | `number` | 77.758197 |
| `location.pincode` | `string` | 560067 |
| `location.serviceable` | `boolean` | true |
| `location.store_id` | `string` | e0e12ce6-3431-4ed8-a74b-b0de26426220 |
| `location.store_ids` | `array` | 1 items |
| `location_eta_in_minutes` | `integer` | 9 |
| `location_eta_serviceable` | `boolean` | true |
| `location_is_nightly_store` | `boolean` | true |
| `location_latitude` | `number` | 12.9967012 |
| `location_longitude` | `number` | 77.758197 |
| `location_serviceable` | `boolean` | true |
| `location_store_id` | `string` | e0e12ce6-3431-4ed8-a74b-b0de26426220 |
| `location_store_ids` | `array` | 1 items |
| `location_store_ids` | `array` | 1 items |
| `next_cursor` | `string` | [redacted:token] |
| `page` | `integer` | 0 |
| `page_number` | `integer` | 1 |
| `pages_fetched` | `integer` | 1 |
| `results` | `array` | 3 items |
| `results` | `array` | 3 items |
| `rows_scanned` | `integer` | 32 |
| `sample_size` | `integer` | 5 |
| `sort_scope` | `string` | upstream |
| `stop_reason` | `string` | limit |

## Execution behavior

A `200` response completed inline. A `202` response was queued; poll `GET /jobs/{id}` until the job reaches `completed` or `failed`. Use an `Idempotency-Key` when retrying must not create a duplicate logical job.

## Related documentation

- [Authentication](https://docs.upscrape.com/docs/api/authentication)
- [Jobs and results](https://docs.upscrape.com/docs/api/jobs)
- [Errors and retries](https://docs.upscrape.com/docs/api/errors)
- [Idempotency](https://docs.upscrape.com/docs/api/idempotency)
