# Быстрый склад API

HTTP API для первого работающего среза складского учёта. Это описание отражает реализованные маршруты; полный продуктовый план находится в соседнем репозитории `prompts`.

## Как получить доступ

Войдите в приложение, откройте **Настройки → API-токены** и создайте токен для интеграции. Скопируйте его сразу: секрет показывается только при выпуске. Вызовы API передают `Authorization: Bearer <токен>`. Токен можно отозвать в настройках. Эта спецификация описывает маршруты интеграции с Bearer; вход пользователя и управление токенами остаются в сессионном API приложения.

Документация на отдельном порту отправляет запросы через прокси к API и не использует сессию приложения. Введите токен в поле сверху, выберите метод и нажмите **Выполнить**. Токен хранится только в памяти открытой страницы.

## Запись данных

Для команд требуется заголовок `Idempotency-Key` длиной от 8 до 120 символов. Повтор той же команды с тем же ключом возвращает прежний ответ; другая команда с таким ключом отклоняется. В примерах замените `replace-with-unique-key` своим уникальным значением. Просмотрщик создаёт новый ключ, который можно изменить перед запросом.

Суммы передаются числом в основных денежных единицах с точностью до двух знаков. Заменяйте `replace-with-id` идентификаторами связанных сущностей из ответов API. Пустой склад не содержит демонстрационных товаров или документов.

## Машиночитаемая спецификация

Актуальный контракт доступен по [/openapi.json](/openapi.json). Его можно импортировать в любой клиент OpenAPI 3.1. Справочник ниже автоматически собран из этого контракта; примеры запросов строятся из схем полей.

## Как устроены складские данные

### Фильтры и товары

Фильтр и его значения — самостоятельные записи компании. Они сохраняются, даже если ими не пользуется ни один товар. Товар может ссылаться на значения через `filterValueIds`; назначение фильтра не создаёт отдельную складскую позицию. Для набора фильтров каталог принимает повторяющийся параметр `valueId`.

Товар имеет основной тип цены и может иметь дополнительные цены в `prices`. Отсутствующая цена выбранного типа остаётся отсутствующей: API не подставляет другую автоматически.

### Комплекты

Комплект создаётся как товар с `kind: "bundle"` и непустым `components`. Компонентами пока могут быть только действующие обычные товары. Комплект не имеет собственных партий; доступное количество считается по его компонентам на выбранном складе. Заказ сохраняет снимок состава, поэтому дальнейшее изменение карточки не меняет старый заказ.

### Склады

Название, краткое название, город и адрес склада меняются через `PATCH /api/v1/warehouses/{warehouseId}`. `archived: true` убирает склад из новых операций, сохраняя историю. Перед архивированием нужно вывести остаток и завершить открытые заказы. Пустой склад без ссылок можно удалить через `DELETE`; последний действующий склад удалить или архивировать нельзя.

### Заказы и остатки

Перед закупкой создайте поставщика и товар; перед заказом покупателя — покупателя и достаточный доступный остаток. В `partners/resolve` для поиска или создания контрагента нужен телефон или email. Поле `customer` или `supplier` содержит сохранённое имя контрагента. Заказ покупателя резервирует доступное количество, но не уменьшает физический остаток. Подтверждённая отгрузка списывает партии. Приёмка увеличивает остаток только на годное количество; брак и недостача хранятся отдельно. Списание и перемещение расходуют партии по FIFO либо по явно выбранной партии. История операций сохраняется в аудите.

### Загруженные закупочные документы

Файл можно отклонить через `DELETE /api/v1/procurement/imports/{importId}` с JSON `{}` и `Idempotency-Key`, пока из него не создан закупочный документ. Файл исчезает из очереди, его распознавание отменяется, отказ записывается в аудит. Остатки и закупки не меняются. Исходные байты остаются в общем хранилище: тот же файл может использоваться другими вложениями. При необходимости его можно загрузить заново с новым ключом. Если черновик уже создан, API возвращает `409 ALREADY_IMPORTED`; отмена закупки выполняется через сам документ.

