> For the complete documentation index, see [llms.txt](https://docs.skhokho.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.skhokho.ai/assets/products.md).

# 📦 Products

Product inventory and stock management

## List products

> Get a paginated list of products with optional filters

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Products","description":"Product inventory and stock management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"ProductList":{"type":"object","description":"Lightweight serializer for product lists.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"is_low_stock":{"type":"boolean","readOnly":true},"image_url":{"type":"string","format":"uri","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true}},"required":["image_url","is_low_stock","name","short_description"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/inventory/":{"get":{"operationId":"organisation_inventory_list","description":"Get a paginated list of products with optional filters","summary":"List products","parameters":[{"in":"query","name":"category","schema":{"type":"string"},"description":"Filter products by category"},{"in":"query","name":"low_stock","schema":{"type":"boolean"},"description":"Filter only low stock products (true/false)"},{"in":"query","name":"name","schema":{"type":"string"},"description":"Filter products by name/title (case-insensitive partial match)"},{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true},{"in":"query","name":"product_type","schema":{"type":"string"},"description":"Filter products by product type"},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search products by name, product code, or barcode"},{"in":"query","name":"status","schema":{"type":"string"},"description":"Filter products by status (active, inactive, discontinued, out_of_stock)"}],"tags":["Products"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductList"}}}},"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}}}}}}
```

## Create product

> Create a new product

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Products","description":"Product inventory and stock management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"ProductRequest":{"type":"object","description":"Full serializer for Product creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"short_description":{"type":"string","nullable":true,"maxLength":500},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"Product type is required.\n\n* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model_number":{"type":"string","nullable":true,"maxLength":200},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"cost_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Cost price per unit"},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"maximum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"image":{"type":"string","format":"binary","nullable":true,"title":"Product Image","description":"Product image for catalogs and invoices"},"supplier_name":{"type":"string","nullable":true,"maxLength":300}},"required":["name","product_type"]},"ProductDetail":{"type":"object","description":"Detailed serializer for single product retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model_number":{"type":"string","nullable":true,"maxLength":200},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"cost_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Cost price per unit"},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"maximum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"image_url":{"type":"string","format":"uri","nullable":true,"readOnly":true},"supplier_name":{"type":"string","nullable":true,"maxLength":300},"created_by":{"allOf":[{"$ref":"#/components/schemas/ProductPersonMini"}],"readOnly":true},"is_low_stock":{"type":"boolean","readOnly":true},"profit_margin":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","image_url","is_low_stock","name","profit_margin","short_description"]},"ProductPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/inventory/create/":{"post":{"operationId":"organisation_inventory_create_create","description":"Create a new product","summary":"Create product","parameters":[{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true}],"tags":["Products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDetail"}}},"description":""},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}}}}}}
```

## Retrieve product

> Get detailed information about a specific product

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Products","description":"Product inventory and stock management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"ProductDetail":{"type":"object","description":"Detailed serializer for single product retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model_number":{"type":"string","nullable":true,"maxLength":200},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"cost_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Cost price per unit"},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"maximum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"image_url":{"type":"string","format":"uri","nullable":true,"readOnly":true},"supplier_name":{"type":"string","nullable":true,"maxLength":300},"created_by":{"allOf":[{"$ref":"#/components/schemas/ProductPersonMini"}],"readOnly":true},"is_low_stock":{"type":"boolean","readOnly":true},"profit_margin":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","image_url","is_low_stock","name","profit_margin","short_description"]},"ProductPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/inventory/{unique_id}/":{"get":{"operationId":"organisation_inventory_retrieve","description":"Get detailed information about a specific product","summary":"Retrieve product","parameters":[{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true},{"in":"path","name":"unique_id","schema":{"type":"string"},"required":true}],"tags":["Products"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDetail"}}},"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```

## Update product

