---
title: "Открыть сессию загрузки файла складского импорта"
method: POST
path: "/api/v1/stock/imports/upload-sessions"
tags: ["Stock imports"]
---

# Открыть сессию загрузки файла складского импорта

`POST /api/v1/stock/imports/upload-sessions`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/stock/imports/upload-sessions`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://erp.akeda.ru/oauth2/authorize`, token URL `https://erp.akeda.ru/oauth2/token`, scopes: `akeda:delegate`)

Файл импорта (XLSX, XLS, ODS, CSV или TSV до 25 МиБ) кладётся прямо в хранилище кабинета по подписанному адресу, мимо API: так его загружают агент по MCP и клиенты без формы. Ответ называет путь байтов: post — один multipart POST на upload.url с полями upload.fields и файлом последним полем upload.file_field; parts — PUT каждой части на upload.direct_urls; api — хранилище подписывать не умеет, байты идут PUT на upload.url этого API с авторизацией. Затем stockFinishUploadSession проверяет размер, контрольную сумму и антивирус, разбирает таблицу и заводит прогон импорта со статусом uploaded и номером сессии — дальше inspect, mapping, preview и apply. Пара kind+mode та же, что у загрузки формой: initial_stock — только create_only, kit_specs — create_only или upsert, document_items — upsert или replace, остальные виды — только upsert. Имена filename и size приняты как синонимы name и size_bytes. Прогон принадлежит открывшему сессию; её открывает пользователь или агент от его имени.

## Request body

- StockImportUploadSessionRequest: Заявка на сессию загрузки файла складского импорта. filename и size — синонимы name и size_bytes.
  - `kind` 'initial_stock' | 'inventory_count' | 'document_items' | 'reorder_rules' | 'kit_specs' | 'agent_report_lines', required: Вид складской ЗАГРУЗКИ. Выгрузка шире, у неё свой перечень StockExportKind. agent_report_lines — строки отчёта комиссионера для формы отчёта в «Документах»; прогон только проверяет строки и находит товары, apply его не применяет
  - `mode` 'create_only' | 'upsert' | 'replace', required: Режим загрузки: create_only — initial_stock, kit_specs и agent_report_lines; upsert — добавить строки, строки с ID строки обновить (меняются только присланные колонки, __CLEAR__ очищает поле); replace — только document_items, строки файла заменяют все строки черновика
  - `name` string: Имя файла с расширением xlsx, xls, ods, csv или tsv
  - `mime_type` string: Тип содержимого; по умолчанию — по расширению файла
  - `size_bytes` integer: Точный размер файла в байтах
  - `sha256` string: Необязательная контрольная сумма SHA-256 строчными шестнадцатеричными знаками
  - `target_document_id` string, uuid
  - `filename` string: Синоним поля name
  - `size` integer: Синоним поля size_bytes

## Response `201`

Сессия и адрес для байтов

- TransferSession: Сессия загрузки файла по подписанному адресу хранилища. Ключи хранилища наружу не отдаются.
  - `id` string, uuid, required
  - `owner_type` string, required
  - `owner_id` string
  - `name` string, required
  - `mime_type` string, required
  - `size_bytes` integer, required
  - `sha256` string
  - `attributes` object
  - `status` 'pending' | 'processing' | 'attached' | 'failed' | 'expired', required
  - `failure` 'infected' | 'size' | 'checksum' | 'storage' | 'owner' | 'aborted' | 'expired'
  - `failure_detail` string
  - `scan_status` 'pending' | 'clean' | 'infected' | 'skipped'
  - `scan_verdict` string
  - `published_ref` string: Номер строки, заведённой по файлу; у почты — id загрузки для upload_ids
  - `expires_at` string, date-time, required
  - `created_at` string, date-time, required
  - `completed_at` string, date-time
  - `upload` TransferInstructions: Как передать байты. Выдаётся один раз, при открытии сессии.
    - `mode` 'post' | 'parts' | 'api', required: post — один multipart POST; parts — PUT каждой части; api — PUT через этот API с авторизацией
    - `url` string
    - `method` string
    - `fields` object: Поля формы для POST; файл идёт после них последним полем
    - `file_field` string: Имя поля формы для файла
    - `headers` object
    - `part_bytes` integer
    - `part_count` integer
    - `direct_urls` object: Подписанный адрес каждой части по её номеру, начиная с 1
    - `requires_authorization` boolean, required: true — адрес требует токен API, агенту по MCP этот путь недоступен
    - `max_bytes` integer, required
    - `expires_at` string, date-time, required

## Other responses

- `400`: Некорректный запрос или нарушение бизнес-правила
- `401`: Сессия, ключ или кабинет не подтверждены
- `403`: Текущая роль не имеет требуемого права
- `413`: Файл больше разрешённых 25 МБ
- `503`: Внешний банк, справочник или контур подключений временно недоступен

---

[API](https://skmtc.dev/akeda/apis/akeda-erp-client-api.md) · [All operations](https://skmtc.dev/akeda/apis/akeda-erp-client-api/llms.txt) · [OpenAPI document](https://skmtc.dev/akeda/apis/akeda-erp-client-api/revisions/a99574d597cc?raw)
