For AI agents: markdown of this page — /docs-content-en/entities/items/products-add.md documentation index — /llms.txt

A field name that is not in the writable set is no longer dropped silently — the request is rejected with 400 INVALID_PARAMS and the error text lists the writable names. Read-only fields that appear in product-row responses (priceAccount, ownerId, storeId and others) are still accepted and ignored, so an object read via GET can be sent back as is.

Use the entityTypeId field from GET /v1/smart-processes in the /v1/items/:entityTypeId path. The type record's internal id is a different identifier. For example, if a type is returned as { "id": 3, "entityTypeId": 174 }, the path starts with /v1/items/174. Use the returned value rather than assuming all type IDs start at 1030.

Add a product to a smart process item

POST /v1/items/:entityTypeId/:id/products

Adds a single product row to a smart process item. Unlike PUT /v1/items/:entityTypeId/:id/products, it does not replace existing rows.

Request fields (body)

Parameter Type Required Description
ParameterentityTypeId (path) Typenumber Requiredyes DescriptionSmart process type ID
Parameterid (path) Typenumber Requiredyes DescriptionItem ID
ParameterproductId Typenumber Requiredno DescriptionCatalog product ID. If set without productName, the name is taken from the catalog. Catalog: GET /v1/products
ParameterproductName Typestring Requiredno DescriptionProduct row name — for a free-form row without a catalog product. Provide at least one of productId / productName.
Parameterprice Typenumber Requiredno DescriptionPrice per unit
Parameterquantity Typenumber Requiredno DescriptionQuantity
ParameterdiscountTypeId Typenumber Requiredno DescriptionHow the discount is set: 1 — as an amount in discount, 2 — as a percentage in discountRate. Defaults to 2
Parameterdiscount Typenumber Requiredno DescriptionDiscount amount. Applied only when discountTypeId is 1
ParameterdiscountRate Typenumber Requiredno DescriptionDiscount percentage. Applied only when discountTypeId is 2
ParametertaxRate Typenumber Requiredno DescriptionTax rate (%)
ParametertaxIncluded Typeboolean Requiredno DescriptionTax included in price

Examples

curl — personal key

Terminal
curl -X POST "https://vibecode.bitrix24.com/v1/items/180/47/products" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "productId": 1, "price": 25000, "quantity": 2 }'

curl — OAuth application

Terminal
curl -X POST "https://vibecode.bitrix24.com/v1/items/180/47/products" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "productId": 1, "price": 25000, "quantity": 2 }'

JavaScript — personal key

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/items/180/47/products', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ productId: 1, price: 25000, quantity: 2 }),
})

const { success, data } = await res.json()
console.log('Row ID:', data.id)

JavaScript — OAuth application

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/items/180/47/products', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ productId: 1, price: 25000, quantity: 2 }),
})

const { success, data } = await res.json()

Response fields

Field Type Description
Fielddata Typeobject DescriptionThe created product row in full, HTTP status 201. Field set — Product fields

Response example

The main fields are shown. Full list — Product fields.

JSON
{
  "success": true,
  "data": {
    "id": 1465,
    "productId": 1,
    "productName": "Server equipment",
    "price": 25000,
    "quantity": 2,
    "discount": 0,
    "discountTypeId": 2,
    "taxIncluded": false
  }
}

Error response example

404 — item not found:

JSON
{
  "success": false,
  "error": {
    "code": "ENTITY_NOT_FOUND",
    "message": "Item not found"
  }
}

Errors

HTTP Code Description
HTTP400 CodeINVALID_PARAMS DescriptionThe body contains a field name that is not among the writable fields — see Product fields
HTTP400 CodeINVALID_DYNAMIC_PARAM DescriptionentityTypeId is not a positive integer or is reserved (1, 2, 3, 4, 7, 31)
HTTP400 CodeINVALID_PARAMS DescriptionThe request body is not an object or contains no recognized product-row fields
HTTP404 CodeENTITY_NOT_FOUND DescriptionItem not found
HTTP403 CodeSCOPE_DENIED DescriptionThe API key does not have the crm scope
HTTP401 CodeTOKEN_MISSING DescriptionThe API key has no configured tokens

Full list of common API errors — Errors.

See also