For AI agents: markdown of this page — /docs-content-en/entities/products/list.md documentation index — /llms.txt
Product list
GET /v1/products
Returns a list of CRM catalog products with support for filtering, sorting, and auto-pagination. A list item contains the base product fields without the custom PROPERTY_<N> properties — those come in GET /v1/products/:id.
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
limit |
number | 50 |
Number of records (up to 5000). When limit > 50 the request is automatically assembled from multiple pages on the server side |
offset |
number | 0 |
Offset from the start of the result set |
select |
string | — | Field selection: ?select=id,name,price,active |
order |
object | — | Sorting by the id, name, sort fields. Example: ?order[sort]=desc, ?order[name]=asc. The price and currency fields do not support sorting |
filter |
object | — | Only exact equality and $in (IN-set) on the id, name, code, xmlId, active, sectionId, sort fields. Operators (>, >=, <, <=, !, %, $ne, $contains, $nin) and filtering by other fields (price, currency) are not supported — you will get 400 UNSUPPORTED_FILTER.Filtering syntax. Example: ?filter[active]=true |
Examples
curl — personal key
curl "https://vibecode.bitrix24.com/v1/products?filter[active]=true&order[sort]=desc&limit=10" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl "https://vibecode.bitrix24.com/v1/products?filter[active]=true&order[sort]=desc&limit=10" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — personal key
const params = new URLSearchParams({
'filter[active]': 'true',
'order[sort]': 'desc',
limit: '10',
})
const res = await fetch(`https://vibecode.bitrix24.com/v1/products?${params}`, {
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { success, data, meta } = await res.json()
console.log(`Products: ${meta.total}`)
JavaScript — OAuth application
const params = new URLSearchParams({
'filter[active]': 'true',
'order[sort]': 'desc',
limit: '10',
})
const res = await fetch(`https://vibecode.bitrix24.com/v1/products?${params}`, {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { success, data, meta } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data |
array | Array of products. For the item's field set, see Product fields |
meta.total |
number | Total number of records matching the filter |
meta.hasMore |
boolean | Whether there are more records beyond limit |
The store card URL of any product from the data array on the portal is built from catalogId and id:
https://<portal>.bitrix24.com/shop/catalog/<catalogId>/product/<id>/
<portal> is the portal domain. Access is restricted by the employee's permissions in Bitrix24.
Response example
{
"success": true,
"data": [
{
"id": 6967,
"name": "Main 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
},
{
"id": 533,
"name": "test",
"code": "test",
"active": true,
"previewPicture": null,
"detailPicture": null,
"sort": 500,
"xmlId": "533",
"updatedAt": "2023-08-21T09:12:18.000Z",
"createdAt": "2021-07-20T11:01:36.000Z",
"modifyBy": 29,
"createdBy": 99,
"catalogId": 25,
"sectionId": 19,
"description": null,
"descriptionType": "html",
"price": 10,
"currency": "USD",
"vatId": 1,
"vatIncluded": false,
"measure": 9
}
],
"meta": {
"total": 19,
"hasMore": true
}
}
Error response example
400 — operator or unsupported field in the filter:
{
"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."
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | UNSUPPORTED_FILTER |
Operator or unsupported field in the filter. Filter by exact equality or $in on id, name, code, xmlId, active, sectionId, sort |
| 400 | INVALID_FILTER |
Error in the filter syntax |
| 403 | SCOPE_DENIED |
The API key does not have the crm scope |
| 401 | MISSING_API_KEY |
The X-Api-Key header was not passed |
For the full list of common API errors, see Errors.