For AI agents: markdown of this page — /docs-content-en/entities/products/get.md documentation index — /llms.txt
Get CRM product
GET /v1/products/:id
Returns a single CRM catalog product by identifier. The response includes the product's basic fields and the custom PROPERTY_<N> properties configured for the catalog in your Bitrix24 account.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id (path) |
number | yes | Product identifier. List: GET /v1/products |
include (query) |
string | no | Related data: section — the catalog section the product belongs to. Details: see "Related data" below |
Examples
curl — personal key
curl "https://vibecode.bitrix24.com/v1/products/6967" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl "https://vibecode.bitrix24.com/v1/products/6967" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/products/6967', {
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { success, data } = await res.json()
console.log('Product:', data.name, '—', data.price, data.currency)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/products/6967', {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { success, data } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data |
object | Product object: basic fields — see CRM product fields, plus the custom PROPERTY_<N> properties |
The basic fields are the same as in an array element of GET /v1/products. The response also includes PROPERTY_<N> properties — one key per catalog property. If a value is not filled in, the key is returned with a null value.
Related data
To get the catalog section the product belongs to along with the product, pass the include parameter:
GET /v1/products/533?include=section
The available value is section. The result is in the data._included.section field. For a product outside any section, when sectionId is null, the response carries "section": null. The example shows only the sectionId field and the _included block:
{
"success": true,
"data": {
"id": 533,
"name": "Test",
"sectionId": 19,
"_included": {
"section": {
"id": 19,
"name": "Tours",
"catalogId": 25,
"sectionId": 31,
"xmlId": null,
"code": null
}
}
}
}
Response example
{
"success": true,
"data": {
"id": 6967,
"name": "Master product",
"code": "product_sku",
"active": true,
"previewPicture": null,
"detailPicture": null,
"sort": 100,
"xmlId": "6967",
"updatedAt": "2025-05-12T09:05:27.000Z",
"createdAt": "2025-05-12T09:03:15.000Z",
"modifyBy": 1,
"createdBy": 1,
"catalogId": 25,
"sectionId": null,
"description": null,
"descriptionType": "text",
"price": 100,
"currency": "USD",
"vatId": null,
"vatIncluded": false,
"measure": null,
"PROPERTY_309": null,
"PROPERTY_295": null,
"PROPERTY_297": null
}
}
Error response example
404 — product not found:
{
"success": false,
"error": {
"code": "ENTITY_NOT_FOUND",
"message": "Product is not found."
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 404 | ENTITY_NOT_FOUND |
A product with this id was not found |
| 400 | INVALID_INCLUDE |
include contains a value other than section. The message lists the available values after the word Available |
| 403 | SCOPE_DENIED |
The API key does not have the crm scope |
| 401 | MISSING_API_KEY |
The X-Api-Key header was not passed |
Full list of common API errors — Errors.
Known specifics
The property set is the same within a catalog. The set of PROPERTY_<N> keys is determined by the catalog settings in your Bitrix24 account — it is identical for all products in the same catalog.
A filled list property arrives as an identifier only, with no text. This endpoint returns an object { "valueId": "...", "value": "..." } in PROPERTY_<N>, where value is the identifier of the selected enumeration element, not its label. There is no readable text available here, and /v1/products/fields does not contain it either — a property descriptor carries the name only. Two ways forward:
- for the readable text of a single product —
GET /v1/catalog-products/:id: the catalog family returns the ready-made text inpropertyNNN.valueEnum. - for all options of a property — for a dropdown list, a filter or an export —
GET /v1/catalog-product-property-enums?filter[propertyId]=NNN&limit=1000.
Both calls require the catalog scope — a key with only the crm scope gets 403 SCOPE_DENIED.
An empty PROPERTY_<N> means one of two things. A single cross-check call to GET /v1/catalog-products/:id tells them apart:
- the property is not filled in on this product — the catalog endpoint comes back empty too, or with a synthesized
"N"for a checkbox property (listType: "C"). - the property is served by the catalog family only (for example, a string property with the
directorycustom type) — the catalog endpoint then returns the value while/v1/productsreturnsnull.
Offers are not visible through this endpoint. This endpoint works with CRM catalog products. Offers live in a separate catalog and are read through GET /v1/catalog-products.