> Update product information (PUT for full update, PATCH for partial)

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Products","description":"Product inventory and stock management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"ProductRequest":{"type":"object","description":"Full serializer for Product creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"short_description":{"type":"string","nullable":true,"maxLength":500},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"Product type is required.\n\n* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model_number":{"type":"string","nullable":true,"maxLength":200},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"cost_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Cost price per unit"},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"maximum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"image":{"type":"string","format":"binary","nullable":true,"title":"Product Image","description":"Product image for catalogs and invoices"},"supplier_name":{"type":"string","nullable":true,"maxLength":300}},"required":["name","product_type"]},"ProductDetail":{"type":"object","description":"Detailed serializer for single product retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model_number":{"type":"string","nullable":true,"maxLength":200},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"cost_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Cost price per unit"},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"maximum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"image_url":{"type":"string","format":"uri","nullable":true,"readOnly":true},"supplier_name":{"type":"string","nullable":true,"maxLength":300},"created_by":{"allOf":[{"$ref":"#/components/schemas/ProductPersonMini"}],"readOnly":true},"is_low_stock":{"type":"boolean","readOnly":true},"profit_margin":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","image_url","is_low_stock","name","profit_margin","short_description"]},"ProductPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/inventory/{unique_id}/update/":{"put":{"operationId":"organisation_inventory_update_update","description":"Update product information (PUT for full update, PATCH for partial)","summary":"Update product","parameters":[{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true},{"in":"path","name":"unique_id","schema":{"type":"string"},"required":true}],"tags":["Products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDetail"}}},"description":""},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```

## Update product

> Update product information (PUT for full update, PATCH for partial)

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Products","description":"Product inventory and stock management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"PatchedProductRequest":{"type":"object","description":"Full serializer for Product creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"short_description":{"type":"string","nullable":true,"maxLength":500},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"Product type is required.\n\n* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model_number":{"type":"string","nullable":true,"maxLength":200},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"cost_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Cost price per unit"},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"maximum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"image":{"type":"string","format":"binary","nullable":true,"title":"Product Image","description":"Product image for catalogs and invoices"},"supplier_name":{"type":"string","nullable":true,"maxLength":300}}},"ProductDetail":{"type":"object","description":"Detailed serializer for single product retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model_number":{"type":"string","nullable":true,"maxLength":200},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"cost_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Cost price per unit"},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"maximum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"image_url":{"type":"string","format":"uri","nullable":true,"readOnly":true},"supplier_name":{"type":"string","nullable":true,"maxLength":300},"created_by":{"allOf":[{"$ref":"#/components/schemas/ProductPersonMini"}],"readOnly":true},"is_low_stock":{"type":"boolean","readOnly":true},"profit_margin":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","image_url","is_low_stock","name","profit_margin","short_description"]},"ProductPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/inventory/{unique_id}/update/":{"patch":{"operationId":"organisation_inventory_update_partial_update","description":"Update product information (PUT for full update, PATCH for partial)","summary":"Update product","parameters":[{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true},{"in":"path","name":"unique_id","schema":{"type":"string"},"required":true}],"tags":["Products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProductRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProductRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProductRequest"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDetail"}}},"description":""},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```

## Perform action on product

> Perform actions on a product (deactivate, mark\_out\_of\_stock). Uses query parameters.

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Products","description":"Product inventory and stock management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"ProductDetail":{"type":"object","description":"Detailed serializer for single product retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model_number":{"type":"string","nullable":true,"maxLength":200},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"cost_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Cost price per unit"},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"maximum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"image_url":{"type":"string","format":"uri","nullable":true,"readOnly":true},"supplier_name":{"type":"string","nullable":true,"maxLength":300},"created_by":{"allOf":[{"$ref":"#/components/schemas/ProductPersonMini"}],"readOnly":true},"is_low_stock":{"type":"boolean","readOnly":true},"profit_margin":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","image_url","is_low_stock","name","profit_margin","short_description"]},"ProductPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/inventory/{unique_id}/action/":{"get":{"operationId":"organisation_inventory_action_retrieve","description":"Perform actions on a product (deactivate, mark_out_of_stock). Uses query parameters.","summary":"Perform action on product","parameters":[{"in":"query","name":"action","schema":{"type":"string","enum":["deactivate","mark_out_of_stock"]},"description":"Action to perform: deactivate or mark_out_of_stock","required":true},{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true},{"in":"path","name":"unique_id","schema":{"type":"string"},"required":true}],"tags":["Products"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDetail"}}},"description":""},"400":{"description":"Bad Request - Invalid action"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```
