For AI agents: markdown of this page — /docs-content-en/entities/catalogs/search.md documentation index — /llms.txt
Search catalogs
POST /v1/catalogs/search
Search product catalogs with filters. Equivalent to GET /v1/catalogs with filters, but over POST, which is more convenient for conditions on multiple fields.
Request fields (body)
| Parameter | Type | Default | Description |
|---|---|---|---|
Parameterfilter |
Typeobject | Default— | DescriptionFilter by fields from GET /v1/catalogs/fields.Filtering syntax. Example: { "iblockTypeId": "CRM_PRODUCT_CATALOG" } |
Parameterlimit |
Typenumber | Default50 |
DescriptionNumber of records (up to 5000) |
Parameterselect |
Typestring[] | Default— | DescriptionField selection: ["id", "name"] |
Parametersort |
Typestring | Default— | DescriptionSort field from GET /v1/catalogs/fields. The - prefix means descending: "-id" |
Examples
curl — personal key
curl -X POST "https://vibecode.bitrix24.com/v1/catalogs/search" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"filter": { "iblockTypeId": "CRM_PRODUCT_CATALOG" },
"limit": 10
}'
curl — OAuth application
curl -X POST "https://vibecode.bitrix24.com/v1/catalogs/search" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"filter": { "iblockTypeId": "CRM_PRODUCT_CATALOG" },
"limit": 10
}'
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/catalogs/search', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
filter: { iblockTypeId: 'CRM_PRODUCT_CATALOG' },
limit: 10,
}),
})
const { success, data, meta } = await res.json()
console.log('Found:', meta.total)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/catalogs/search', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
filter: { iblockTypeId: 'CRM_PRODUCT_CATALOG' },
limit: 10,
}),
})
const { success, data, meta } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
Fieldsuccess |
Typeboolean | DescriptionAlways true on success |
Fielddata |
Typearray | DescriptionArray of catalogs (all fields — see Catalog fields) |
Fieldmeta.total |
Typenumber | DescriptionTotal number of catalogs matching the filter |
Fieldmeta.hasMore |
Typeboolean | DescriptionWhether there are more records beyond limit |
Fieldmeta.durationMs |
Typenumber | DescriptionRequest duration in milliseconds |
The meta fields sit next to data, not inside it. Page through the results using meta.hasMore: a data length equal to limit does not rule out the last page.
Response example
{
"success": true,
"data": [
{
"id": 25,
"iblockId": 25,
"iblockTypeId": "CRM_PRODUCT_CATALOG",
"lid": "s1",
"name": "CRM product catalog",
"productIblockId": null,
"skuPropertyId": null,
"subscription": "N",
"vatId": 1
},
{
"id": 27,
"iblockId": 27,
"iblockTypeId": "CRM_PRODUCT_CATALOG",
"lid": "s1",
"name": "CRM product catalog (offers)",
"productIblockId": 25,
"skuPropertyId": 101,
"subscription": "N",
"vatId": 1
}
],
"meta": {
"total": 2,
"hasMore": false,
"durationMs": 142
}
}
Error response example
400 — filter by a non-existent field:
{
"success": false,
"error": {
"code": "UNKNOWN_FILTER_FIELD",
"message": "Unknown filter field 'nonExistentField' for entity 'catalogs'. Available: id, iblockId, iblockTypeId, lid, name, productIblockId, skuPropertyId, subscription, vatId, yandexExport"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| HTTP400 | CodeUNKNOWN_FILTER_FIELD |
DescriptionFilter by a field the catalog does not have. The message contains the list of available fields |
| HTTP400 | CodeUNKNOWN_SORT_FIELD |
DescriptionSort by a field the catalog does not have. The message contains the list of available fields |
| HTTP403 | CodeSCOPE_DENIED |
DescriptionThe API key does not have the catalog scope |
| HTTP401 | CodeMISSING_API_KEY |
DescriptionThe X-Api-Key header was not provided |
| HTTP429 | CodeRATE_LIMITED |
DescriptionRate limit exceeded: 300 requests per minute per portal. All API keys of the portal share one limit. The current limit is returned in the x-ratelimit-limit header. Retry after the delay in the Retry-After header |
For the full list of common API errors, see Errors.
Known specifics
Product catalog or offers catalog. The catalog type in the output can be determined from the productIblockId and skuPropertyId fields: in a base product catalog both are null. In an offers catalog they are populated, where productIblockId is the iblockId of the linked product catalog.
When to use list instead of search: for a single simple condition it is easier to use GET /v1/catalogs with the filter query parameter.