Catalog

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/

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_since

Combine any of these as query parameters. Also accepts cursor and page_size.

Fields on each result

id
integer
name
string
name_ur
stringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_root
string
description
string
description_ur
stringUrdu translation of the product description.
product_type
string
category
integer
category_name
string
brand
integer
brand_name
string
base_unit
integer
base_unit_name
string
is_serialized
boolean
is_batch_tracked
boolean
valuation_method
string
tax
integer
tax_name
string
tax_group
integer
is_tax_inclusive
boolean
tax_rate
string
hs_code
string
image_url
string
status
string
drug_schedule
stringDispensing class. Only rendered when the pharmacy-pack extension is installed. * `` - — * `otc` - Over-the-counter * `rx` - Prescription * `controlled` - Controlled substance
generic_name
stringGeneric (international non-proprietary) name.
molecule
stringActive molecule / salt — powers the 'low stock by molecule' view.
variants_count
integer
default_variant_id
string
retail_price
string
wholesale_price
string
stock_quantity
string
reorder_level
string
created_at
datetime
updated_at
datetime

Errors

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

nameRequired
string
name_urOptional
stringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_rootRequired
string
descriptionOptional
string
description_urOptional
stringUrdu translation of the product description.
product_typeOptional
enum(simple, variant, service, bundle, deal)* `simple` - Simple * `variant` - Variant * `service` - Service * `bundle` - Bundle * `deal` - Deal
categoryOptional
integer
brandOptional
integer
base_unitOptional
integer
is_serializedOptional
boolean
is_batch_trackedOptional
boolean
valuation_methodOptional
enum(moving_avg, fifo, actual)* `moving_avg` - Moving Average * `fifo` - FIFO * `actual` - Actual
taxOptional
integer
tax_groupOptional
integer
is_tax_inclusiveOptional
boolean
hs_codeOptional
string
image_urlOptional
string
statusOptional
enum(active, discontinued, draft)* `active` - Active * `discontinued` - Discontinued * `draft` - Draft
drug_scheduleOptional
stringDispensing class. Only rendered when the pharmacy-pack extension is installed. * `` - — * `otc` - Over-the-counter * `rx` - Prescription * `controlled` - Controlled substance
generic_nameOptional
stringGeneric (international non-proprietary) name.
moleculeOptional
stringActive molecule / salt — powers the 'low stock by molecule' view.
cold_chainOptional
booleanTrue for products requiring temperature-controlled storage/transport (vaccines, insulin, frozen goods). Surfaces warnings at dispense.
security_depositOptional
decimalRefundable deposit for returnable container (e.g. water bottle, gas cylinder). Added to sale total separately from product price.
variantsOptional
array of objectInline variants to create with the product
bundle_itemsOptional
array of objectList of {"child_variant": <id>, "quantity": <decimal>}
opening_stockOptional
array of objectList of {"variant_sku": "...", "warehouse": <id>, "quantity": <decimal>, "unit_cost": <decimal>}
uom_conversionsOptional
array of objectList of {"from_unit": <uuid>, "to_unit": <uuid>, "factor": <decimal>}
product_uomsOptional
array of objectList of {"unit": <uuid>, "conversion_to_base": "12", "barcode": "", "is_sales_unit": true, "is_purchase_unit": true, "price": null}

Response fields

id
integer
name
string
name_ur
stringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_root
string
description
string
description_ur
stringUrdu translation of the product description.
product_type
enum(simple, variant, service, bundle, deal)* `simple` - Simple * `variant` - Variant * `service` - Service * `bundle` - Bundle * `deal` - Deal
category
integer
brand
integer
base_unit
integer
is_serialized
boolean
is_batch_tracked
boolean
valuation_method
enum(moving_avg, fifo, actual)* `moving_avg` - Moving Average * `fifo` - FIFO * `actual` - Actual
tax
integer
tax_group
integer
is_tax_inclusive
boolean
hs_code
string
image_url
string
status
enum(active, discontinued, draft)* `active` - Active * `discontinued` - Discontinued * `draft` - Draft
drug_schedule
stringDispensing class. Only rendered when the pharmacy-pack extension is installed. * `` - — * `otc` - Over-the-counter * `rx` - Prescription * `controlled` - Controlled substance
generic_name
stringGeneric (international non-proprietary) name.
molecule
stringActive molecule / salt — powers the 'low stock by molecule' view.
cold_chain
booleanTrue for products requiring temperature-controlled storage/transport (vaccines, insulin, frozen goods). Surfaces warnings at dispense.
security_deposit
decimalRefundable deposit for returnable container (e.g. water bottle, gas cylinder). Added to sale total separately from product price.
variants
array of objectInline variants to create with the product
bundle_items
array of objectList of {"child_variant": <id>, "quantity": <decimal>}
opening_stock
array of objectList of {"variant_sku": "...", "warehouse": <id>, "quantity": <decimal>, "unit_cost": <decimal>}
uom_conversions
array of objectList of {"from_unit": <uuid>, "to_unit": <uuid>, "factor": <decimal>}
product_uoms
array of objectList of {"unit": <uuid>, "conversion_to_base": "12", "barcode": "", "is_sales_unit": true, "is_purchase_unit": true, "price": null}

Errors

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

