Для AI-агентов: markdown этой страницы — /docs-content/entities/catalog-documents/search.md индекс документации — /llms.txt
Поиск складских документов
POST /v1/catalog-documents/search
Ищет складские документы по условиям из тела запроса. Подходит для фильтров с операторами и выборок по диапазону дат. Для выборки без таких условий достаточно списка с фильтром в строке запроса.
Поля запроса (body)
| Поле | Тип | По умолч. | Описание |
|---|---|---|---|
filter |
object | — | Фильтрация по полям GET /v1/catalog-documents/fields.Синтаксис фильтрации. Пример: {"docType": {"$in": ["A", "S"]}, "status": "N"} |
select |
string[] | — | Поля в ответе: ["id", "title", "status"]. Принимается и строка через запятую "id,title,status". Имена — из GET /v1/catalog-documents/fields |
sort |
string | object | string[] | — | Сортировка: "-id" — по убыванию, "id" — по возрастанию, или объект {"id": "desc"}. Принимается и под именем order. Без поля документы идут по возрастанию id |
limit |
number | 50 |
Количество записей, от 1 до 5000. Значение больше 5000 сокращается до 5000 |
offset |
number | 0 |
Сколько записей пропустить. Значение больше нуля вместе с разбиением на окна отклоняется — см. UNSTABLE_OFFSET_PAGINATION в разделе «Ошибки» |
autoWindow |
boolean | true |
Разбивать выборку на недельные окна при фильтре по диапазону дат шире 14 дней. false отключает разбиение |
Примеры
curl — личный ключ
curl -X POST "https://vibecode.bitrix24.tech/v1/catalog-documents/search" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"filter": { "docType": "S", "status": "N" },
"select": ["id", "title", "docType", "status", "total"],
"sort": "-id",
"limit": 2
}'
curl — OAuth-приложение
curl -X POST "https://vibecode.bitrix24.tech/v1/catalog-documents/search" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"filter": { "docType": "S", "status": "N" },
"select": ["id", "title", "docType", "status", "total"],
"sort": "-id",
"limit": 2
}'
JavaScript — личный ключ
const res = await fetch('https://vibecode.bitrix24.tech/v1/catalog-documents/search', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
filter: { docType: 'S', status: 'N' },
select: ['id', 'title', 'docType', 'status', 'total'],
sort: '-id',
limit: 2,
}),
})
const { success, data, meta } = await res.json()
console.log(`Получено непроведённых оприходований: ${data.length}`)
JavaScript — OAuth-приложение
const res = await fetch('https://vibecode.bitrix24.tech/v1/catalog-documents/search', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
filter: { docType: 'S', status: 'N' },
select: ['id', 'title', 'docType', 'status', 'total'],
sort: '-id',
limit: 2,
}),
})
const { success, data, meta } = await res.json()
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | Всегда true при успехе |
data |
array | Массив складских документов (все поля — см. Поля складского документа). При заданном select — только перечисленные поля |
meta.total |
number | Точное количество документов под фильтром, если оно известно. При неполном обходе временных окон ключ отсутствует |
meta.hasMore |
boolean | Есть ли ещё документы за пределами limit |
meta.durationMs |
number | Длительность запроса в миллисекундах |
meta.autoWindowed |
boolean | true, если выборка разбита на недельные окна. Приходит только при разбиении |
meta.windowCount |
number | Число окон. Приходит при autoWindowed: true |
meta.batchWaves |
number | Число волн параллельных запросов по окнам. Приходит при autoWindowed: true |
meta.warnings |
array | Предупреждения о запросе. Приходит, когда в select есть имя, которого нет среди полей документа: код UNKNOWN_SELECT_FIELD, имя в поле field. Остальные поля возвращаются |
Конец выборки определяйте по meta.hasMore: страница, в которой записей ровно limit, тоже может оказаться последней.
Пример ответа
{
"success": true,
"data": [
{
"id": 299,
"title": "Корректировка остатков — склад 11",
"docType": "S",
"status": "N",
"total": null
},
{
"id": 151,
"title": "оприходование 33",
"docType": "S",
"status": "N",
"total": null
}
],
"meta": {
"total": 36,
"hasMore": true,
"durationMs": 103
}
}
С фильтром по диапазону дат шире 14 дней, например {"filter": {">=dateCreate": "2025-01-01T00:00:00Z", "<dateCreate": "2025-07-01T00:00:00Z"}}, в meta дополнительно приходят autoWindowed, windowCount и batchWaves:
{
"success": true,
"data": [
{
"id": 1,
"title": "Оприходование #2",
"dateCreate": "2025-01-10T11:49:37.000Z"
},
{
"id": 3,
"title": "Приходная накладная #12",
"dateCreate": "2025-06-27T05:00:47.000Z"
}
],
"meta": {
"total": 2,
"hasMore": false,
"autoWindowed": true,
"windowCount": 26,
"batchWaves": 1,
"durationMs": 219
}
}
В примере выше все окна прочитаны успешно, повторы удалены, поэтому meta.total содержит точное число совпадений. При ранней остановке по limit или неполной выдаче окон ключ meta.total отсутствует. Дополнительный обход только ради счётчика не выполняется. Количество возвращённых документов — data.length; наличие следующих результатов определяет meta.hasMore.
Пример ответа при ошибке
400 — фильтр по полю, которого нет у документа:
{
"success": false,
"error": {
"code": "UNKNOWN_FILTER_FIELD",
"message": "Unknown filter field 'bogus' for entity 'catalog-documents'. Available: id, docType, currency, responsibleId, status, dateStatus, createdBy, dateCreate, title, docNumber, commentary, dateDocument, siteId, total, modifiedBy, statusBy, dateModify"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 400 | UNKNOWN_FILTER_FIELD |
Фильтр по полю, которого нет у документа. Сообщение перечисляет допустимые поля |
| 400 | UNKNOWN_SORT_FIELD |
Сортировка по полю, которого нет у документа. Сообщение перечисляет допустимые поля |
| 400 | INVALID_FILTER_OPERATOR |
В фильтре передан неподдерживаемый оператор. Сообщение перечисляет поддерживаемые |
| 400 | INVALID_SORT_TYPE |
sort передан не строкой, не объектом и не массивом строк, например числом |
| 400 | INVALID_SELECT_TYPE |
select передан не строкой и не массивом строк, например числом |
| 400 | INVALID_LIMIT |
limit не является числом, например "abc" |
| 400 | INVALID_REQUEST |
Тело запроса — не JSON-объект, например массив |
| 400 | UNSTABLE_OFFSET_PAGINATION |
offset больше нуля вместе с фильтром по диапазону дат шире 14 дней. Возьмите всё одним запросом с limit до 5000, либо передайте autoWindow: false с сортировкой "sort": "id", либо разбейте диапазон дат на части сами |
| 403 | SCOPE_DENIED |
API-ключ не имеет скоупа catalog |
| 401 | MISSING_API_KEY |
Не передан заголовок X-Api-Key |
| 401 | INVALID_API_KEY |
Переданный API-ключ не найден |
| 401 | TOKEN_MISSING |
API-ключ не имеет настроенных токенов |
| 429 | RATE_LIMITED |
Превышен лимит запросов: 300 в минуту на портал, все API-ключи портала делят один лимит. Действующее значение — в заголовке x-ratelimit-limit. Повторите после срока из заголовка Retry-After |
Полный список общих ошибок API — Ошибки.