GET products
List public product catalog records.
Endpoint
GET /public-api/v1/productsPurpose
Returns public product catalog data for the organization, including the current average unit cost for each store.
Authentication
Required.
Parameters
limit: optional page size, default25, maximum100.cursor: optional UUID frompagination.nextCursor.storeIds: optional branch filter, comma-separated or repeated.categoryIds: optional category filter, comma-separated or repeated.search: optional text search by product name or SKU.
Response fields
Each product includes id, timestamps, sku, name, description, price, type, lowStockThreshold, imageUrl, category, assignedStores, and branchOverrides. Each branch override includes averageCost, the current average unit cost for that product and store.
Example request
curl "https://api.klupos.com/public-api/v1/products?limit=10&search=flower" \
-H "Authorization: Bearer klu_live_replace_me"Example response
{
"data": [
{
"id": "product-id",
"createdAt": "2026-06-01T00:00:00.000Z",
"updatedAt": "2026-06-24T00:00:00.000Z",
"sku": "SKU-001",
"name": "Blue Dream",
"description": "Hybrid flower",
"price": 450,
"type": "DEFAULT",
"lowStockThreshold": 5,
"imageUrl": "https://example.com/product.jpg",
"category": {
"id": "category-id",
"name": "Flower",
"color": "#36B37E",
"unit": "WEIGHT",
"group": null
},
"assignedStores": [
{ "id": "store-id", "name": "Main Branch", "branchNo": "001" }
],
"branchOverrides": [
{
"storeId": "store-id",
"averageCost": 210,
"price": 420,
"hidden": false,
"imageUrl": null
}
]
}
]
}Common errors
400: invalid query parameter.401: invalid key.403: requestedstoreIdsare outside the organization.429: rate limit exceeded.
AI-agent notes
Use this endpoint to discover product IDs, SKUs, and current per-store average costs. averageCost is not a historical sale-time cost, so it cannot produce exact historical margins.