curl --request PUT \
--url https://api.products.kameleoon.com/import/products \
--header 'Content-Type: application/json' \
--data '
{
"shop_id": "eehj3eu84299kg5ghw5a6743r8",
"shop_secret": "pmd5362597thrgq8k256ep01t0",
"items": [
{
"id": "myID",
"name": "myItem",
"price": 1,
"currency": "USD",
"url": "https://example.com/product",
"picture": "https://example.com/product/image.png",
"available": true,
"categories": [
"ID1",
"ID2"
]
}
]
}
'import requests
url = "https://api.products.kameleoon.com/import/products"
payload = {
"shop_id": "eehj3eu84299kg5ghw5a6743r8",
"shop_secret": "pmd5362597thrgq8k256ep01t0",
"items": [
{
"id": "myID",
"name": "myItem",
"price": 1,
"currency": "USD",
"url": "https://example.com/product",
"picture": "https://example.com/product/image.png",
"available": True,
"categories": ["ID1", "ID2"]
}
]
}
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
shop_id: 'eehj3eu84299kg5ghw5a6743r8',
shop_secret: 'pmd5362597thrgq8k256ep01t0',
items: [
{
id: 'myID',
name: 'myItem',
price: 1,
currency: 'USD',
url: 'https://example.com/product',
picture: 'https://example.com/product/image.png',
available: true,
categories: ['ID1', 'ID2']
}
]
})
};
fetch('https://api.products.kameleoon.com/import/products', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.products.kameleoon.com/import/products",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'shop_id' => 'eehj3eu84299kg5ghw5a6743r8',
'shop_secret' => 'pmd5362597thrgq8k256ep01t0',
'items' => [
[
'id' => 'myID',
'name' => 'myItem',
'price' => 1,
'currency' => 'USD',
'url' => 'https://example.com/product',
'picture' => 'https://example.com/product/image.png',
'available' => true,
'categories' => [
'ID1',
'ID2'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.products.kameleoon.com/import/products"
payload := strings.NewReader("{\n \"shop_id\": \"eehj3eu84299kg5ghw5a6743r8\",\n \"shop_secret\": \"pmd5362597thrgq8k256ep01t0\",\n \"items\": [\n {\n \"id\": \"myID\",\n \"name\": \"myItem\",\n \"price\": 1,\n \"currency\": \"USD\",\n \"url\": \"https://example.com/product\",\n \"picture\": \"https://example.com/product/image.png\",\n \"available\": true,\n \"categories\": [\n \"ID1\",\n \"ID2\"\n ]\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.products.kameleoon.com/import/products")
.header("Content-Type", "application/json")
.body("{\n \"shop_id\": \"eehj3eu84299kg5ghw5a6743r8\",\n \"shop_secret\": \"pmd5362597thrgq8k256ep01t0\",\n \"items\": [\n {\n \"id\": \"myID\",\n \"name\": \"myItem\",\n \"price\": 1,\n \"currency\": \"USD\",\n \"url\": \"https://example.com/product\",\n \"picture\": \"https://example.com/product/image.png\",\n \"available\": true,\n \"categories\": [\n \"ID1\",\n \"ID2\"\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.products.kameleoon.com/import/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"shop_id\": \"eehj3eu84299kg5ghw5a6743r8\",\n \"shop_secret\": \"pmd5362597thrgq8k256ep01t0\",\n \"items\": [\n {\n \"id\": \"myID\",\n \"name\": \"myItem\",\n \"price\": 1,\n \"currency\": \"USD\",\n \"url\": \"https://example.com/product\",\n \"picture\": \"https://example.com/product/image.png\",\n \"available\": true,\n \"categories\": [\n \"ID1\",\n \"ID2\"\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "error",
"message": "Incorrect shop credentials"
}Import and update products
Import or update your product catalog in Kameleoon using the preferred endpoint for catalogs with more than 50K products.
curl --request PUT \
--url https://api.products.kameleoon.com/import/products \
--header 'Content-Type: application/json' \
--data '
{
"shop_id": "eehj3eu84299kg5ghw5a6743r8",
"shop_secret": "pmd5362597thrgq8k256ep01t0",
"items": [
{
"id": "myID",
"name": "myItem",
"price": 1,
"currency": "USD",
"url": "https://example.com/product",
"picture": "https://example.com/product/image.png",
"available": true,
"categories": [
"ID1",
"ID2"
]
}
]
}
'import requests
url = "https://api.products.kameleoon.com/import/products"
payload = {
"shop_id": "eehj3eu84299kg5ghw5a6743r8",
"shop_secret": "pmd5362597thrgq8k256ep01t0",
"items": [
{
"id": "myID",
"name": "myItem",
"price": 1,
"currency": "USD",
"url": "https://example.com/product",
"picture": "https://example.com/product/image.png",
"available": True,
"categories": ["ID1", "ID2"]
}
]
}
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
shop_id: 'eehj3eu84299kg5ghw5a6743r8',
shop_secret: 'pmd5362597thrgq8k256ep01t0',
items: [
{
id: 'myID',
name: 'myItem',
price: 1,
currency: 'USD',
url: 'https://example.com/product',
picture: 'https://example.com/product/image.png',
available: true,
categories: ['ID1', 'ID2']
}
]
})
};
fetch('https://api.products.kameleoon.com/import/products', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.products.kameleoon.com/import/products",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'shop_id' => 'eehj3eu84299kg5ghw5a6743r8',
'shop_secret' => 'pmd5362597thrgq8k256ep01t0',
'items' => [
[
'id' => 'myID',
'name' => 'myItem',
'price' => 1,
'currency' => 'USD',
'url' => 'https://example.com/product',
'picture' => 'https://example.com/product/image.png',
'available' => true,
'categories' => [
'ID1',
'ID2'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.products.kameleoon.com/import/products"
payload := strings.NewReader("{\n \"shop_id\": \"eehj3eu84299kg5ghw5a6743r8\",\n \"shop_secret\": \"pmd5362597thrgq8k256ep01t0\",\n \"items\": [\n {\n \"id\": \"myID\",\n \"name\": \"myItem\",\n \"price\": 1,\n \"currency\": \"USD\",\n \"url\": \"https://example.com/product\",\n \"picture\": \"https://example.com/product/image.png\",\n \"available\": true,\n \"categories\": [\n \"ID1\",\n \"ID2\"\n ]\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.products.kameleoon.com/import/products")
.header("Content-Type", "application/json")
.body("{\n \"shop_id\": \"eehj3eu84299kg5ghw5a6743r8\",\n \"shop_secret\": \"pmd5362597thrgq8k256ep01t0\",\n \"items\": [\n {\n \"id\": \"myID\",\n \"name\": \"myItem\",\n \"price\": 1,\n \"currency\": \"USD\",\n \"url\": \"https://example.com/product\",\n \"picture\": \"https://example.com/product/image.png\",\n \"available\": true,\n \"categories\": [\n \"ID1\",\n \"ID2\"\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.products.kameleoon.com/import/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"shop_id\": \"eehj3eu84299kg5ghw5a6743r8\",\n \"shop_secret\": \"pmd5362597thrgq8k256ep01t0\",\n \"items\": [\n {\n \"id\": \"myID\",\n \"name\": \"myItem\",\n \"price\": 1,\n \"currency\": \"USD\",\n \"url\": \"https://example.com/product\",\n \"picture\": \"https://example.com/product/image.png\",\n \"available\": true,\n \"categories\": [\n \"ID1\",\n \"ID2\"\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "error",
"message": "Incorrect shop credentials"
}Rate limit
- Kameleoon sets the API request limit (Rate Limit) at 40 requests per minute, with a maximum of 1 request every 1.5 seconds.
- Kameleoon caps the API request weight limit (Weight Limit) at 35 megabytes per request.
List of query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
shop_id | String | Yes | Store Key. Find this in Recommendations > Settings > Store settings in the Kameleoon app. Contact your Customer Success Manager for the key if necessary. |
shop_secret | String | Yes | Secret Key. Find this in Recommendations > Settings > Store settings in the Kameleoon app. Contact your Customer Success Manager for the key if necessary. |
items | List | Yes | A list of product items. Find in this table the parameters required for items |
webhook | String | No | The Webhook URL. Kameleoon sends a POST request to this URL upon completion of the import. |
webhook is to notify the developer once a request completes. Once Kameleoon imports all products in the API call and they become fully available, it sends a POST request to the designated webhook.Example of a successful request:{
"status": "success"
}
{
"status": "error",
"message": "MESSAGE"
}
List of parameters for items object
| Parameter | Type | Required | Description |
|---|---|---|---|
id | String (max length 64) | Yes | A unique ID assigned to the item |
group_id | String (max length 64) | Optional | The ID associated to the item group |
name | String (max length 255) | Yes | The name of the item |
price | Float (must be positive) | Yes | The price of the item. To provide prices in multiple locations, use the locations object instead. |
oldprice | Float (must be positive) | Optional | The previous price of the item |
currency | String | Yes | The currency in which you specified the price |
url | String | Yes | A URL to associate with the item |
picture | String | Yes | A URL containing an image of the item |
available | Boolean | Yes | Indicates whether the item is available for purchase. Use the update products endpoint to update this later |
categories | Array of strings | Yes | Each string represents a category ID that this product belongs to. |
locations | Array | Optional | Array of prices of the item in different locations. Find in this table the parameters required for locations |
accessories | Array of strings | Optional | Contains the product IDs of related accessories for the item |
seasonality | Array of integers | Optional | Represents the months of the year (January=1, December=12) that you want to promote this item |
brand | String | Optional | The brand name of the item |
barcode | Integer | Optional | A barcode value for the item |
price_margin | Integer | Optional | The price margin for the item |
tags | Array of strings | Optional | A list of keywords that you want to associate with the item |
is_child | Boolean | Optional | Indicates whether this item is a child of another item |
is_fashion | Boolean | Optional | Indicates whether this item is a fashion item |
is_new | Boolean | Optional | Indicates whether this item is a new item |
fashion | Object | Optional | Defines several additional parameters for fashion items. Find in this table the parameters required for fashion |
stock_quantity | Integer | Optional | The quanity of the item in stock |
type_prefix | String | Optional | A prefix to distinguish the type of item |
model | String | Optional | The model name of the item |
params | Object | Optional | Add custom parameters. Find in this table the parameters required for params |
merchant | String | Optional | The merchant you want to associate with the item |
rating | Integer | Optional | A value between 1 and 5. The user rating you want to assign to the item |
leftovers | String | Optional | A description of the remaining stock.For example, “one” represents a product available as a single unit, “few” represents product in limited quantities (up to 10 units), and “lot” represents a product available in quantities of 10 or more units |
creation_date | String | Optional | Must be in the format yyyy-mm-dd. The date you created the item |
List of parameters for locations object
Use the locations object to provide price, inventory, and other location-specific information when you have multiple locations. Pass the locations object inside the product items object.
| Parameter | Type | Required | Description |
|---|---|---|---|
location | String | Yes | The location you want to specify a price for. Include this field if you provide the locations field. |
price | Float (must be positive) | Optional | The price at this location. |
oldprice | Float (must be positive) | Optional | The previous price of the item (for example, the regular price of a sale item). |
stock_quantity | Int (must be positive) | Optional | The quantity of the item in stock. |
sizes | Array of Strings | Optional | A list of size options for the item. |
weight | Int (must be positive) | Optional | The weight of the item. |
delivery_types | Object | Optional | Indicates the availability of the item. Find in this table the parameters required for delivery_types |
List of parameters for delivery_types object
| Parameter | Type | Required | Description |
|---|---|---|---|
store | Int (must be positive) | Yes | Number of items available in-store |
delivery | Int (must be positive) | Yes | Number of items available for delivery, or in the warehouse |
List of parameters for Params object
The params object allows you to specify custom parameter values for the item. Pass the params object inside the product items object.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | String | Yes | The name of the parameter |
value | Array of Strings | Yes | Array of values for the parameter |
unit | String | Optional | Unit of measurement for the values. |
List of parameters for Fashion object
The fashion object allows you to specify additional information about fashion items. Pass the fashion object inside the product items object.
| Parameter | Type | Required | Description |
|---|---|---|---|
gender | String | Optional | A gender to associate with the item. For example, “m,” “f,” or “female.” |
sizes | Array of Strings | Optional | List of sizes for the item. |
type | String | Yes | The type of fashion item. For example, “jacket.” |
Example JSON request
{
"id": "myID",
"group_id": "myGroup",
"name": "myItem",
"price": 1,
"oldprice": 2,
"currency": "USD",
"url": "https://example.com/product",
"picture": "https://example.com/product/image.png",
"available": true,
"categories": ["ID1", "ID2"],
"locations": [
{
"location": "USA",
"delivery_types": {
"store": 10,
"delivery": 50
}
},
{
"location": "CAN",
"price": 60
}
],
"accessories": ["ID1", "ID2"],
"seasonality": [1, 2, 3],
"brand": "Acme",
"barcode": 123456789,
"price_margin": 10,
"tags": ["TAG1", "TAG2"],
"is_child": false,
"is_fashion": true,
"is_new": false,
"fashion": {
"gender": "m",
"sizes": ["48", "50", "52"],
"type": "jacket"
},
"stock_quantity": 60,
"type_prefix": "prefix",
"model": "Widget 3000",
"params": [
{
"name": "Param 1",
"value": ["bluetooth", "wi-fi"]
},
{
"name": "Param 2",
"value": [23]
}
],
"merchant": "MerchantName",
"rating": 4,
"leftovers": "one",
"creation_date": "2021-12-21"
}
Body
Store Key. Find this in Recommendations > Settings > Store settings in the Kameleoon app. Contact your Customer Success Manager for the key if necessary.
Secret Key. Find this in Recommendations > Settings > Store settings in the Kameleoon app. Contact your Customer Success Manager for the key if necessary.
A list of product items. To update only some properties of a product, you must still include all of that product's mandatory parameters, or the product is ignored during import.
Show child attributes
Show child attributes
The webhook URL where a POST request is sent upon completion of the import.
Response
Import accepted. Verified against a live response on 2026-09-24: this endpoint returns an empty 204 response on success, not a JSON body — the {"status": "success"} shape only applies to the asynchronous webhook callback payload, if a webhook was provided.
Was this page helpful?