How to Read Products, Categories and Taxes with the Zepio Developer API
List your products with their variants, stock, prices and images, and look up category and tax IDs, through the Zepio Developer API.
Updated 19 Oct 2026 4 min read
On this page
The Products API lets you read your catalogue from your own code: products with their variants, stock, prices, images and categories, plus your categories and taxes. Use it to match your ERP items to Zepio products, or to check what a bulk update saved.
Create an API key
- Go to Settings › Developer API and click Create API key.
- Tick this ability: Read products (
products:read).
Send it as a Bearer token. See API keys, limits and errors for the basics.
Authorization: Bearer YOUR_API_KEY
Accept: application/json
Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /products |
List products, newest first |
| GET | /products/{id} |
Get one product |
| GET | /categories |
List categories |
| GET | /taxes |
List taxes |
All are under https://yourwebsite.com/api/developer/v1.
Get products
GET /api/developer/v1/products
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
per_page |
integer | No | Products per page. Maximum 100. Default 25 |
cursor |
string | No | The cursor for the next or previous page |
branch_id |
integer | No | Only products from this branch |
erp_id |
string | No | Only the product with this ERP ID |
sku_code |
string | No | Only the product with this SKU |
category_id |
integer | No | Only products in this category |
is_active |
boolean | No | 1 for active products, 0 for hidden ones |
updated_after |
datetime | No | Only products changed after this time, for example 2026-10-17T09:00:00+05:30 |
search |
string | No | Matches part of the name, or an exact SKU or ERP ID |
Example request
curl -X GET "https://yourwebsite.com/api/developer/v1/products?per_page=100" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
Find a product by its ERP ID
curl -X GET "https://yourwebsite.com/api/developer/v1/products?erp_id=55885588" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
Example response
{
"success": true,
"message": "OK",
"data": [
{
"id": 1009,
"branch_id": 1,
"name": "Organic Almonds 500g",
"slug": "organic-almonds-500g",
"short_description": null,
"description": "<p>Crunchy, unsalted almonds.</p>",
"sku_code": "QFMAWVHW",
"erp_id": "55885588",
"hsn_code": "0802",
"original_price": 120,
"selling_price": 100,
"track_quantity": true,
"unit_quantity": 48,
"has_stock": true,
"min_quantity": 1,
"max_quantity": null,
"low_stock_alert": 5,
"unit_label": "",
"unit_weight": 500,
"weight_unit": "gm",
"length": null,
"width": null,
"height": null,
"tax_id": 1,
"is_active": true,
"created_at": "2026-09-21T04:25:59+00:00",
"updated_at": "2026-10-16T12:10:17+00:00",
"category_ids": [54],
"images": [
{
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"url": "https://yourwebsite.com/media/almonds.jpg",
"position": 1
}
],
"variants": []
}
],
"meta": {
"per_page": 100,
"next_page_url": "https://yourwebsite.com/api/developer/v1/products?per_page=100&cursor=eyJpZCI6MTAwOSwiX3BvaW50c1RvTmV4dEl0ZW1zIjp0cnVlfQ",
"prev_page_url": null,
"has_more": true
}
}
Pagination
When has_more is true, call next_page_url to get the next page. Stop when has_more is false.
Get one product
GET /api/developer/v1/products/{id}
curl -X GET "https://yourwebsite.com/api/developer/v1/products/1009" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
The reply has the same fields as one product in the list. A product that does not exist, or was deleted, returns 404.
Product fields
| Field | Description |
|---|---|
id |
Zepio product ID. Use it as id in a bulk update |
branch_id |
The branch the product belongs to |
sku_code, erp_id, hsn_code |
Your codes for the product |
original_price |
MRP |
selling_price |
The price shoppers pay |
track_quantity |
Whether stock is tracked |
unit_quantity |
Stock in hand, when stock is tracked |
has_stock |
Whether the product can be bought right now |
tax_id |
The tax applied. Look it up in /taxes |
is_active |
Whether the product shows in your store |
category_ids |
IDs of the categories the product is in. Look them up in /categories |
images |
Images in display order |
variants |
Sizes, colours or other options, each with its own id, sku_code, prices and stock. Empty when the product has none |
Get categories
GET /api/developer/v1/categories
| Parameter | Type | Required | Description |
|---|---|---|---|
per_page |
integer | No | Categories per page. Maximum 100. Default 100 |
cursor |
string | No | The cursor for the next page |
branch_id |
integer | No | Only categories from this branch |
parent_id |
integer | No | Only sub-categories of this category |
is_active |
boolean | No | 1 for active categories, 0 for hidden ones |
{
"success": true,
"message": "OK",
"data": [
{
"id": 2,
"branch_id": 1,
"parent_id": null,
"name": "Fresh Fruits",
"slug": "fresh-fruits",
"position": 20,
"is_active": true,
"created_at": "2024-11-24T18:17:31+00:00",
"updated_at": "2024-11-24T19:15:34+00:00"
}
],
"meta": {
"per_page": 100,
"next_page_url": null,
"prev_page_url": null,
"has_more": false
}
}
Get taxes
GET /api/developer/v1/taxes
{
"success": true,
"message": "OK",
"data": [
{ "id": 1, "name": "5% GST", "percentage": "5.00" }
]
}
Notes
- The API key must have the Read products ability (
products:read). - Reading shares one limit of 60 requests a minute with all your other keys. Use
per_page=100andupdated_afterto need fewer requests. See API keys, limits and errors. - Deleted products are not returned.
- Download links, licence keys and streaming links of digital products are never returned by this API.