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

Get a product from an item

GET /v1/items/:entityTypeId/:id/products/:rowId

Returns a single product row of an item by row ID.

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.

Parameters

Parameter Type Required Description
entityTypeId (path) number yes Smart process type ID
id (path) number yes Item ID
rowId (path) number yes Product row ID (from the add or list response)

rowId is the product row ID, not the productId from the product catalog.

Examples

curl — personal key

Terminal
curl -X GET "https://vibecode.bitrix24.com/v1/items/156/741/products/1471" \
  -H "X-Api-Key: YOUR_API_KEY"

curl — OAuth application

Terminal
curl -X GET "https://vibecode.bitrix24.com/v1/items/156/741/products/1471" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"

JavaScript — personal key

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/items/156/741/products/1471', {
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
  },
})

const { success, data } = await res.json()
console.log('Price:', data.price)

JavaScript — OAuth application

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/items/156/741/products/1471', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})

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

Response fields

Field Type Description
data.id number Product row ID
data.productId number Product ID. Catalog: GET /v1/products
data.productName string Product name
data.price number Unit price
data.quantity number Quantity
data.discount number Discount amount
data.discountRate number Discount percentage
data.discountTypeId number Discount type (1 — amount, 2 — percentage)
data.taxRate number | null Tax rate (%)
data.taxIncluded boolean Tax included in the price
data.priceExclusive number Price excluding tax, with discount
data.priceNetto number Net price
data.priceBrutto number Gross price
data.priceAccount number Price in the reporting currency
data.measureCode number Unit of measure code
data.measureName string Unit of measure name
data.sort number Sort order
data.ownerId number ID of the owner entity the row belongs to
data.ownerType string Row owner type: the letter T plus the hexadecimal entityTypeId, T9c for type 156
data.storeId number | null Warehouse ID. List: GET /v1/warehouses. null when inventory management is off

Response example

JSON
{
  "success": true,
  "data": {
    "id": 1471,
    "productId": 1,
    "productName": "Server equipment",
    "price": 5000,
    "priceAccount": 5000,
    "priceExclusive": 5000,
    "priceNetto": 5000,
    "priceBrutto": 5000,
    "quantity": 3,
    "discountTypeId": 2,
    "discountRate": 0,
    "discount": 0,
    "taxRate": null,
    "taxIncluded": false,
    "customized": "Y",
    "measureCode": 796,
    "measureName": "pcs",
    "sort": 0,
    "ownerId": 741,
    "ownerType": "T9c",
    "storeId": 3,
    "xmlId": "sale_basket_995",
    "type": 1
  }
}

Error response example

404 — item or product row not found:

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

Errors

HTTP Code Description
400 INVALID_DYNAMIC_PARAM entityTypeId is not a positive integer or is reserved (1, 2, 3, 4, 7, 31)
400 INVALID_ROW_ID rowId is not a positive integer
404 ENTITY_NOT_FOUND Item or product row not found
404 NOT_FOUND Bitrix24 returned a success response, but the product row is missing (Product row not found)
403 SCOPE_DENIED The API key lacks the crm scope
401 TOKEN_MISSING The API key has no configured tokens
429 RATE_LIMITED Rate limit exceeded: 300 requests per minute per portal, all API keys of the portal share one limit. The exact value arrives in the x-ratelimit-limit header (the cap is divided across replicas). Retry after the delay in the Retry-After header

Full list of common API errors — Errors.

See also