---
title: "Загрузить продажу от имени установки"
method: POST
path: "/api/v1/app/docflow/sales/import"
tags: ["App runtime"]
---

# Загрузить продажу от имени установки

`POST /api/v1/app/docflow/sales/import`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/app/docflow/sales/import`
- Auth: HTTP bearer

Интернет-магазин или CRM загружает продажу своим токеном. Повтор того же external_id обновляет ЭТУ же продажу, а не заводит второй, поэтому ответ 200. Внешний номер, уже занятый продажей другого источника (человека, ключа кабинета или другого приложения), отвечает 409 docflow.sale.foreign_source. Необязательный funnel_id выбирает действующую воронку продаж этого кабинета в момент создания продажи: повтор с другой воронкой отвечает 409 core.trade.funnel_mismatch, неизвестная, чужая или архивная воронка — 422 core.trade.funnel_unavailable.

Покупатель называется человеческими ключами. Названный ИНН узнаётся строго; продажа сайта (scenario self_service) без ИНН — в том числе вовсе без покупателя — ложится на системную карточку «Розничный покупатель», а имя, телефон и почта плательщика остаются в самом продаже; в остальных сценариях покупатель с телефоном получает именную карточку физлица. Позиции узнаются по артикулу. Статусы оплаты и отгрузки не принимаются — они считаются из фактов.

Если у юрлица есть склад (warehouse_id или склад по умолчанию политики склада) и в продаже есть складские позиции, под продажа ставится штатный резерв склада на срок из настроек склада; свободный остаток (stockGetAvailability) уменьшается на него. Резерв, который склад поставить не смог, продаже не отказывает.

Кабинет, пространство приложения и автор изменений берутся из токена установки. Строка журнала загрузок получает источником пространство приложения, а не поле source тела.

## Headers

- `X-Tenant` string, required

## Request body

- DocflowAppSalesOrderInput
  - `company_id` string, uuid, required
  - `contact_id` string, uuid
  - `contract_document_id` string, uuid
  - `counterparty` DocflowAppSalesOrderCounterparty: Покупатель человеческими ключами. ИНН узнаётся строго; телефон — признак физлица. Имя, телефон и почта остаются в продаже или закупке как реквизиты плательщика
    - `name` string
    - `inn` string
    - `kpp` string
    - `phone` string
    - `email` string
  - `funnel_id` string, uuid
  - `external_id` string, required: Номер продажи или закупки у магазина — ключ идемпотентности загрузки
  - `number` string: Пусто — кабинет выдаст следующий номер
  - `title` string
  - `currency` string, required: Код валюты сделки, например RUB
  - `manager` string
  - `comment` string
  - `order_date` string, date, required
  - `ship_date` string, date
  - `due_date` string, date
  - `discount` string
  - `prices_include_vat` boolean: Цены включают налог; пусто — умолчание кабинета
  - `scenario` 'self_service' | 'one_off_sale' | 'contract_sale': Путь сделки; продажа или закупка с оплатой на сайте — self_service
  - `payment` DocflowAppSalesOrderPayment: Сообщение эквайринга о продаже или закупке. Идемпотентно по паре provider + external_id
    - `provider` string, required: Кто подтвердил списание: yookassa, tochka, имя платёжного кабинета сайта
    - `external_id` string, required: Номер платежа у провайдера
    - `kind` 'payment' | 'refund': Пусто — списание (payment)
    - `amount` string, required: Сумма больше нуля; возврат присылается видом refund, а не минусом
    - `currency` string
    - `paid_at` string: Когда провайдер списал; пусто — момент сообщения
  - `source` string: Не используется контуром приложения: источник журнала — пространство приложения из токена
  - `warehouse_id` string, uuid
  - `items` DocflowAppSalesOrderItem[], required
    - `article` string: Артикул или штрихкод позиции у магазина; узнаётся справочником номенклатуры точным совпадением
    - `product_id` string, uuid
    - `title` string: Пусто — название берётся из номенклатуры
    - `kind` 'goods' | 'service' | 'material' | 'semi_product': Пусто — вид номенклатуры
    - `unit` string
    - `quantity` string, required
    - `price` string, required
    - `discount` string
    - `vat_rate` string: Ставка строки: 22%, 10%, без НДС; пусто — учётная политика юрлица на дату продажи или закупки

## Response `200`

Продажа после загрузки: новый или обновлённый

- DocflowSalesOrder
  - `id` string, uuid, required
  - `company_id` string, uuid, required
  - `contact_id` string, uuid, required
  - `contract_document_id` string, uuid
  - `number` string
  - `title` string, required
  - `status` 'draft' | 'confirmed' | 'done' | 'cancelled', required
  - `status_id` string, uuid
  - `status_name` string: Имя статуса, которое придумал кабинет
  - `funnel_id` string, uuid
  - `scenario` 'self_service' | 'one_off_sale' | 'contract_sale', required
  - `steps` string[], required
  - `currency` string, required
  - `manager` string
  - `comment` string
  - `external_id` string
  - `buyer` DocflowSalesOrderBuyer: Как покупатель представился в продаже или закупке
    - `name` string
    - `phone` string
    - `email` string
  - `acquiring_amount` string: Сколько подтвердил эквайринг — списания минус возвраты
  - `order_date` string, date
  - `ship_date` string, date
  - `due_date` string, date
  - `discount` string
  - `prices_include_vat` boolean, required
  - `items` DocflowSalesOrderItem[], required
    - `id` string, uuid, required
    - `product_id` string, uuid
    - `title` string, required
    - `kind` string, required
    - `unit` string
    - `quantity` string, required
    - `price` string, required
    - `discount` string
    - `vat_rate` string
    - `position` integer, required
    - `amount` string
  - `amount` string, required
  - `goods_amount` string, required
  - `service_amount` string, required
  - `paid_amount` string, required: Сколько денег пришло на счёт по продаже или закупке
  - `shipped_amount` string, required
  - `invoiced_amount` string, required
  - `closed_amount` string, required
  - `payment_status` 'unpaid' | 'partial' | 'paid', required
  - `shipment_status` 'not_shipped' | 'partial' | 'shipped', required
  - `company_name` string
  - `contact_name` string
  - `contract_title` string
  - `company_archived` boolean
  - `contact_archived` boolean
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required

## Other responses

- `400`: Некорректный запрос или нарушение бизнес-правила
- `401`: Сессия, ключ или кабинет не подтверждены
- `403`: Текущая роль не имеет требуемого права
- `404`: Запись не найдена или не видима текущему пользователю
- `409`: Конфликт версии, идемпотентности или бизнес-состояния
- `422`: Покупателя или позицию не узнали, либо названная воронка недоступна в кабинете
- `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/3c60ded179f2?raw)
