Для AI-агентов: markdown этой страницы — /docs-content/entities/products/list.md индекс документации — /llms.txt
Список товаров CRM
GET /v1/products
Возвращает список товаров CRM-каталога с поддержкой фильтрации, сортировки и автоматического листания страниц.
По умолчанию элемент списка содержит базовые поля товара. Пользовательские свойства каталога PROPERTY_<N> приходят в том же элементе, если перечислить их в select поимённо.
Параметры
| Параметр | Тип | По умолч. | Описание |
|---|---|---|---|
limit |
number | 50 |
Количество записей (до 5000). При limit > 50 запрос автоматически собирается из нескольких страниц на стороне сервера |
offset |
number | 0 |
Смещение от начала выборки |
select |
string | — | Выборка полей: ?select=id,name,price,active. Пользовательское свойство каталога запрашивается своим именем: ?select=id,name,price,PROPERTY_301. Имена свойств — в Полях товара CRM |
sort |
string | — | Сортировка кратким синтаксисом: ?sort=-sort, минус означает убывание. Поддерживаются: id, name, active, sort, sectionId, xmlId, code, description, descriptionType, createdBy, modifyBy, createdAt, updatedAt, а также свойства каталога вида PROPERTY_<n> |
order |
object | — | Сортировка в форме объекта. Пример: ?order[sort]=desc, ?order[name]=asc. price, currency, catalogId, measure, поля НДС и изображения не сортируются: любое написание, включая исходное имя PRICE, вернёт 400 UNKNOWN_SORT_FIELD со списком поддерживаемых полей |
filter |
object | — | Только точное равенство и $in (IN-множество) по полям id, name, code, xmlId, active, sectionId, sort, description. Операторы (>, >=, <, <=, !, %, $ne, $contains, $nin) и фильтрация по другим полям (price, currency) не поддерживаются — вернётся 400 UNSUPPORTED_FILTER.Синтаксис фильтрации. Пример: ?filter[active]=true |
include |
string | — | Связанные данные: section — раздел каталога, в котором лежит товар. Подробнее — секция «Связанные данные» |
withTotal |
string | — | Нужно ли количество: true или false. false — не заказывать подсчёт. Это единственный способ гарантированно убрать meta.total из ответа. Без параметра — настройка ключа, затем платформенное умолчание, и тогда на короткой странице точное количество приходит и без заказа. Листание и количество |
Примеры
curl — личный ключ
curl -g "https://vibecode.bitrix24.tech/v1/products?filter[active]=true&order[sort]=asc&limit=2" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth-приложение
curl -g "https://vibecode.bitrix24.tech/v1/products?filter[active]=true&order[sort]=asc&limit=2" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — личный ключ
const params = new URLSearchParams({
'filter[active]': 'true',
'order[sort]': 'asc',
limit: '2',
})
const res = await fetch(`https://vibecode.bitrix24.tech/v1/products?${params}`, {
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { success, data, meta } = await res.json()
console.log(`Получено: ${data.length}, есть ещё: ${meta.hasMore}`)
JavaScript — OAuth-приложение
const params = new URLSearchParams({
'filter[active]': 'true',
'order[sort]': 'asc',
limit: '2',
})
const res = await fetch(`https://vibecode.bitrix24.tech/v1/products?${params}`, {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { success, data, meta } = await res.json()
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | Всегда true при успехе |
data |
array | Массив товаров. Состав полей элемента — см. Поля товара CRM |
meta.total |
number | Общее количество записей, соответствующих фильтру. Необязательное поле: если количество не заказывалось, его в ответе нет |
meta.hasMore |
boolean | Есть ли ещё записи за пределами limit |
meta.includeSkipped |
boolean | true, если в ответе больше 200 записей и связи из include не загружены. Уменьшите limit. При 200 записях и меньше ключа нет |
URL карточки любого товара из массива data в магазине портала строится из catalogId и id:
https://<портал>.bitrix24.ru/shop/catalog/<catalogId>/product/<id>/
<портал> — домен портала. Доступ ограничен правами сотрудника в Битрикс24.
Связанные данные
Раздел каталога, в котором лежит товар, приходит в каждом элементе массива через параметр include:
GET /v1/products?filter[sectionId]=19&limit=1&include=section
Доступное значение — section. Результат — в поле _included.section каждого элемента data[]. У товара вне раздела, когда sectionId равен null, приходит "section": null. Если в ответе больше 200 записей, связи не загружаются, а в meta приходит includeSkipped: true — уменьшите limit. Показаны поле sectionId и блок _included:
{
"success": true,
"data": [
{
"id": 533,
"name": "тест",
"sectionId": 19,
"_included": {
"section": {
"id": 19,
"name": "Экскурсии",
"catalogId": 25,
"sectionId": 31,
"xmlId": null,
"code": null
}
}
}
],
"meta": {
"hasMore": true
}
}
Пример ответа
{
"success": true,
"data": [
{
"id": 6967,
"name": "Головной товар",
"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": "RUB",
"vatId": null,
"vatIncluded": false,
"measure": null
},
{
"id": 6969,
"name": "Услуга",
"code": "service",
"active": true,
"previewPicture": null,
"detailPicture": null,
"sort": 100,
"xmlId": "6969",
"updatedAt": "2025-05-12T09:04:01.000Z",
"createdAt": "2025-05-12T09:04:01.000Z",
"modifyBy": 1,
"createdBy": 1,
"catalogId": 25,
"sectionId": null,
"description": null,
"descriptionType": "text",
"price": 250,
"currency": "RUB",
"vatId": 1,
"vatIncluded": true,
"measure": null
}
],
"meta": {
"hasMore": true
}
}
Пример ответа при ошибке
400 — оператор или неподдерживаемое поле в фильтре:
{
"success": false,
"error": {
"code": "UNSUPPORTED_FILTER",
"message": "UNSUPPORTED_FILTER: 'price' is not filterable on 'products'. Its Bitrix24 method (crm.product.list) filters by exact match only. Filterable: id, name, code, xmlId, active, sectionId, sort, description."
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 400 | UNSUPPORTED_FILTER |
Оператор или неподдерживаемое поле в фильтре. Фильтруйте точным равенством или $in по id, name, code, xmlId, active, sectionId, sort, description |
| 400 | INVALID_FILTER |
Ошибка в синтаксисе фильтра |
| 400 | INVALID_INCLUDE |
В include передано значение, отличное от section. Сообщение перечисляет доступные значения после слова Available |
| 400 | UNKNOWN_SORT_FIELD |
Сортировка по полю, которое товар не сортирует, — price, currency, catalogId, measure, поля НДС и изображений в любом написании, включая исходные имена PRICE и CATALOG_ID. Сообщение содержит список доступных полей после слова Available |
| 400 | UNKNOWN_SELECT_FIELD |
В select передано имя, которого нет у товара. Сообщение перечисляет допустимые имена после слова Available |
| 400 | SELECT_FIELD_NOT_RETURNED |
В select передано имя, которое Поля товара CRM показывают с признаком notReturned: true, — например currencyId. Уберите его из select |
| 403 | SCOPE_DENIED |
API-ключ не имеет скоупа crm |
| 401 | MISSING_API_KEY |
Не передан заголовок X-Api-Key |
| 429 | RATE_LIMITED |
Превышен лимит запросов: 300 в минуту на портал, все API-ключи портала делят один лимит. Точное значение — в заголовке x-ratelimit-limit (потолок делится на реплики). Повторите после срока из заголовка Retry-After |
Полный список общих ошибок API — Ошибки.
Известные особенности
Свойства каталога приходят по явному перечислению. Каждое нужное свойство называется в select своим именем — ?select=id,name,PROPERTY_295,PROPERTY_297. Значение select=* их не возвращает, оно отдаёт базовые поля товара. Пустое свойство приходит ключом со значением null, заполненное — объектом { "valueId": …, "value": … }, как в Получить товар CRM.
Номер свойства не проверяется. Имя вида PROPERTY_<N> принимается с любым номером. Если свойства с таким номером на портале нет, ключ не приходит в ответе — ни отказа, ни предупреждения при этом не будет. Действующие номера — в Полях товара CRM.