Products¶
GET /products¶
Returns list of all products
Required scopes: products
VERSIONING
Be aware: V6 inherits and adds onto V7. This enpoint show big inconsistencies between version. Check the serializers when in doubt.
GET Params¶
param | type/format | required | sample value | description |
---|---|---|---|---|
limit | integer | false | 40 | default and max value: 40 |
page | integer | false | 10 | page number |
in_shop | boolean | false | true | Default: false . Products that are published in the e-shop |
search | string | false | blue | Search products. HEADSUP: Search returns duplicates which also affects the total too. |
sort | string | false | price | For sorting results based on attribute value. Only in V6. |
filter | string | false | reorder | Options:reorder , safety . Only in V6 . It will filter the product list by item with stock below reorder level or safety stock. |
Request¶
curl -X GET \
'https://app.inventorum.com/api/products/?limit=10&page=1' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {{oauth_token}}' \
-H 'X-Api-Version: 12'
Response¶
{
"total": 72267,
"data": [
{
"name": "00001 Drink",
"id": 12544049,
"quantity": "150.00",
"reorder_level": "0.00",
"safety_stock": "0.00",
"price": "4.2016806723",
"tax_type": 4672,
"custom_price": false,
"ebay_product_id": null,
"ebay_url": null,
"in_shop": false,
"shop_url": null,
"thumbnail": {
"ipad": "http://app.inventorum.com/uploads/1627/product/....ipad.png",
"thumb": "http://app.inventorum.com/uploads/1627/product/....thumb.png",
"image": "http://app.inventorum.com/uploads/1627/product/....ipad.png",
"ipad_retina": "http://app.inventorum.com/uploads/1627/product/....ipad_retina.png",
"ebay": "http://app.inventorum.com/uploads/1627/product/....ebay.png",
"thumb_retina": "http://app.inventorum.com/uploads/1627/product/...thumb_retina.png",
"original": "http://app.inventorum.com/uploads/1627/product/....original.png",
"new": true,
"id": -217514
},
"variation_count": 4,
"is_giftcard": false,
"gross_price": "5.00",
"ean": "",
"inv_id": "612689785305669070",
"reorder_level_reached": true,
"safety_stock_reached": true,
"min_gross_price": "5.00",
"max_gross_price": "5.00"
},
...
]
}
POST /products¶
Creates a product.
Required scopes: products
For clarity, this endpoint will be described divided into two sections - product without variants and product with variants.
param | type/format | required | sample value | description |
---|---|---|---|---|
name | string | true | "Shoes" | Product name |
tax_type | integer | true | 7122 | ID of an existing tax rate. |
quantity | float | false | 59 | Initial stock. |
reorder_level | float | false | 10 | Stock level where the app will signal that you should reorder the goods. Default: 0. |
safety_stock | float | false | 5 | Stock level where the app will signal that you're running out of stock. Default: 0 |
price | float | false | 25.99 | Net price, base for all calculations. gross_price = price + (price * tax_rate) |
purchase_price | float | false | 15.50 | Wholesale price. |
custom_price | boolean | false | false | With this option set to true, in POS app you can override the regular price. Default: false |
product_code | string | false | "112123" | Product identifier of your choice. |
ean | String | false | "78687868" | Product identifier of your choice. |
attributes | false | {"color": ["pink"],"size": ["S"]} | Can contain 3 keys: "color", "weight", "size". Each key is optional. | |
categories[{id}] | false | "categories": [{"id": 111}] | List of existing categories you would like to assign the product to. | |
images[] | images[{"id": 100, "new": true}] | List of existing images that you would like to associate the product with. | ||
package_size_value | float | false | 1.5 | Size of a product package. |
package_size_unit | string | false | "ml" | Available options: 'ml', 'l', 'g', 'kg', 'm', 'm2', 'm3', 'pc' |
Required headers:
Content-Type: application/json;charset=UTF-8
Accept: application/json, text/plain, */*
VERSIONING
This endpoint supports 2 versions: 7 and 8. V8 offers following additional fileds:
images
variations
meta
1) Product without variants¶
Request¶
curl -X POST \
https://app.inventorum.com/api/products/ \
-H 'Accept: application/json, text/plain, */*' \
-H 'Authorization: Bearer {{oauth_token}}' \
-H 'Content-Type: application/json;charset=UTF-8' \
-H 'X-Api-Version: 12' \
-d '{
"quantity":200,
"reorder_level":75,
"safety_stock":50,
"purchase_price":10.50,
"name":"Pink t-shirt",
"brand":"Nike",
"tax_type":59342,
"categories":[{"id":90302}],
"price":100,
"attributes":{
"weight":["1"],
"size":["S"],
"color":["pink"]
},
"product_code":"22222222222222",
"ean":"121312121212",
"images":[{
"id":751315,
"new":true
}],
"package_size_value":"1",
"package_size_unit":"pc"
}'
Response¶
{
"attributes": {
"color": [
"pink"
],
"weight": [
"1"
],
"size": [
"S"
]
},
"name": "Pink t-shirt",
"id": 13388386,
"quantity": "200.00",
"reorder_level": "75.00",
"safety_stock": "50.00",
"price": "100",
"tax_type": 59342,
"custom_price": false,
"ebay_product_id": null,
"ebay_url": null,
"in_shop": false,
"shop_url": null,
"thumbnail": {
"ipad": "http://app.inventorum.com/uploads/1627/product/....ipad.png",
"thumb": "http://app.inventorum.com/uploads/1627/product/....thumb.png",
"image": "http://app.inventorum.com/uploads/1627/product/....ipad.png",
"ipad_retina": "http://app.inventorum.com/uploads/1627/product/....ipad_retina.png",
"ebay": "http://app.inventorum.com/uploads/1627/product/....ebay.png",
"thumb_retina": "http://app.inventorum.com/uploads/1627/product/....thumb_retina.png",
"original": "http://app.inventorum.com/uploads/1627/product/....original.png",
"new": true,
"id": -751315
},
"variation_count": 0,
"variations": [],
"average_purchase_price": "10.5",
"description": "",
"product_code": "22222222222222",
"ean": "121312121212",
"categories": [
{
"parent": null,
"is_leaf": true,
"hint": "Alben",
"tree_id": 58005,
"id": 90302,
"channel": null,
"translations": [
{
"name": "Alben",
"language": "de",
"id": null
}
],
"image": null,
"name": "Alben",
"products_count": 233,
"products": [
13388386
]
}
],
"images": [
{
"id": 751315,
"urls": {
"ipad": "https://app.inventorum.com/uploads/1627/product/...ipad.png",
"thumb": "https://app.inventorum.com/uploads/1627/product/...thumb.png",
"image": "https://app.inventorum.com/uploads/1627/product/...ipad.png",
"ipad_retina": "https://app.inventorum.com/uploads/1627/product/...ipad_retina.png",
"ebay": "https://app.inventorum.com/uploads/1627/product/...ebay.png",
"thumb_retina": "https://app.inventorum.com/uploads/1627/product/...thumb_retina.png",
"original": "https://app.inventorum.com/uploads/1627/product/...original.png"
},
"type": 0,
"new": true
}
],
"custom_sale": false,
"shipping_services": [],
"is_favourite": false,
"brand": "Nike",
"supplier": "",
"meta": {},
"is_giftcard": false,
"gross_price": "195.00",
"purchase_price": "10.5",
"states": [],
"attributes_str": "S, pink, 1",
"inv_id": "612746191473171482",
"package_size_value": "1",
"package_size_unit": "pc",
"base_price": "195.00",
"base_size_value": "1",
"base_size_unit": "pc"
}
Error¶
Status 400 Bad Request
{
"error": {
"fields": {
"tax_type": [
"This field is required."
],
"name": [
"This field is required."
]
},
"description": "Serialization error",
"key": "common.serializer_error"
}
}
2) Product with variants¶
VERSIONING
Only supports API version V8.
Note
quantity
for the parent product is equal the sum of quantities of variantssafety_stock
andreorder_level
fields in parent product are populated with values from first variantinv_id
is generated only per parent producttax_type
needs to be provided for all variants and parent product. It has to be the same value.
Request¶
curl -X POST \
https://app.inventorum.com/api/products/ \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {{oauth_token}}' \
-H 'Content-Type: application/json' \
-H 'X-Api-Version: 12' \
-d '{
"name": "T-shirt",
"tax_type": 60396,
"price": 145.00,
"brand": "nike",
"variations": [
{
"attributes": {
"size": "22",
"color": "Red",
"material": "Denim"
},
"price": 140.00,
"quantity": 30,
"safety_stock": 45,
"reorder_level": 40,
"purchase_price": 15.99,
"tax_type": 60396,
"ean": "11111",
"product_code": "99999",
"package_size_value": 1,
"package_size_unit": "pc"
},
{
"images":[{
"id":780792,
"new":true
}],
"attributes": {
"size": "50",
"color": "Blue",
"material": "Leather"
},
"quantity": 150,
"safety_stock": 5,
"reorder_level": 10,
"purchase_price": 17.99,
"price": 100,
"tax_type": 60396,
"ean": "2222222",
"product_code": "8888888",
"package_size_value": 1,
"package_size_unit": "pc"
}
]
}'
Note
The name of the product variant is the joined string of the product name and the attributes values, which is probably just a bug that we have for years now. That is maybe also in the delta endpoints
Response¶
{
"attributes": {},
"name": "T-shirt",
"id": 13825787,
"quantity": "180.00",
"reorder_level": "40.00",
"safety_stock": "45.00",
"price": "145.0",
"tax_type": 60396,
"custom_price": false,
"ebay_product_id": null,
"ebay_url": null,
"in_shop": false,
"shop_url": null,
"thumbnail": {
"ipad": "http://app.inventorum.com/uploads/20469/product/...ipad.png",
"thumb": "http://app.inventorum.com/uploads/20469/product/...thumb.png",
"image": "http://app.inventorum.com/uploads/20469/product/...ipad.png",
"ipad_retina": "http://app.inventorum.com/uploads/20469/product/...ipad_retina.png",
"ebay": "http://app.inventorum.com/uploads/20469/product/...ebay.png",
"thumb_retina": "http://app.inventorum.com/uploads/20469/product/...thumb_retina.png",
"original": "http://app.inventorum.com/uploads/20469/product/...original.png",
"new": true,
"id": -780792
},
"variation_count": 2,
"variations": [
{
"id": 13825788,
"attributes": {
"color": [
"Red"
],
"material": [
"Denim"
],
"size": [
"22"
]
},
"quantity": "30.00",
"reorder_level": "40.00",
"safety_stock": "45.00",
"ean": "11111",
"price": "140.0000000000",
"product_code": "99999",
"tax_type": 60396,
"name": "T-shirt, 22, Red, Denim",
"images": [],
"meta": {},
"gross_price": "166.60",
"purchase_price": "15.99",
"average_purchase_price": "15.99",
"attributes_str": "22, Red, Denim",
"inv_id": null,
"package_size_value": "1.000",
"package_size_unit": "pc",
"base_price": "166.60",
"base_size_value": "1",
"base_size_unit": "pc",
"is_giftcard": false
},
{
"id": 13825789,
"attributes": {
"color": [
"Blue"
],
"material": [
"Leather"
],
"size": [
"50"
]
},
"quantity": "150.00",
"reorder_level": "10.00",
"safety_stock": "5.00",
"ean": "2222222",
"price": "100.0000000000",
"product_code": "8888888",
"tax_type": 60396,
"name": "T-shirt, 50, Blue, Leather",
"images": [
{
"id": 780792,
"urls": {
"ipad": "https://app.inventorum.com/uploads/20469/product/...ipad.png",
"thumb": "https://app.inventorum.com/uploads/20469/product/...thumb.png",
"image": "https://app.inventorum.com/uploads/20469/product/...ipad.png",
"ipad_retina": "https://app.inventorum.com/uploads/20469/product/...ipad_retina.png",
"ebay": "https://app.inventorum.com/uploads/20469/product/...ebay.png",
"thumb_retina": "https://app.inventorum.com/uploads/20469/product/...thumb_retina.png",
"original": "https://app.inventorum.com/uploads/20469/product/...original.png"
},
"type": 0,
"new": true
}
],
"meta": {},
"gross_price": "119.00",
"purchase_price": "17.99",
"average_purchase_price": "17.99",
"attributes_str": "50, Blue, Leather",
"inv_id": null,
"package_size_value": "1.000",
"package_size_unit": "pc",
"base_price": "119.00",
"base_size_value": "1",
"base_size_unit": "pc",
"is_giftcard": false
}
],
"average_purchase_price": "0",
"description": "",
"product_code": null,
"ean": null,
"categories": [],
"images": [],
"custom_sale": false,
"shipping_services": [],
"is_favourite": false,
"brand": "nike",
"supplier": "",
"meta": {},
"is_giftcard": false,
"gross_price": "172.55",
"purchase_price": "0",
"states": [],
"attributes_str": "",
"inv_id": "612762878458692247",
"package_size_value": null,
"package_size_unit": null,
"base_price": null,
"base_size_value": null,
"base_size_unit": null
}
Error¶
Status 400 Bad Request
{
"error": {
"fields": {
"tax_type": [
"This field is required."
],
"name": [
"This field is required."
]
},
"description": "Serialization error",
"key": "common.serializer_error"
}
}
GET /products/delta/modified¶
Returns list of all products modified since defined date
Required scopes: products
param | type/format | required | sample value | description |
---|---|---|---|---|
start_date | YYYY-MM-DDTHH:mm:ss.sssZ | false | 2018-01-25T15:00:56.643Z | Simplified extended ISO format (ISO 8601). The timezone is zero UTC offset, as denoted by the suffix "Z". |
limit | integer | false | 40 | default and max value: 100 |
page | integer | false | 10 | page number |
verbose | boolean | false | true | Default: false . If set to true it will return these additional fields: meta , images , publish_states . |
order_by | string | false | name,-id | Sort results by given fields. Seprate fields by , . To sort descending add - before field name: -name . |
Request¶
curl -X GET \
'https://app.inventorum.com/api/products/delta/modified/?start_date=2016-12-21T11:32:26.341Z&limit=100&page=1' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {{oauth_token}}' \
Response¶
{
"total": 200,
"data": [
{
"name": "Example product",
"id": 12980855,
"quantity": "13.00",
"reorder_level": "5.00",
"safety_stock": "0.00",
"price": "0.5042016807",
"tax_type": 59105,
"custom_price": false,
"ebay_product_id": null,
"ebay_url": null,
"in_shop": false,
"shop_url": null,
"thumbnail": null,
"variation_count": 0,
"is_giftcard": false,
"gross_price": "0.60",
"ean": "400000000",
"inv_id": "612743774036966711",
"state": "created",
"parent": null,
"custom_sale": false,
"categories": [
{
"id": 159381,
"hint": "Schulhefte",
"name": "Schulhefte"
}
],
"attributes_str": "",
"description": "Lorem ipsum",
"product_code": "V47514",
"attributes": {},
"brand": "Venceremos BUND",
"average_purchase_price": "0.27"
}
]
}
GET /products/delta/deleted¶
Returns list of all products deleted since defined date
Required scopes: products
param | type/format | required | sample value | description |
---|---|---|---|---|
start_date | YYYY-MM-DDTHH:mm:ss.sssZ ±YYYYYY-MM-DDTHH:mm:ss.sssZ | false | 2018-01-25T15:00:56.643Z | Simplified extended ISO format (ISO 8601). The timezone is zero UTC offset, as denoted by the suffix "Z". |
limit | integer | false | 40 | default and max value: 1000 |
page | integer | false | 10 | page number |
order_by | string | false | name,-id | Sort results by given fields. Seprate fields by , . To sort descending add - before field name: -name . |
Request¶
curl -X GET \
'https://app.inventorum.com/api/products/delta/deleted/?start_date=2016-12-21T11:32:26.341Z&limit=100&page=1' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {{oauth_tioken}}' \
Response¶
{
"total": 3,
"data": [
13344583,
13344584,
13344585
]
}
GET /products/{product_id}¶
Returns details of a specified product.
VERSIONING
Supported versions: 7
, 8
, 10
.
The response object might differ greatly with every version. Make sure to double check the serializers in the source code.
V8 and V10 use different images
and meta
serializers than V7.
V7, V8, V10 use different variations
serilaizers.
Required scopes: products
Required headers: X-Api-Version: 10
Request¶
curl -X GET \
https://app.inventorum.com/api/products/12846584/ \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {{oauth_token}}' \
-H 'X-Api-Version: 12'
Response fields¶
parent object | field | type | source | sample value | description |
---|---|---|---|---|---|
attributes | color, weight, size | string | user input | "color": ["Red"] | Product attributes. Also, they can determine variants, but the uniqueness is not validated, so be careful when adding them. |
name | string | user input | "T-shirt" | Name of the product, displayed in the POS, Backoffice and channels. | |
brand | string | user input | "Nike" | Brand of the product. | |
supplier | string | user input | "Some wholesaler" | Supplier of the product. | |
quantity | string | user input / generated | "500" | Quantity for product without variants is taken from user input. In case of variants, the parent product quantity is a sum of variant quantities provided during product creation. | |
reorder_level | string | user input | "250" | In case of product with variants, field in parent product are populated with values from first variant. | |
safety_stock | string | user input | "200" | In case of product with variants, field in parent product are populated with values from first variant. | |
price | string | user input | "15.99" | ||
tax_type | integer | user input | 7123 | ID of an existing tax rate. | |
custom_price | boolean | user input | false | If this is set to true, the price in POS app can be overridden by the clerk. Default: false | |
ebay_product_id | string | generated | ID on Ebay | ||
ebay_url | string | generated | Link to ebay page of the product. | ||
in_shop | boolean | generated | If true, the product is published on the online shop. Can be changed with publishing endpoint. | ||
shop_url | string | generated | Link to online shop product page. | ||
thumbnail | ipad, thumb, image, ipad_retina, ebay, thumb_retina, original | string | generated | Links to images generated from uploaded original image for different resolutions. | |
thumbnail | new | boolean | user input | true | Always true. |
thumbnail | id | id | user input | -702003 | ID of image existing in the system. |
variation_count | integer | generated | Number of variations. | ||
is_giftcard | boolean | user input | false | If true, the product is a giftcard. Default: false. | |
custom_sale | boolean | user_input | false | If true, the product was created ad hoc in POS in checkout. Custom sales are not visible in regular /products endpoint, but are present in /products/delta/modified. | |
is_favourite | boolean | user_input | false | You can mark a product as a favourite, so that it can be displayed under a favourites filter in POS app. | |
gross_price | string | generated | Value of price with tax. | ||
product_code | string | user_input | "22343432" | Your own way of distinguishing products. Is not validated for uniqueness. | |
ean | string | user input | "2732232" | Your own way of distinguishing products. Is not validated for uniqueness. | |
inv_id | string | generated | Generated from timestamp of product creation date. | ||
reorder_level_reached | boolean | generated | If quantity is equal or less than reorder level, the value is true. | ||
safety_stock_reached | boolean | generated | If quantity is equal or less than safety stock level, the value is true. | ||
min_gross_price | string | generated | If product has variants, this equals to the gross price of the cheapest variant. | ||
max_gross_price | string | generated | If product has variants, this equals to the gross price of the most expensive variant. | ||
attributes_str | string | generated | String created as a concatenation of attributes, separated by a coma. | ||
package_size_value | string | user input | "10" | Size of a product package, e.g. how many items are in a package. | |
package_size_unit | string | user input | Unit of a package. | ||
base_price | generated | Price per item. Example: if a package has 3 pieces in a package, the base price would be equal price divided by 3. | |||
base_size_value | generated | If package size is present, the value is 1. | |||
base_size_unit | generated | If package_size_unit is a mass unit, the value would be kilogram, if it's a volume unit, the value would be litre and if it's the other kind, the base_size_unit will be equal package_size_unit | |||
purchase_price | float | user input | 15.87 | Purchase price of the original stock. | |
average_purchase_price | string | generated | Calculated as average of purchase prices for different stock adjustments. | ||
categories | See details in /categories endpoints | ||||
images | See details in /images endpoint | ||||
meta: shop, ipad,... | channel, description, gross_price, images, name, price | generated / user input | Structure of channels is generated per variant, but field values can be updated so that you can have different values per channel. | ||
states | channel | generated | States inform about publishing state in different channels. If channel is not activated in settings, it won't be present in this object. List of available channels: shop, ipad, ebay, ece, click_and_collect, atalanda. | ||
states | state | generated | State can be 'published' or 'unpublished'. |
Response¶
{
"attributes": {},
"name": "00001 Club Mate_",
"id": 12544049,
"quantity": "150.00",
"reorder_level": "0.00",
"safety_stock": "0.00",
"price": "4.2016806723",
"tax_type": 4672,
"custom_price": false,
"ebay_product_id": null,
"ebay_url": null,
"in_shop": false,
"shop_url": null,
"thumbnail": {
"ipad":
"https://app.inventorum.com/uploads/1627/product/...ipad.png",
...
"new": true,
"id": -217514
},
"variation_count": 4,
"variations": [
{
"id": 5977221,
"attributes": {
"color": [
"Red"
]
},
"quantity": "38.00",
"reorder_level": "0.00",
"safety_stock": "0.00",
"ean": "",
"price": "4.2016806723",
"product_code": null,
"tax_type": 4672,
"name": "00001 Club Mate_, Red",
"images": [
{
"id": 217514,
"urls": {
"ipad": "https://app.inventorum.com/uploads/1627/product/...ipad.png",
...
},
"type": 0,
"new": true
}
...
],
"meta": {
"shop": {
"channel": 4,
"description": null,
"gross_price": null,
"id": 1380378,
"images": null,
"name": "00001 Club Mate_, Red",
"price": null
},
...
},
"gross_price": "5.00",
"purchase_price": "0",
"average_purchase_price": "0",
"attributes_str": "Red",
"inv_id": null,
"package_size_value": "0.500",
"package_size_unit": "l",
"base_price": "10.00",
"base_size_value": "1",
"base_size_unit": "l",
"is_giftcard": false
},
{
"id": 12544050,
...
},
],
"average_purchase_price": "0",
"description": "<a href=\"http://www.gmx.de\"> Link </a>",
"product_code": null,
"ean": "",
"categories": [
{
"parent": null,
"is_leaf": true,
"hint": "Drinks",
"tree_id": 39710,
"id": 43104,
"channel": null,
"translations": [
{
"name": "Drinks",
"language": "de",
"id": null
}
],
"image": null,
"name": "Drinks",
"products_count": 4,
"products": [
2286411,
2286412,
2286413,
12726873
]
}
],
"images": [
{
"id": 217514,
"urls": {
"ipad": "https://app.inventorum.com/uploads/1627/product/...ipad.png",
...
},
"type": 0,
"new": true
},
...
],
"custom_sale": false,
"shipping_services": [],
"is_favourite": false,
"brand": "",
"supplier": "",
"meta": {
"shop": {
"channel": 4,
"description": null,
"gross_price": null,
"id": 4145396,
"images": null,
"name": null,
"price": null
},
...
},
"is_giftcard": false,
"gross_price": "5.00",
"purchase_price": "0",
"states": [
{
"channel": "shop",
"details": null,
"state": "unpublished"
}
],
"attributes_str": "",
"inv_id": "612689785305669070",
"package_size_value": "0.500",
"package_size_unit": "l",
"base_price": "10.00",
"base_size_value": "1",
"base_size_unit": "l"
}
Error¶
Status: 404 Not found
{
"error": {
"fields": {},
"description": null,
"key": "product.not_found"
}
}
PUT /products/{product_id}/ (without variants)¶
Update a product without variants.
VERSIONING
For best results use endpoint version 7
.
Required scopes: products
Note: To update data, send in request body only the fields to update.
object | field | type | sample value | description |
---|---|---|---|---|
attributes | size, color, ... | string | "color": ["Red"],"material": ["Denim"],"size": ["22"] | Product attributes. Also, they can determine variants, but the uniqueness is not validated, so be careful when adding them. The attributes need to be the same for all variants and the parent product. |
name | string | "T-shirt" | Name of the product, displayed in the POS, Backoffice and channels. | |
brand | string | "Nike" | Brand of the product. | |
supplier | string | "Some wholesaler" | Supplier of the product. | |
quantity | float | 500 | Quantity for product without variants is taken from user input. In case of variants, the parent product quantity is a sum of variant quantities provided during product creation. | |
reorder_level | float | 250 | In case of product with variants, field in parent product are populated with values from first variant. | |
safety_stock | float | 200 | In case of product with variants, field in parent product are populated with values from first variant. | |
price | float | 15.99 | ||
tax_type | integer | 7123 | ID of an existing tax rate. | |
custom_price | boolean | false | If this is set to true, the price in POS app can be overridden by the clerk. Default: false | |
is_giftcard | boolean | false | If true, the product is a giftcard. Default: false. | |
custom_sale | boolean | false | If true, the product was created ad hoc in POS in checkout. Custom sales are not visible in regular /products endpoint, but are present in /products/delta/modified. | |
is_favourite | boolean | false | You can mark a product as a favourite, so that it can be displayed under a favourites filter in POS app. | |
product_code | string | "22343432" | Your own way of distinguishing products. Is not validated for uniqueness. | |
ean | string | "2732232" | Your own way of distinguishing products. Is not validated for uniqueness. | |
package_size_value | string | "10" | Size of a product package, e.g. how many items are in a package. | |
package_size_unit | string | "pc" | Unit of a package. | |
purchase_price | float | 15.87 | Purchase price of the original stock. | |
categories | id | integer | 1231 | ID of existing category |
images | id, new | {"id": 12321, "new": true} | ID of existing image, new is always true. | |
meta: shop, atalanda, click_and_collect, ebay | description | string | "Special description for specific channel" | Structure of channels is generated per variant, but field values can be updated so that you can have different values per channel. |
meta | images | {"id": 12321, "new": true} | Special images per channel. If empty, they're taken from product. | |
meta | name | string | "T-shirt for ebay" | Special name per channel. If empty, it's taken from product. |
meta | price | float | 159 | Special price per channel. If empty, it's taken from product. |
Required headers:
Accept: application/json
Content-Type: application/json
Request¶
curl -X PUT \
https://app.inventorum.com/api/products/4094157/ \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {{oauth_token}}' \
-H 'Content-Type: application/json' \
-H 'X-Api-Version: 12' \
-d '{
"attributes": {
"color": [
"blue"
],
"material": [
"Denim"
],
"size": [
"SM"
]
},
"name": "T-shirt",
"quantity": 200,
"reorder_level": 100,
"safety_stock": 50,
"price": 155.89,
"tax_type": 11500,
"custom_price": false,
"variations": [],
"description": "This is the product description",
"product_code": "TS-128y982137",
"ean": "aaggagga",
"categories": [{"id": 56130}],
"images": [
{"id": 763102, "new": true}
],
"custom_sale": false,
"brand": "NIKE",
"supplier": "Wholesaler inc.",
"is_giftcard": false,
"purchase_price": 105,
"package_size_value": 1,
"package_size_unit": "pc",
"meta": {
"atalanda": {
"description": "atalanda desc",
"id": 4586506,
"name": "atalanda name",
"price": 203
},
"shop": {
"description": "shop desc",
"name": "shop name",
"price": 204
},
"click_and_collect": {
"description": "click desc",
"name": "click name",
"price": 205
},
"ebay": {
"description": "ebay desc",
"images": [{"id": 763101, "new": true}],
"name": "ebay name",
"price": 200
}
}
}'
Response¶
{
"attributes": {
"color": [
"blue"
],
"material": [
"Denim"
],
"size": [
"SM"
]
},
"name": "T-shirt",
"id": 4094157,
"quantity": "200.00",
"reorder_level": "100.00",
"safety_stock": "50.00",
"price": "155.89",
"tax_type": 11500,
"custom_price": false,
"ebay_product_id": null,
"ebay_url": null,
"in_shop": false,
"shop_url": null,
"thumbnail": {
"ipad": "http://app.inventorum.com/uploads/4158/product/a3/14/c3/49/cd/a2/18/52/92/1a/12/a5/3a/8b/61/a314c349cda21852921a12a53a8b6131.ipad.png",
...
"new": true,
"id": -763102
},
"variation_count": 0,
"variations": [],
"average_purchase_price": "0",
"description": "This is the product description",
"product_code": "TS-128y982137",
"ean": "aaggagga",
"categories": [
{
"parent": null,
"is_leaf": true,
"hint": "Accessoires",
"tree_id": 45973,
"id": 56130,
"channel": null,
"translations": [
{
"name": "Accessoires",
"language": "de",
"id": null
}
],
"image": null,
"name": "Accessoires",
"products_count": 23,
"products": [
4094157,
...
]
}
],
"images": [
{
"id": 763102,
"urls": {
"ipad": "https://app.inventorum.com/uploads/4158/product/a3/14/c3/49/cd/a2/18/52/92/1a/12/a5/3a/8b/61/a314c349cda21852921a12a53a8b6131.ipad.png",
...
},
"type": 0,
"new": true
}
],
"custom_sale": false,
"shipping_services": [],
"is_favourite": false,
"brand": "NIKE",
"supplier": "Wholesaler inc.",
"meta": {
"shop": {
"channel": 4,
"description": "shop desc",
"gross_price": "242.76",
"id": 4587308,
"images": null,
"name": "shop name",
"price": "204.0000000000"
},
...
},
"is_giftcard": false,
"gross_price": "185.51",
"purchase_price": "0",
"states": [],
"attributes_str": "SM, blue, Denim",
"inv_id": "612672236550287870",
"package_size_value": "1",
"package_size_unit": "pc",
"base_price": "185.51",
"base_size_value": "1",
"base_size_unit": "pc"
}
Error¶
Status 400 Bad Request
{
"error": {
"fields": {
"tax_type": [
"Invalid tax"
]
},
"description": "Serialization error",
"key": "common.serializer_error"
}
}
PUT /products/{product_id}/ (with variants)¶
Update a product with variants
VERSIONING
For best results use endpoint version 7
.
Required scopes: products
Note: To update data, send in request body only the fields to update.
object | field | type | sample value | description |
---|---|---|---|---|
attributes | size, color, material, fabric, cut, finish, fit, flavor, fragrance, length, model, package, pattern | string | "color": ["Red"],"material": ["Denim"],"size": ["22"] | Product attributes. Also, they can determine variants, but the uniqueness is not validated, so be careful when adding them. The attributes need to be the same for all variants and the parent product. |
name | string | "T-shirt" | Name of the product, displayed in the POS, Backoffice and channels. | |
brand | string | "Nike" | Brand of the product. | |
supplier | string | "Some wholesaler" | Supplier of the product. | |
quantity | float | 500 | Quantity for product without variants is taken from user input. In case of variants, the parent product quantity is a sum of variant quantities provided during product creation. | |
reorder_level | float | 250 | In case of product with variants, field in parent product are populated with values from first variant. | |
safety_stock | float | 200 | In case of product with variants, field in parent product are populated with values from first variant. | |
price | float | 15.99 | ||
tax_type | integer | 7123 | ID of an existing tax rate. | |
custom_price | boolean | false | If this is set to true, the price in POS app can be overridden by the clerk. Default: false | |
is_giftcard | boolean | false | If true, the product is a giftcard. Default: false. | |
custom_sale | boolean | false | If true, the product was created ad hoc in POS in checkout. Custom sales are not visible in regular /products endpoint, but are present in /products/delta/modified. | |
is_favourite | boolean | false | You can mark a product as a favourite, so that it can be displayed under a favourites filter in POS app. | |
product_code | string | "22343432" | Your own way of distinguishing products. Is not validated for uniqueness. | |
ean | string | "2732232" | Your own way of distinguishing products. Is not validated for uniqueness. | |
package_size_value | string | "10" | Size of a product package, e.g. how many items are in a package. | |
package_size_unit | string | "pc" | Unit of a package. | |
purchase_price | float | 15.87 | Purchase price of the original stock. | |
categories | id | integer | 1231 | ID of existing category |
images | id, new | {"id": 12321, "new": true} | ID of existing image, new is always true. | |
meta: shop, atalanda, click_and_collect, ebay | description | string | "Special description for specific channel" | Structure of channels is generated per variant, but field values can be updated so that you can have different values per channel. |
meta | images | {"id": 12321, "new": true} | Special images per channel. If empty, they're taken from product. | |
meta | name | string | Special name per channel. If empty, it's taken from product. | |
meta | price | float | 159 | Special price per channel. If empty, it's taken from product. |
Required headers:
'Accept: application/json'
,
'Content-Type: application/json'
Request¶
curl -X PUT \
https://app.inventorum.com/api/products/13417182/ \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {{oauth_token}}' \
-H 'Content-Type: application/json' \
-H 'X-Api-Version: 12' \
-d '{
"attributes":{
},
"name":"Pink t-shirt",
"price":235,
"tax_type":11500,
"custom_price":false,
"variations":[
{
"attributes":{
"color":[
"pink"
],
"weight":[
"1"
],
"size":[
"S"
]
},
"quantity":300,
"reorder_level":70,
"safety_stock":55,
"ean":"121312121212",
"price":155,
"product_code":"22222222222222",
"images":[
{
"id":223634,
"new":true
}
],
"meta":{
"atalanda":{
"description":"atalanda var1",
"tax_type":11500,
"images":null,
"price":110
},
"shop":{
"description":"shop var1",
"tax_type":11500,
"images":null,
"price":100
},
"click_and_collect":{
"description":"click var1",
"tax_type":11500,
"images":null,
"price":150
},
"ebay":{
"description":"ebay var1",
"tax_type":11500,
"images":null,
"price":200
}
},
"purchase_price":10.5,
"package_size_value":1,
"package_size_unit":"pc",
"is_giftcard":false,
"tax_type":11500
},
{
"attributes":{
"color":[
"blue"
],
"weight":[
"20"
],
"size":[
"L"
]
},
"quantity":1500,
"reorder_level":175,
"safety_stock":150,
"ean":"121312121212",
"price":100,
"product_code":"22222222222222",
"images":[
],
"meta":{
"atalanda":{
"description":"atalanda var2",
"tax_type":11500,
"images":null,
"price":200
},
"shop":{
"description":"shop var2",
"tax_type":11500,
"images":null,
"price":15.99
},
"click_and_collect":{
"description":"click var2",
"tax_type":11500,
"images":null,
"price":15.99
},
"ebay":{
"description":"ebay var2",
"tax_type":11500,
"images":null,
"price":200
}
},
"purchase_price":10.5,
"package_size_value":3,
"package_size_unit":"pc",
"is_giftcard":false,
"tax_type":11500
}
],
"description":"Here you put details about your product",
"product_code":"22222222222222",
"ean":"121312121212",
"categories":[
{
"id":56130
}
],
"images":[
{
"id":223634,
"new":true
}
],
"custom_sale":false,
"is_favourite":false,
"brand":"Nike",
"supplier":"",
"meta":{
"atalanda":{
"name":"atalanda name",
"description":"atalanda desc",
"tax_type":11500,
"images":null,
"price":null
},
"shop":{
"name":"shop name",
"description":"shop desc",
"tax_type":11500,
"images":null,
"price":null
},
"click_and_collect":{
"name":"click name",
"description":"click desc",
"tax_type":11500,
"images":null,
"price":null
},
"ebay":{
"name":"ebay name",
"description":"ebay desc",
"tax_type":11500,
"images":null,
"price":null
}
},
"is_giftcard":false,
"purchase_price":"10.5",
"package_size_value":"1.000",
"package_size_unit":"pc"
}'
Response¶
{
"attributes": {},
"name": "Pink t-shirt",
"id": 13417182,
"quantity": "1800.00",
"reorder_level": "70.00",
"safety_stock": "55.00",
"price": "235",
"tax_type": 11500,
"custom_price": false,
"ebay_product_id": null,
"ebay_url": null,
"in_shop": false,
"shop_url": null,
"thumbnail": {
"ipad": "http://app.inventorum.com/uploads/4158/product/45/ee/28/94/ba/1d/d9/b6/ff/55/f8/e1/44/55/35/45ee2894ba1dd9b6ff55f8e1445535b0.ipad.png",
...
"new": true,
"id": -223634
},
"variation_count": 2,
"variations": [
{
"id": 13423258,
"attributes": {
"color": [
"pink"
],
"weight": [
"1"
],
"size": [
"S"
]
},
"quantity": "300.00",
"reorder_level": "70.00",
"safety_stock": "55.00",
"ean": "121312121212",
"price": "155.0000000000",
"product_code": "22222222222222",
"tax_type": 11500,
"name": "Pink t-shirt, S, pink, 1",
"images": [
{
"id": 223634,
"urls": {
"ipad": "https://app.inventorum.com/uploads/4158/product/45/ee/28/94/ba/1d/d9/b6/ff/55/f8/e1/44/55/35/45ee2894ba1dd9b6ff55f8e1445535b0.ipad.png",
...
},
"type": 0,
"new": true
}
],
"meta": {
"shop": {
"channel": 4,
"description": "shop var1",
"gross_price": "119.00",
"id": 4590504,
"images": null,
"name": "shop name, S, pink, 1",
"price": "100.0000000000"
}
...
},
"gross_price": "184.45",
"purchase_price": "10.5",
"average_purchase_price": "10.5",
"attributes_str": "S, pink, 1",
"inv_id": null,
"package_size_value": "1.000",
"package_size_unit": "pc",
"base_price": "184.45",
"base_size_value": "1",
"base_size_unit": "pc",
"is_giftcard": false
},
{
"id": 13423259,
"attributes": {
"color": [
"blue"
],
"weight": [
"20"
],
"size": [
"L"
]
},
"quantity": "1500.00",
"reorder_level": "175.00",
"safety_stock": "150.00",
"ean": "121312121212",
"price": "100.0000000000",
"product_code": "22222222222222",
"tax_type": 11500,
"name": "Pink t-shirt, L, blue, 20",
"images": [],
"meta": {
"shop": {
"channel": 4,
"description": "shop var2",
"gross_price": "19.03",
"id": 4590512,
"images": null,
"name": "shop name, L, blue, 20",
"price": "15.9900000000"
},
...
},
"gross_price": "119.00",
"purchase_price": "10.5",
"average_purchase_price": "10.5",
"attributes_str": "L, blue, 20",
"inv_id": null,
"package_size_value": "3.000",
"package_size_unit": "pc",
"base_price": "39.67",
"base_size_value": "1",
"base_size_unit": "pc",
"is_giftcard": false
}
],
"average_purchase_price": "10.5",
"description": "Here you put details about your product",
"product_code": "22222222222222",
"ean": "121312121212",
"categories": [
{
"parent": null,
"is_leaf": true,
"hint": "Accessoires",
"tree_id": 45973,
"id": 56130,
"channel": null,
"translations": [
{
"name": "Accessoires",
"language": "de",
"id": null
}
],
"image": null,
"name": "Accessoires",
"products_count": 23,
"products": [
4094157,
...
]
}
],
"images": [
{
"id": 223634,
"urls": {
"ipad": "https://app.inventorum.com/uploads/4158/product/45/ee/28/94/ba/1d/d9/b6/ff/55/f8/e1/44/55/35/45ee2894ba1dd9b6ff55f8e1445535b0.ipad.png",
...
},
"type": 0,
"new": true
}
],
"custom_sale": false,
"shipping_services": [],
"is_favourite": false,
"brand": "Nike",
"supplier": "",
"meta": {
"shop": {
"channel": 4,
"description": "shop desc",
"gross_price": null,
"id": 4588985,
"images": null,
"name": "shop name",
"price": null
}
...
},
"is_giftcard": false,
"gross_price": "279.65",
"purchase_price": "10.5",
"states": [],
"attributes_str": "",
"inv_id": "612746559719345313",
"package_size_value": "1.000",
"package_size_unit": "pc",
"base_price": "279.65",
"base_size_value": "1",
"base_size_unit": "pc"
}
Error¶
Status 400 Bad Request
{
"error": {
"fields": {
"tax_type": [
"Invalid tax"
]
},
"description": "Serialization error",
"key": "common.serializer_error"
}
}
Adding and removing variations¶
There are two situations you can encounter when you want to add or delete variations to a product:
-
The product doesn't have variations: In this case, you need to do a
PUT
request updating the product that you want to add the variations (let's call it ORIGINAL) and pass the same product as one of the variations in the variations list. Then you will get a new product as result, which will be a clone of ORIGINAL and will have ORIGINAL as one of the variations. You can also add the extra variations in the same step, just pass the extra variations withoutid
field. -
The product has variations: In this case, you just need to pass all the existing variations, excluding those you want to delete, in the variation list. If you want to add new variations, put them in the list without
id
field. note You need at least one variation with id in the list.
Example¶
Let say we create a simple product without variations by doing a POST
to /products/
like:
(Notice that we are passing just the minimal required fields, I recommends you pass all the needed,
this is just for clarity):
{
"name" : "Simplest Product",
"price" : 4.20,
"tax_type" : 11500
}
{
"name": "Simplest Product",
"id": 11111111
...
}
Now if we want to add variations to this product, we'll need to do a PUT
to products/11111111/
with something like:
{
"name" : "Simplest Product",
"variations": [
{
"id": 11111111, # We need this to make the old product become a variation itself
"attributes": {
"size": "22",
"color": "Blue",
"material": "Denim"
}
},
{
"attributes": {
"size": "22",
"color": "Red",
"material": "Denim"
},
"price": 4.20,
"tax_type": 11500
}
]
}
{
"name": "Simplest Product",
"id": 11111114,
"variations": [
{
"id": 11111111,
"name": "Simple Product, 22, Blue, Denim",
...
},
{
"id": 11111113,
"name": "Simple Product, 22, Red, Denim",
...
}
]
}
id
of the parent product we got is different of the one we PUT
to,
and we should use this one next time we want to add, update or delete more variations. So if we wanna
add a new variation and also delete one of the old variations you can do PUT
to products/11111114/
{
"name" : "Simplest Product",
"variations": [
{
"id": 11111111,
"attributes": {
"size": "22",
"color": "Blue",
"material": "Denim"
}
},
{
"attributes": {
"size": "22",
"color": "Green",
"material": "Denim"
},
"price": 4.20,
"tax_type": 11500
}
]
}
{
"name": "Simplest Product",
"id": 11111114,
"variations": [
{
"id": 11111111,
"name": "Simple Product, 22, Blue, Denim",
...
},
{
"id": 11111115,
"name": "Simple Product, 22, Green, Denim",
...
}
]
}
id
, but another without it. So the one with id
will
remain, and the one that was generated with the id:11111113
will be gone, and a new one will be created.
You can't call this endpoint without passing at least on variation with id
.
Converting one product with variation into a product without variations¶
In order to transform a product with variations you just need to remove all the variations but one, and then the last one will become a product without variations.
Example¶
Following the last example we want now to make 11111114
a product without variations, in order to
do that we should make a PUT
to products/1111114/
with:
{
"name" : "Simplest Product",
"variations": [
{
"id": 11111111,
...
}
]
}
{
"id": 11111111
...
}
DELETE /products/{product_id}/¶
Deletes a specified product.
Required scopes: products
Required headers: 'Accept: application/json, text/plain, */*'
Request¶
curl -X DELETE \
https://app.inventorum.com/api/products/13214024/ \
-H 'Accept: application/json, text/plain, */*' \
-H 'Authorization: Bearer {{oauth_token}}' \
Response¶
Status 200 OK
Error¶
Status 404 Not Found
{
"error": {
"fields": {},
"description": null,
"key": "common.unknown"
}
}
PUT /products/{product_id}/adjust_inventory/¶
Adjusts stock for a product without variants or for a product variant.
VERSIONING
This endpoint supports 2 API versions:
- V6 and earlier: uses the
ProductSerializerLegacy
serializer. - V7 and later: use more recent
ProductDetailsV7Serializer
serializer (recommended).
Required scopes: inventories
param | type/format | required | sample value | description |
---|---|---|---|---|
quantity | String | true | "200.5" | Can be positive (increase) or negative (decrease) |
note | String | true | "Lost packets" | For empty reason, pass "" |
price | String | true | "10.50" | Purchase price of the added stock |
date | String, 10 characters, DD.MM.YYYY | true | "20.01.2018" | Date of stock adjustment |
Required headers:
'Content-Type: application/json'
'Accept: application/json, text/plain'
Request¶
curl -X PUT \
https://app.inventorum.com/api/products/12544049/adjust_inventory/ \
-H 'Accept: application/json, text/plain' \
-H 'Authorization: Bearer {{oauth_token}}' \
-H 'Content-Type: application/json' \
-H 'X-Api-Version: 12' \
-d '{"stock":{"quantity":"102","note":"some reason","price":"1","date":"15.01.2018"}}'
Response¶
Status 200 OK
{
"attributes": {},
"name": "00CZJ K900",
"id": 2716814,
"quantity": "201.00",
"reorder_level": "2.00",
"safety_stock": "1.00",
"price": "33.2916666667",
"tax_type": 6442,
"custom_price": false,
"ebay_product_id": null,
"ebay_url": null,
"in_shop": true,
"shop_url": "https://inventorum-workshop.inventorum.com/products/details?pid=2716814",
"thumbnail": {
"ipad": "http://app.inventorum.com/uploads/1627/product/ipad.png",
...
"new": true,
"id": -702078
},
"variation_count": 0,
"variations": [],
"average_purchase_price": "9.095238095238095238095238095",
"description": "TULCAN T-SHIRT",
"product_code": "00J2MC 4J.",
"ean": "8053621788200",
"categories": [
{
"parent": null,
"is_leaf": true,
"hint": "DIESEL",
"tree_id": 41616,
"id": 47569,
"channel": null,
"translations": [
{
"name": "DIESEL",
"language": "de",
"id": null
}
],
"image": null,
"name": "DIESEL",
"products_count": 27,
"products": [
2716805
]
}
],
"images": [
{
"ipad": "https://app.inventorum.com/uploads/1627/product/...ipad.png",
...
"new": true,
"id": -702078
}
],
"custom_sale": false,
"shipping_services": [],
"is_favourite": false,
"brand": "",
"supplier": "",
"meta": {
"shop": {
"channel": 4,
"description": "",
"gross_price": null,
"id": 586866,
"images": null,
"name": "",
"price": null
},
...
},
"is_giftcard": false,
"gross_price": "39.95",
"purchase_price": "1",
"states": [
{
"channel": "shop",
"details": null,
"state": "published"
}
],
"attributes_str": "",
"inv_id": "612666708292466421",
"package_size_value": null,
"package_size_unit": null,
"base_price": null,
"base_size_value": null,
"base_size_unit": null
}
Error¶
Status 404 Not found
POST /products/{product_id}/shop/¶
Publishes a selected product to the online shop.
Required scopes: shop.products.publishing
Required headers: 'Accept: application/json, text/plain, */*'
Request¶
curl -X POST \
https://app.inventorum.com/api/products/1976956/shop/ \
-H 'Accept: application/json, text/plain, */*' \
-H 'Authorization: Bearer {{oauth_token}}' \
-H 'X-Api-Version: 12'
Response¶
Status 200 OK
{
"price": "21.0084033613",
"gross_price": "25.00",
"purchase_price": "10.0000000000",
"average_price": null,
"average_purchase_price": "10.0000000000",
"is_favourite": false,
"stock": 1,
"reorder": 0,
"safety": 0,
"images": [],
"tax_rate": 19,
"address": "",
"shipping_services": [],
"categories": [],
"shop_url": null,
"ebay_url": null,
"in_shop": true,
"id": 1976956,
"name": "Dickies Free Bird",
"description": "White XL",
"supplier": "",
"brand": "",
"product_code": "06 210375",
"gtin": "40040003B",
"ebay_product_id": null,
"custom_price": false,
"is_giftcard": false,
"attributes": [],
"tags": []
}
Error¶
Status 404 Not found
DELETE /products/{product_id}/shop/¶
Unpublishes a selected product from the online shop.
Required scopes: shop.products.publishing
Required headers: 'Accept: application/json, text/plain, */*'
Request¶
curl -X DELETE \
https://app.inventorum.com/api/products/1976956/shop/ \
-H 'Accept: application/json, text/plain, */*' \
-H 'Authorization: Bearer {{oauth_token}}' \
-H 'X-Api-Version: 12'
Response¶
Status 200 OK
{
"price": "21.0084033613",
"gross_price": "25.00",
"purchase_price": "10.0000000000",
"average_price": null,
"average_purchase_price": "10.0000000000",
"is_favourite": false,
"stock": 1,
"reorder": 0,
"safety": 0,
"images": [],
"tax_rate": 19,
"address": "",
"shipping_services": [],
"categories": [],
"shop_url": null,
"ebay_url": null,
"in_shop": false,
"id": 1976956,
"name": "Dickies Free Bird",
"description": "White XL",
"supplier": "",
"brand": "",
"product_code": "06 210375",
"gtin": "40040003B",
"ebay_product_id": null,
"custom_price": false,
"is_giftcard": false,
"attributes": [],
"tags": []
}
Error¶
Status 404 Not found