#Завершить составную загрузку
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 — личный ключ
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-приложение
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 — личный ключ
// 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-приложение
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 |
#Пример ответа
{
"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 — передано неверное количество частей:
{
"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 — Ошибки.