Integration API · Catalog sync
Create or replace a product
Creates the product the first time an external_id is seen and updates the same product afterwards, so a retry never makes a duplicate. A new product needs name and sku; it gets one variant with that SKU, price and stock.
Categories and tags are linked by your external ids, which must be created first; a list replaces the product’s links. image_url must be a public https image; it is downloaded into the store.
For a product in several colours or sizes send variants: each with its SKU, price, stock and options (the same option names in every variant). The list replaces the product’s variants: matched by SKU, new ones added, missing ones removed; a variant row without price or quantity keeps the variant’s own, a new variant needs its price. Without variants the product has one variant from sku, price and quantity.
catalog:write ability: Authorization: Bearer {key}.
Path parameters
external_idstringrequiredRequest body application/json
namestringskustringpriceintegerquantityintegerdescriptionstringstatusstringimage_urlstringcategory_external_idsarray of stringstag_external_idsarray of stringsattributesobjectvariantsarray of objectsExample
{
"name": "Навушники Sonar ANC повнорозмірні",
"description": "Активне шумозаглушення, 40 годин роботи.",
"status": "published",
"image_url": "https://cdn.example.com/sonar-anc.jpg",
"category_external_ids": [
"erp-cat-audio"
],
"tag_external_ids": [
"erp-tag-new"
],
"variants": [
{
"sku": "SONAR-ANC-BLK",
"price": 599900,
"quantity": 24,
"options": {
"Колір": "Чорний"
}
},
{
"sku": "SONAR-ANC-WHT",
"price": 599900,
"quantity": 9,
"options": {
"Колір": "Білий"
}
}
]
}
Responses
200The product as the catalog now shows it, with your external_id.
{
"external_id": "erp-10045",
"data": {
"id": 12,
"name": "Навушники Sonar ANC повнорозмірні",
"description": "Активне шумозаглушення, 40 годин роботи.",
"sku": "SONAR-ANC-BLK",
"thumbnail_url": "https://your-store.storeforma.shop/media/12/sonar-anc.webp",
"quantity": 24,
"currency_code": "UAH",
"min_price": 599900,
"max_price": 599900,
"weight": 0.32,
"length": null,
"height": null,
"width": null,
"has_offers": false,
"is_archived": false,
"category_id": 7,
"attributes": [
{
"handle": "kolir",
"name": "Колір",
"type": "swatch",
"unit": null,
"group": null,
"variant_axis": false,
"values": [
"Чорний"
]
},
{
"handle": "vaga",
"name": "Вага",
"type": "number",
"unit": "г",
"group": "Загальні",
"variant_axis": false,
"values": [
"320 г"
]
}
],
"input_options": [
{
"key": "hraviiuvannia",
"label": "Гравіювання",
"type": "text",
"required": false,
"price": 10000,
"max": 30,
"choices": []
}
],
"created_at": "2026-10-01 10:12:00",
"updated_at": "2026-10-12 08:40:00"
}
} 401Missing, unknown or revoked key.
{
"code": "unauthenticated",
"message": "Integration key is inactive.",
"field": null
} 403The key lacks catalog:write, or the store’s plan has no API access.
{
"code": "forbidden",
"message": "Integration key cannot catalog:write.",
"field": null
} 422A field is invalid; field names it.
{
"code": "validation_error",
"message": "name is required.",
"field": "name"
} 429More than 60 requests a minute for this key. Wait Retry-After seconds.
{
"code": "rate_limited",
"message": "Too many integration requests.",
"field": null
}