---
title: "Отправить предмет на согласование"
method: POST
path: "/api/v1/docflow/approvals"
tags: ["Docflow approvals"]
---

# Отправить предмет на согласование

`POST /api/v1/docflow/approvals`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/docflow/approvals`
- 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`)

Маршрут не перечисляют в запросе — его ПОДБИРАЮТ. Тело называет только предмет тройкой «модуль — вид — идентификатор», а факты о нём (сумму, контрагента, статью расхода, автора) согласование спрашивает у модуля-владельца его портом: читать чужую таблицу ради этих полей нельзя, да и незачем.

Подошло несколько шаблонов — берётся САМЫЙ КОНКРЕТНЫЙ: маршрут, названный на юрлицо и вид документа, выигрывает у маршрута на весь модуль. Нижняя граница суммы маршрута включается, верхняя нет, поэтому смежные диапазоны стыкуются без щели и без нахлёста.

Маршрута под предмет не нашлось, а вид объявлен требующим согласования — отказ docflow.approval.route_not_found. Это НЕДОНАСТРОЙКА кабинета, и назвать её надо именно так: «согласуйте сами» здесь неверный совет. Если у подобранного маршрута все этапы согласования отсечены лимитом по сумме, проход согласуется в момент отправки (state approved) со строкой журнала auto_approved: маршрут сам сказал, что бумагу такой суммы визировать не нужно (ERP-1566).

## Headers

- `X-Tenant` string, required

## Request body

- DocflowApprovalSubject: Предмет согласования нейтральной тройкой «модуль — вид — идентификатор». Факты предоставляет модуль-владелец: карточка, заявка на оплату, пакет ЭДО или складская заявка на закупку. Складскую заявку отправляют проведением через API склада; общие команды отправки, повтора и отзыва согласования для неё закрыты.
  - `module` 'docflow' | 'finance' | 'stock', required: Модуль-владелец предмета
  - `kind` 'flow_document' | 'payment_request' | 'edo_message' | 'stock_purchase_request', required: Вид предмета: карточка документооборота, заявка на оплату, входящий документ ЭДО или складская заявка на закупку
  - `id` string, uuid, required

## Response `201`

Заведённый проход согласования

- DocflowApproval: Один проход предмета по маршруту. Согласование ничего не проводит и ни строки регистра не пишет: оно отвечает на один вопрос — можно ли уже выполнить действие, выпускающее бумагу или деньги наружу. Возврат на доработку проход не закрывает: предмет правят и продолжают тот же проход, сохраняя чужие визы.
  - `id` string, uuid, required
  - `subject` DocflowApprovalSubject, required: Предмет согласования нейтральной тройкой «модуль — вид — идентификатор». Факты предоставляет модуль-владелец: карточка, заявка на оплату, пакет ЭДО или складская заявка на закупку. Складскую заявку отправляют проведением через API склада; общие команды отправки, повтора и отзыва согласования для неё закрыты.
    - `module` 'docflow' | 'finance' | 'stock', required: Модуль-владелец предмета
    - `kind` 'flow_document' | 'payment_request' | 'edo_message' | 'stock_purchase_request', required: Вид предмета: карточка документооборота, заявка на оплату, входящий документ ЭДО или складская заявка на закупку
    - `id` string, uuid, required
  - `subject_title` string
  - `subject_number` string
  - `company_id` string, uuid
  - `contact_id` string, uuid
  - `item_id` string, uuid
  - `route_id` string, uuid
  - `route_name` string
  - `rework_mode` 'restart' | 'returner_only', required
  - `amount` string: Пусто законно: у рамочного договора суммы нет
  - `currency` string
  - `content_version` integer, required: Редакция предмета, по которой решают
  - `content_fingerprint` string: SHA-256 значимого состава складской заявки, по которому получено согласие; закупка проверяет совпадение с текущим составом
  - `state` 'pending' | 'approved' | 'rejected' | 'returned' | 'cancelled', required
  - `active_stage` integer, required: Номер текущего этапа
  - `requested_by` integer, required
  - `requested_name` string
  - `requested_at` string, date-time, required
  - `finished_at` string, date-time
  - `reminded_at` string, date-time
  - `escalated_at` string, date-time
  - `updated_at` string, date-time, required
  - `stages` DocflowApprovalStage[], required
    - `id` string, uuid, required
    - `position` integer, required
    - `title` string
    - `stage_kind` 'approve' | 'acknowledge': Что делает этап: approve — согласует и держит маршрут; acknowledge — «ознакомиться»: извещает участников (нужно право docflow.flow:read), маршрут не держит, отказа не знает (ERP-1566). Пусто — approve
    - `mode` 'all' | 'any', required
    - `assignee_kind` 'user' | 'department' | 'role' | 'manager' | 'department_head', required
    - `assignee_label` string
    - `min_amount` string
    - `due_hours` integer
    - `due_at` string, date-time
    - `state` 'waiting' | 'active' | 'approved' | 'rejected' | 'returned' | 'skipped' | 'notified' | 'acknowledged', required: notified — этап ознакомления известил участников и пропустил проход дальше; acknowledged — все отметились
    - `started_at` string, date-time
    - `decided_at` string, date-time
    - `reviews` DocflowApprovalReview[], required
      - `id` string, uuid, required
      - `actor_id` integer, required
      - `actor_name` string
      - `decided_by` integer
      - `decided_by_name` string
      - `decided_via` 'self' | 'substitute' | 'delegate' | 'administrator'
      - `delegated_to` integer
      - `decision` 'approve' | 'return' | 'reject' | 'acknowledge': Пусто, пока человек не решил; acknowledge — отметка «ознакомлен» на этапе ознакомления
      - `comment` string: Обязателен у return и reject: без слов автор не узнает, что исправлять
      - `decided_at` string, date-time
  - `events` DocflowApprovalEvent[]
    - `id` string, uuid, required
    - `stage_position` integer
    - `action` 'submitted' | 'approved' | 'returned' | 'rejected' | 'cancelled' | 'resubmitted' | 'reset_significant_change' | 'delegated' | 'escalated' | 'reminded' | 'operator_replied' | 'operator_refused' | 'operator_signature_required' | 'operator_skipped' | 'acknowledged' | 'auto_approved', required: auto_approved — согласовано автоматически: сумма меньше порогов маршрута. operator_* — ответ оператору по входящему пакету ЭДО после прохода (настройка подключения reply_after_approval); comment несёт слова оператора или машинный код отказа docflow.edo.*
    - `user_id` integer
    - `user_name` string
    - `comment` string
    - `created_at` string, date-time, required

## Other responses

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