Creating winning targeted marketing strategy with customer insights
Are you ready to transform your marketing strategy? Watch an insightful webinar with Ruohonjuuri, tailored specifically for e-commerce and omnichannel retailers.
Are you ready to transform your marketing strategy? Watch an insightful webinar with Ruohonjuuri, tailored specifically for e-commerce and omnichannel retailers.
API documentation
A product represents a single sellable item. Each product is defined by a set of mandatory, optional and company-specific custom fields.
Mandatory fields
A product record must contain in minimum two fields, the identifier, which you use to refer the product and a price.
Field | Type | Description |
---|---|---|
external_id | string | An identifier which uniquely identifies the product. |
price | money | Base price of the product in cents. A price of 10.50 € should be passed as 1050. |
Optional fields
Optional fields are not required, but recommended, since they add more richness for Custobar users, thus allowing them to make better marketing decisions.
Field | Type | Description |
---|---|---|
type | string | Product type, e.g. CD or T-Shirt. |
category | string or list of string | Visible name of the category, e.g. Bedding, Jazz or Men's Knitwear. |
category_id | string or list of string | Your technical name or id for the category. |
vendor | string | Publisher or manufacturer of a product, e.g. L'Oréal. |
ean | string | International Article Number of the product. An identifier which uniquely identifies the product. In case product imports from another source do not contain a product_id, Custobar will try to look for sku or ean field to connect the product update with. |
sku | string | An identifier which uniquely identifies the product. In case product imports from another source do not contain a product_id, Custobar will try to look for sku or ean field to connect the product update with. |
shop_id | string | Name or identifier for the shop in which the product is available. This field can then be used to only show a specific shops products in the email editor. |
brand | string | Name of the brand, e.g. Escada Home, Gucci or Miles Davis. |
title | string | Name of the product, e.g. Egyptian Cotton Linen Fitted Sheet. |
image | string | Persistent address to a product image. The image may be cached or served through a proxy during marketing campaigns. |
date | datetime | The date, when the product has been modified most recently, e.g. 2016-06-08 or 2016-06-10T14:10:00Z. If the timezone is not given, the timezone will be defaulted to the timezone configured in the Custobar's settings. |
url | string | Address of a product page. This field is used to provide link to a web page in campaign mails. |
sale_price | money | Advertised sale price of the item in cents, if the product is in sale, e.g. for a sale price of 9.45 €, pass 945. |
lowest_price | money | Lowest price of the item in the past 30 days the item in cents. This field is related to EU's Omnibus directive. |
price_before_campaign | money | Price of the item in cents before a long-term campaign that lasts more than 30 days but less than 60 days, and where the price progressively decreases. This field is related to EU's Omnibus directive. |
highest_price | money | Highest price of the item in the past 30 days the item in cents. This field is related to EU's Omnibus directive. |
description | string | Description is embedded into marketing templates as text. |
language | language_code | Language of given product information. See section "Localizing product data". |
visible | boolean | Determines whether a product is "active". Products that are end-of-life, should be marked as not visible. If omitted, defaults to true. |
exclude_from_recommendations | boolean | A master flag determining whether the product may appear in product recommendations. If omitted, defaults to true. |
recommendation_set_ids | list of string | A list of external_ids that that belong to same recommendation set. When generating recommendations, only the highest-ranking recommendation from the set is used. Up to 20 external_ids can be provided for the set. |
in_stock | boolean | Indicates whether the product is currently stocked in general. |
stock | list of object | Shop specific stock status. A list of objects containing keys shop_id and quantity, e.g. [{"shop_id": "east-london", "quantity": 5}]. The key shop_id is the external_id of the imported shop. |
tags | [set][] of string | Tags assigned for this product. |
main_product_ids | list of string | A list of external_ids of products that are considered to be the main products. I.e. if you have shirts with different sizes, define the main_product_ids for the product variants that refer the main product. |
In addition to recommended optional fields, you may describe the product further by defining its unit of sale and item weight.
Field | Type | Description |
---|---|---|
unit | string | Plural shorthand for units sold, e.g. l, oz or pcs. |
weight | string | Weight of one sold unit. For product bundles or multi-packs, the weight is the combined weight of items sold in one bundle. |
You may add additional fields, that are company specific by prefixing them with a company short name and a double underscore __
, e.g. COMPANY__color
.
Company specific fields are searchable in the Custobar user interface.
Suppose you sell clothes and have different sizes for each product. To create a relation between the main product and the size variants, define main_product_ids
in the individual shirt products that represent the products in given size.
Product data can be localized into differed languages by supplying information for the same product multiple times (same external_id
), but translating the relevant fields and the changing the language
code to the appropriate language.
Available stock per location can be specifed as a list of shop_id/quantity pairs under the stock
property. For example, specifying the available stock for a product at three shops:
{
"products": [
{
"external_id": "11912",
"stock": [
{ "shop_id": "hki", "quantity": 14 },
{ "shop_id": "tku", "quantity": 0 },
{ "shop_id": "hml", "quantity": 8 }
]
}
]
}
When updating stock data, the incoming data is merged by the shop_id
, so the entries that are not explicitly given in new data are not erased. For example, after updating the stock state above with the following import:
{
"products": [
{
"external_id": "11912",
"stock": [
{ "shop_id": "hki", "quantity": 9 },
{ "shop_id": "lpr", "quantity": 1 }
]
}
]
}
the quantities are: hki:9, tku:0, hml:8, lpr:1.
When importing data using CSV, stock quantities can be updated using the property path notation, e.g.
external_id;stock.0.shop_id;stock.0.quantity
11912;hki;14
11912;tku;0
11912;hml;8
To upload new or changed product information, you may pass them to Custobar using a HTTP POST command, e.g.
curl -X POST -u USER -H "Content-Type: application/json" \
--data-binary @products.json https://COMPANY.custobar.com/api/products/upload/
Basic product import
The product objects must be provided as a list, wrapped into a JSON object, with a key products
, as shown in the example below.
{
"products": [
{
"external_id": "1619490226",
"category": "Children's Books",
"category_id": "1619",
"title": "Alice in Wonderland",
"date": "2013-02-13T13:10:40Z",
"url": "https://www.example.com/product/1619490226",
"brand": "Lewis Carroll",
"type": "Paperback",
"price": 1200,
"stock": [
{"shop_id": "BAKER-STREET", "quantity": 40},
{"shop_id": "CANNON-STREET", "quantity": 17}
],
"COMPANY__author": "Lewis Carroll",
"COMPANY__publisher": "Empire Books",
},
{
"external_id": "1770461221",
"category": ["Children's Books", "Nordic Classics"],
"category_id": ["1619", "1311"],
"title": "Moomin and the Comet",
"date": "2011-12-10T08:10:42Z",
"url": "https://www.example.com/product/1770461221",
"brand": "Tove Jansson",
"type": "Paperback",
"price": 2080,
"recommendation_set_ids": ["1619490226"],
"COMPANY__author": "Tove Jansson",
"COMPANY__publisher": "Drawn and Quarterly"
}
]
}
Product with variants where main product also has a price defined
To import a product which has variants, use the main_product_ids
array to define the relationship as shown below. In the example below, the first product is a master product that also includes a price. This price can be a "starting at" sort of price if the variants pricing varies a lot. After the main product there are three subsequent variant products.
{
"products": [
{
"external_id": "5789422",
"title": "Vintage t-shirt",
"type": "T-shirt",
"price": 1995
},
{
"external_id": "5789422LG",
"title": "Vintage t-shirt - Large",
"main_product_ids": ["5789422"],
"price": 1995
},
{
"external_id": "5789422MD",
"title": "Vintage t-shirt - Medium",
"main_product_ids": ["5789422"],
"price": 1995
},
{
"external_id": "5789422SM",
"title": "Vintage t-shirt - Small",
"main_product_ids": ["5789422"],
"price": 1995
}
]
}