Для файлов в очереди или обработке `GET /api/v1/procurement/imports` возвращает `recognition`: фактическое прошедшее время `elapsedSeconds`, место в очереди `queuePosition`, число замеров `sampleCount` и приблизительное время до готовности `estimatedRemainingSeconds`. Оценка использует среднюю длительность последних десяти успешных распознаваний этой компании текущей моделью и учитывает файлы перед текущим. До первого успешного замера оценка равна `null`. Если текущий или предшествующий файл обрабатывается дольше среднего времени, `estimateExceeded` становится `true`, а оценка — `null`. Фактические начало и длительность обработки сохраняются в `extraction.recognition`; ошибки подключения и старые импорты без замеров не используются как образцы скорости.

## Перенос данных из МойСклада

Откройте **Настройки → Импорт из МойСклада** в приложении. Введите токен с правами чтения, проверьте подключение, выберите данные и подготовьте предварительный отчёт. Склад на этом этапе не меняется. Просмотрите ошибки/замечания, подтвердите состав и нажмите «Перенести». Можно приостановить или продолжить задачу; после закрытия страницы сервер продолжает работу. Отмена останавливает дальнейшую запись, сохраняя уже перенесённые сущности. Повторный импорт узнаёт их по ID МойСклада и сохраняет локальные изменения.

Поддерживаются товары/услуги/модификации/комплекты, цены и простые дополнительные поля, контрагенты с контактами/счетами, склады и организации. Закупки переносятся черновиками: историческое проведение, остатки, резервы, оплаты, договоры и связи документов автоматически не переносятся. Чтобы номера разных типов не конфликтовали, добавляются префиксы МС-ЗП-, МС-СЧ-, МС-ПР-. Исходный номер, сложные дополнительные сведения и ссылки на фото/вложения сохраняются в JSON-отчёте. Цены поддерживаются в рублях; неизвестная валюта не считается рублём.

Сервер отправляет запросы последовательно с интервалом минимум 5,1 секунды, включая проверку соединения и повторные попытки. Это не более двух запросов за любое окно десять секунд внутри нашей системы. Ожидание, указанное МойСкладом при ограничении скорости, увеличивает паузу. Запросы иных приложений с тем же токеном находятся вне этого ограничителя.

Управление импортом требует сессии владельца. API-токен Быстрого склада для этих маршрутов не подходит; интерактивная документация направляет в приложение. Токен МойСклада хранится зашифрованным и никогда не появляется в ответах. Пока миграция 015 не применена, вкладка сообщает об ожидающем обновлении базы.

## Справочник методов

### Цены

#### POST /api/v1/price-types

Создать тип цены

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string, обязательно.
- `city` — string.

Тело запроса, полученное из схемы:

```json
{
  "name": "Название"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/price-types' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Название"}'
```

#### PATCH /api/v1/price-types/{priceTypeId}

Изменить тип цены

Параметры:

