cURL
curl -X POST 'https://clarus-api.com/api/v1/products' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-H 'X-Clarus-Subdomain: your-subdomain' \
-d '{
"data": {
"type": "products",
"attributes": {
"code": "SKU-001",
"description": "Widget A - Standard Size",
"stock_unit_type_id": 1,
"barcode": "5012345678901"
}
}
}'import requests
url = "https://clarus-api.com/api/products"
payload = { "data": {
"type": "products",
"attributes": {
"description": "Widget A",
"stock_unit_type_id": 1,
"code": "SKU-001"
}
} }
headers = {
"Authorization": "Bearer <token>",
"X-Clarus-Subdomain": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const response = await fetch('https://clarus-api.com/api/v1/products', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json',
'X-Clarus-Subdomain': 'your-subdomain'
},
body: JSON.stringify({
data: {
type: 'products',
attributes: {
code: 'SKU-001',
description: 'Widget A - Standard Size',
stock_unit_type_id: 1,
barcode: '5012345678901'
}
}
})
});
const product = await response.json();{
"data": {
"id": 123,
"type": "products",
"attributes": {
"description": "<string>",
"stock_unit_type_id": 123,
"code": "<string>",
"long_description": "<string>",
"barcode": "<string>",
"case_barcode": "<string>",
"inner_barcode": "<string>",
"outer_barcode": "<string>",
"commodity_code": "<string>",
"country_of_manufacture": "<string>",
"customs_description": "<string>",
"shelf_life_min": 2,
"shelf_life_max": 2,
"stop": true,
"obsolete": 123,
"specific_gravity": 123,
"output_quantity": 1,
"assemble_on_pick": true,
"require_dimensions_on_receipt": true,
"non_hazardous_for_transport": true,
"external_system_reference1": "<string>",
"external_system_reference2": "<string>",
"external_system_reference3": "<string>",
"string1": "<string>",
"string2": "<string>",
"string3": "<string>",
"string4": "<string>",
"string5": "<string>",
"integer1": 123,
"integer2": 123,
"integer3": 123,
"integer4": 123,
"integer5": 123,
"datetime1": "2023-11-07T05:31:56Z",
"datetime2": "2023-11-07T05:31:56Z",
"datetime3": "2023-11-07T05:31:56Z",
"datetime4": "2023-11-07T05:31:56Z",
"datetime5": "2023-11-07T05:31:56Z",
"boolean1": true,
"boolean2": true,
"boolean3": true,
"boolean4": true,
"boolean5": true
}
}
}{
"error": "<string>"
}{
"errors": [
{
"code": 123,
"symbol": "<string>",
"details": "<string>",
"source": "<string>",
"context": {}
}
]
}Products
Create a product
Create a new product in the warehouse catalog. Products are the master data for inventory items and define how stock is tracked, picked, and stored.
POST
/
api
/
products
cURL
curl -X POST 'https://clarus-api.com/api/v1/products' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-H 'X-Clarus-Subdomain: your-subdomain' \
-d '{
"data": {
"type": "products",
"attributes": {
"code": "SKU-001",
"description": "Widget A - Standard Size",
"stock_unit_type_id": 1,
"barcode": "5012345678901"
}
}
}'import requests
url = "https://clarus-api.com/api/products"
payload = { "data": {
"type": "products",
"attributes": {
"description": "Widget A",
"stock_unit_type_id": 1,
"code": "SKU-001"
}
} }
headers = {
"Authorization": "Bearer <token>",
"X-Clarus-Subdomain": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const response = await fetch('https://clarus-api.com/api/v1/products', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json',
'X-Clarus-Subdomain': 'your-subdomain'
},
body: JSON.stringify({
data: {
type: 'products',
attributes: {
code: 'SKU-001',
description: 'Widget A - Standard Size',
stock_unit_type_id: 1,
barcode: '5012345678901'
}
}
})
});
const product = await response.json();{
"data": {
"id": 123,
"type": "products",
"attributes": {
"description": "<string>",
"stock_unit_type_id": 123,
"code": "<string>",
"long_description": "<string>",
"barcode": "<string>",
"case_barcode": "<string>",
"inner_barcode": "<string>",
"outer_barcode": "<string>",
"commodity_code": "<string>",
"country_of_manufacture": "<string>",
"customs_description": "<string>",
"shelf_life_min": 2,
"shelf_life_max": 2,
"stop": true,
"obsolete": 123,
"specific_gravity": 123,
"output_quantity": 1,
"assemble_on_pick": true,
"require_dimensions_on_receipt": true,
"non_hazardous_for_transport": true,
"external_system_reference1": "<string>",
"external_system_reference2": "<string>",
"external_system_reference3": "<string>",
"string1": "<string>",
"string2": "<string>",
"string3": "<string>",
"string4": "<string>",
"string5": "<string>",
"integer1": 123,
"integer2": 123,
"integer3": 123,
"integer4": 123,
"integer5": 123,
"datetime1": "2023-11-07T05:31:56Z",
"datetime2": "2023-11-07T05:31:56Z",
"datetime3": "2023-11-07T05:31:56Z",
"datetime4": "2023-11-07T05:31:56Z",
"datetime5": "2023-11-07T05:31:56Z",
"boolean1": true,
"boolean2": true,
"boolean3": true,
"boolean4": true,
"boolean5": true
}
}
}{
"error": "<string>"
}{
"errors": [
{
"code": 123,
"symbol": "<string>",
"details": "<string>",
"source": "<string>",
"context": {}
}
]
}Request Structure
{
"data": {
"type": "products",
"attributes": {
"code": "SKU-001",
"description": "Widget A - Standard Size",
"stock_unit_type_id": 1,
"barcode": "5012345678901",
"commodity_code": "84719000",
"country_of_manufacture": "GB",
"shelf_life_min": 30,
"shelf_life_max": 365
}
}
}
Key Fields
| Field | Required | Description |
|---|---|---|
code | No | Unique product SKU code |
description | Yes | Short product description |
stock_unit_type_id | Yes | Unit of measure type ID |
barcode | No | Primary product barcode |
commodity_code | No | HS code for customs |
shelf_life_min | No | Minimum shelf life in days |
shelf_life_max | No | Maximum shelf life in days |
GraphQL Product Lookups
When searching products by code or barcode via GraphQL, use the specific field filter (code, barcode, case_barcode, inner_barcode, outer_barcode) if you know which field the value belongs to. Each supports eq, ilike, in, like, and between operators.
Use the all_codes filter only when you have a code/barcode value but don’t know which field it belongs to (e.g., scanning an unknown barcode). all_codes performs an exact-match OR across all 5 code fields. Do not use it when a specific field filter would suffice.Authorizations
OAuth 2.0 authentication. Use the client credentials or authorization code flow to obtain an access token.
The subdomain/tenant name identifying which tenant's data to access. Required for all API requests.
Body
application/json
Show child attributes
Show child attributes
Response
Product created successfully
Show child attributes
Show child attributes
⌘I

