#Завершить составную загрузку

POST /v1/storage/objects/multipart/complete

Финализирует сессию составной загрузки: собирает загруженные части в единый объект хранилища и переводит его в статус COMPLETED. Возвращает готовый объект.

#Поля запроса (body)

Тело запроса — JSON.

Параметр Тип Обяз. По умолч. Описание
objectId string да Идентификатор объекта, полученный из ответа /multipart/create
parts array да Непустой массив описателей частей с номерами и ETag
parts[].partNumber number да Номер части (целое от 1 до 10 000); должен совпадать с номерами из ответа /multipart/create; дубликаты не допускаются
parts[].etag string да Значение заголовка ETag из ответа на PUT-запрос части; принимается со скобками ("abc...") и без

#Примеры

#curl — личный ключ

Terminal
curl -X POST https://vibecode.bitrix24.tech/v1/storage/objects/multipart/complete \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "objectId": "cmpfg012a01aco510mrr6u632",
    "parts": [
      { "partNumber": 1, "etag": "b315b942673d13dbdd2d866e92b0ec13" },
      { "partNumber": 2, "etag": "a1b2c3d4e5f678901234567890abcdef" }
    ]
  }'

#curl — OAuth-приложение

Terminal
curl -X POST https://vibecode.bitrix24.tech/v1/storage/objects/multipart/complete \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "objectId": "cmpfg012a01aco510mrr6u632",
    "parts": [
      { "partNumber": 1, "etag": "b315b942673d13dbdd2d866e92b0ec13" },
      { "partNumber": 2, "etag": "a1b2c3d4e5f678901234567890abcdef" }
    ]
  }'

#JavaScript — личный ключ

javascript
// uploadedParts — массив { partNumber, etag }, собранный на шаге PUT-загрузки частей
const res = await fetch(
  'https://vibecode.bitrix24.tech/v1/storage/objects/multipart/complete',
  {
    method: 'POST',
    headers: {
      'X-Api-Key': 'YOUR_API_KEY',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      objectId: 'cmpfg012a01aco510mrr6u632',
      parts: uploadedParts,
    }),
  }
)
const { object } = await res.json()
console.log('Object ID:', object.id)

#JavaScript — OAuth-приложение

javascript
const res = await fetch(
  'https://vibecode.bitrix24.tech/v1/storage/objects/multipart/complete',
  {
    method: 'POST',
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      objectId: 'cmpfg012a01aco510mrr6u632',
      parts: uploadedParts,
    }),
  }
)
const { object } = await res.json()

#Поля ответа

Поле Тип Описание
object.id string Идентификатор объекта
object.key string Логический ключ объекта
object.contentType string MIME-тип файла
object.sizeBytes string Размер файла в байтах (строка)
object.sha256 string SHA-256 хеш файла или null
object.visibility string Видимость: PRIVATE или PUBLIC
object.uploadStatus string Статус загрузки: COMPLETED
object.createdAt string Дата создания (ISO 8601)
object.deletedAt string Дата удаления или null

#Пример ответа

JSON
{
  "object": {
    "id": "cmpfg012a01aco510mrr6u632",
    "key": "videos/lecture-01.mp4",
    "contentType": "video/mp4",
    "sizeBytes": "209715200",
    "sha256": null,
    "visibility": "PRIVATE",
    "uploadStatus": "COMPLETED",
    "createdAt": "2026-05-21T12:03:56.387Z",
    "deletedAt": null
  }
}

#Пример ответа при ошибке

400 — передано неверное количество частей:

JSON
{
  "success": false,
  "error": {
    "code": "STORAGE_INVALID_PARTS",
    "message": "Expected 2 parts, got 1"
  }
}

#Ошибки

HTTP Код Описание
403 STORAGE_SCOPE_REQUIRED API-ключу не хватает скоупа vibe:storage
401 STORAGE_NO_AUTH_CONTEXT Запрос выполнен без авторизации
400 STORAGE_INVALID_PATH Идентификатор вызывающего содержит недопустимые символы пути
400 STORAGE_OBJECT_ID_REQUIRED Не передано поле objectId
400 STORAGE_PARTS_REQUIRED Поле parts отсутствует или является пустым массивом
400 STORAGE_INVALID_PART Элемент массива parts содержит недопустимый partNumber (не целое в диапазоне 1–10 000, дубликат) или пустой etag
404 STORAGE_OBJECT_NOT_FOUND Объект с указанным objectId не найден или сессия составной загрузки уже завершена
400 STORAGE_INVALID_PARTS Количество частей не совпадает с partCount из /create, либо хранилище отклонило сборку из-за неверных ETag
503 STORAGE_FEATURE_DISABLED Хранилище отключено для портала
503 STORAGE_STS_UNAVAILABLE Служба выдачи временных учётных данных недоступна
502 STORAGE_BUCKET_ERROR Ошибка при взаимодействии с хранилищем

Полный список общих ошибок API — Ошибки.

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