- `priceTypeId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string, обязательно.
- `city` — string.
- `archived` — boolean, обязательно.

Тело запроса, полученное из схемы:

```json
{
  "name": "Название",
  "archived": false
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/price-types/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Название","archived":false}'
```

### Типы цен

#### DELETE /api/v1/price-types/{priceTypeId}

Удалить тип цены и его цены товаров

Параметры:

- `priceTypeId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/price-types/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

### Фильтры

#### POST /api/v1/filters

Создать фильтр

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string, обязательно.

Тело запроса, полученное из схемы:

```json
{
  "name": "Название"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/filters' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Название"}'
```

#### PATCH /api/v1/filters/{filterId}

Изменить фильтр

Параметры:

- `filterId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string, обязательно.
- `archived` — boolean, обязательно.

Тело запроса, полученное из схемы:

```json
{
  "name": "Название",
  "archived": false
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/filters/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Название","archived":false}'
```

#### DELETE /api/v1/filters/{filterId}

Удалить фильтр, значения и привязки к товарам

Параметры:

- `filterId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/filters/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### POST /api/v1/filters/{filterId}/values

Добавить значение

Параметры:

- `filterId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string, обязательно.

Тело запроса, полученное из схемы:

```json
{
  "name": "Название"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/filters/replace-with-id/values' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Название"}'
```

#### PATCH /api/v1/filters/{filterId}/values/{valueId}

Изменить значение

Параметры:

- `filterId` — path, обязательно.
- `valueId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string, обязательно.
- `archived` — boolean, обязательно.

Тело запроса, полученное из схемы:

```json
{
  "name": "Название",
  "archived": false
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/filters/replace-with-id/values/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Название","archived":false}'
```

#### DELETE /api/v1/filters/{filterId}/values/{valueId}

Удалить значение и его привязки к товарам

Параметры:

- `filterId` — path, обязательно.
- `valueId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/filters/replace-with-id/values/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

### Товары

#### POST /api/v1/products

Создать товар или комплект

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `sku` — string.
- `name` — string, обязательно.
- `category` — string.
- `description` — string.
- `price` — number,null.
- `cost` — number,null.
- `minStock` — number,null.
- `code` — string.
- `externalCode` — string.
- `uom` — string.
- `country` — string.
- `weightKg` — number,null.
- `volumeM3` — number,null.
- `vatRate` — number,null.
- `minPrice` — number,null.
- `preferredSupplierId` — string,null.
- `parentProductId` — string,null.
- `barcodes` — array.
- `packages` — array.
- `analogIds` — array.
- `customValues` — object.
- `tags` — array.
- `kind` — string; product / bundle / service / variant.
- `components` — array.
- `filterValueIds` — array.
- `prices` — array.

Тело запроса, полученное из схемы:

```json
{
  "name": "Товар"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/products' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Товар"}'
```

#### PATCH /api/v1/products/{productId}

Изменить товар или комплект

Параметры:

- `productId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `sku` — string.
- `name` — string, обязательно.
- `category` — string.
- `description` — string.
- `price` — number,null.
- `cost` — number,null.
- `minStock` — number,null.
- `code` — string.
- `externalCode` — string.
- `uom` — string.
- `country` — string.
- `weightKg` — number,null.
- `volumeM3` — number,null.
- `vatRate` — number,null.
- `minPrice` — number,null.
- `preferredSupplierId` — string,null.
- `parentProductId` — string,null.
- `barcodes` — array.
- `packages` — array.
- `analogIds` — array.
- `customValues` — object.
- `tags` — array.
- `kind` — string; product / bundle / service / variant.
- `components` — array.
- `filterValueIds` — array.
- `prices` — array.
- `archived` — boolean.

Тело запроса, полученное из схемы:

```json
{
  "name": "Товар"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/products/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Товар"}'
```

#### DELETE /api/v1/products/{productId}

Удалить товар без операций и связей

Параметры:

- `productId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/products/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### DELETE /api/v1/products/{productId}/images/{imageId}

Удалить фотографию

Параметры:

- `productId` — path, обязательно.
- `imageId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/products/replace-with-id/images/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### GET /api/v1/catalog

Каталог с фильтрами и типом цены

Параметры:

- `valueId` — query; Несколько ID через повторяющийся параметр.
- `priceTypeId` — query.

Запрос `curl`, полученный из спецификации:

```bash
curl -X GET 'http://127.0.0.1:18576/api/v1/catalog' \
  -H 'Authorization: Bearer <API_TOKEN>'
```

#### GET /api/v1/images/{imageId}

Получить оригинал фотографии

Параметры:

- `imageId` — path, обязательно.

Запрос `curl`, полученный из спецификации:

```bash
curl -X GET 'http://127.0.0.1:18576/api/v1/images/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>'
```

#### POST /api/v1/products/{productId}/images

Загрузить фотографию

Параметры:

- `productId` — path, обязательно.
- `Idempotency-Key` — header, обязательно.

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/products/replace-with-id/images' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: image/jpeg' \
  --data-binary @image.jpg
```

### Контрагенты

#### POST /api/v1/partners

Создать контрагента

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string, обязательно.
- `type` — string; Поставщик / Покупатель.
- `roles` — array.
- `contact` — string.
- `phone` — string.
- `email` — string.
- `legalKind` — string.
- `fullName` — string.
- `inn` — string.
- `kpp` — string.
- `ogrn` — string.
- `legalAddress` — string.
- `actualAddress` — string.
- `contacts` — array.
- `bankAccounts` — array.
- `groups` — array.
- `note` — string.
- `priceTypeId` — string.
- `discountPercent` — number.
- `customValues` — object.

Тело запроса, полученное из схемы:

```json
{
  "name": "Название"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/partners' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Название"}'
```

#### PATCH /api/v1/partners/{partnerId}

Изменить контрагента

Параметры:

- `partnerId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string.
- `roles` — array.
- `contact` — string.
- `phone` — string.
- `email` — string.
- `legalKind` — string.
- `fullName` — string.
- `inn` — string.
- `kpp` — string.
- `ogrn` — string.
- `legalAddress` — string.
- `actualAddress` — string.
- `contacts` — array.
- `bankAccounts` — array.
- `groups` — array.
- `note` — string.
- `priceTypeId` — string.
- `discountPercent` — number.
- `archived` — boolean.
- `customValues` — object.

Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/partners/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### DELETE /api/v1/partners/{partnerId}

Удалить контрагента без связей

Параметры:

- `partnerId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/partners/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### POST /api/v1/partners/resolve

Найти или создать контрагента

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string, обязательно.
- `type` — string, обязательно; Поставщик / Покупатель.
- `phone` — string.
- `email` — string.

Тело запроса, полученное из схемы:

```json
{
  "name": "Контрагент",
  "type": "Поставщик",
  "phone": "+70000000000"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/partners/resolve' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Контрагент","type":"Поставщик","phone":"+70000000000"}'
```

### Организации

#### POST /api/v1/organizations

Создать собственное юридическое лицо

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string, обязательно.
- `legalKind` — string.
- `fullName` — string.
- `inn` — string.
- `kpp` — string.
- `ogrn` — string.
- `legalAddress` — string.
- `actualAddress` — string.
- `bankAccounts` — array.

Тело запроса, полученное из схемы:

```json
{
  "name": "Название"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/organizations' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Название"}'
```

#### PATCH /api/v1/organizations/{organizationId}

Изменить собственное юридическое лицо

Параметры:

- `organizationId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string.
- `legalKind` — string.
- `fullName` — string.
- `inn` — string.
- `kpp` — string.
- `ogrn` — string.
- `legalAddress` — string.
- `actualAddress` — string.
- `bankAccounts` — array.
- `archived` — boolean.

Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/organizations/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### DELETE /api/v1/organizations/{organizationId}

Удалить организацию без связей

Параметры:

- `organizationId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/organizations/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

### Договоры

#### POST /api/v1/contracts

Создать договор

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `partnerId` — string, обязательно.
- `organizationId` — string, обязательно.
- `kind` — string, обязательно; purchase / sale / commission.
- `number` — string.
- `signedAt` — string.
- `commissionPercent` — number.
- `note` — string.

Тело запроса, полученное из схемы:

```json
{
  "partnerId": "replace-with-id",
  "organizationId": "replace-with-id",
  "kind": "purchase"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/contracts' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"partnerId":"replace-with-id","organizationId":"replace-with-id","kind":"purchase"}'
```

#### PATCH /api/v1/contracts/{contractId}

Изменить договор

Параметры:

- `contractId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `partnerId` — string.
- `organizationId` — string.
- `kind` — string; purchase / sale / commission.
- `number` — string.
- `signedAt` — string.
- `commissionPercent` — number.
- `note` — string.
- `archived` — boolean.

Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/contracts/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### DELETE /api/v1/contracts/{contractId}

Удалить договор без связей

Параметры:

- `contractId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/contracts/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

### Дополнительные поля

#### POST /api/v1/custom-fields

Создать определение поля

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `entityKind` — string, обязательно.
- `name` — string, обязательно.
- `valueType` — string, обязательно; string / number / date / boolean / select.
- `options` — array.

Тело запроса, полученное из схемы:

```json
{
  "entityKind": "product",
  "name": "Название",
  "valueType": "string"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/custom-fields' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"entityKind":"product","name":"Название","valueType":"string"}'
```

#### PATCH /api/v1/custom-fields/{fieldId}

Изменить определение поля

Параметры:

- `fieldId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string.
- `options` — array.
- `archived` — boolean.

Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/custom-fields/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### DELETE /api/v1/custom-fields/{fieldId}

Удалить поле без сохранённых значений

Параметры:

- `fieldId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/custom-fields/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

### Интеграции

#### POST /api/v1/external-links

Связать внешний ID

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `source` — string, обязательно.
- `entityType` — string, обязательно; product / partner / order.
- `externalId` — string, обязательно.
- `internalId` — string, обязательно.

Тело запроса, полученное из схемы:

```json
{
  "source": "shop",
  "entityType": "product",
  "externalId": "external-123",
  "internalId": "replace-with-id"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/external-links' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"source":"shop","entityType":"product","externalId":"external-123","internalId":"replace-with-id"}'
```

#### GET /api/v1/external-links

Найти связь по внешнему ID

Параметры:

- `source` — query, обязательно.
- `entityType` — query, обязательно.
- `externalId` — query, обязательно.

Запрос `curl`, полученный из спецификации:

```bash
curl -X GET 'http://127.0.0.1:18576/api/v1/external-links?source=shop&entityType=product&externalId=external-123' \
  -H 'Authorization: Bearer <API_TOKEN>'
```

#### GET /api/v1/integrations/moysklad

Подключение и история импорта МойСклада (сессия владельца)

Запрос `curl`, полученный из спецификации:

```bash
curl -X GET 'http://127.0.0.1:18574/api/v1/integrations/moysklad' \
  --cookie 'bs_session=<SESSION_COOKIE>'
```

#### POST /api/v1/integrations/moysklad/connection

Проверить и сохранить шифрованный токен МойСклада

Параметры:

- `Idempotency-Key` — header, обязательно.

Поля JSON:

- `token` — string, обязательно.

Тело запроса, полученное из схемы:

```json
{
  "token": "<MOYSKLAD_TOKEN>"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18574/api/v1/integrations/moysklad/connection' \
  --cookie 'bs_session=<SESSION_COOKIE>' \
  -H 'Origin: http://127.0.0.1:18573' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"token":"<MOYSKLAD_TOKEN>"}'
```

#### DELETE /api/v1/integrations/moysklad/connection

Отключить МойСклад после завершения задач

Параметры:

- `Idempotency-Key` — header, обязательно.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18574/api/v1/integrations/moysklad/connection' \
  --cookie 'bs_session=<SESSION_COOKIE>' \
  -H 'Origin: http://127.0.0.1:18573' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### POST /api/v1/integrations/moysklad/jobs

Подготовить возобновляемый предварительный отчёт; склад не изменяется

Параметры:

- `Idempotency-Key` — header, обязательно.

Поля JSON:

- `products` — boolean, обязательно.
- `partners` — boolean, обязательно.
- `warehouses` — boolean, обязательно.
- `organizations` — boolean, обязательно.
- `purchases` — boolean, обязательно.

Тело запроса, полученное из схемы:

```json
{
  "products": true,
  "partners": true,
  "warehouses": true,
  "organizations": true,
  "purchases": false
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18574/api/v1/integrations/moysklad/jobs' \
  --cookie 'bs_session=<SESSION_COOKIE>' \
  -H 'Origin: http://127.0.0.1:18573' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"products":true,"partners":true,"warehouses":true,"organizations":true,"purchases":false}'
```

#### POST /api/v1/integrations/moysklad/jobs/{jobId}/pause

Приостановить импорт

Параметры:

- `jobId` — path, обязательно.
- `Idempotency-Key` — header, обязательно.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18574/api/v1/integrations/moysklad/jobs/replace-with-id/pause' \
  --cookie 'bs_session=<SESSION_COOKIE>' \
  -H 'Origin: http://127.0.0.1:18573' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### POST /api/v1/integrations/moysklad/jobs/{jobId}/resume

Продолжить с checkpoint

Параметры:

- `jobId` — path, обязательно.
- `Idempotency-Key` — header, обязательно.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18574/api/v1/integrations/moysklad/jobs/replace-with-id/resume' \
  --cookie 'bs_session=<SESSION_COOKIE>' \
  -H 'Origin: http://127.0.0.1:18573' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### POST /api/v1/integrations/moysklad/jobs/{jobId}/cancel

Отменить дальнейший перенос; созданные данные сохраняются

Параметры:

- `jobId` — path, обязательно.
- `Idempotency-Key` — header, обязательно.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18574/api/v1/integrations/moysklad/jobs/replace-with-id/cancel' \
  --cookie 'bs_session=<SESSION_COOKIE>' \
  -H 'Origin: http://127.0.0.1:18573' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### POST /api/v1/integrations/moysklad/jobs/{jobId}/apply

Начать запись после готового preview; закупки только черновиками

Параметры:

- `jobId` — path, обязательно.
- `Idempotency-Key` — header, обязательно.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18574/api/v1/integrations/moysklad/jobs/replace-with-id/apply' \
  --cookie 'bs_session=<SESSION_COOKIE>' \
  -H 'Origin: http://127.0.0.1:18573' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### GET /api/v1/integrations/moysklad/jobs/{jobId}/rows

Страница отчёта; source=true включает сохранённый исходный снимок

Параметры:

- `jobId` — path, обязательно.
- `offset` — query.
- `limit` — query.
- `problems` — query.
- `source` — query.

Запрос `curl`, полученный из спецификации:

```bash
curl -X GET 'http://127.0.0.1:18574/api/v1/integrations/moysklad/jobs/replace-with-id/rows' \
  --cookie 'bs_session=<SESSION_COOKIE>'
```

### Склады

#### POST /api/v1/warehouses

Создать склад

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string, обязательно.
- `short` — string.
- `city` — string.
- `address` — string.

Тело запроса, полученное из схемы:

```json
{
  "name": "Название"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/warehouses' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Название"}'
```

#### PATCH /api/v1/warehouses/{warehouseId}

Изменить или архивировать склад

Параметры:

- `warehouseId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `name` — string.
- `short` — string.
- `city` — string.
- `address` — string.
- `archived` — boolean.

Тело запроса, полученное из схемы:

```json
{
  "name": "Новое название склада"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/warehouses/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Новое название склада"}'
```

#### DELETE /api/v1/warehouses/{warehouseId}

Удалить пустой склад

Параметры:

- `warehouseId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/warehouses/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

### Закупки

#### POST /api/v1/purchases

Создать заказ поставщику

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `productId` — string, обязательно.
- `warehouseId` — string, обязательно.
- `supplier` — string, обязательно.
- `quantity` — number, обязательно.
- `unitCost` — number, обязательно.
- `externalSource` — string.
- `externalId` — string.

Тело запроса, полученное из схемы:

```json
{
  "productId": "replace-with-id",
  "warehouseId": "replace-with-id",
  "supplier": "Поставщик",
  "quantity": 1,
  "unitCost": 800
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/purchases' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"productId":"replace-with-id","warehouseId":"replace-with-id","supplier":"Поставщик","quantity":1,"unitCost":800}'
```

#### DELETE /api/v1/purchases/{purchaseId}

Удалить закупку без приёмки

Параметры:

- `purchaseId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/purchases/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### POST /api/v1/procurement/documents

Создать многострочный документ

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `kind` — string, обязательно; purchase_order / supplier_invoice / receipt / supplier_return / internal_order.
- `reference` — string,null.
- `supplierId` — string,null.
- `organizationId` — string,null.
- `contractId` — string,null.
- `warehouseId` — string,null.
- `sourceDocumentId` — string,null.
- `issuedAt` — string,null.
- `dueAt` — string,null.
- `note` — string.
- `customValues` — object.
- `lines` — array, обязательно.

Тело запроса, полученное из схемы:

```json
{
  "kind": "purchase_order",
  "lines": [
    {
      "productId": "replace-with-id",
      "quantity": 1,
      "unitCost": 800
    }
  ]
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/procurement/documents' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"kind":"purchase_order","lines":[{"productId":"replace-with-id","quantity":1,"unitCost":800}]}'
```

#### PATCH /api/v1/procurement/documents/{documentId}

Изменить черновик

Параметры:

- `documentId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `kind` — string; purchase_order / supplier_invoice / receipt / supplier_return / internal_order.
- `reference` — string,null.
- `supplierId` — string,null.
- `organizationId` — string,null.
- `contractId` — string,null.
- `warehouseId` — string,null.
- `sourceDocumentId` — string,null.
- `issuedAt` — string,null.
- `dueAt` — string,null.
- `note` — string.
- `customValues` — object.
- `lines` — array.

Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/procurement/documents/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### DELETE /api/v1/procurement/documents/{documentId}

Удалить непроведённый документ без зависимых документов

Параметры:

- `documentId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/procurement/documents/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### PATCH /api/v1/procurement/documents/{documentId}/status

Провести, закрыть или отменить документ

Параметры:

- `documentId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `status` — string, обязательно; posted / closed / cancelled.

Тело запроса, полученное из схемы:

```json
{
  "status": "posted"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/procurement/documents/replace-with-id/status' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"status":"posted"}'
```

#### POST /api/v1/procurement/imports/{importId}/recognize

Повторить локальное распознавание файла

Параметры:

- `importId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/procurement/imports/replace-with-id/recognize' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### DELETE /api/v1/procurement/imports/{importId}

Отклонить загруженный файл без созданного документа

Параметры:

- `importId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/procurement/imports/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### POST /api/v1/procurement/imports/{importId}/document

Создать черновик из распознанного файла

Параметры:

- `importId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `kind` — string, обязательно; purchase_order / supplier_invoice / receipt / supplier_return / internal_order.
- `reference` — string,null.
- `supplierId` — string,null.
- `organizationId` — string,null.
- `contractId` — string,null.
- `warehouseId` — string,null.
- `sourceDocumentId` — string,null.
- `issuedAt` — string,null.
- `dueAt` — string,null.
- `note` — string.
- `customValues` — object.
- `lines` — array, обязательно.

Тело запроса, полученное из схемы:

```json
{
  "kind": "purchase_order",
  "lines": [
    {
      "productId": "replace-with-id",
      "quantity": 1,
      "unitCost": 800
    }
  ]
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/procurement/imports/replace-with-id/document' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"kind":"purchase_order","lines":[{"productId":"replace-with-id","quantity":1,"unitCost":800}]}'
```

#### POST /api/v1/procurement/payments

Создать платёж

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `partnerId` — string, обязательно.
- `reference` — string,null.
- `direction` — string, обязательно; outgoing / incoming.
- `method` — string, обязательно; bank / cash.
- `amount` — number, обязательно.
- `organizationId` — string,null.
- `contractId` — string,null.
- `documentId` — string,null.
- `paidAt` — string,null.
- `note` — string.

Тело запроса, полученное из схемы:

```json
{
  "partnerId": "replace-with-id",
  "direction": "outgoing",
  "method": "bank",
  "amount": 800
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/procurement/payments' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"partnerId":"replace-with-id","direction":"outgoing","method":"bank","amount":800}'
```

#### PATCH /api/v1/procurement/payments/{paymentId}

Изменить черновик платежа

Параметры:

- `paymentId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `partnerId` — string.
- `reference` — string,null.
- `direction` — string; outgoing / incoming.
- `method` — string; bank / cash.
- `amount` — number.
- `organizationId` — string,null.
- `contractId` — string,null.
- `documentId` — string,null.
- `paidAt` — string,null.
- `note` — string.

Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/procurement/payments/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### DELETE /api/v1/procurement/payments/{paymentId}

Удалить непроведённый платёж

Параметры:

- `paymentId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/procurement/payments/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

#### PATCH /api/v1/procurement/payments/{paymentId}/status

Провести или отменить платёж

Параметры:

- `paymentId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `status` — string, обязательно; posted / cancelled.

Тело запроса, полученное из схемы:

```json
{
  "status": "posted"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/procurement/payments/replace-with-id/status' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"status":"posted"}'
```

#### GET /api/v1/procurement/imports

Список загруженных закупочных файлов

Запрос `curl`, полученный из спецификации:

```bash
curl -X GET 'http://127.0.0.1:18576/api/v1/procurement/imports' \
  -H 'Authorization: Bearer <API_TOKEN>'
```

#### POST /api/v1/procurement/imports

Загрузить файл закупки для локального распознавания

Параметры:

- `Idempotency-Key` — header, обязательно.
- `X-File-Name` — header.

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/procurement/imports' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: image/jpeg' \
  --data-binary @image.jpg
```

#### GET /api/v1/procurement/imports/{importId}/file

Оригинал закупочного файла

Параметры:

- `importId` — path, обязательно.

Запрос `curl`, полученный из спецификации:

```bash
curl -X GET 'http://127.0.0.1:18576/api/v1/procurement/imports/replace-with-id/file' \
  -H 'Authorization: Bearer <API_TOKEN>'
```

### Продажи

#### POST /api/v1/orders

Создать заказ покупателя

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `customer` — string, обязательно.
- `warehouseId` — string, обязательно.
- `channel` — string, обязательно.
- `items` — array, обязательно.
- `priceTypeId` — string.
- `externalNumber` — string.
- `deliveryAddress` — string.
- `note` — string.
- `orderedAt` — string.
- `externalSource` — string.
- `externalId` — string.

Тело запроса, полученное из схемы:

```json
{
  "customer": "Покупатель",
  "warehouseId": "replace-with-id",
  "channel": "Сайт",
  "items": [
    {
      "productId": "replace-with-id",
      "quantity": 1
    }
  ]
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/orders' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"customer":"Покупатель","warehouseId":"replace-with-id","channel":"Сайт","items":[{"productId":"replace-with-id","quantity":1}]}'
```

#### PATCH /api/v1/orders/{orderId}/status

Сменить статус заказа

Параметры:

- `orderId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `status` — string, обязательно; picking / shipped / cancelled.

Тело запроса, полученное из схемы:

```json
{
  "status": "picking"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/orders/replace-with-id/status' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"status":"picking"}'
```

#### DELETE /api/v1/orders/{orderId}

Удалить неотгруженный заказ и снять резерв

Параметры:

- `orderId` — path, обязательно.
- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:


Тело запроса, полученное из схемы:

```json
{}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X DELETE 'http://127.0.0.1:18576/api/v1/orders/replace-with-id' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{}'
```

### Остатки

#### POST /api/v1/stock/receipt

Принять товар

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `productId` — string, обязательно.
- `warehouseId` — string, обязательно.
- `supplier` — string, обязательно.
- `quantity` — number, обязательно.
- `damaged` — number.
- `missing` — number.
- `unitCost` — number, обязательно.
- `purchaseId` — string.

Тело запроса, полученное из схемы:

```json
{
  "productId": "replace-with-id",
  "warehouseId": "replace-with-id",
  "supplier": "Поставщик",
  "quantity": 1,
  "unitCost": 800
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/stock/receipt' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"productId":"replace-with-id","warehouseId":"replace-with-id","supplier":"Поставщик","quantity":1,"unitCost":800}'
```

#### POST /api/v1/stock/writeoff

Списать товар

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `productId` — string, обязательно.
- `warehouseId` — string, обязательно.
- `quantity` — number, обязательно.
- `reason` — string, обязательно.
- `selectedLotId` — string.

Тело запроса, полученное из схемы:

```json
{
  "productId": "replace-with-id",
  "warehouseId": "replace-with-id",
  "quantity": 1,
  "reason": "Причина"
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/stock/writeoff' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"productId":"replace-with-id","warehouseId":"replace-with-id","quantity":1,"reason":"Причина"}'
```

#### POST /api/v1/stock/transfer

Переместить товар

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `productId` — string, обязательно.
- `warehouseId` — string, обязательно.
- `toWarehouseId` — string, обязательно.
- `quantity` — number, обязательно.
- `selectedLotId` — string.

Тело запроса, полученное из схемы:

```json
{
  "productId": "replace-with-id",
  "warehouseId": "replace-with-id",
  "toWarehouseId": "replace-with-id",
  "quantity": 1
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X POST 'http://127.0.0.1:18576/api/v1/stock/transfer' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"productId":"replace-with-id","warehouseId":"replace-with-id","toWarehouseId":"replace-with-id","quantity":1}'
```

### Настройки

#### PATCH /api/v1/settings

Изменить настройки компании

Параметры:

- `Idempotency-Key` — header, обязательно; Уникальный ключ команды (8–120 символов). Повтор с тем же ключом возвращает прежний ответ.

Поля JSON:

- `companyName` — string, обязательно.
- `lowStockAlerts` — boolean, обязательно.
- `dailySummary` — boolean, обязательно.

Тело запроса, полученное из схемы:

```json
{
  "companyName": "Название",
  "lowStockAlerts": true,
  "dailySummary": true
}
```

Запрос `curl`, полученный из спецификации:

```bash
curl -X PATCH 'http://127.0.0.1:18576/api/v1/settings' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -H 'Idempotency-Key: replace-with-unique-key' \
  -H 'Content-Type: application/json' \
  --data '{"companyName":"Название","lowStockAlerts":true,"dailySummary":true}'
```

### Состояние

#### GET /api/v1/bootstrap

Состояние склада

Запрос `curl`, полученный из спецификации:

```bash
curl -X GET 'http://127.0.0.1:18576/api/v1/bootstrap' \
  -H 'Authorization: Bearer <API_TOKEN>'
```

### Аудит

#### GET /api/v1/audit

Журнал аудита

Параметры:

- `limit` — query.

Запрос `curl`, полученный из спецификации:

```bash
curl -X GET 'http://127.0.0.1:18576/api/v1/audit' \
  -H 'Authorization: Bearer <API_TOKEN>'
```
