Popular

↑↓ move ↵ open All results →

Integration API · Catalog sync

Create or replace a product

PUThttps://{store}/api/v1/integrations/catalog/products/{external_id}

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.

Integration key with the catalog:write ability: Authorization: Bearer {key}.

Path parameters

external_idstringrequired
Your product id, stable across retries (1–191 characters).

Request body application/json

namestring
Product name. Required for a new product.
skustring
SKU of the product’s variant. Required for a new product.
priceinteger
Price in minor units (599900 = 5 999.00).
quantityinteger
Stock.
descriptionstring
Plain-text description.
statusstring
draft or published. Default draft.
draftpublished
image_urlstring
Public https URL of the main image.
category_external_idsarray of strings
Your category ids; replaces the links.
tag_external_idsarray of strings
Your tag ids; replaces the links.
attributesobject
Characteristics by name, such as {"Матеріал": ["Бавовна", "Льон"], "Вага": "180 г", "Водонепроникний": true}; null removes one, names not sent stay. For a store on the one attribute model; elsewhere tags carry characteristics.
variantsarray of objects
Up to 100 variants: sku (required), price, quantity and options, an object of option name → value such as {"Колір": "Чорний", "Розмір": "M"}. When present, the top-level sku, price and quantity are not used.

Example

{
    "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
}