Для AI-агентов: markdown этой страницы — /docs-content/disk/search.md индекс документации — /llms.txt
Поиск по Диску
POST /v1/disk/search
Ищет файлы и папки во всём Диске, который сейчас доступен пользователю Битрикс24, и возвращает карточки объектов без содержимого файлов. Выдача читается постранично, по курсору.
Поля запроса (body)
| Поле | Тип | Обяз. | По умолч. | Описание |
|---|---|---|---|---|
Полеquery |
Типstring | Обяз.да | По умолч.— | ОписаниеПоисковая строка. Края обрезаются, пробелы внутри схлопываются в один. Длина — от 3 до 255 символов до и после этой обработки |
Полеtype |
Типstring | Обяз.да | По умолч.— | ОписаниеЧто искать: file, folder или all |
Полеfilter.storageId |
Типstring | Обяз.нет | По умолч.— | ОписаниеID хранилища, десятичная строка. Список хранилищ: GET /v1/storages |
Полеfilter.folderId |
Типstring | Обяз.нет | По умолч.— | ОписаниеID папки, десятичная строка. Корневая папка хранилища — поле rootFolderId в GET /v1/storages, вложенные папки — GET /v1/folders или objectId карточки с objectType: "folder" из этого поиска |
Полеfilter.fileType |
Типstring | Обяз.нет | По умолч.— | ОписаниеТип файла, например document. Длина от 1 до 64 символов. Только при type: "file", с другим type запрос отклоняется 400 INVALID_PARAMS |
Полеlimit |
Типnumber | Обяз.нет | По умолч.50 |
ОписаниеВерхняя граница числа карточек в ответе, от 1 до 1000 |
Полеcursor |
Типstring | Обяз.нет | По умолч.— | ОписаниеЗначение nextCursor из предыдущего ответа. В первом запросе не передаётся |
Других полей тело не принимает: неизвестное поле, как и поле в filter вне списка выше, даёт 400 INVALID_PARAMS.
Навигация
- Отправьте первый запрос без
cursor. - Если в ответе
hasMore: true, повторите запрос с теми жеquery,typeиfilter, передавnextCursorцеликом в полеcursor. - Продолжайте, пока
hasMoreне станетfalse. Страница может прийти корочеlimitи даже пустой приhasMore: true— это не конец выдачи.
Курсор действует час с момента первого запроса обхода, продолжение срок не продлевает. Курсор привязан к строке поиска, type, filter и к привязке ключа из GET /v1/disk/capabilities. Просроченный курсор, курсор от другого запроса и курсор после роста identity.accountGeneration дают 403 DISK_GENERATION_STALE — начните обход заново без cursor.
Примеры
curl — личный ключ
curl -X POST https://vibecode.bitrix24.tech/v1/disk/search \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "vibe-disk-docs-check",
"type": "file",
"limit": 1
}'
curl — OAuth-приложение
curl -X POST https://vibecode.bitrix24.tech/v1/disk/search \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "vibe-disk-docs-check",
"type": "file",
"limit": 1
}'
JavaScript — личный ключ
// Обход всех страниц выдачи курсором
const items = []
let cursor
do {
const res = await fetch('https://vibecode.bitrix24.tech/v1/disk/search', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
query: 'vibe-disk-docs-check',
type: 'file',
limit: 1,
...(cursor ? { cursor } : {}),
}),
})
const { success, data, error } = await res.json()
if (!success) throw new Error(error.code)
items.push(...data.items)
cursor = data.hasMore ? data.nextCursor : undefined
} while (cursor)
console.log(items.map(item => item.name))
JavaScript — OAuth-приложение
const res = await fetch('https://vibecode.bitrix24.tech/v1/disk/search', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
query: 'vibe-disk-docs-check',
type: 'file',
limit: 1,
}),
})
const { data } = await res.json()
console.log(data.items, data.hasMore)
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
Полеsuccess |
Типboolean | Описаниеtrue при успешном ответе |
Полеdata.items |
Типarray | ОписаниеКарточки найденных объектов, не больше limit |
Полеdata.items[].objectId |
Типstring | ОписаниеID файла или папки. Для файла подходит в GET /v1/files/:id, для папки — в filter.folderId следующего поиска |
Полеdata.items[].objectType |
Типstring | Описаниеfile или folder |
Полеdata.items[].name |
Типstring | ОписаниеНазвание объекта |
Полеdata.items[].storageId |
Типstring | ОписаниеID хранилища, в котором лежит объект |
Полеdata.items[].parentId |
Типstring | ОписаниеID родительской папки. Может отсутствовать |
Полеdata.items[].size |
Типstring | ОписаниеТолько у файла. Размер в байтах, десятичная строка |
Полеdata.items[].contentFileId |
Типstring | ОписаниеТолько у файла. ID текущего содержимого файла |
Полеdata.items[].contentGeneration |
Типstring | ОписаниеТолько у файла. Номер текущей версии содержимого. Вместе с contentFileId и size нужен для загрузки новой версии через POST /v1/disk/uploads/reserve |
Полеdata.items[].safeLink |
Типstring | ОписаниеАдрес объекта в веб-интерфейсе Битрикс24. Только https, без параметров и учётных данных. Ссылкой на скачивание не является. Отсутствует, если портал не отдал такой адрес |
Полеdata.items[].source |
Типstring | ОписаниеПроисхождение карточки. В поиске всегда native-current — текущие данные портала на момент запроса |
Полеdata.hasMore |
Типboolean | ОписаниеЕсть ли продолжение выдачи |
Полеdata.nextCursor |
Типstring | ОписаниеКурсор следующей страницы. Только при hasMore: true, см. «Навигация» |
Полеdata.truncated |
Типboolean | Описаниеtrue, когда выдача упёрлась в предел 1000 позиций поиска портала: результаты дальше этой границы недоступны, уточните query или filter |
Полеdata.limitations |
Типstring[] | ОписаниеПояснения к выдаче на английском. Первые две строки приходят всегда. Дополнительные строки сообщают, что часть найденных объектов не удалось показать или что страница закончилась раньше из-за ограничения времени или размера ответа — тогда продолжайте обход по nextCursor |
Пример ответа
Первая страница при limit: 1 — найдено два файла, второй придёт по nextCursor:
{
"success": true,
"data": {
"items": [
{
"objectId": "10901",
"objectType": "file",
"name": "vibe-disk-docs-check-2.txt",
"storageId": "1",
"parentId": "1",
"size": "29",
"contentFileId": "39571",
"contentGeneration": "1",
"safeLink": "https://example.bitrix24.ru/company/personal/user/1/disk/file/vibe-disk-docs-check-2.txt",
"source": "native-current"
}
],
"hasMore": true,
"nextCursor": "4OI2oJB6n4E0MLK5:ipx34E3vaJmBYDYNX5IKpKEMOJJEocUC2GenIl8JleEm7X1UnoGfWTtf2E1/gDE0aR3Nq+fesCeRRqN3520Gq0hkB2XxI+rSCbg+W3T6NbfMNHYlDWg010aWQOYz2VkxapPddVjEYUT3BUX4Hn5j68DX05BTFZv9gE5F4qUwxcEOTaeW8ReIfBa/dcCR0CzHMaEVxmilisorOtaRWGLDhdtjvYgRmIQpcFSOPuEfYn2JWYTZPRQmcn92Bi8PZx1Y70zRSYXxzw/mrsYgzAuzICojBvE=:LaEM6qPdvLmXkEoPFgtftA==",
"truncated": false,
"limitations": [
"Native search pages contain at most 50 objects and offsets stop at 1000.",
"The native index and access rights can change between requests; search is not a stable snapshot."
]
}
}
На последней странице hasMore равно false, а поля nextCursor нет.
Пример ответа при ошибке
400 — поисковая строка короче трёх символов:
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "Disk request unavailable",
"retrySafe": false
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| HTTP400 | КодINVALID_PARAMS |
ОписаниеТело нарушает правила полей: не передан query или type, длина query вне 3–255, filter.fileType при type не file, limit вне 1–1000, ID не десятичная строка, неизвестное поле |
| HTTP401 | КодTOKEN_MISSING |
ОписаниеУ ключа нет настроенной авторизации на портале Битрикс24 |
| HTTP401 | КодDISK_AUTH_UNAVAILABLE |
ОписаниеНе удалось подтвердить пользователя Битрикс24: вебхук ключа не совпадает с порталом или пользователем, ключ OAuth-приложения передан без Authorization: Bearer, токен сессии принадлежит другому приложению или порталу, либо токен Битрикс24 истёк или отозван |
| HTTP401 | КодMISSING_API_KEY |
ОписаниеНе передан заголовок X-Api-Key |
| HTTP401 | КодINVALID_API_KEY |
ОписаниеКлюч не опознан |
| HTTP401 | КодTOKEN_REFRESH_FAILED |
ОписаниеНе удалось обновить авторизацию портала для ключа. Повтор не поможет, пока ключ не авторизован заново |
| HTTP403 | КодDISK_GENERATION_STALE |
ОписаниеКурсор просрочен, выдан для другого запроса или до роста identity.accountGeneration. Начните обход без cursor |
| HTTP403 | КодDISK_ACCESS_DENIED |
ОписаниеБитрикс24 отказал пользователю в доступе к поиску |
| HTTP403 | КодSCOPE_DENIED |
ОписаниеУ ключа нет скоупа disk |
| HTTP501 | КодDISK_UNSUPPORTED |
ОписаниеПортал не поддерживает поиск по Диску — признак search.available в GET /v1/disk/capabilities |
| HTTP502 | КодDISK_UNSUPPORTED |
ОписаниеПортал вернул выдачу в неожиданном виде либо первая же карточка превышает предел размера ответа |
| HTTP502 | КодDISK_READ_UNAVAILABLE |
ОписаниеПоиск не удался по причине, которой нет среди остальных кодов. Повторите запрос позже |
| HTTP503 | КодBITRIX_TIMEOUT |
ОписаниеОтведённые на запрос 20 секунд истекли до первого обращения к поиску портала, либо портал не ответил вовремя |
| HTTP503 | КодQUERY_LIMIT_EXCEEDED |
ОписаниеПортал ограничил частоту запросов |
| HTTP503 | КодQUEUE_OVERFLOW, QUEUE_TIMEOUT |
ОписаниеОчередь вызовов портала переполнена. Заголовок Retry-After называет паузу перед повтором |
| HTTP503 | Кодuser_self_deletion_pending |
ОписаниеВладелец ключа запросил удаление своей учётной записи — обращения к Диску остановлены |
| HTTP503 | КодRATE_LIMITED |
ОписаниеПортал ответил HTTP 429. Паузу перед повтором называет заголовок Retry-After |
| HTTP503 | КодERROR_LOOP_DETECTED |
ОписаниеПовторяющиеся ошибки этого ключа на этом методе временно остановили вызовы. Паузу называет заголовок Retry-After |
Полный список общих ошибок API — Ошибки.
Известные особенности
Выдача — не снимок Диска. Поисковый индекс портала и права доступа меняются между запросами, поэтому при обходе курсором объект может появиться, исчезнуть или сместиться между страницами.
Один запрос ограничен по времени и объёму. На запрос отводится 20 секунд, включая проверку пользователя. За один запрос читается столько страниц поиска портала по 50 позиций, сколько нужно на limit карточек, а карточки в ответе занимают не больше 2 МиБ. Если время, страницы или размер исчерпаны раньше, чем набралось limit карточек, ответ приходит с тем, что успело набраться, hasMore: true и строкой о причине в limitations.
Ключ «только чтение» ищет. Запрос не изменяет данные и доступен ключу в режиме «только чтение».
Содержимое одной папки. Чтобы получить содержимое известной папки с условиями по полям, а не искать по всему Диску, используйте POST /v1/files/search.