id
integer
name
string
name_ur
stringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_root
string
description
string
description_ur
stringUrdu translation of the product description.
product_type
string
category
integer
category_name
string
brand
integer
brand_name
string
base_unit
integer
base_unit_name
string
is_serialized
boolean
is_batch_tracked
boolean
valuation_method
string
tax
integer
tax_name
string
tax_group
integer
is_tax_inclusive
boolean
tax_rate
string
hs_code
string
image_url
string
status
string
drug_schedule
stringDispensing class. Only rendered when the pharmacy-pack extension is installed. * `` - — * `otc` - Over-the-counter * `rx` - Prescription * `controlled` - Controlled substance
generic_name
stringGeneric (international non-proprietary) name.
molecule
stringActive molecule / salt — powers the 'low stock by molecule' view.
variants_count
integer
default_variant_id
string
retail_price
string
wholesale_price
string
stock_quantity
string
reorder_level
string
created_at
datetime
updated_at
datetime
cold_chain
booleanTrue for products requiring temperature-controlled storage/transport (vaccines, insulin, frozen goods). Surfaces warnings at dispense.
security_deposit
decimalRefundable deposit for returnable container (e.g. water bottle, gas cylinder). Added to sale total separately from product price.
variants
array of object
bundle_items
array of object
uom_conversions
array of object
product_uoms
array of object
deal_choice_groups
array of object

Errors

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

nameOptional
string
name_urOptional
stringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_rootOptional
string
descriptionOptional
string
description_urOptional
stringUrdu translation of the product description.
product_typeOptional
enum(simple, variant, service, bundle, deal)* `simple` - Simple * `variant` - Variant * `service` - Service * `bundle` - Bundle * `deal` - Deal
categoryOptional
integer
brandOptional
integer
base_unitOptional
integer
is_serializedOptional
boolean
is_batch_trackedOptional
boolean
valuation_methodOptional
enum(moving_avg, fifo, actual)* `moving_avg` - Moving Average * `fifo` - FIFO * `actual` - Actual
taxOptional
integer
tax_groupOptional
integer
is_tax_inclusiveOptional
boolean
hs_codeOptional
string
image_urlOptional
string
statusOptional
enum(active, discontinued, draft)* `active` - Active * `discontinued` - Discontinued * `draft` - Draft
drug_scheduleOptional
stringDispensing class. Only rendered when the pharmacy-pack extension is installed. * `` - — * `otc` - Over-the-counter * `rx` - Prescription * `controlled` - Controlled substance
generic_nameOptional
stringGeneric (international non-proprietary) name.
moleculeOptional
stringActive molecule / salt — powers the 'low stock by molecule' view.
cold_chainOptional
booleanTrue for products requiring temperature-controlled storage/transport (vaccines, insulin, frozen goods). Surfaces warnings at dispense.
security_depositOptional
decimalRefundable deposit for returnable container (e.g. water bottle, gas cylinder). Added to sale total separately from product price.
variantsOptional
array of objectInline variants to create with the product
bundle_itemsOptional
array of objectList of {"child_variant": <id>, "quantity": <decimal>}
opening_stockOptional
array of objectList of {"variant_sku": "...", "warehouse": <id>, "quantity": <decimal>, "unit_cost": <decimal>}
uom_conversionsOptional
array of objectList of {"from_unit": <uuid>, "to_unit": <uuid>, "factor": <decimal>}
product_uomsOptional
array of objectList of {"unit": <uuid>, "conversion_to_base": "12", "barcode": "", "is_sales_unit": true, "is_purchase_unit": true, "price": null}

Response fields

id
integer
name
string
name_ur
stringUrdu translation of the product name. Shown bilingually on receipts and POS.
sku_root
string
description
string
description_ur
stringUrdu translation of the product description.
product_type
enum(simple, variant, service, bundle, deal)* `simple` - Simple * `variant` - Variant * `service` - Service * `bundle` - Bundle * `deal` - Deal
category
integer
brand
integer
base_unit
integer
is_serialized
boolean
is_batch_tracked
boolean
valuation_method
enum(moving_avg, fifo, actual)* `moving_avg` - Moving Average * `fifo` - FIFO * `actual` - Actual
tax
integer
tax_group
integer
is_tax_inclusive
boolean
hs_code
string
image_url
string
status
enum(active, discontinued, draft)* `active` - Active * `discontinued` - Discontinued * `draft` - Draft
drug_schedule
stringDispensing class. Only rendered when the pharmacy-pack extension is installed. * `` - — * `otc` - Over-the-counter * `rx` - Prescription * `controlled` - Controlled substance
generic_name
stringGeneric (international non-proprietary) name.
molecule
stringActive molecule / salt — powers the 'low stock by molecule' view.
cold_chain
booleanTrue for products requiring temperature-controlled storage/transport (vaccines, insulin, frozen goods). Surfaces warnings at dispense.
security_deposit
decimalRefundable deposit for returnable container (e.g. water bottle, gas cylinder). Added to sale total separately from product price.
variants
array of objectInline variants to create with the product
bundle_items
array of objectList of {"child_variant": <id>, "quantity": <decimal>}
opening_stock
array of objectList of {"variant_sku": "...", "warehouse": <id>, "quantity": <decimal>, "unit_cost": <decimal>}
uom_conversions
array of objectList of {"from_unit": <uuid>, "to_unit": <uuid>, "factor": <decimal>}
product_uoms
array of objectList of {"unit": <uuid>, "conversion_to_base": "12", "barcode": "", "is_sales_unit": true, "is_purchase_unit": true, "price": null}

Errors

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

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."]
    }
  }
}