สำหรับเอเจนต์ AI: markdown ของหน้านี้ — /docs-content-en/entities/catalog-skus.md ดัชนีเอกสาร — /llms.txt
บทความในเอกสารมีให้บริการเป็นภาษาอังกฤษในขณะนี้
Catalog SKUs
An SKU, or parent product, is the shared card of a product with offers: it has one name, description, and catalog section, while sizes, colors, and other variants are stored in catalog offers. The methods in this section create, read, update, and delete parent products.
Bitrix24 API: catalog.product.sku.*
Scope: catalog
Create an SKU
POST /v1/catalog-skus
Creates a parent product in the product catalog — a shared card to which offers are then linked. Fields are passed flat at the root of the JSON.
Request fields (body)
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | yes | Parent product name |
iblockId |
number | yes | Product catalog ID. List: GET /v1/catalogs. An offer catalog — one with productIblockId filled in — is not accepted |
active |
boolean | no | Whether the product is active. Defaults to true |
iblockSectionId |
number | no | ID of the main catalog section. List: GET /v1/catalog-sections |
iblockSection |
number[] | no | Array of IDs of all sections the product is linked to. List: GET /v1/catalog-sections |
code |
string | no | Product symbolic code |
xmlId |
string | no | External code. If omitted, Bitrix24 sets it to the product id as a string |
sort |
number | no | Sort order. Defaults to 500 |
dateActiveFrom |
datetime | no | Activity start date |
dateActiveTo |
datetime | no | Activity end date |
previewText |
string | no | Preview text |
previewTextType |
string | no | Preview text format: text or html. Defaults to text |
detailText |
string | no | Detailed description |
detailTextType |
string | no | Detailed description format: text or html. Defaults to text |
previewPicture |
object | no | Preview picture: { "fileData": ["name.png", "<base64>"] } |
detailPicture |
object | no | Detail picture, same format |
propertyNNN |
string | no | Catalog property value, where NNN is the property id from GET /v1/catalog-product-properties: "property301": "cotton" |
The type, available, and bundle fields are computed by Bitrix24 — in the request body they are rejected with 400 READONLY_FIELD.
Examples
curl — personal key
curl -X POST "https://vibecode.bitrix24.com/v1/catalog-skus" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Basic T-shirt",
"iblockId": 25,
"active": true
}'
curl — OAuth application
curl -X POST "https://vibecode.bitrix24.com/v1/catalog-skus" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Basic T-shirt",
"iblockId": 25,
"active": true
}'
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/catalog-skus', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Basic T-shirt',
iblockId: 25,
active: true,
}),
})
const { success, data } = await res.json()
console.log('Parent product ID:', data.id)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/catalog-skus', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Basic T-shirt',
iblockId: 25,
active: true,
}),
})
const { success, data } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data |
object | Full object of the created parent product. The field set is the same as for GET /v1/catalog-skus/:id |
Response example
The main fields are shown; propertyNNN properties are omitted. A newly created parent product has type equal to 6.
{
"success": true,
"data": {
"id": 7203,
"iblockId": 25,
"iblockSectionId": null,
"iblockSection": null,
"name": "Basic T-shirt",
"type": 6,
"active": true,
"available": false,
"bundle": false,
"code": null,
"xmlId": "7203",
"sort": 500,
"previewText": null,
"previewTextType": "text",
"detailText": null,
"detailTextType": "text",
"createdBy": 1295,
"modifiedBy": 1295,
"dateCreate": "2026-10-08T18:45:34.000Z",
"timestampX": "2026-10-08T18:45:34.000Z"
}
}
Error response example
400 — a required field was not passed:
{
"success": false,
"error": {
"code": "MISSING_REQUIRED_FIELDS",
"message": "Body field \"name\" is required to create catalogSku."
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | MISSING_REQUIRED_FIELDS |
The required field name or iblockId was not passed — the message names it. The request is rejected before it reaches Bitrix24 |
| 400 | READONLY_FIELD |
A read-only field was passed in the body: type, available, bundle |
| 422 | BITRIX_ERROR |
iblockId points to an offer catalog (productType is not allowed for this catalog) |
| 422 | BITRIX_ERROR |
iblockId is not a catalog (iblock is not catalog) |
| 403 | SCOPE_DENIED |
The key lacks the catalog scope |
| 401 | MISSING_API_KEY |
The X-Api-Key header was not passed |
Full list of common API errors — Errors.
Known specifics
The type changes once an offer is linked. A new parent product has type: 6. When the first offer is linked to it — POST /v1/catalog-offers with parentId — the type becomes 3. There is no need to change the type separately, and it cannot be passed.