[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-storage\u002Fupload\u002Fdirect":3,"docs-tabs-storage\u002Fupload\u002Fdirect":6},{"content":4,"lastmod":5},"## Прямая загрузка файла\n\n`POST \u002Fv1\u002Fstorage\u002Fobjects\u002Fupload`\n\nЗагружает файл до 10 МБ одним запросом в формате `multipart\u002Fform-data` — сервер принимает файл и возвращает готовый объект хранилища.\n\n## Поля запроса (body)\n\nТело запроса должно быть в формате `multipart\u002Fform-data`.\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `file` | file | да | — | Бинарный файл размером не более 10 МБ. MIME-тип определяется из заголовка `Content-Type` части формы. Если заголовок отсутствует, используется `application\u002Foctet-stream` |\n| `key` | string | да | — | Логический ключ объекта: от 1 до 1024 символов, допустимы `a-z`, `A-Z`, `0-9`, `.`, `_`, `\u002F`, `-`. Не начинать с `\u002F` или `.`, не содержать `..` |\n| `visibility` | string | нет | `PRIVATE` | Видимость объекта: `PRIVATE` или `PUBLIC` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fstorage\u002Fobjects\u002Fupload \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -F \"file=@avatar.png;type=image\u002Fpng\" \\\n  -F \"key=users\u002F42\u002Favatar.png\" \\\n  -F \"visibility=PRIVATE\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fstorage\u002Fobjects\u002Fupload \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -F \"file=@avatar.png;type=image\u002Fpng\" \\\n  -F \"key=users\u002F42\u002Favatar.png\" \\\n  -F \"visibility=PRIVATE\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst formData = new FormData()\nformData.append('file', fileInput.files[0])\nformData.append('key', 'users\u002F42\u002Favatar.png')\nformData.append('visibility', 'PRIVATE')\n\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fstorage\u002Fobjects\u002Fupload', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n  body: formData,\n})\n\nif (!res.ok) {\n  const { error } = await res.json()\n  console.error(error.code, error.message)\n  return\n}\nconst { object } = await res.json()\nconsole.log('Object ID:', object.id)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst formData = new FormData()\nformData.append('file', fileInput.files[0])\nformData.append('key', 'users\u002F42\u002Favatar.png')\nformData.append('visibility', 'PRIVATE')\n\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fstorage\u002Fobjects\u002Fupload', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n  body: formData,\n})\n\nconst { object } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `object.id` | string | Идентификатор объекта |\n| `object.key` | string | Логический ключ объекта |\n| `object.contentType` | string | MIME-тип файла |\n| `object.sizeBytes` | string | Размер файла в байтах (строка) |\n| `object.sha256` | string | SHA-256 хеш файла. При прямой загрузке вычисляется всегда |\n| `object.visibility` | string | Видимость: `PRIVATE` или `PUBLIC` |\n| `object.uploadStatus` | string | Статус загрузки: `COMPLETED` |\n| `object.createdAt` | string | Дата создания (ISO 8601) |\n| `object.deletedAt` | string | Дата удаления или `null` |\n\n## Пример ответа\n\n```json\n{\n  \"object\": {\n    \"id\": \"cmpf9b1gp003omr0zkc0qjojn\",\n    \"key\": \"users\u002F42\u002Favatar.png\",\n    \"contentType\": \"image\u002Fpng\",\n    \"sizeBytes\": \"20480\",\n    \"sha256\": \"10068f1908d45621f11b50a1d23ddc0720a669c15f45a43d883604e7793537cd\",\n    \"visibility\": \"PRIVATE\",\n    \"uploadStatus\": \"COMPLETED\",\n    \"createdAt\": \"2026-05-21T08:56:32.809Z\",\n    \"deletedAt\": null\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n415 — для `PUBLIC`-объектов передан MIME-тип, недопустимый из соображений межсайтового выполнения скриптов:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"STORAGE_FORBIDDEN_CONTENT_TYPE\",\n    \"message\": \"Content-Type text\u002Fhtml is not allowed for PUBLIC objects (XSS-prone)\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 403 | `STORAGE_SCOPE_REQUIRED` | API-ключу не хватает скоупа `vibe:storage` |\n| 401 | `STORAGE_NO_AUTH_CONTEXT` | Запрос выполнен без авторизации |\n| 400 | `STORAGE_FILE_REQUIRED` | Не передано поле `file` |\n| 400 | `STORAGE_KEY_REQUIRED` | Не передано поле `key` |\n| 400 | `STORAGE_INVALID_KEY` | Значение `key` нарушает правила формата |\n| 400 | `STORAGE_INVALID_VISIBILITY` | Недопустимое значение `visibility` |\n| 400 | `STORAGE_MULTIPART_PARSE_FAILED` | Не удалось разобрать тело запроса как `multipart\u002Fform-data` |\n| 413 | `STORAGE_UPLOAD_TOO_LARGE` | Файл превышает 10 МБ — используйте предподписанный URL |\n| 415 | `STORAGE_FORBIDDEN_CONTENT_TYPE` | Для `PUBLIC`-объектов запрещены типы `text\u002Fhtml`, `application\u002Fjavascript`, `application\u002Fx-javascript`, `image\u002Fsvg+xml` |\n| 402 | `BILLING_INSUFFICIENT` | Недостаточно средств на балансе |\n| 507 | `STORAGE_QUOTA_EXCEEDED` | Исчерпана квота хранилища |\n| 503 | `STORAGE_FEATURE_DISABLED` | Хранилище отключено для портала |\n| 502 | `STORAGE_BUCKET_ERROR` | Ошибка при взаимодействии с хранилищем |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Файлы крупнее 10 МБ.** Для файлов от 10 МБ до 5 ГБ используйте [предподписанный URL](\u002Fdocs\u002Fstorage\u002Fupload\u002Fpresigned) (Путь B). Для файлов крупнее 5 ГБ — [составную загрузку](\u002Fdocs\u002Fstorage\u002Fupload\u002Fmultipart-create) (Путь C).\n\n**Проверка типа для `PUBLIC`-объектов.** Проверка выполняется по заявленному `Content-Type` части формы до записи файла — при нарушении запрос отклоняется без обращения к хранилищу.\n\n## Смотрите также\n\n- [Загрузка](\u002Fdocs\u002Fstorage\u002Fupload)\n- [Создать предподписанный URL](\u002Fdocs\u002Fstorage\u002Fupload\u002Fpresigned)\n- [Подтвердить загрузку](\u002Fdocs\u002Fstorage\u002Fupload\u002Fcomplete)\n- [Составная загрузка](\u002Fdocs\u002Fstorage\u002Fupload\u002Fmultipart-create)\n- [Хранилище](\u002Fdocs\u002Fstorage)\n","2026-07-14",{}]