---
title: "Получить пакет документов"
method: GET
path: "/api/v1/docflow/messages/{id}"
tags: ["Docflow mirror"]
---

# Получить пакет документов

`GET /api/v1/docflow/messages/{id}`

## Request

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

Вид документа, его подвид и регламент — слова ОПЕРАТОРА, а не наша классификация: зеркало обязано сохранить то, что действительно пришло. Сумма приходит строкой ровно так, как её прислал оператор: через плавающую точку здесь теряются копейки, а сверять их придётся с проводками.

## Path parameters

- `id` string, uuid, required

## Headers

- `X-Tenant` string, required

## Response `200`

Пакет документов

- DocflowMessage: Пакет документов у оператора — конверт, а не учётный документ Акеды.
  - `id` string, uuid, required
  - `connection` string, uuid, required
  - `external_id` string, required: Идентификатор пакета у оператора
  - `external_revision` string, required: Редакция пакета: оператор меняет содержимое конверта, не меняя его идентификатор
  - `direction` 'incoming' | 'outgoing', required
  - `doc_type` string, required: Слова оператора, а не наша классификация
  - `doc_subtype` string, required
  - `doc_regulation` string, required
  - `number` string, required
  - `date` string, required: Календарная дата документа ГГГГ-ММ-ДД; пусто означает, что даты нет вовсе
  - `amount` string, required: Сумма строкой ровно так, как её прислал оператор; пусто означает «суммы нет», а не ноль
  - `currency` string, required
  - `counterparty` DocflowCounterparty, required: Вторая сторона обмена. Реквизиты хранятся текстом всегда, даже когда сопоставление с нашим контрагентом состоялось: карточку могут удалить или переименовать, а пакет обязан остаться читаемым спустя годы.
    - `name` string, required
    - `inn` string, required
    - `kpp` string, required
    - `external_id` string, required: Идентификатор участника обмена у оператора: надёжнее ИНН, потому что у одного ИНН бывает несколько ящиков
    - `contact` string, uuid
    - `contact_name` string, required: Наш контрагент, если сопоставление состоялось. Это наша догадка по ИНН либо выбор человека, а не факт от оператора
  - `state_code` string, required: Код состояния документооборота у оператора
  - `state_name` string, required: Состояние словами оператора: своего перевода состояний у нас нет и быть не должно
  - `our_org_external_id` string, required
  - `received_at` string, date-time
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `connection_name` string, required
  - `connection_provider` string, required
  - `stage_repeat` boolean: Оператор подключения умеет «Повторить этап» утверждения входящего документа (Saby). У Контур.Диадока такого действия нет
  - `company` string, uuid
  - `company_name` string, required
  - `attachments_total` integer, required
  - `signatures_total` integer, required
  - `actions_due` integer, required: Сколько незакрытых этапов у пакета. Ноль означает «ход не за нами»
  - `stage_name` string, required: Название ближайшего незакрытого этапа словами оператора
  - `sign_required` boolean, required: У пакета открыт этап, который закрывается нашей подписью под самим документом. Отдельно от actions_due и stage_name: счётчик говорит «ход за нами», а название этапа — слова оператора, и отличить по ним подпись от согласования нельзя. Пока признак поднят, приёмка к учёту отказывает кодом docflow.edo.sign_first
  - `notice_sign_required` boolean, required: Открытый подписной этап служебный: извещение о получении, подтверждение даты, квитанция. Отдельным признаком, потому что человеку это другое дело — «Подписать извещение» подтверждает технологию обмена, а не содержание документа. Приёмку к учёту служебный этап НЕ держит
  - `attachments` DocflowAttachment[], nullable: Состав пакета. Наполняется ТОЛЬКО в карточке одного пакета; в списке остаётся null. null означает «не спрашивали», пустой массив — «спросили, и там пусто»
    - `id` string, uuid, required
    - `message` string, uuid, required
    - `external_id` string, required: Идентификатор вложения у оператора
    - `name` string, required: Имя файла словами оператора
    - `kind` '' | 'document' | 'title' | 'notice', required: Наш словарь, а не оператора: документ, ответный титул, служебное извещение. Пусто означает, что вид неизвестен, и это законно
    - `content_type` string, required
    - `size_bytes` integer, required
    - `sha256` string, required
    - `stored` boolean, required: Байты скачаны и лежат у НАС. Ссылка оператора хранилищем не считается: она живёт около месяца, а накладную спрашивают через три года
    - `downloaded_at` string, date-time
    - `created_at` string, date-time, required
  - `signatures` DocflowSignature[], nullable
    - `id` string, uuid, required
    - `message` string, uuid, required
    - `attachment` string, uuid
    - `side` 'ours' | 'counterparty', required
    - `signer_name` string, required
    - `signer_position` string, required
    - `certificate` DocflowCertificate, required: Сертификат, которым подпись доказывают спустя годы: имя подписанта меняется, отпечаток нет.
      - `thumbprint` string, required
      - `subject` string, required
      - `valid_from` string, date-time
      - `valid_to` string, date-time
    - `poa_number` string, required: Номер машиночитаемой доверенности. С 2023 года подпись сотрудника без неё недействительна
    - `signed_at` string, date-time
    - `stored` boolean, required: Контейнер подписи скачан к нам и открывается отдельной операцией
    - `created_at` string, date-time, required
  - `stages` DocflowStage[], nullable
    - `id` string, uuid, required
    - `message` string, uuid, required
    - `external_id` string, required: Идентификатор этапа у оператора; он же адресует действие
    - `name` string, required
    - `actions` DocflowStageAction[], required
      - `code` string, required
      - `name` string, required
      - `requires_signature` boolean: Действие закрывается подписью («ТребуетПодписания» оператора). Точнее признака этапа: на этапе «Утверждение» подписи требует «Утвердить», а «Переназначить» — нет. У этапов, записанных до появления признака, false у всех действий — тогда судят по requires_signature этапа
    - `requires_signature` boolean, required: Этап закрывается подписью. Признак оператора, а не наш вывод из названия
    - `closed` boolean, required: Ход не за нами. Закрытые этапы не показываются и не считаются
    - `service` boolean, required: Служебный этап оператора — извещение о получении, подтверждение, квитанция. Технология обмена, а не решение по документу: клиент обрабатывает все служебные этапы пакета одним действием, а не по кнопке на каждый
    - `started_at` string, date-time, required: С какого момента этап ждёт человека: дата этапа у оператора, без неё — когда зеркало увидело его открытым; открытый снова этап считается заново
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
  - `events` DocflowEvent[], nullable
    - `id` string, uuid, required
    - `message` string, uuid, required
    - `external_id` string, required
    - `name` string, required
    - `comment` string, required
    - `occurred_at` string, date-time
    - `created_at` string, date-time, required
  - `flow_documents` DocflowMessageFlowLink[], nullable: Карточки документооборота, которые вёз этот конверт. Как и весь состав, наполняется ТОЛЬКО в карточке одного пакета; в списке остаётся null
    - `id` string, uuid, required
    - `document` string, uuid, required
    - `role` 'primary' | 'attachment' | 'basis', required: Чем карточка приходится конверту: основной документ, приложение или основание
    - `version` integer, required: Текущая редакция карточки: открывать человеку следует её
    - `kind` 'contract' | 'specification' | 'amendment' | 'invoice' | 'act' | 'upd' | 'goods_waybill' | 'transport_waybill' | 'consignment_note' | 'transport_order' | 'tax_invoice' | 'correction' | 'return' | 'discrepancy_act' | 'reconciliation_act' | 'power_of_attorney' | 'other', required: Вид документа внутреннего контура. Вид называет бумагу, а не учётную операцию: продажу и закупку из бумаги делают отдельные команды.
    - `status` 'draft' | 'registered' | 'archived', required
    - `title` string, required
    - `number` string, required
    - `date` string, date, required
    - `created_at` string, date-time, required
    - `external_attachment_id` string: Файл пакета, по которому заведена карточка (ERP-2063): идентификатор вложения у оператора (external_id), а без него — «id:» и id вложения. У пакета «ДС + счёт» своя карточка у каждого файла. Нет у карточки на весь пакет — так заводила приёмка до разбора по файлам
  - `cancellation` DocflowCancellation: Соглашение сторон об аннулировании документа. Запускает его любая сторона, а решает вторая: согласие даёт состояние 22 «Документ аннулирован», отказ — состояние 40 «Аннулирование отклонено», при котором состояние самого документа НЕ меняется. Шаг цепочки выводится из ленты СОБЫТИЙ пакета, а не из кода состояния: состояние 27 «Ожидает аннулирования» оператор отдаёт только отдельным методом выборки по событиям.
    - `state` 'none' | 'requested' | 'agreed' | 'refused', required: Шаг цепочки: none — её нет; requested — ждём решения; agreed — аннулирован по соглашению; refused — в аннулировании отказано, и документ остался действующим
    - `state_name` string, required: Слова ОПЕРАТОРА о состоянии, когда оно относится к аннулированию. Своего перевода состояний у нас нет и быть не должно
    - `initiator` '' | 'us' | 'counterparty', required: Кто запустил цепочку. Пусто означает «неизвестно», а не «мы»
    - `reason` string, required: Причина словами того, кто её написал. Не переводится
    - `requested_at` string, date-time, nullable, required
    - `decided_at` string, date-time, nullable, required
    - `available` boolean, required: Вид документа вообще допускает аннулирование. У электронной транспортной накладной его нет: там отказ 409 с кодом docflow.edo.cancellation_unavailable
    - `can_request` boolean, required: Ход за нами и цепочку можно начать
    - `can_approve` boolean, required: Соглашение прислали нам и на него можно согласиться
    - `can_reject` boolean, required: Соглашение прислали нам и в нём можно отказать
  - `accounting_document` string, uuid
  - `accepted_at` string, date-time, nullable: Когда пакет приняли к учёту. Переживает удаление учётного документа: приёмка была
  - `accepted_by` integer, nullable: Кто принял пакет к учёту
  - `accounting_number` string: Номер учётного документа приёмки для строки «В учёте: … № …»; пусто — не принят или документ не прочитан
  - `accounting_type` string: Вид учётного документа приёмки (ключ вида документа ядра), например finance_purchase
  - `draft` boolean, required: Пакет записан оператору и наружу ещё не ушёл. Выводится из состава пакета при чтении: исходящий, без единого события обмена и без единой подписи
  - `deleted_at` string, date-time, nullable: Корзина НАШЕГО зеркала: контрагент её не видит, и пакет у оператора остаётся прежним
  - `deleted_by` integer, nullable
  - `deleted_reason` '' | 'trashed' | 'draft_removed', required: Возвращают из корзины только trashed: у draft_removed документа у оператора больше нет
  - `recognized` DocflowRecognized: Сумма и реквизиты, прочитанные ИЗ ФАЙЛА пакета, а не присланные оператором. Оператор присылает сумму отдельным реквизитом только у формализованных документов — УПД и счёта-фактуры; у счёта на оплату и договора она живёт внутри PDF. Поле стоит РЯДОМ с amount, а не вместо него: amount — слова оператора, по ним сверяют переписку спустя годы, и подменять их нашим чтением чужой бумаги нельзя. Разбор локальный и детерминированный: текстовый слой PDF, у скана — распознавание изображения; ни одной нейросети и ни одного обращения к платному справочнику. Строк товарной таблицы здесь нет: со скана они не восстанавливаются и фактом не выдаются.
    - `at` string, date-time, nullable: Когда разбирали. Пусто — попытки ещё не было; это не то же самое, что source=none («читали и брать оказалось нечего»)
    - `source` '' | 'title' | 'text' | 'none', required: Чем прочитано, и заодно насколько верить. title — подписанный файл обмена ФНС, проверять нечего; text — вытащено якорными правилами из чужой раскладки, и рядом со значением интерфейс ставит «проверьте»; none — читали и брать было нечего; пустая строка — разбора не было
    - `document` string, required: Имя вложения СЛОВАМИ ОПЕРАТОРА: по нему человек откроет ту же бумагу и сверит показанную цифру
    - `amount` string, required: Итог к оплате строкой, как и amount: через число с плавающей точкой здесь теряются копейки. Пустая строка — итог в бумаге не нашёлся
    - `currency` string, required: Валюта счёта, если бумага её назвала. Пусто означает «не сказано»: подставлять рубль молча нельзя
    - `number` string, required
    - `date` string, required: Дата документа в форме ГГГГ-ММ-ДД; пустая строка означает, что даты нет
  - `payment` DocflowMessagePayment: Состояние оплаты входящего счёта. Два состояния, а не шесть: путь заявки внутри финансов подробнее (план, отправлена, ждёт подписи, исполнена, отклонена, отменена), но ленте нужен ответ на один вопрос — деньги уже ушли или ещё нет. Оплаченным платёж делает ВЫПИСКА, а не наша кнопка и не слово банка: «отправлено в банк» означает лишь, что платёжка легла в интернет-банк на подпись.
    - `state` 'requested' | 'paid', required: requested — заявка заведена, денег ещё нет; paid — платёж подтверждён выпиской
    - `request` string, uuid, required
    - `number` string: Номер заявки на оплату словами для человека
    - `paid_on` string: Дата оплаты из выписки в форме ГГГГ-ММ-ДД. Заполнена только у state=paid
    - `step` 'draft' | 'on_approval' | 'rework' | 'approved' | 'scheduled' | 'sent' | 'paid' | 'payment_cancelled': Шаг заявки словарём хода заявки «Документов»: до согласования — состояние документа заявки, после — строка очереди финансов
    - `docflow_request` string, uuid
    - `order` string, uuid
  - `viewed` boolean, required: Открывал ли карточку пакета текущий сотрудник — личная отметка, а не состояние у оператора. Считается в ленте одним запросом на страницу; карточка отдаёт false, потому что её открытие само ставит отметку дверью viewed.
  - `state_category` 'in_work' | 'awaiting_signature' | 'cancellation_requested' | 'cancellation_refused' | 'draft' | 'error' | 'signer_invalid' | 'approved' | 'rejected' | 'cancelled' | 'interrupted', required: Состояние пакета нашими словами поверх кода оператора (справочник «Код состояния документа»): в работе, ждёт подписи, запрос на аннулирование, отказ в аннулировании, черновик, с ошибкой, подписант не прошёл проверку, утверждён, отклонён, аннулирован, прервано. Слово оператора остаётся в state_name.
  - `operator_link` string, required: Карточка документа в кабинете нашей организации у оператора («СсылкаДляНашаОрганизация»); пусто, пока карточку не перечитали
  - `print_form` DocflowMessagePrintForm, required: Печатный вид пакета. operator — PDF оператора с впечатанными подписями, лежащий у нас; ours — наша форма счёта или УПД по формализованному XML, когда оператор своего вида не отдал (штампа подписи оператора на ней нет).
    - `source` 'operator' | 'ours', required
    - `size` integer, required
    - `revision` string, required: Редакция пакета, с которой снят PDF оператора
    - `fetched_at` string, date-time, required

## Other responses

- `400`: Некорректный запрос или нарушение бизнес-правила
- `401`: Сессия, ключ или кабинет не подтверждены
- `403`: Текущая роль не имеет требуемого права
- `404`: Запись не найдена или не видима текущему пользователю

---

[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)
