Products
Everything you sell. A product owns one or more variants; a variant is the thing that carries a SKU, a barcode and a stock level.
GET
/catalog/products/POST/catalog/products/GET/catalog/products/{id}/PATCH/catalog/products/{id}/DELETE/catalog/products/{id}/GET
/catalog/products/List the products in a shop. Returns the sellable catalog — a product with its default variant, price and stock summary.
Filters
categorybrandproduct_typestatusis_serializedis_batch_trackedbarcodeinclude_inactivesearchcreated_afterupdated_sinceCombine any of these as query parameters. Also accepts cursor and page_size.
Fields on each result
FieldType & description
idinteger
namestring
name_urstringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_rootstring
descriptionstring
description_urstringUrdu translation of the product description.
product_typestring
categoryinteger
category_namestring
brandinteger
brand_namestring
base_unitinteger
base_unit_namestring
is_serializedboolean
is_batch_trackedboolean
valuation_methodstring
taxinteger
tax_namestring
tax_groupinteger
is_tax_inclusiveboolean
tax_ratestring
hs_codestring
image_urlstring
statusstring
drug_schedulestringDispensing class. Only rendered when the pharmacy-pack extension is installed.
* `` - —
* `otc` - Over-the-counter
* `rx` - Prescription
* `controlled` - Controlled substance
generic_namestringGeneric (international non-proprietary) name.
moleculestringActive molecule / salt — powers the 'low stock by molecule' view.
variants_countinteger
default_variant_idstring
retail_pricestring
wholesale_pricestring
stock_quantitystring
reorder_levelstring
created_atdatetime
updated_atdatetime
Errors
CodeWhen it happens
401The access token is missing or has expired. Refresh and retry.403Your role lacks permission, or X-Shop-Id is a shop you cannot access.429Rate limited. Wait for Retry-After seconds.Request
curl https://api.tajirpoint.com/api/v1/catalog/products/ \
-H "Authorization: Bearer $TAJIR_TOKEN" \
-H "X-Shop-Id: 8f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"Response · 200 · 21 more fields below
{
"next": "https://api.tajirpoint.com/api/v1/catalog/products/?cursor=cD0yMDI2LTA3LTExVDA5MTQyMlomcD00Mg",
"previous": null,
"results": [
{
"id": 42,
"name": "Nescafé Classic 200g",
"name_ur": "نیسکافے کلاسک ۲۰۰ گرام",
"sku_root": "NES-200",
"description": "Sale INV-00042",
"description_ur": "description ur",
"product_type": "simple",
"category": 1,
"category_name": "Beverages",
"brand": 1,
"brand_name": "Nescafé",
"base_unit": 1,
"base_unit_name": "Main Store",
"is_serialized": false
}
]
}Response · error
{
"error": {
"code": 400,
"message": "Validation failed.",
"details": {
"quantity": ["Must be greater than zero."]
}
}
}POST
/catalog/products/Create a product. A product with no explicit variants gets one default variant, which is what carries the SKU, barcode and stock.
Body parameters
FieldType & description
nameRequiredstring
name_urOptionalstringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_rootRequiredstring
descriptionOptionalstring
description_urOptionalstringUrdu translation of the product description.
product_typeOptionalenum(simple, variant, service, bundle, deal)* `simple` - Simple
* `variant` - Variant
* `service` - Service
* `bundle` - Bundle
* `deal` - Deal
categoryOptionalinteger
brandOptionalinteger
base_unitOptionalinteger
is_serializedOptionalboolean
is_batch_trackedOptionalboolean
valuation_methodOptionalenum(moving_avg, fifo, actual)* `moving_avg` - Moving Average
* `fifo` - FIFO
* `actual` - Actual
taxOptionalinteger
tax_groupOptionalinteger
is_tax_inclusiveOptionalboolean
hs_codeOptionalstring
image_urlOptionalstring
statusOptionalenum(active, discontinued, draft)* `active` - Active
* `discontinued` - Discontinued
* `draft` - Draft
drug_scheduleOptionalstringDispensing class. Only rendered when the pharmacy-pack extension is installed.
* `` - —
* `otc` - Over-the-counter
* `rx` - Prescription
* `controlled` - Controlled substance
generic_nameOptionalstringGeneric (international non-proprietary) name.
moleculeOptionalstringActive molecule / salt — powers the 'low stock by molecule' view.
cold_chainOptionalbooleanTrue for products requiring temperature-controlled storage/transport (vaccines, insulin, frozen goods). Surfaces warnings at dispense.
security_depositOptionaldecimalRefundable deposit for returnable container (e.g. water bottle, gas cylinder). Added to sale total separately from product price.
variantsOptionalarray of objectInline variants to create with the product
bundle_itemsOptionalarray of objectList of {"child_variant": <id>, "quantity": <decimal>}
opening_stockOptionalarray of objectList of {"variant_sku": "...", "warehouse": <id>, "quantity": <decimal>, "unit_cost": <decimal>}
uom_conversionsOptionalarray of objectList of {"from_unit": <uuid>, "to_unit": <uuid>, "factor": <decimal>}
product_uomsOptionalarray of objectList of {"unit": <uuid>, "conversion_to_base": "12", "barcode": "", "is_sales_unit": true, "is_purchase_unit": true, "price": null}
Response fields
FieldType & description
idinteger
namestring
name_urstringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_rootstring
descriptionstring
description_urstringUrdu translation of the product description.
product_typeenum(simple, variant, service, bundle, deal)* `simple` - Simple
* `variant` - Variant
* `service` - Service
* `bundle` - Bundle
* `deal` - Deal
categoryinteger
brandinteger
base_unitinteger
is_serializedboolean
is_batch_trackedboolean
valuation_methodenum(moving_avg, fifo, actual)* `moving_avg` - Moving Average
* `fifo` - FIFO
* `actual` - Actual
taxinteger
tax_groupinteger
is_tax_inclusiveboolean
hs_codestring
image_urlstring
statusenum(active, discontinued, draft)* `active` - Active
* `discontinued` - Discontinued
* `draft` - Draft
drug_schedulestringDispensing class. Only rendered when the pharmacy-pack extension is installed.
* `` - —
* `otc` - Over-the-counter
* `rx` - Prescription
* `controlled` - Controlled substance
generic_namestringGeneric (international non-proprietary) name.
moleculestringActive molecule / salt — powers the 'low stock by molecule' view.
cold_chainbooleanTrue for products requiring temperature-controlled storage/transport (vaccines, insulin, frozen goods). Surfaces warnings at dispense.
security_depositdecimalRefundable deposit for returnable container (e.g. water bottle, gas cylinder). Added to sale total separately from product price.
variantsarray of objectInline variants to create with the product
bundle_itemsarray of objectList of {"child_variant": <id>, "quantity": <decimal>}
opening_stockarray of objectList of {"variant_sku": "...", "warehouse": <id>, "quantity": <decimal>, "unit_cost": <decimal>}
uom_conversionsarray of objectList of {"from_unit": <uuid>, "to_unit": <uuid>, "factor": <decimal>}
product_uomsarray of objectList of {"unit": <uuid>, "conversion_to_base": "12", "barcode": "", "is_sales_unit": true, "is_purchase_unit": true, "price": null}
Errors
CodeWhen it happens
400Validation failed. `details` names the offending fields.401The access token is missing or has expired. Refresh and retry.403Your role lacks permission, or X-Shop-Id is a shop you cannot access.429Rate limited. Wait for Retry-After seconds.Request
curl -X POST https://api.tajirpoint.com/api/v1/catalog/products/ \
-H "Authorization: Bearer $TAJIR_TOKEN" \
-H "X-Shop-Id: 8f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f" \
-H "Content-Type: application/json" \
-d '{
"name": "Nescafé Classic 200g",
"sku_root": "NES-200",
"name_ur": "نیسکافے کلاسک ۲۰۰ گرام",
"description": "Sale INV-00042",
"description_ur": "description ur",
"product_type": "simple",
"category": 1,
"brand": 1,
"base_unit": 1,
"is_serialized": false
}'Response · 200 · 15 more fields below
{
"id": 42,
"name": "Nescafé Classic 200g",
"name_ur": "نیسکافے کلاسک ۲۰۰ گرام",
"sku_root": "NES-200",
"description": "Sale INV-00042",
"description_ur": "description ur",
"product_type": "simple",
"category": 1,
"brand": 1,
"base_unit": 1,
"is_serialized": false,
"is_batch_tracked": false,
"valuation_method": "moving_avg",
"tax": 1
}Response · error
{
"error": {
"code": 400,
"message": "Validation failed.",
"details": {
"quantity": ["Must be greater than zero."]
}
}
}GET
/catalog/products/{id}/Retrieve one product with every variant, its pricing tiers and its custom fields.
Response fields
FieldType & description
idinteger
namestring
name_urstringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_rootstring
descriptionstring
description_urstringUrdu translation of the product description.
product_typestring
categoryinteger
category_namestring
brandinteger
brand_namestring
base_unitinteger
base_unit_namestring
is_serializedboolean
is_batch_trackedboolean
valuation_methodstring
taxinteger
tax_namestring
tax_groupinteger
is_tax_inclusiveboolean
tax_ratestring
hs_codestring
image_urlstring
statusstring
drug_schedulestringDispensing class. Only rendered when the pharmacy-pack extension is installed.
* `` - —
* `otc` - Over-the-counter
* `rx` - Prescription
* `controlled` - Controlled substance
generic_namestringGeneric (international non-proprietary) name.
moleculestringActive molecule / salt — powers the 'low stock by molecule' view.
variants_countinteger
default_variant_idstring
retail_pricestring
wholesale_pricestring
stock_quantitystring
reorder_levelstring
created_atdatetime
updated_atdatetime
cold_chainbooleanTrue for products requiring temperature-controlled storage/transport (vaccines, insulin, frozen goods). Surfaces warnings at dispense.
security_depositdecimalRefundable deposit for returnable container (e.g. water bottle, gas cylinder). Added to sale total separately from product price.
variantsarray of object
bundle_itemsarray of object
uom_conversionsarray of object
product_uomsarray of object
deal_choice_groupsarray of object
Errors
CodeWhen it happens
404No such record in this shop.401The access token is missing or has expired. Refresh and retry.403Your role lacks permission, or X-Shop-Id is a shop you cannot access.429Rate limited. Wait for Retry-After seconds.Request
curl https://api.tajirpoint.com/api/v1/catalog/products/42/ \
-H "Authorization: Bearer $TAJIR_TOKEN" \
-H "X-Shop-Id: 8f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"Response · 200 · 28 more fields below
{
"id": 42,
"name": "Nescafé Classic 200g",
"name_ur": "نیسکافے کلاسک ۲۰۰ گرام",
"sku_root": "NES-200",
"description": "Sale INV-00042",
"description_ur": "description ur",
"product_type": "simple",
"category": 1,
"category_name": "Beverages",
"brand": 1,
"brand_name": "Nescafé",
"base_unit": 1,
"base_unit_name": "Main Store",
"is_serialized": false
}Response · error
{
"error": {
"code": 400,
"message": "Validation failed.",
"details": {
"quantity": ["Must be greater than zero."]
}
}
}PATCH
/catalog/products/{id}/Update a product. Send only the fields you are changing.
Body parameters
FieldType & description
nameOptionalstring
name_urOptionalstringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_rootOptionalstring
descriptionOptionalstring
description_urOptionalstringUrdu translation of the product description.
product_typeOptionalenum(simple, variant, service, bundle, deal)* `simple` - Simple
* `variant` - Variant
* `service` - Service
* `bundle` - Bundle
* `deal` - Deal
categoryOptionalinteger
brandOptionalinteger
base_unitOptionalinteger
is_serializedOptionalboolean
is_batch_trackedOptionalboolean
valuation_methodOptionalenum(moving_avg, fifo, actual)* `moving_avg` - Moving Average
* `fifo` - FIFO
* `actual` - Actual
taxOptionalinteger
tax_groupOptionalinteger
is_tax_inclusiveOptionalboolean
hs_codeOptionalstring
image_urlOptionalstring
statusOptionalenum(active, discontinued, draft)* `active` - Active
* `discontinued` - Discontinued
* `draft` - Draft
drug_scheduleOptionalstringDispensing class. Only rendered when the pharmacy-pack extension is installed.
* `` - —
* `otc` - Over-the-counter
* `rx` - Prescription
* `controlled` - Controlled substance
generic_nameOptionalstringGeneric (international non-proprietary) name.
moleculeOptionalstringActive molecule / salt — powers the 'low stock by molecule' view.
cold_chainOptionalbooleanTrue for products requiring temperature-controlled storage/transport (vaccines, insulin, frozen goods). Surfaces warnings at dispense.
security_depositOptionaldecimalRefundable deposit for returnable container (e.g. water bottle, gas cylinder). Added to sale total separately from product price.
variantsOptionalarray of objectInline variants to create with the product
bundle_itemsOptionalarray of objectList of {"child_variant": <id>, "quantity": <decimal>}
opening_stockOptionalarray of objectList of {"variant_sku": "...", "warehouse": <id>, "quantity": <decimal>, "unit_cost": <decimal>}
uom_conversionsOptionalarray of objectList of {"from_unit": <uuid>, "to_unit": <uuid>, "factor": <decimal>}
product_uomsOptionalarray of objectList of {"unit": <uuid>, "conversion_to_base": "12", "barcode": "", "is_sales_unit": true, "is_purchase_unit": true, "price": null}
Response fields
FieldType & description
idinteger
namestring
name_urstringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_rootstring
descriptionstring
description_urstringUrdu translation of the product description.
product_typeenum(simple, variant, service, bundle, deal)* `simple` - Simple
* `variant` - Variant
* `service` - Service
* `bundle` - Bundle
* `deal` - Deal
categoryinteger
brandinteger
base_unitinteger
is_serializedboolean
is_batch_trackedboolean
valuation_methodenum(moving_avg, fifo, actual)* `moving_avg` - Moving Average
* `fifo` - FIFO
* `actual` - Actual
taxinteger
tax_groupinteger
is_tax_inclusiveboolean
hs_codestring
image_urlstring
statusenum(active, discontinued, draft)* `active` - Active
* `discontinued` - Discontinued
* `draft` - Draft
drug_schedulestringDispensing class. Only rendered when the pharmacy-pack extension is installed.
* `` - —
* `otc` - Over-the-counter
* `rx` - Prescription
* `controlled` - Controlled substance
generic_namestringGeneric (international non-proprietary) name.
moleculestringActive molecule / salt — powers the 'low stock by molecule' view.
cold_chainbooleanTrue for products requiring temperature-controlled storage/transport (vaccines, insulin, frozen goods). Surfaces warnings at dispense.
security_depositdecimalRefundable deposit for returnable container (e.g. water bottle, gas cylinder). Added to sale total separately from product price.
variantsarray of objectInline variants to create with the product
bundle_itemsarray of objectList of {"child_variant": <id>, "quantity": <decimal>}
opening_stockarray of objectList of {"variant_sku": "...", "warehouse": <id>, "quantity": <decimal>, "unit_cost": <decimal>}
uom_conversionsarray of objectList of {"from_unit": <uuid>, "to_unit": <uuid>, "factor": <decimal>}
product_uomsarray of objectList of {"unit": <uuid>, "conversion_to_base": "12", "barcode": "", "is_sales_unit": true, "is_purchase_unit": true, "price": null}
Errors
CodeWhen it happens
400Validation failed. `details` names the offending fields.401The access token is missing or has expired. Refresh and retry.403Your role lacks permission, or X-Shop-Id is a shop you cannot access.429Rate limited. Wait for Retry-After seconds.Request
curl -X PATCH https://api.tajirpoint.com/api/v1/catalog/products/42/ \
-H "Authorization: Bearer $TAJIR_TOKEN" \
-H "X-Shop-Id: 8f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f" \
-H "Content-Type: application/json" \
-d '{
"name": "Nescafé Classic 200g",
"name_ur": "نیسکافے کلاسک ۲۰۰ گرام",
"sku_root": "NES-200",
"description": "Sale INV-00042",
"description_ur": "description ur",
"product_type": "simple",
"category": 1,
"brand": 1,
"base_unit": 1,
"is_serialized": false
}'Response · 200 · 15 more fields below
{
"id": 42,
"name": "Nescafé Classic 200g",
"name_ur": "نیسکافے کلاسک ۲۰۰ گرام",
"sku_root": "NES-200",
"description": "Sale INV-00042",
"description_ur": "description ur",
"product_type": "simple",
"category": 1,
"brand": 1,
"base_unit": 1,
"is_serialized": false,
"is_batch_tracked": false,
"valuation_method": "moving_avg",
"tax": 1
}Response · error
{
"error": {
"code": 400,
"message": "Validation failed.",
"details": {
"quantity": ["Must be greater than zero."]
}
}
}DELETE
/catalog/products/{id}/Soft-delete a product. It stops appearing in the catalog but stays attached to the sales that already reference it — history is never rewritten.
Errors
CodeWhen it happens
400Validation failed. `details` names the offending fields.401The access token is missing or has expired. Refresh and retry.403Your role lacks permission, or X-Shop-Id is a shop you cannot access.429Rate limited. Wait for Retry-After seconds.Request
curl -X DELETE https://api.tajirpoint.com/api/v1/catalog/products/42/ \
-H "Authorization: Bearer $TAJIR_TOKEN" \
-H "X-Shop-Id: 8f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"Response · error
{
"error": {
"code": 400,
"message": "Validation failed.",
"details": {
"quantity": ["Must be greater than zero."]
}
}
}