Для AI-агентов: markdown этой страницы — /docs-content/disk.md индекс документации — /llms.txt

Агент Диска

Агент Диска ищет файлы и папки на Диске Битрикс24, записывает файлы и проверяет, видны ли объекты пользователю.

Скоуп: disk | Базовый URL: https://vibecode.bitrix24.tech/v1 | Авторизация: X-Api-Key, для OAuth-приложения — также Authorization: Bearer

Все вызовы выполняются от имени одного пользователя Битрикс24: владельца личного ключа или пользователя сессии OAuth-приложения. Агент видит только то, что доступно этому пользователю.

Что доступно на портале, сообщает GET /v1/disk/capabilities. Вызывайте его первым: поиск, загрузка и синхронизация проверяются каждая своим признаком и не зависят друг от друга.

Запись файла идёт в два шага. Резерв фиксирует, что и куда записать, и выдаёт operationId. Загрузка передаёт содержимое по этому operationId и пишет в Битрикс24 ровно один раз. Повтор того же запроса не создаёт второй файл, а возвращает уже записанную операцию. Поэтому operationId сохраняйте до загрузки, а после сбоя читайте операцию, а не загружайте заново.

ID и размеры в ответах агента — строки. Курсор поиска и списка операций непрозрачен: передавайте его обратно без изменений.

Быстрый старт

Проверить возможности и найти файлы, в имени которых есть report:

Terminal
curl https://vibecode.bitrix24.tech/v1/disk/capabilities \
  -H "X-Api-Key: YOUR_API_KEY"

curl -X POST https://vibecode.bitrix24.tech/v1/disk/search \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "report", "type": "file", "limit": 10 }'

Полный пример

Записать текстовый файл в папку и прочитать результат операции. Скрипт для Node.js 18 и новее, ключ — в переменной окружения VIBE_API_KEY. ID папки — из GET /v1/folders или поле rootFolderId хранилища из GET /v1/storages/:id.

javascript
import { createHash, randomUUID } from 'node:crypto'

const API = 'https://vibecode.bitrix24.tech/v1'
const headers = { 'X-Api-Key': process.env.VIBE_API_KEY, 'Content-Type': 'application/json' }

async function call(method, path, body) {
  const res = await fetch(API + path, { method, headers, body: body && JSON.stringify(body) })
  const json = await res.json()
  if (!json.success) throw new Error(`${path}: ${res.status} ${json.error.code}`)
  return json.data
}

// 1. Проверить, что загрузка доступна
const caps = await call('GET', '/disk/capabilities')
if (!caps.save.create) throw new Error('Загрузка новых файлов недоступна этому ключу')

// 2. Зарезервировать загрузку в папку
const folderId = '1'
const name = `report-${Date.now()}.txt`
const bytes = Buffer.from('Отчёт за неделю\n')
const contentHash = createHash('sha256').update(bytes).digest('hex')
const intent = [1, 'create', folderId, contentHash, String(bytes.length), null, name, 'createFail']
const reserve = await call('POST', '/disk/uploads/reserve', {
  reserveRequestId: randomUUID(),
  intent,
  lineage: { kind: 'initial' },
})

// 3. Передать содержимое
const upload = await call('POST', '/disk/uploads', {
  operationId: reserve.operationId,
  intentHash: reserve.intentHash,
  effectiveFilename: name,
  content: bytes.toString('base64'),
  contentHash,
})
console.log('Запись:', upload.application, 'файл', upload.fileId)

// 4. Прочитать операцию позже, например после перезапуска приложения
const op = await call('GET', `/disk/uploads/${reserve.operationId}`)
console.log('Сверка:', op.verification)

Результат прогона:

text
Запись: applied файл 10903
Сверка: matched

В рабочем приложении сохраняйте reserveRequestId, intent и operationId в своё хранилище до каждого следующего шага. Тогда после сбоя повтор того же запроса вернёт уже созданную операцию.

Справочник эндпоинтов

Метод Путь Описание
МетодGET Путь/v1/disk/capabilities ОписаниеВозможности агента Диска на портале
МетодPOST Путь/v1/disk/search ОписаниеПоиск файлов и папок
МетодPOST Путь/v1/disk/uploads/reserve ОписаниеЗарезервировать загрузку
МетодPOST Путь/v1/disk/uploads ОписаниеЗагрузить содержимое по резерву
МетодGET Путь/v1/disk/uploads ОписаниеСписок операций загрузки
МетодGET Путь/v1/disk/uploads/:operationId ОписаниеОперация загрузки
МетодPOST Путь/v1/disk/sync/check ОписаниеПроверить видимость объектов

Коды ошибок

Ошибки агента Диска приходят в конверте { "success": false, "error": { "code", "message", "retrySafe" } }. Поле message у них всегда Disk request unavailable, поэтому решение принимайте по code.

Ошибки агента Диска

HTTP Код Описание
HTTP400 КодINVALID_PARAMS ОписаниеТело или параметры запроса не прошли проверку
HTTP401 КодDISK_AUTH_UNAVAILABLE ОписаниеНе удалось подтвердить пользователя Битрикс24
HTTP403 КодDISK_ACCESS_DENIED ОписаниеБитрикс24 отказал пользователю в доступе
HTTP403, 409 КодDISK_GENERATION_STALE ОписаниеКурсор поиска устарел (403) или подключение ключа сменилось во время записи (409)
HTTP409 КодDISK_OPERATION_CONFLICT ОписаниеПовтор запроса с другим телом или содержимое не совпало с резервом
HTTP409 КодDISK_OPERATION_EXPIRED ОписаниеОперация не найдена или срок резерва истёк
HTTP409 КодDISK_PRIOR_REQUIRED ОписаниеПрошлая операция для продолжения или повтора не найдена, не завершена или не подходит по lineage.kind
HTTP409 КодDISK_OUTCOME_UNKNOWN ОписаниеРезультат прошлой операции неизвестен, продолжение от неё не принимается
HTTP409 КодDISK_VERSION_CONFLICT ОписаниеФайл изменился после того, как прочитано его состояние
HTTP413 КодDISK_UPLOAD_TOO_LARGE ОписаниеФайл больше 25 МиБ
HTTP501 КодDISK_UNSUPPORTED ОписаниеПортал не поддерживает возможность
HTTP502 КодDISK_READ_UNAVAILABLE ОписаниеЧтение с портала не удалось

Системные ошибки

HTTP Код Описание
HTTP401 КодMISSING_API_KEY ОписаниеНе передан заголовок X-Api-Key
HTTP401 КодTOKEN_MISSING ОписаниеУ ключа нет подключения к Битрикс24
HTTP403 КодSCOPE_DENIED ОписаниеУ ключа нет скоупа disk
HTTP403 КодWRITE_BLOCKED_READONLY ОписаниеКлюч в режиме «только чтение» не может загружать файлы
HTTP503 КодQUERY_LIMIT_EXCEEDED ОписаниеБитрикс24 ограничил частоту запросов

Условия каждого кода — на страницах эндпоинтов. Полный список общих ошибок — Ошибки.

Смотрите также