properties — those come in "> properties — those come in "> properties — those come in ">

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

Terminal
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

Terminal
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

javascript
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

javascript
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

JSON
{
  "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:

JSON
{
  "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.

See also