Сервис электронной подписи

Сервис «N3.Health.Сервис электронной подписи»

«N3.Health.СЭП» предназначен для реализации процесса подписания документов с пациентом (клиентом) юридического лица как простой электронной подписью, так и иными видами электронной подписи, в т.ч. квалифицированной.

Пациент подписывает документ простой электронной подписью (ПЭП) или ПЭП с ЕСИА (для определенных типов документов, к примеру: ИДС) через свой смартфон без установки дополнительного ПО.

Для осуществления интеграции требуется создавать комплект документов и передавать их в сервис в соответствии с форматом, указанным в запросе /signing

Сценарий использования предполагает создание комплекта документов на стороне Информационной системы инициирующей запрос (далее ИС) и осуществления их отправки в сервис СЭП – одним post запросом на endpoint /sep/api/signing с указанием типа доставки: (SMS, MAX, MILA) и указание на необходимость авторизации через ЕСИА (для ИДС, Телемедицинских консультаций и иных сценариев требующих подписание с использованием ЕСИА).

Логика типов доставки

SMS – отправлено будет СМС

MAX – для подписания пациенту необходимо перейти в чат-бот (или мини-приложение внутри чат-бота), в чат-бот используемой медицинским учреждением.

Mila – необходимо скачать приложение или перейти в веб-интерфейс приложения, если пациент не зарегистрирован в MILA – АВТОМАТИЧЕСКИ будет направлено СМС.


Краткий сценарий для интегратора

  • Окружения :
    Тестовое  https://b2b-demo.n3health.ru
    Промышленное  https://b2b.n3health.ru

  • Создание и отправка отправления
    POST /sep/api/signing → создать и отправить комплект документов на подпись в сервис СЭП  и возвращает {trackingId}.

  • ЧЕРНОВИКИ
    POST sep/api/signing/drafts/init →  Создание черновика , возвращает {trackingId}.
    POST  /sep/api/signing/drafts/{trackingId}/finalize Отправить существующий  черновик без изменения.
    POST sep/api/signing/drafts/{trackingId}/send →  Сохранить|Отправить с  добавлением  или полным  обновлением  файлов.
    POST sep/api/signing/drafts/{trackingId}/archive — поместить черновик в  Архив

  • ВЫДАЧА
    GET /sep/api/signing/{trackingId} —  получить  отправление и  PDF .SIG  вложение с открепленной подписью работника (если подписано после пациента).
    GET /sep/api/signing/{trackingId}/status возвращает:  только status  + подписанты (без attachments и без base64 PDF).
    GET Списочный
    GET sep/api/signing — списочный метод  по всему ЛПУ  (листинг по ЛПУ,  фильтры query  параметрами, включая idPatientMis
    GET sep/api/signing?idPatientMis={string} — получение отправлений по  ID пациента из внешней системы

    Рекомендация интеграторам: для поллинга статуса использовать только GET /signing/:id/status . Полный GET /signing/:id — разово, когда реально нужен файл.

  • КЭП (QES) Подписание сертификатом квалифицированной подписи (локальное)

    POST sep/api/initqes — метод локального подписания КЭПом.

    Возвращает ссылку для подписание работником сертификатом КЭП через КриптоПро плагин и локально установленное на АРМ работника СКЗИ: КриптоПро CSP.

    POST /sep/mis/api/initbatchqes — списочный метод для локального подписания КЭП сразу множества треков, согласно заданным в запросе параметрам.

  • Отмена/повторная отправка
    POST sep/api/signing/{tracking_id}/cancel  — метод  отмены  (пока не подписано пациентом)
    POST  sep/api/resend — метод  повторной  отправки существующего.
  • Анкетирование
    POST /questionnaires/templates, POST /questionnaires/templates/{id}/send — создание шаблона и отправка пациенту.
    GET /questionnaires/templates, GET /questionnaires/submissions — список шаблонов и отправленных анкет.

АВТОРИЗАЦИЯ

Authorization Обязателен 44556afd-0e84-b847-2322-75999668f590 Авторизационный токен. Выдается разработчику МИС администратором Интеграционной платформы;
X-Id-Lpu Обязателен 12346afd-0e84-b847-2322-75999668f500a Уникальный идентификатор ЛПУ в системе согласно справочнику 1.2.643.2.69.1.1.1.64

Лимиты

Чтобы сервис оставался стабильным при нагрузке, на gateway действуют ограничения (значения по умолчанию).
Лимиты действуют на пару idLpu /token

Загрузка документов (POST /signing)

  • один файл — до 5 МБ (не сумма всех файлов в запросе);
  • до 10 файлов в одном запросе;
  • до 120 новых отправлений на организацию за 1 минуту; при превышении — блок на 2 минуты (429).

Опрос статуса и списка (GET /signingGET /signing/{id}/status)

  • до 600 запросов в минуту на организацию;
  • до 10 одновременных запросов;
  • для поллинга статуса используйте GET /signing/{id}/status (без PDF).

Полный документ (GET /signing/{id} с PDF в base64)

  • до 120 запросов в минуту на организацию;
  • до 5 одновременных запросов;
  • дополнительно: не более 10 полных PDF одновременно в обработке на процессе gateway; ожидание слота до 20 с (очередь до 40). Вызывать разово, когда реально нужен файл — не для поллинга.

Ответы при превышении

  • 400 — лимит размера/числа файлов (LIMIT_FILE_SIZELIMIT_FILE_COUNT);
  • 429 — превышен лимит частоты или одновременных запросов.

МЕТОДЫ POST

Метод отправки

Эндпоинт https://b2b-demo.n3health.ru/sep/api

  • Метод POST /sep/api/signing – направление комплекта документов на подпись в сервис СЭП

Метод осуществляет немедленную доставку ссылки с кодом и паролем указанным способом доставки и возвращает trackingId отправления или ошибку.

Рекомендуем сохранять связь ID отправления СЭП (trackingId) с карточкой Пациента в используемой информационной системе для осуществления запросов GET методами статуса и направленного комплекта документов с визуализацией подписи в дальнейшем.

Пакетное подписание — при передачи нескольких документов , будет осуществлено пакетное подписание всех входящих в запрос документов

Тарификация осуществляется за пакеты (1 документ – 1 пакет, 5 документов в запросе – 1 пакет).

Пример запроса

POST /sep/api/signing
HTTP/1.1
Host: b2b-demo.n3health.ru
Authorization: 44556afd-0e84-b847-2312-75999668f777
X-Id-Lpu: 12346afd-0e84-b847-2322-75999668f500a
Content-Type: multipart/form-data; boundary=razdelitel
--razdelitel
Content-Disposition
: form-data; name="meta"
Content-Type
: application/json; charset=utf-8
{
"organization": {
"idLpu": "d39269b3-289d-4c5d-aa33-b3c945ad22ee", // обязательно
"email": "email@example.com", // опционально
"phone": "+71234567890" // опционально
]
},
"practitioner": {
"mrProxyNumber": "12-52884аАА", // опционально
"pbProxy":{                                            // опционально
"number": "PB-42",
"issuedAt": "2026-07-08",
"signer": "Петров Петр Петрович"
},
"familyName": "Иванов", // обязательно
"givenName": "Иван", // обязательно
"middleName": "Иванович", // опционально
"userIdLpu": "doc-123", // обязательно
"snils": "12345678901" , // опционально
"firstTouchCertificateThumbprint": "A1B2C3" , // опционально
"telecom": [
{ "system": "Email", "value": "email@example.com" }, // обязательно
{ "system": "Telephone", "value": "+7XXXXXXXXXX" } // обязательно
]
},
"patients": [
{
"idPatientMis": "patient-456", // обязательно
"mpiId": "123e4567-e89b-12d3-a456-426614174000", // опционально
"familyName": "Петров", // обязательно
"givenName": "Пётр", // обязательно
"middleName": "Петрович", // опционально
"birthDate": "1980-01-01", // обязательно
"sex": "male", // обязательно
"deliveryOverride": ["sms"], // опционально
"telecom": [
{ "system": "Email", "value": "email@example.com" }, // опционально
{ "system": "Telephone", "value": "+7XXXXXXXXXX" } // обязательно
],
"documentDto": [
{
"providerName": "ОВД", // обязательно
"issuedDate": "2010-05-15", // обязательно
"docN": "1234", // обязательно
"docS": "123456", // обязательно
"documentName": "Паспорт гражданина РФ", // опционально
"idDocumentType": 14 // обязательно
}
]
},
{
"idPatientMis": "patient-468", // обязательно
"mpiId": "123e4567-e89b-12d3-a456-426614154001", // опционально
"familyName": "Сингаев", // обязательно
"givenName": "Иван", // обязательно
"middleName": "Михайлович", // опционально
"birthDate": "1980-01-01", // обязательно
"sex": "male", // обязательно
"deliveryOverride": ["max"], // опционально
"telecom": [
{ "system": "Email", "value": "email@example.com" }, // опционально
{ "system": "Telephone", "value": "+7XXXXXXXXXX" } // обязательно
],
"documentDto": [
{
"providerName": "ОВД", // обязательно
"issuedDate": "2010-05-15", // обязательно
"docN": "1234", // обязательно
"docS": "123456", // обязательно
"documentName": "Паспорт гражданина РФ", // опционально
"idDocumentType": 14 // обязательно
}
]
},
],
"medDocument": {
"esiaAuth": false, // обязательно
"attachments": [
{ "partName": "file0", "documentType": "pdf" },  // partName обязателен, documentType опционален
{ "partName": "file1", "documentType": "dox" }  // partName обязателен, documentType опционален
]
},
"delivery": ["max"] // обязательно
}
--razdelitel
Content-Disposition
: form-data; name="file0"; filename="document.pdf"
Content-Type
: application/pdf

<бинарные данные PDF документа>

--razdelitel
Content-Disposition
: form-data; name="file1"; filename="document.docx"
Content-Type
: application/vnd.openxmlformats-officedocument.wordprocessingml.document

<бинарные данные DOCX документа>

--razdelitel--

Ответ сервера

Успех:

HTTP/1.1 201 Created
Location: /sep/api/signing/123e4567-e89b-12d3-a456-426614174000
Content-Type: application/json
{
"status": "created",
"trackingId": "123e4567-e89b-12d3-a456-426614174000"
}

Ошибка:

HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"status": "error",
"trackingId": "123e4567-e89b-12d3-a456-426614174000",
"errorCode": "INVALID_ATTACHMENT",
"errorMessage": "Файл file1 отсутствует в multipart-теле"
}

* Все варианты ошибок ниже

1. Заголовок (Headers)

Поле Тип Обязательность Описание
Authorization string Обязательно Авторизационный токен. Выдается разработчику МИС администратором Интеграционной платформы. Формат: 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu string Обязательно Уникальный идентификатор ЛПУ в системе
Content-Type string Обязательно multipart/form-data; boundary=razdelitel

2. Организация (organization)

Поле Тип Обязательность Описание
idLpu string Обязательно Уникальный идентификатор ЛПУ в системе согласно
справочнику 1.2.643.2.69.1.1.1.64
email string Опционально Адрес электронной почты
phone string Опционально Телефон медицинской организации

Поля объектов в telecom :

Поле Тип Обязательность Описание
system string Обязательно Тип контакта: «Email» или «Telephone»
value string Обязательно Значение (email/телефон). Телефон в формате +7XXXXXXXXXX.

3. Медицинский работник (practitioner)

Поле Тип Обязательность Описание
mrProxyNumber string Опционально Номер машиночитаемой доверенности (например, 12-52884аАА)
familyName string Обязательно Фамилия
givenName string Обязательно Имя
middleName string Опционально Отчество
userIdLpu string Обязательно Идентификатор врача в ЛПУ
firstTouchCertificateThumbprint string Опционально Сертификат КЭП работника. Используется для методов InitQes, InitBatchQes при вызове которого, указывается соответствующий флаг, что подписать КЭПом работника можно только тем, который был указан при отправке. 
snils string Обязательно СНИЛС сотрудника
telecom array Опционально Контактные данные (аналогично organization.telecom)
 deliveryOverride  string Опционально


deliveryOverride
—   Индивидуальный способ доставки для данного работника. Если указан, игнорирует глобальный 
delivery
 для этого подписанта»
.

Допустимые значения: 
"sms"

"mila"

"max"
.  

pbProxy

object Опционально

pbProxy.number — string

pbProxy.issuedAt iso

pbProxy.signer string

 

4. Пациенты (patients)

Массив объектов, где каждый объект содержит:

Поле Тип Обязательность Описание
idPatientMis string Обязательно ID пациента в МИС (например, patient-456)
mpiId string Опционально MPI ID из ИЭМК (например, 123e4567-e89b-12d3-a456-426614174000)
familyName string Обязательно Фамилия
givenName string Обязательно Имя
middleName string Опционально Отчество
birthDate string Обязательно Дата рождения в формате YYYY-MM-DD
sex string Обязательно Пол: male или female
telecom array Обязательно Минимум 1 объект с system: «Telephone».
deliveryOverride array Опционально Переопределяет способ доставки до конкретного пациента. Глобальный параметр delivery для конкретного пациента игнорируется.

Документы пациента (patients.documentDto) :

Массив объектов (обязательно хотя бы 1 документ):

Поле Тип Обязательность Описание
providerName string Обязательно Кто выдал документ (например, «ОВД», «ПФР»)
issuedDate string Опционально Дата выдачи (YYYY-MM-DD)
docN string Обязательно Номер документа
docS string Обязательно Серия документа (если есть)
documentName string Опционально Название документа (например, «СНИЛС»)
idDocumentType integer Обязательно

Код типа документа:

• 14 — паспорт РФ

• 223 — СНИЛС

Рекомендуется СНИЛС или Паспорт (полный список в справочнике 1.2.643.2.69.1.1.1.6)

5. Медицинский документ (medDocument)

Поле Тип Обязательность Описание
esiaAuth boolean Опционально true — требуется подпись через ЕСИА (Госуслуги).
attachments array Обязательно Массив вложений.

Вложения (attachments) :

Поле Тип Обязательность Описание
partName string Обязательно

partName в attachments должен совпадать с именами полей файлов в multipart.

В вышеуказанном примере:

"medDocument": {
"esiaAuth": false, // обязательно
"attachments": [
{"partName": "file0", "documentType": "pdf"},
Content-Disposition:
           

            form-data; name="file0"
           

           ; filename="document.pdf"
documentType string Опционально Тип документа: .doc .docx .pdf .odt 
MIME Type
.doc application/msword
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.pdf applicatiapplication/pdfon/pdf
.odt application/vnd.oasis.opendocument.text

6. Доставка (delivery)

Поле Тип Обязательность Описание
delivery array Обязательно

Способы доставки:

• «sms»

• «max»

• «mila»

(по умолчанию SMS, если не указано)


Важные примечания:

  1. Если esiaAuth: true, пациент должен авторизоваться через ЕСИА для подписи.
  2. Все даты — в формате ISO 8601 (YYYY-MM-DD).

ЧЕРНОВИКИ

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

  1. POST sep/api/signing/drafts/init →  Создание черновика. Сохранить trackingId в ответ.
  2. POST  /sep/api/signing/drafts/{trackingId}/finalize →  Отправить существующий черновик.
  3. POST sep/api/signing/drafts/{trackingId}/send → Отправить с добавлением или обновлением файлов
  4. POST sep/api/signing/drafts/{trackingId}/archive Архивировать черновик.

В визуализацию подписи и в отправление (подписание) идут данные работника отправившего черновик пациенту. Срок жизни черновика 24 часа, после этого будет перемещен в архив, а файлы удалены.

Как сочетаются send и finalize

POST …/drafts/{trackingId}/ send

multipart/form-data

Финализация (отправка) с возможностью приложить новые файлы (части multipart + meta сmedDocument.attachments под новые части). Новых файлов может не быть — тогда только meta; 
Возможность полностью обновить состав файлов.

POST …/drafts/{trackingId}/ finalize

application/json

Финализация (отправка) без новых файлов и без перечня вложений в теле; вложения остаются теми, что сохранены при init.

Создание черновика

POST sep/api/signing/drafts/init →   Создание черновика . возвращает {trackingId}
Создать черновик: новый trackingId, ответ с draftExpiresAt, status — 215 и т.д. trackingId

После успешного init возвращаются trackingId (идентификатор пакета он же dratId) и draftExpiresAt (момент окончания жизни черновика). Доставка ссылок подписанту и полный цикл обработки 
не
 выполняются до вызова 
POST /sep/api/signing/drafts/{trackingId}/send
или
/sep/api/signing/drafts/{trackingId}/finalize

Practitioner при init указывается справочно (кто оформил черновик). Фактическая отправка подписанту выполняется запросом send: в бизнес-логике используется practitioner из запроса send/finalize (работник, инициировавший непосредственную отправку подписанту), при условии, что ему это разрешено во внешней ИС или ролями СЭП. Черновик может отправить другой работник, не обязательно автор init.

Запрос аналогичен запросу на создание отправления (sep/api/signing). Для создания черновика отправить запрос на указанный location

POST  https://b2b-demo.n3health.ru/sep/api/signing/drafts/init

Успех:

HTTP/1.1 201 Created
Content-Type: application/json
{
"status": "draft",
"statusCode": 215,
"trackingId": "...",
"draftExpiresAt": "2026-04-20T12:00:00.000Z"
}

Отправка существующего черновика

POST  /sep/api/signing/drafts/{trackingId}/finalize →  
Отправить
 
существующий
 черновик без изменения.
Content-Type:
application/json

Полный URL (пример): https://b2b-demo.n3health.ru/sep/api/signing/drafts/123e4567-e89b-12d3-a456-426614174000/finalize

practitioner.userIdLpu — обязателен
practitioner.snils — опционален 

Тело: JSON той же структуры, что и поле meta в multipart для подписания: organization, practitioner, patients, medDocument, delivery
Поле medDocument.attachments не передаётся (или пустой массив — семантика «новых файлов нет»). 
trackingId в теле: поле опционально. Если передаёте — оно должно совпасть с {trackingId} в URL, иначе ошибка. Можно не передавать вообще.

Пример тела запроса:
       

       POST /sep/api/signing/drafts/123e4567-e89b-12d3-a456-426614174000/finalize
HTTP/1.1
Host: b2b-demo.n3health.ru
Authorization: 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu: 12346afd-0e84-b847-2322-75999668f500a
Content-Type: application/json
{
"organization": {
"idLpu": "d39269b3-289d-4c5d-aa33-b3c945ad22ee",
"inn": "1234567890",
"ogrn": "1234567890123",
"name": "Городская больница №1",
"email": "email@example.com",
"phone": "+71234567890"
},
"practitioner": {
"familyName": "Иванов",
"givenName": "Иван",
"userIdLpu": "doc-123",
"snils": "12345678947"
},
"patients": [
{
"idPatientMis": "patient-456",
"familyName": "Петров",
"givenName": "Пётр",
"birthDate": "1980-01-01",
"sex": "male",
"documentDto": [
{
"providerName": "ОВД",
"docN": "1234",
"docS": "123456",
"idDocumentType": 14
}
]
}
],
"medDocument": { "esiaAuth": true },
"delivery": ["sms"]
}}

Успешный ответ

{ status: 'created', statusCode: 201, trackingId } (finalize — HTTP 200)

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

POST /signing/drafts/{trackingId}/send →  Сохранить | Отправить  с  добавлением  или полным  обновлением  файлов.

Метод: POST
Эндпоинт: /sep/api/signing/drafts/{trackingId}/send

Content-Type: multipart/form-data
        

       Пример полного URL:
       

       https://b2b-demo.n3health.ru/sep/api/signing/drafts/44556afd-0e84-b847-1111-8h79kj78ff590/send

По trackingIdиз пути находится ранее созданный черновик; выполняется отправка подписанту и запуск полного цикла обработки по правилам обычного подписания  с особенностями указания обновления или добавления массива файлов.  

trackingId в meta: опционально; если передан — должен совпасть с path (доп проверка).

Если в запросе переданы файлы, они добавляются к имеющимся в черновки. 
Если передано значение переменной  replaceAttachments=true  то файлы будут полностью заменены на новые из текущего запроса send (Полное обновление пула файлов по треку) replaceAttachments / completeDelivery: оба опциональны, по умолчанию false.

Данные единственного подписанта в send/finalize заменяют сохранённые в черновике.

Practitioner, delivery, organization и прочие поля meta в send отражают актуальное отправление.

Поле в meta Обязательность Тип Описание

trackingId

да

string (UUID), опционально

Если указано, должно совпадать с {trackingId} из URL. Иначе ответ с ошибкой — защита от несоответствия path и тела запроса. Если поле не передано, достаточно path.

replaceAttachments

да

boolean, по умолчанию false

false  или не передаётся — файлы из запроса дополняют уже сохранённые в черновике вложения. 
true  — вложения черновика полностью заменяются набором из запроса.

completeDelivery

да

boolean, по умолчанию false

completeDelivery: false  — только обновить черновик

completeDelivery true  — обновляет и отправляет 

Пример запроса
Добавить файл в черновик и сразу отправить:

POST /sep/api/signing/drafts/44556afd-0e84-b847-1111-a45642661417/send HTTP/1.1
Host: b2b-demo.n3health.ru
Authorization: <44556afd-0e84-b847-2322-75999668f590>
X-Id-Lpu: 12346afd-0e84-b847-2322-75999668f500a
Content-Type: multipart/form-data; boundary=razdelitel
--razdelitel
Content-Disposition: form-data; name="meta"
Content-Type: application/json; charset=utf-8
{
"trackingId": "44556afd-0e84-b847-1111-a45642661417",
"replaceAttachments": false,
"completeDelivery": true,
"organization": {
"idLpu": "11ea52be-1543-4977-8f9c-038521fd3d9e",
"email": "email@example.com",
"phone": "+71234567890"
},
"practitioner": {
"familyName": "Иванов",
"givenName": "Иван",
"userIdLpu": "doc-123",
"snils": "12901762547",
"telecom": [
{ "system": "Email", "value": "email1@example.com" },
{ "system": "Telephone", "value": "+79123456789" }
]
},
"patients": [
{
"idPatientMis": "UKURA1235",
"mpiId": "",
"familyName": "Ухура",
"givenName": "Нийота",
"middleName": "Кейтаровна",
"birthDate": "1986-11-28",
"sex": "female",
"telecom": [
{ "system": "Email", "value": "uhura-keitarovna@ogogomail.com" },
{ "system": "Telephone", "value": "+73218213232" }
],
"documentDto": [
{
"providerName": "ОВД РАЙОНА ГОРОДА",
"issuedDate": "2006-11-11",
"docN": "123456",
"docS": "1234",
"documentName": "Паспорт гражданина РФ",
"idDocumentType": 14
}
]
}
],
"medDocument": {
"esiaAuth": false,
"attachments": [
{ "partName": "file0" }
]
},
"delivery": ["sms"]
}
--razdelitel
Content-Disposition: form-data; name="file0"; filename="appendix.docx"
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document

<бинарные данные DOCX>

--razdelitel--

Успешный ответ для send

{
"status": "created",
"statusCode": 201,
"trackingId": "44556afd-0e84-b847-1111-a45642661417"
}

АРХИВИРОВАНИЕ отправления

POST /sep/api/signing/drafts/{trackingId}/archive
 — поместить черновик в Архив.

Описание:  Переводит в статус «Архив» на ui — показывается только в при включенном фильтре «Показать архивные» 
Архивирование доступно для 215 / 213 / 500 Статусов.
body обязателен и trackingId должен совпадать с path

Параметры запроса:

Параметр Тип Обязательность Описание
trackingId string Да UUID подписания
practitioner object Да

Объект «работник» данные того, кто инициирует запрос из внешней ИС practitioner обязателен объект обязателен хотя бы один идентификатор: snils или userIdLpu плюс контроль: body.trackingId обязателен и должен совпасть с id в path 

Пример запроса

POST /sep/api/signing/drafts/a1b2c3d4-5678-90ef-1234-567890abcdef/archive HTTP/1.1
Host: b2b-demo.n3health.ru
Authorization: 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe
Content-Type: application/json
{
"trackingId": "a1b2c3d4-5678-90ef-1234-567890abcdef",
"practitioner": {
"snils": "23148567894",
"userIdLpu": "Uhura143"
}
}
Успешный ответ
{ "status": "success", "trackingId": "
" } + HTTP 200

Формат ошибок (400)

Ошибки сейчас отдаются как BadRequestException с JSON-телом следующего вида:

{
"status": "error",
"errorCode": "NOT_FOUND",
"errorMessage": "Отправление не найдено"
}

Нет доступа (X-Id-Lpu не совпал с org пакета)

{
"status": "error",
"errorCode": "ACCESS_DENIED",
"errorMessage": "Нет доступа к отправлению"
}

Неверный статус (не 215/213/500)

{
"status": "error",
"errorCode": "NOT_DRAFT",
"errorMessage": "Архивировать можно только черновик (215), отменённое (213) или ошибочное (500) отправление"
}

Отсутствует заголовок

{

«statusCode»: 400,

«message»: «x-id-lpu header is required»,

«error»: «Bad Request»

}

Метод отмены подписания

Метод позволяет отменить подписание до того, как один из подписантов осуществил подписание. 

Авторизация стандартная как при подписании.

POST sep/api/signing/{trackingId}/cancel

trackingId отправления — полученный при выполнении метода отправки на подпись.

Пример запроса

POST https://b2b-demo.n3health.ru/sep/api/resend

Authorization: 53656afd-0e84-17dd-5555-9de51d0aa920
X-Id-Lpu: 1234937e-bla4-707d-abcd-3ce6df2bf68e
Content-Type: application/json
{
"trackingId": "8da15c45-3b27-8727-77dd-9de51d0aa920",
"delivery": ["mila"],
"IdPatientMis": ["singaevDemo1234"]
}

Ответ
Успешный ответ (200 OK):

{ "success": true, "message": "Уведомление успешно повторно отправлено", "tracking_id": "a8cc7886-906f-42e4-aa3c-747df306930f"}

Ошибка (400 Bad Request):

{ "error": "Документ не найден", "message": "Tracking ID не существует" }
       

       { "error": "IdPationMis не найден", "message": "IdPationMis не существует или не соответствует "trackingId" }

Ошибка (404 Not Found):

{ "error": "Документ не найден", "message": "Tracking ID не существует" }

Дополнительно возможно отменить отправку до подписания в личном кабинете клиники в Mila при просмотре конкретного отправления через меню опция (Шестеренка отправления)

Повторная отправка уведомления

Описание

Метод для повторной отправки уведомления о необходимости подписания документа по указанному trackingId. Позволяет изменить способ доставки уведомления.

Базовые параметры

Демо-окружение: https://b2b-demo.n3health.ru

Базовый путь API: /sep/api

Полный базовый URL: https://b2b-demo.n3health.ru/sep/api

HTTP-запрос
POST https://b2b-demo.n3health.ru/sep/api/resend

Заголовки (Headers)

Authorization string Да Токен доступа СЭП 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu string Да Идентификатор медицинской организации (из регионального справочника) 0453937e-fad5-402d-aacb-3ce6df2bf6fe
Content-Type string Да Формат тела запроса application/json
{
"trackingId": "string",
"delivery": ["string"],
"IdPatientMis": ["string"]
}

Параметры

trackingId string Да Идентификатор отслеживания подписания (полученный при первоначальной отправке) «8da15c45-3b27-8727-77dd-9de51d0aa920»
delivery array[string] Да Способ доставки нового уведомления. Возможные значения: sms, max, mila, goskey [«mila»]
IdPatientMis array[string] Да Идентификатор пациента в отправляющей системе [«singaevDemo1234»]

Пример запроса

POST https://b2b-demo.n3health.ru/sep/api/resend
Authorization: 53656afd-0e84-77dd-5555-9de51d0aa920
X-Id-Lpu: 1234937e-bla4-707d-abcd-3ce6df2bf6fe
Content-Type: application/json

{
  "trackingId": "8da15c45-3b27-8727-77dd-9de51d0aa920",
  "delivery": ["mila"],
  "IdPatientMis": ["singaevDemo1234"]
}

Ответ

Успешный ответ (200 OK):

{"success": true,   "message": "Уведомление успешно повторно отправлено",   "tracking_id": "a8cc6886-956f-42e4-aa3c-742df306930f"}

Ошибка (400 Bad Request):

{   "error": "Документ не найден",   "message": "Tracking ID не существует" }
{   "error": "IdPationMis не найден",   "message": "IdPationMis  не существует или не соответствует "trackingId" }

Ошибка (404 Not Found):

{   "error": "Документ не найден",   "message": "Tracking ID не существует" }

Важные примечания

  1. Формат IdPatientMis:  Параметр передается как массив строк для поддержки будущей функциональности отправки уведомлений нескольким пациентам по одному отправлению.

  2. Соответствие ID: IdPatientMis должен соответствовать тому, который был указан при первоначальной отправке документа.

  3. Способы доставки: Доступные значения для поля delivery :

    • sms — SMS-сообщение
    • max — MAX-сообщение
    • mila — Mila-сообщение
  4. Таймауты : Рекомендуемый таймаут для запроса — 30 секунд.

  5. Логика биллинга на текущий момент. Если ранее было отправлено не СМС, то отправление снимается тарификации, создается новая биллинговая запись с новым указанными типом. Если СМС, то тарификация по факту отправки.

Запрос на локальное подписание КЭП

Базовые параметры

Демо-окружение: https://b2b-demo.n3health.ru

Базовый путь API: /sep/api

Полный базовый URL: https://b2b-demo.n3health.ru/sep/api/initqes

Метод для отправки открепленной подписи КЭП указанному trackingId. После локального подписания КЭПом через initQes комплекта документов.  
Доступна выдача при GET запросе по trackingId. 
Метод можно будет успешно исполнен при статусах trackingId 208, 209, 201, 211, 214

В ответ возвращается ссылка qesLink переход на которую должен быть осуществлен в браузере имеющем установленный КриптоПро плагин и настроен сертификат с локальным СКЗИ.

После процесса подписания на документ будет наложена визуализация подписи КЭП и возможность скачать результаты: PDF + .SIG А итоговый файл будет помещен в хранилище N3health и доступен для получения через  GET методы .

Метод: Добавляем файл открепленной подписи к подписанному пациентом отправлению.
Использовать метод возможно только при статусе отправления: 

208 Успешно. Подписан всеми — обработка Success. Fully Signed — Processing Все получатели подписали, документ обрабатывается

Статус выведен из эксплуатации, использовался ранее

209 Успешно. Подписан не всеми — обработка Success. Partially Signed — Processing Не все получатели подписали, документ обрабатывается

Статус выведен из эксплуатации, использовался ранее

210 Завершено. Подписано всеми Completed. Fully Signed Все получатели подписали, документ сохранен Актуальный статус
211 Завершено. Подписано не всеми Completed. Partially Signed Не все получатели подписали, документ сохранен Актуальный статус
214 Требует подписания КЭП UKEP required  Требуется подписание КЭП медицинского работника Актуальный статус

Заголовки (Headers)

Authorization string Да Токен доступа СЭП 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu string Да Идентификатор медицинской организации (из регионального справочника) 0453937e-fad5-402d-aacb-3ce6df2bf6fe
Content-Type string Да Формат тела запроса application/json

 

{
"trackingId": "8da15c45-3b27-8727-77dd-9de51d0aa920",
"practitioner": {
"familyName": "Иванов",
"givenName": "Иван",
"middleName": "Иванович",
"snils": "12345678912", // Обязательно для валидации
"certificateThumbprint": "A1B2C3D4E5F6...", // Опционально
"userIdLpu": "doc-123",
"telecom": [
{ "system": "Email", "value": "email@example.com" },
{ "system": "Telephone", "value": "+71234567890" }
]
}
}

Параметры

trackingId string Да Идентификатор отслеживания подписания (полученный при первоначальной отправке) «8da15c45-3b27-8727-77dd-9de51d0aa920»
practitioner string Да

Данные работника инициировавшего запрос

«practitioner»: {

«mrProxyNumber»: «12-52884аАА», // номер МЧД — опционально

«familyName»: «Иванов», // Обязательно

«givenName»: «Иван», // Обязательно

«middleName»: «Иванович», // опционально

«userIdLpu»: «doc-123», // Обязательно

«snils»: «12345678912», // Обязательно

«certificateThumbprint»: «A1B2C3D4E5F6…», // опционально

«telecom»: [{ «system»: «Email», «value»: «email@example.com» }, // Обязательно
{ «system»: «Telephone», «value»: «+71234567890» } //Обязательно]
}
practitioner.certificateThumbprint string нет

Отпечаток (thumbprint) сертификата КЭП врача в формате HEX (например, A1B2C3D4E5F6…). Если указан и сертификат с таким отпечатком найден в системе пользователя, он будет автоматически выбран в процессе подписания. Пользователь сохраняет возможность выбрать другой сертификат вручную

qesZspd boolean Нет Если «true» то qesLink будет возвращен для ЗСПД контура (для Облачных МИС — рекомендуется «false» — если отсутствует сетевая связанность. Просмотр подписываемого документа в этом случае недоступен. 
Документ передается напрямую в КриптоПро плагин. (по умолчанию «false»)

Пример запроса

POST https://b2b-demo.n3health.ru/sep/api/initqes
Authorization: 53656afd-0e84-77dd-5555-9de51d0aa920
X-Id-Lpu: 1234937e-bla4-707d-abcd-3ce6df2bf6fe
Content-Type: application/json
{
"trackingId": "8da15c45-3b27-8727-77dd-9de51d0aa920",
"practitioner": {
"mrProxyNumber": "12-52884аАА",
"familyName": "Иванов",
"givenName": "Иван",
"middleName": "Иванович",
"userIdLpu": "doc-123",
"snils": "12345678912",
"certificateThumbprint": "A1B2C3D4E5F6...",
"telecom": [
{ "system": "Email", "value": "email@example.com" },
{ "system": "Telephone", "value": "+71234567890" }
]
}

Ответ

  • Успешный ответ (200 OK):

    {
    "success": true,
    "message": "Подпись успешно добавлена, и будет доступна после индексации",
    "tracking_id": "a8cc6886-956f-23e4-aa3c-742df306930f",
    "qesLink": "https://b2b-demo.n3health.ru/sep/mis/qes/addqes-t?trackingId=cd6899fe-9ae6-4b86-ac48-8cefe6db749b&thumbprint=231B6DEE3B12348A3C6BACF943EFD7788B8E69EC"
    }
  • Ошибка (400 Bad Request):

    {   "error": "Документ не найден",   "message": "Tracking ID не существует",  "tracking_id": "a8cc6886-956f-42e4-aa3c-742df306930f" }
    {   "error": "Документ не соответствует",   "message": "Tracking ID не соответствует указанной организации, проверьте токен доступа или трекинг номер",  "tracking_id": "a8cc6886-956f-42e4-aa3c-742df306930f" }
    {   "error": "Метод недоступен для текущего статуса trackingId",   "message": "Статус TrackingID должен быть trackingId 208, 209, 201, 211, 214 ",  "trackingStatus": "203" }

Запрос на локальное подписание КЭП списка отправлений

Базовые параметры

Демо-окружение: https://b2b-demo.n3health.ru

Базовый путь API: /sep/api

Полный базовый URL: https://b2b-demo.n3health.ru/sep/api/initbatchqes

Метод: Инициализирует последовательное проставление квалифицированной электронной подписи (КЭП) списку отправлений, подписанных пациентом.

Описание

Метод пакетного подписания QES (КЭП) работником отправлений по trackingIds  ИЛИ  заданным параметрам.
В ответ на запрос возвращается ссылка, переход на которую должен быть осуществлен в браузере, имеющем установленный КриптоПро плагин и настроен сертификат с локальным СКЗИ.
Перед подписанием на документ будет наложена визуализация подписи КЭП. После подписания документы сохраняются в Сервисе Электронной Подписи и доступны через GET-методы.

Внешняя информационная система может осуществить следующие сценарии:

  • Отправка массива trackingIds конкретных отправлений  для проставления КЭП
    Будет инициировано подписание только trackingIds из запроса.
  • Отправить  запрос по параметрам, без указания конкретных trackingIds
    В таком случае будет осуществлена выборка в соответствии с передаваемыми параметрами.

Важно: без явного указания статусов возвращаются отправления в статусе 214 (требуется подписание КЭП).

по дате — все отправления конкретного работника за период.

по дате и статусу — все отправления конкретного работника за период и статусы

POST https://b2b-demo.n3health.ru/sep/mis/api/initbatchqes

Заголовки (Headers)

Authorization string Да Токен доступа СЭП 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu string Да Идентификатор медицинской организации (из регионального справочника) 0453937e-fad5-402d-aacb-3ce6df2bf6fe
Content-Type string Да Формат тела запроса application/json
{"trackingIds": ["34a987b7-b042-4e6f-a8c1-19ffd9066786", "52c94dcd-b470-48e4-8449-443480732a1b", "5ad07a15-33b6-4699-a0f3-63f9d5b04e2c", "0c585017-e776-4eda-99ba-492959a17736"],
  "certificateThumbprint": "A1B2C3...",
  "dateFrom": "2025-03-01",
  "dateTo": "2025-03-20",
  "statuses": ["214", "210", "211"],
  "practitioner": {
    "snils": "1234567899",
    "userIdLpu": "doc-Id123"
  } }

либо

{
  "trackingIds": ["34a987b7-b042-4e6f-a8c1-19ffd9066786", "52c94dcd-b470-48e4-8449-443480732a1b", "5ad07a15-33b6-4699-a0f3-63f9d5b04e2c", "0c585017-e776-4eda-99ba-492959a17736"],
  "practitioner": {
    "snils": "1234567899",
    "userIdLpu": "doc-Id123"
  }
}

Параметры тела запроса 

trackingIds array of strings Нет* Приоритет над остальными параметрами. Массив идентификаторов отправлений для подписания.
*Должен быть передан либо trackingIds либо параметры для выборки dateFrom, dateTo, statuse
certificateThumbprint string

Нет (условно обязателен) *

Отпечаток (thumbprint) сертификата КЭП врача в формате HEX (например, A1B2C3D4E5F6…). Если указан и сертификат с таким отпечатком найден в системе пользователя, он будет автоматически выбран в процессе подписания. Пользователь сохраняет возможность выбрать другой сертификат вручную.  Не является фильтром по сертификату. Без других параметров указывается с целью автоматического выбора сертификата на странице подписания для удобства пользователя.

* Если onlyPractitionerCertificateThumbprint =  true, то certificateThumbprint обязателен

practitioner object

Да **

Данные работника,  инициирующего запрос по API важно  в текущей редакции —  не является фильтром по работнику !  

**  должен быть передан один из идентификаторов: practitioner.snils | practitioner.userIdLpu

practitioner.snils string условно обязателен СНИЛС работника (приоритет над userIdLpu если переданы оба)
practitioner.userIdLpu string условно обязателен Внутренний идентификатор работника в МИС. Используется, если не передан snils.
dateFrom string (ISO 8601) Нет Начало периода (включительно), формат YYYY-MM-DD.
dateTo string (ISO 8601) Нет Окончание периода (включительно), формат YYYY-MM-DD.
statuses array of strings Нет Список статусов.  Если не передан или отсутствует — по умолчанию «214». Допустимые: 210, 211, 214.
onlyPractitioner boolean нет

Включает фильтр по работнику (practitioner)
Если true, из всех отобранных отправлений (по параметрам dateFrom/dateTo/statuses) будут включены в сессию только те, которые принадлежат указанному работнику (practitioner) который был указан в запросе на отправку ПЭП в адрес пациента ранее.

По умолчанию false.
onlyPractitioner не игнорируется при trackingIds. 

onlyPractitionerCertificateThumbprint  boolean нет Фильтр по сертификату из текущего запроса  (certificateThumbprint)
Если указан, то осуществить подписание возможно будет только с сертификатом работника указанного в certificateThumbprint из текущего запроса.
Если true, то обязательно наличие certificateThumbprint, иначе возвращается ошибка.

  • Обязательно  наличие certificateThumbprint и в интерфейсе подписания пользователь не сможет выбрать отличный сертификат  от переданного в запросе.

Если onlyPractitionerCertificateThumbprint =  false или не указан:

  • пользователь может выбрать любой сертификат (certificateThumbprint) из доступных в момент инициации подписания в локальном хранилище.

    важно onlyPractitionerCertificateThumbprint  — не игнорируется  если передан массив trackingId

firstTouchCertificateThumbprint boolean нет Фильтр по сертификату из запросов на POST /sep/api/signing ранее направленных для проставления простой электронной подписи.
qesZspd boolean нет Если «true» то qesLink будет возвращен для ЗСПД контура (для Облачных МИС — рекомендуется «false» — если отсутствует сетевая связанность. Просмотр подписываемого документа в этом случае недоступен. 
Документ передается напрямую в КриптоПро плагин (по умолчанию «false»)

* должен быть передан один из идентификаторов.
**Либо trackingIds либо параметры.

Корректный минимальный пример

POST https://b2b-demo.n3health.ru/sep/mis/api/initbatchqes

Authorization:
X-Id-Lpu:
Content-Type: application/json
{
"trackingIds": [
"34a987b7-b042-4e6f-a8c1-19ffd9066786",
"52c94dcd-b470-48e4-8449-443480732a1b"
],
"certificateThumbprint": "A1B2C3...",
"practitioner": {
"snils": "12345678990",
"userIdLpu": "doc-Id123"
},
"qesZspd": false
}

ответ

{
"success": true,
"message": "Сессия пакетного подписания создана",
"batchQesLink": "https://sep.mila.online/sep/mis/qes/addbatchqes?id=96c6a822-7cc2-4ed9-9ba6-c60b4a468e03&thumbprint=A1B2C3...",
"sessionId": "96c6a822-7cc2-4ed9-9ba6-c60b4a468e03",
"total": 2
}

Подписание всех отправлений работника за период (статус 214)

{
"practitioner": {
"snils": "12345678990"
},
"dateFrom": "2025-03-01",
"dateTo": "2025-03-20"
}

Подписание отправлений работника за период с указанием статусов{

"practitioner": {
"userIdLpu": "doc-12345"
},
"dateFrom": "2025-03-01",
"dateTo": "2025-03-20",
"statuses": ["210", "214"]
}

Фильтрация отправлений по работнику + обязательный сертификат этого же работника

{
"practitioner": {
"snils": "12345678990"
},
"dateFrom": "2025-03-01",
"dateTo": "2025-03-20",
"statuses": ["214"],
"onlyPractitioner": true,
"onlyPractitionerCertificateThumbprint": true,
"certificateThumbprint": "A1B2C3..."
}

Ошибка: не передан ни trackingIds, ни practitioner (400 Bad Request)

{
"error": "Недостаточно параметров",
"message": "Необходимо указать trackingIds или practitioner (snils/userIdLpu)"
}

Ошибка: не переданы обязательные параметры (400 Bad Request)

{
"error": "Недостаточно параметров",
"message": "onlyPractitionerCertificateThumbprint = true, а certificateThumbprint отсутствует. Для принудительного выбора сертификата необходимо передать certificateThumbprint"
}

Ошибка: работник не найден (404 Not Found)

{
"error": "Practitioner not found",
"message": "Работник с указанным snils=12345678990 не найден"
}

Ошибка: некорректный формат даты (400 Bad Request)

{
"error": "Invalid date format",
"message": "dateFrom должен быть в формате YYYY-MM-DD"
}

Примечания

  • Обязательно должен быть задан practitioner (через snils или userIdLpu).

  • Без явного указания statuses подбираются отправления только в статусе 214 (ожидают подписания КЭП).

  • После получения batchQesLink необходимо открыть её в браузере (или эмулировать) с установленным КриптоПро плагином и настроенным сертификатом

Анкетирование

PEP-600. Документ для интеграторов (МИС, MILA). Базовый путь: /sep/api/questionnaires. Сервис: n3h-sep-gateway-api.

Демо: https://b2b-demo.n3health.ru/sep/api · Production: https://b2b.n3health.ru/sep/api

Общие заголовки

Заголовок Обязательно Описание
Authorization Да Токен доступа СЭП (без Bearer)
X-Id-Lpu Да UUID медицинской организации
Content-Type: application/json Да* Для POST / PUT (* для GET не требуется)

На входе gateway принимаются только российские мобильные +7 9XX …. Номера других стран и регионов (в т.ч. Казахстан +7 7XX) — 400.

Методы POST / PUT / DELETE (шаблоны и отправка)

Метод URL Назначение Успех
POST /questionnaires/templates Создание шаблона 201 объект шаблона
PUT /questionnaires/templates/{id} Редактирование (новая версия schema) 200 объект шаблона
DELETE /questionnaires/templates/{id} Деактивация (active: false) 200 id, active, deactivated
POST /questionnaires/templates/{id}/send Отправка анкеты пациенту 200 submissionId, trackingId, …
POST /initquestionnairetemplate Создание шаблона + сессия редактирования (ссылка UI) 200 editLink, sessionId, templateId, expiresAt

Для скачивания PDF анкеты используйте GET /questionnaires/submissions/{id}/download. GET /signing/{trackingId} — альтернатива (общий контракт подписания), не основной путь для анкет.

Типы вопросов в schema

type UI Ответ (value) options
yes_no Да / Нет boolean не нужны
text Развёрнутый ответ string не нужны
single_choice Радиокнопки string id опции минимум 2
multiple_choice Чекбоксы string[] id опций минимум 2
select_single Выпадающий список string id опции минимум 2

Один и тот же JSON используется для POST (создание) и PUT (редактирование). При PUT создаётся новая версия schema.

POST /questionnaires/templates

POST https://b2b-demo.n3health.ru/sep/api/questionnaires/templates
Authorization: <token>
X-Id-Lpu: <uuid-lpu>
Content-Type: application/json

{
  "title": "Комплексная анкета перед приёмом",
  "comment": "Для регистратуры и врача",
  "schema": {
    "title": "Анкета перед приёмом",
    "description": "Заполните, пожалуйста, перед визитом",
    "questions": [
      { "id": "q-yes-no-1", "label": "Есть ли аллергия на лекарства?", "type": "yes_no", "required": true, "order": 0 },
      { "id": "q-text-1", "label": "Опишите текущие жалобы", "type": "text", "required": false, "order": 1 },
      { "id": "q-single-1", "label": "Как часто посещаете поликлинику?", "type": "single_choice", "required": true, "order": 2,
        "options": [
          { "id": "opt-sc-1", "label": "Регулярно", "order": 0 },
          { "id": "opt-sc-2", "label": "По необходимости", "order": 1 }
        ]
      }
    ]
  }
}

PUT /questionnaires/templates/{templateId}

PUT https://b2b-demo.n3health.ru/sep/api/questionnaires/templates/{templateId}
Authorization: <token>
X-Id-Lpu: <uuid-lpu>
Content-Type: application/json

{
  "title": "Комплексная анкета (обновлённая)",
  "comment": "v2",
  "active": false,
  "schema": { "title": "Анкета перед приёмом", "questions": [ ... ] }
}

DELETE /questionnaires/templates/{templateId}

Деактивирует шаблон (active: false). Отправленные анкеты сохраняются.

DELETE https://b2b-demo.n3health.ru/sep/api/questionnaires/templates/uuid-template
Authorization: <token>
X-Id-Lpu: <uuid-lpu>

Ответ 200:
{ "id": "uuid-template", "active": false, "deactivated": true }

POST /initquestionnairetemplate

Аналог initqes: МИС создаёт шаблон (или привязывает существующий) и получает одноразовую ссылку на UI редактирования без входа в ЛК.

POST https://b2b-demo.n3health.ru/sep/api/initquestionnairetemplate
Authorization: <token>
X-Id-Lpu: <uuid-lpu>
Content-Type: application/json

{
  "practitioner": {
    "familyName": "Иванов", "givenName": "Иван", "middleName": "Иванович",
    "snils": "12345678901", "userIdLpu": "doctor@clinic.ru"
  },
  "title": "Анкета перед приёмом",
  "comment": "Черновик из МИС"
}
Поле Обязательно Описание
practitioner Да Как при /send: snils 11 цифр, ФИО
title Нет По умолчанию «Новая анкета»
comment Нет Комментарий для сотрудников
schema Нет Начальная схема; иначе один вопрос-заготовка
templateId Нет UUID существующего шаблона (новый не создаётся)
Ответ 200:
{
  "editLink": "https://sep.mila.online/sep/mis/questionnaires/edit-template?id=uuid-session",
  "sessionId": "uuid-session",
  "templateId": "uuid-template",
  "expiresAt": "2026-07-05T12:00:00.000Z"
}

POST /questionnaires/templates/{templateId}/send

Обязательны patient + practitioner (как signing). practitioner.snils — 11 цифр.

POST https://b2b-demo.n3health.ru/sep/api/questionnaires/templates/{templateId}/send
Authorization: <token>
X-Id-Lpu: <uuid-lpu>
Content-Type: application/json

{
  "practitioner": {
    "familyName": "Иванов", "givenName": "Иван", "userIdLpu": "doc-123", "snils": "12345678901"
  },
  "patient": {
    "idPatientMis": "PAT-001", "familyName": "Петров", "givenName": "Пётр",
    "birthDate": "1985-03-15", "sex": "male",
    "telecom": [
      { "system": "Telephone", "value": "+79261234567" },
      { "system": "Email", "value": "patient@example.com" }
    ],
    "documentDto": [{ "docN": "123456", "docS": "4510", "providerName": "УФМС", "idDocumentType": 223 }]
  },
  "deliveryChannels": ["mila"],
  "clientRequestId": "mis-req-42"
}
Поле ответа Описание
submissionId ID анкеты — метаданные и скачивание PDF
trackingId UUID doc_package — опрос статуса через GET /signing/{trackingId}
shortLink Ссылка для пациента
notificationSent true, если хотя бы один канал доставки отработал

clientRequestId — опциональный ID запроса МИС для аудита.

Каналы доставки (deliveryChannels)

Канал Статус
mila бесплатно
email бесплатно
sms платно, только РФ +7 9XX
max платно, только РФ +7 9XX
mid недоступен (400)

Запрос на самостоятельное подписание КЭПа

SelfQES используется, когда МИС самостоятельно формирует откреплённую КЭП-подпись для документа.

Сценарий работы:

  1. МИС вызывает 
    POST /initselfqes
    .
  2. SEP возвращает PDF в base64 и идентификатор одноразовой сессии 
    signingSessionId
    .
  3. МИС подписывает ровно этот PDF на своей стороне и формирует откреплённую подпись 
    .sig
     в base64.
  4. МИС вызывает 
    POST /attachselfqes
     и передаёт подпись.
  5. SEP проверяет подпись, сохраняет её и добавляет КЭП к отправлению.
  6. Результат доступен через 
    GET /signing/{trackingId}

Метод доступен для статусов отправления:

214 Требуется подписание КЭП
210 Завершено. Подписано всеми
211 Завершено. Подписано не всеми

Метод 1. POST /sep/api/initselfqes

Базовые параметры

Демо-окружение

https://b2b-demo.n3health.ru

Базовый путь API

/sep/api

Полный базовый URL

https://b2b-demo.n3health.ru/sep/api/initselfqes

Метод

Инициализация самостоятельного КЭП-подписания: выдача PDF в base64 и создание сессии

Допустимые статусы trackingId

214

Требует подписания КЭП

UKEP required

Первичное КЭП

210

Завершено. Подписано всеми

Completed. Fully Signed

Доп. подпись, если 
qesKeys
 не пуст

211

Завершено. Подписано не всеми

Completed. Partially Signed

Доп. подпись, если 
qesKeys
 не пуст

Описание

Метод для получения PDF комплекта документов для локального подписания УКЭП на стороне МИС (без браузера и без 
qesLink
). После подписания PDF на стороне МИС откреплённая подпись передаётся методом 
attachselfqes
.

Для статуса 214 на PDF накладывается визуализация КЭП. Для 210/211 при уже существующих 
qesKeys
 PDF выдаётся без повторной визуализации (режим дополнительной подписи).

В ответе: 
signingSessionId
 (обязателен для attach), 
expiresAt
, PDF в 
document.content
 (base64).


signingSessionId
 является одноразовой сессией подписания. По одной сессии можно успешно загрузить подпись только один раз. Повторный или параллельный 
attachselfqes
 по той же сессии будет отклонён.


HTTP-запрос
POST  https://b2b-demo.n3health.ru/sep/api/initselfqes

Заголовки

Authorization

string

Да

Токен доступа СЭП

44556afd-0e84-b847-2322-75999668f590

X-Id-Lpu

string

Да

Идентификатор ЛПУ

0453937e-fad5-402d-aacb-3ce6df2bf6fe

Content-Type

string

Да

Формат тела

application/json

Тело запроса


{

"trackingId": "8da15c45-3b27-8727-77dd-9de51d0aa920",

"practitioner": {

"snils": "12345678912",

"userIdLpu": "doc-123"

},

"certificate": {

"certificateSerialNumber": "02510FA5000EB4458149ECCFBBDCD608A3",

"certificateThumbprint": "B97877E2033309DBF105B37456EBCA9AA9743D08",

"certificateIssuer": "CN=Test CA, O=Org, C=RU",

"certificateSubject": "CN=Иванов Иван Иванович",

"validFrom": "2026-03-15T12:50:58+03:00",

"validTo": "2027-06-15T13:00:58+03:00"

}

}

Параметры

trackingId

string

Да

Идентификатор отправления

practitioner

object

Да

Работник, инициировавший подписание

practitioner.snils

string

Условно*

СНИЛС (11 цифр)

practitioner.userIdLpu

string

Условно*

ID работника в ЛПУ

certificate

object

Да

Данные сертификата для визуализации

certificate.certificateThumbprint

string

Да

Отпечаток HEX

certificate.certificateIssuer

string

Да

Издатель

certificate.certificateSubject

string

Да

Владелец (Subject)

certificate.certificateSerialNumber

string

Нет

Серийный номер

certificate.validFrom / validTo

string ISO-8601

Да

Срок действия

* Обязательно одно из: 
snils
 или 
userIdLpu
.

Успешный ответ (200 OK)


{

"success": true,

"message": "PDF подготовлен для самостоятельного КЭП-подписания",

"trackingId": "8da15c45-3b27-8727-77dd-9de51d0aa920",

"statusCode": 214,

"signingSessionId": "96c6a822-7cc2-4ed9-9ba6-c60b4a468e03",

"expiresAt": "2026-05-04T14:30:00.000Z",

"document": {

"fileName": "signed_base_1715000000000.pdf",

"mimeType": "application/pdf",

"content": "JVBERi0xLjQKJ...",

"contentEncoding": "base64"

}

}

Ошибки (примеры)


  • NOT_FOUND
     (404) — документ не найден / не принадлежит ЛПУ

  • ACCESS_DENIED
     (403) — несовпадение X-Id-Lpu

  • INVALID_STATUS
     (400) — статус не 214 / 210 / 211

  • PRACTITIONER_IDENTIFIER_REQUIRED
     (400) — не передан snils и userIdLpu

  • PROCESSING_ERROR
     (500) — ошибка подготовки PDF

Метод 2. POST /sep/api/attachselfqes

Базовые параметры

Полный URL (demo)

https://b2b-demo.n3health.ru/sep/api/attachselfqes

Метод

Прикрепление откреплённой подписи 
.sig
 после локального подписания PDF

Описание

Метод принимает откреплённую подпись, проверяет её через CryptoPro Service, сверяет с PDF из сессии 
initselfqes
, сохраняет в S3 и обновляет 
qesKeys
. При первичном КЭП (214) статус переходит в 210/211. Результат доступен через GET по 
trackingId
 после индексации.

В 
attachselfqes
 необходимо передать того же practitioner, который был указан в 
initselfqes
: совпадение проверяется по 
snils
 и/или 
userIdLpu
.

Тело запроса


{

"trackingId": "8da15c45-3b27-8727-77dd-9de51d0aa920",

"signingSessionId": "96c6a822-7cc2-4ed9-9ba6-c60b4a468e03",

"signature": {

"sigBase64": "MIIA...",

"fileName": "document.pdf.sig"

},

"practitioner": {

"snils": "12345678912",

"userIdLpu": "doc-123"

}

}

Успешный ответ (200 OK)


{

"success": true,

"message": "КЭП успешно прикреплена к отправлению",

"trackingId": "8da15c45-3b27-8727-77dd-9de51d0aa920",

"statusCode": 210,

"qesStatus": {

"signedAt": "2026-05-04T14:12:30.000Z",

"thumbprint": "B97877E2033309DBF105B37456EBCA9AA9743D08",

"certificateSubject": "CN=Иванов Иван Иванович",

"certificateSerialNumber": "02510FA5000EB4458149ECCFBBDCD608A3",

"iemkSaved": "pending"

}

}

Коды ошибок:
HTTP 422 Unprocessable Entity со структурированным ответом на русском:


{

"statusCode": 422,

"success": false,

"error": "SIGNATURE_DOCUMENT_MISMATCH",

"message": "Проверка файла подписи не пройдена.",

"reason": "Файл подписи не относится к PDF текущей сессии: подпись, вероятно, сформирована для другого документа или подписан не тот PDF, который был выдан в initselfqes.",

"trackingId": "b32c2c5b-88a2-4ce6-9e87-eba70df3a411",

"signingSessionId": "3d0e86fd-1ffe-4d94-b4b3-1055230a82be"

}

{


"statusCode": 422,


"success": false,


"error": "SIGNATURE_DOUBLE_BASE64",


"message": "Некорректный формат файла подписи.",


"reason": "Похоже, signature.sigBase64 было закодировано в base64 повторно ...",


"trackingId": "...",


"signingSessionId": "..."

}
После успешного 
attachselfqes
 результат доступен через 
GET /sep/api/signing/{trackingId}
.
data.medDocument.sign
 содержит первую откреплённую подпись.
data.medDocument.signatures
 содержит массив всех откреплённых КЭП-подписей, включая вторую и последующие.

Пример:


"medDocument": {


"attachments": [


{ "content": "JVBERi0xLjQK..." }


],


"sign": "base64_first_signature",


"signatures": [


"base64_first_signature",


"base64_second_signature",


"base64_third_signature"


]

}

Типовые ошибки

400 INVALID_STATUS Метод недоступен для текущего статуса отправления
400 PRACTITIONER_IDENTIFIER_REQUIRED Не передан practitioner.snils или practitioner.userIdLpu
400 INVALID_SESSION Сессия подписания не найдена или не соответствует trackingId
400 SESSION_EXPIRED Истёк срок действия сессии
400 SESSION_ALREADY_USED По сессии уже была загружена подпись
400 INVALID_SIGNATURE Подпись не прошла проверку
400 SIGNATURE_CONTENT_MISMATCH Подпись не соответствует PDF, который был выдан в initselfqes
403 ACCESS_DENIED X-Id-Lpu не соответствует сессии или отправлению
404 NOT_FOUND Отправление не найдено для указанного ЛПУ

Отличие от initqes

Подписание

Браузер + КриптоПро плагин

Локально на стороне МИС

Ответ init

qesLink

PDF base64+signingSessionId

Статусы

208, 209, 210, 211, 214

214, 210, 211


Предусловия для работы с КЭП сервисом

Необходимо установить криптопровайдер и плагин в браузер или эмулировать.

https://cryptopro.ru/products/cades/plugin/  плагин

КриптоПро CSP важно — подписание осуществляется локально. Таким образом должна быть приобретена поставка КриптоПро CSP c Поддержкой КриптоПро TSP Клиент 2.0 для проставления метки доверенного времени в состав подписываемой информации для долговременного хранения.

https://docs.cryptopro.ru/cades/plugin/plugin-installation-windows

https://docs.cryptopro.ru/cades/plugin/plugin-installation-unix

https://docs.cryptopro.ru/cades/plugin/plugin-installation-macos

Проверка установки 
https://docs.cryptopro.ru/cades/plugin/plugin-usage

ВЕБ ИНСТРУМЕНТЫ ДЛЯ РАБОТЫ С СЕРТИФИКАТАМИ И ПЛАГИНОМ
https://www.cryptopro.ru/sites/default/files/products/cades/demopage_2024-08-09/webtools.html

Приглашения для заполнения данных пациента

Invite API — документация для МИС

Методы получения инвайтов по телефону и Email API GET INVITES получить список приглашений

Базовые параметры

Демо-окружение

https://b2b-demo.n3health.ru

Базовый путь API
/sep/api
Полный базовый URL

https://b2b-demo.n3health.ru/sep/api

Заголовки (общие для всех методов)

Authorization string Да Токен доступа СЭП (без префикса Bearer)
44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu string (UUID) Да Идентификатор МО из регионального справочника
0453937e-fad5-402d-aacb-3ce6df2bf6fe
Content-Type string Да Формат тела запроса
application/json

Общие правила


  • inviteId
     — отдельная сущность, не 
    trackingId
  • Invite API ≠ метод 
    /resend
     (тот работает с 
    trackingId
     отправления документов).
  • Каналы доставки invite: только 
    sms

    max

    email
     (
    mila пока нет
    ).
  • Уведомления отправляются асинхронно: ответ API приходит сразу, доставка SMS/MAX/Email — в фоне.

Блок 
practitioner
 (для методов изменения invite)

Обязателен в initInvite, InviteResend, InviteCancel.


userIdLpu
Нет* ID работника в МИС

snils
Нет* СНИЛС работника

familyName
Да Фамилия

givenName
Да Имя

middleName
Нет Отчество

mpiID

email

phone
Нет Дополнительные поля

* Обязателен хотя бы один из 
userIdLpu
 или 
snils
.


Отправка приглашения

Описание

Создаёт приглашение для самостоятельного заполнения пациентом сведений о документе удостоверяющим личность и подписания ПДН. Формирует PDF согласия, короткую ссылку и отправляет уведомление по выбранным каналам. Возможно автоматическое заполнение через ЕСИА.

Запрос POST https://b2b-demo.n3health.ru/sep/api/initInvite

Тело запроса { «patient»: { «phone»: «+79991234567», «email»: » patient@example.com » }, «practitioner»: { «userIdLpu»: «doctor-001», «familyName»: «Иванов», «givenName»: «Иван», «middleName»: «Иванович», «snils»: «12345678901» }, «channels»: [«sms», «max», «email»] }

Параметры

patient object Да Контакты пациента
patient.phone string Нет** Телефон (
+7...
)
patient.email string Нет** Email
practitioner object Да Работник, инициировавший invite
practitioner.userIdLpu string Нет* ID работника в МИС
practitioner.snils string Нет* СНИЛС работника
practitioner.familyName

string

Да

Фамилия

practitioner.givenName

string

Да

Имя

practitioner.middleName

string

Нет

Отчество

channels

array[string]

Нет


sms

max

email
. Если не указано — все доступные

* Хотя бы 
userIdLpu
 или 
snils
.
** Хотя бы 
phone
 или 
email
.

Каналы (
channels
)


sms
Нужен 
patient.phone
Платно

max
Нужен 
patient.phone
Платно; бесплатно, если в invite есть SMS

email
Нужен 
patient.email
Бесплатно

Пример — SMS + MAX + Email POST https://b2b-demo.n3health.ru/sep/api/initInvite Authorization: 44556afd-0e84-b847-2322-75999668f590 X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe Content-Type: application/json { «patient»: { «phone»: «+79991234567», «email»: » patient@example.com » }, «practitioner»: { «userIdLpu»: «doctor-001», «familyName»: «Иванов», «givenName»: «Иван», «middleName»: «Иванович» }, «channels»: [«sms», «max», «email»] }

Пример — только MAX { «patient»: { «phone»: «+79991234567» }, «practitioner»: { «userIdLpu»: «doctor-001», «familyName»: «Иванов», «givenName»: «Иван» }, «channels»: [«max»] }

Ответ — 201 Created { «inviteId»: «a8cc6886-956f-42e4-aa3c-742df306930f», «link»: » https://b2b-demo.n3health.ru/sep/s/AbCdEf » }

inviteId

ID приглашения (для InviteInfo / InviteResend / InviteCancel)

link

Короткая ссылка на форму для заполнения сведений о пациенте

Ошибки

400
Укажите телефон или email пациента
400
Укажите данные работника (practitioner)
400
Укажите userIdLpu или snils работника
400
Укажите фамилию работника (practitioner.familyName)
400
Укажите имя работника (practitioner.givenName)
409 Активный invite уже есть. Используйте inviteId для InviteCancel или InviteResend.
401
Invalid or inactive token

Получение данных и статуса приглашения

Описание

Возвращает статус invite и данные, заполненные пациентом. Опционально — подписанное согласие ПДН в base64.

Работник (
practitioner
) не требуется.

Запрос POST https://b2b-demo.n3health.ru/sep/api/InviteInfo

Тело запроса { «inviteId»: «a8cc6886-956f-42e4-aa3c-742df306930f», «withApprove»: true }

inviteId Да ID из 
initInvite
withApprove Нет Вернуть PDF подписанного ПДН (base64)

Ответ — 200 OK (заполнено, statusCode = 210)

Структура — как в вашем черновике (
inviteData

pdnApprove

originalPhone

originalEmail
).

Коды statusCode

201 Создано, ожидает заполнения
206 Срок ссылки истёк
210 Форма заполнена, ПДН подписано
213 Отменено

Ошибки

404
Invite не найден

Повторная отправка приглашения

Описание

Повторно отправляет уведомление с ссылкой. Можно выбрать каналы. Если invite истёк (
206
), срок продлевается и статус возвращается в 
201
.

Запрос POST https://b2b-demo.n3health.ru/sep/api/InviteResend

Тело запроса { «inviteId»: «a8cc6886-956f-42e4-aa3c-742df306930f», «practitioner»: { «userIdLpu»: «doctor-001», «familyName»: «Иванов», «givenName»: «Иван» }, «channels»: [«max»] }

inviteId Да ID приглашения
practitioner Да Работник (те же правила, что в initInvite)
channels Нет
sms

max

email
. Без указания — все доступные

Пример POST https://b2b-demo.n3health.ru/sep/api/InviteResend Authorization: 44556afd-0e84-b847-2322-75999668f590 X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe Content-Type: application/json { «inviteId»: «a8cc6886-956f-42e4-aa3c-742df306930f», «practitioner»: { «snils»: «12345678901», «familyName»: «Иванов», «givenName»: «Иван» }, «channels»: [«max»] }

Ответ — 200 OK { «success»: true, «inviteId»: «a8cc6886-956f-42e4-aa3c-742df306930f», «sent»: true, «statusCode»: 201 }

Ошибки

400 Ошибки валидации 
practitioner
 (как в initInvite)
400
Заполненное приглашение нельзя переотправить
400
Отмененное приглашение нельзя переотправить
404
Invite не найден

Отмена приглашения

Описание

Отменяет активное приглашение. Ссылка перестаёт действовать (
statusCode = 213
).

Запрос

POST https://b2b-demo.n3health.ru/sep/api/InviteCancel

Тело запроса { «inviteId»: «a8cc6886-956f-42e4-aa3c-742df306930f», «practitioner»: { «userIdLpu»: «doctor-001», «familyName»: «Иванов», «givenName»: «Иван» } }

inviteId Да ID приглашения
practitioner Да Работник (те же правила, что в initInvite)

Пример POST https://b2b-demo.n3health.ru/sep/api/InviteCancel Authorization: 44556afd-0e84-b847-2322-75999668f590 X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe Content-Type: application/json { «inviteId»: «a8cc6886-956f-42e4-aa3c-742df306930f», «practitioner»: { «userIdLpu»: «doctor-001», «familyName»: «Иванов», «givenName»: «Иван» } }

Ответ — 200 OK { «success»: true, «inviteId»: «a8cc6886-956f-42e4-aa3c-742df306930f», «statusCode»: 213 }

Ошибки

400 Ошибки валидации 
practitioner
400
Заполненное приглашение нельзя отменить
404
Invite не найден

Важные примечания

  1. Authorization — чистый UUID, без 
    Bearer
    .
  2. X-Id-Lpu должен совпадать с организацией токена.
  3. При успешном initInvite сохраните inviteId в МИС. При повторной попытке создания на тот же контакт (409) используйте сохранённый inviteId для InviteResend (переотправить) или InviteCancel (отменить и создать новый). Поиск invite по телефону/email через API не поддерживается.
  4. Срок ссылки — 30 дней по умолчанию (
    INVITE_LINK_TTL_DAYS
    ). После истечения — 
    statusCode = 206
    .
  5. Повторное создание на тот же телефон/email блокируется при активном invite (
    201
    ). Сначала 
    InviteCancel
     или дождитесь 
    206
    .
  6. Форма для заполнения пациента — по 
    link
     в браузере; поддерживается ручной ввод и ЕСИА (Госуслуги).

  7. inviteData.passport.raw
    — строка из ЕСИА:
    series:number:issuedDate:issuedBy
    .
  8. Billing — каждая отправка по каналу создаёт запись с 
    entityType: invite
    . Email — free; SMS — платно; MAX — платно (или free, если в invite есть SMS).

    Тарификация 
    InviteResend

    Платно только SMS. Остальное — бесплатно:


    sms
    Платно (каждая отправка)

    max
    Бесплатно (если у invite указан телефон)

    email
    Бесплатно

    Правило для MAX: бесплатно, когда у invite есть 
    patient.phone
     (т.е. SMS технически доступен). Не важно, отправляли ли SMS при первом 
    initInvite
     или только MAX — достаточно наличия телефона в invite.

    Примеры:

    • resend 
      ["max"]
       → бесплатно
    • resend 
      ["sms"]
       → платно
    • resend 
      ["sms", "max", "email"]
       → платно только SMS, MAX и email — бесплатно

МЕТОДЫ GET

Методы предназначены для получения списка отправлений по организации и пациенту или получения конкретного отправления по его трекинг — ID в системе СЭП.

ЭНДПОИНТ : https://b2b-demo.n3health.ru/sep/api/

Анкетирование

Методы получения шаблонов и отправленных анкет. Базовый путь: /sep/api/questionnaires.

Методы GET

Метод URL Назначение Успех
GET /questionnaires/templates Список шаблонов (пагинация, active) 200 items, pagination
GET /questionnaires/templates/{id} Один шаблон 200 объект шаблона
GET /questionnaires/submissions Список анкет (milaId, idPatientMis, phone) 200 items, pagination
GET /questionnaires/submissions/{id} Метаданные (без PDF) 200 объект submission
GET /questionnaires/submissions/{id}/download PDF base64, если заполнена 200 data.attachments; 409 not_filled

GET /questionnaires/templates

GET https://b2b-demo.n3health.ru/sep/api/questionnaires/templates
Authorization: <token>
X-Id-Lpu: <uuid-lpu>

GET /questionnaires/templates/{templateId}

GET https://b2b-demo.n3health.ru/sep/api/questionnaires/templates/{templateId}
Authorization: <token>
X-Id-Lpu: <uuid-lpu>

GET /questionnaires/submissions

Список отправленных анкет в рамках МО.

Параметр Обязательно Описание
milaId Нет* ID пациента MILA / MPI
idPatientMis Нет* ID пациента в МИС
phone Нет* Телефон (+79…, поиск по последним 10 цифрам)
limit Нет 1–100, по умолчанию 50
offset Нет Смещение, по умолчанию 0

(*) Хотя бы один из milaId, idPatientMis, phone — для фильтрации по пациенту. Без них — полный список по МО.

GET https://b2b-demo.n3health.ru/sep/api/questionnaires/submissions?milaId=mila-patient-uuid&limit=50&offset=0
Authorization: <token>
X-Id-Lpu: <uuid-lpu>

Ответ 200:
{
  "items": [{
    "id": "uuid-submission", "docPackageId": "uuid-tracking", "templateId": "uuid-template",
    "title": "Анкета перед приёмом", "templateVersion": 2,
    "patient": { "idPatientMis": "mila-patient-uuid", "familyName": "Петров", "givenName": "Пётр" },
    "state": "sent", "status": 207, "shortLink": "https://...", "createdAt": "2026-07-04T10:00:00.000Z"
  }],
  "pagination": { "limit": 50, "offset": 0, "total": 1 }
}

GET /questionnaires/submissions/{submissionId}

Метаданные без PDF и без ответов на вопросы. Идентификатор — submissionId из ответа send.

GET https://b2b-demo.n3health.ru/sep/api/questionnaires/submissions/uuid-submission
Authorization: <token>
X-Id-Lpu: <uuid-lpu>

GET /questionnaires/submissions/{submissionId}/download

Основной способ скачивания PDF. PDF в base64: data.attachments[0].content.

Ситуация Ответ
Только отправили (state: sent) 409 not_filled
Заполнена, нажато «Подписать» (ready_to_sign) 200 + PDF
Подписана (signed) 200 + PDF
GET https://b2b-demo.n3health.ru/sep/api/questionnaires/submissions/uuid-submission/download
Authorization: <token>
X-Id-Lpu: <uuid-lpu>

Ответ 200:
{ "data": { "submissionId": "uuid-submission", "docPackageId": "uuid-doc-package",
  "attachments": [{ "content": "JVBERi0xLjQK...base64 PDF..." }] } }

Ответ 409: { "status": "not_filled", "message": "Questionnaire is not filled yet" }

Статусы submission (state)

state Описание
sent Отправлена, пациент ещё не заполнял
filling Пациент начал заполнение
ready_to_sign Заполнена, PDF сгенерирован, ожидает подписи
signed Подписана пациентом

После send сохраняйте submissionId — метаданные и PDF. trackingId — для опроса статуса через signing.

Получение списка отправлений по query параметрам

GET /signing (без параметров)
Списочный метод, возвращает все подписания для указанного пользователя через query параметры. Например 
idPatientMis
 (id-пациента из информационной системы, который ранее был передан вместе с данными пациента) с указанием пагинации, метод возвращает помимо прочего - 
{trackingId} отправления
.

Параметры запроса:

Если направить запрос без параметров, то вернётся весь перечень отправлений по организации в соответствии с заголовком X-Id-Lpu.

Пример запроса :

Параметры запроса:  Без параметров

GET /sep/api/signing
Authorization: 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe

Получение отправлений по ID пациента из внешней системы

GET /signing?idPatientMis={id}

Параметры запроса:

idPatientMis string Query Да

ID пациента из внешней системы (например в МИС обязателен при отправке на подпись в post)

123e4567-e89b-12d3-a456-426614174000

Пример запроса:

GET /sep/api/signing?idPatientMis=123e4567-e89b-12d3-a456-426614174000
Authorization: 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe

Query-параметры:

dateFrom string Нет ISO8601 Фильтр по doc_package.createdAt >= dateFrom 2026-04-01T00:00:00.000Z
dateTo string Нет ISO8601 Фильтр по doc_package.createdAt <= dateTo 2026-04-21T23:59:59.999Z
idPatientMis string Условно Уникальный идентификатор пациента в МИС 1Сmed1235A_6
familyName string Условно Фамилия пациента Иванов
givenName string Условно Имя пациента (только с familyName) Павел
middleName string Условно Отчество пациента (только с familyName и givenName) Святославович
email string Условно Email пациента examplename@anydomain.net
telephone string Условно Телефон пациента 79262119529
limit number Нет Количество элементов (1-50) 50
offset number Нет Смещение 0

Примеры запросов:

# Поиск по idPatientMis
GET /signing?idPatientMis=Красносолнышкин

# Поиск по фамилии
GET /signing?familyName=Красносолнышкин

# Поиск по ФИО
GET /signing?familyName=Иванов&givenName=Павел&middleName=Святославович

# Поиск по контактным данным
GET /signing?email=examplename@anydomain.net
GET /signing?telephone=79262119529

# Комбинированный поиск
GET /signing?familyName=Иванов&givenName=Павел&telephone=79262119529

# С пагинацией
GET /signing?familyName=Иванов&limit=20&offset=40

# С пагинацией и периодом
GET /sep/api/signing?limit=50&offset=0&dateFrom=2026-04-01T00:00:00.000Z&dateTo=2026-04-21T23:59:59.999Z

Формат ответа для списочных методов (200 OK):

"data": [
        {
            "id": "660b3057-a0dc-4be1-a309-5cd730bf6bf3",
            "status": {
                "code": 208,
                "name": "Успешно. Подписан всеми - обработка",
                "message": "Успешно. Подписан всеми - обработка",
                "description": "Успешно. Подписан всеми - обработка"
            },
            "updatedAt": "2025-11-10T14:24:42.604Z",
            "practitioner": {
                "userIdLpu": "doc-123",
                "status": {
                    "code": 204,
                    "description": "Получатель подписал документ"
                }
            },
            "patients": [
                {
                    "idPatientMis": "",
                    "status": {
                        "code": 204,
                        "description": "Получатель подписал документ"
                    }
                }
            ]
        },
        {
            "id": "2eb002f0-5e9e-4ddd-886e-b5c3bcccdb28",
            "status": {
                "code": 208,
                "name": "Успешно. Подписан всеми - обработка",
                "message": "Успешно. Подписан всеми - обработка",
                "description": "Успешно. Подписан всеми - обработка"
            },
            "updatedAt": "2025-11-10T12:16:43.420Z",
            "practitioner": {
                "userIdLpu": "doc-123",
                "status": {
                    "code": 204,
                    "description": "Получатель подписал документ"
                }
            },
            "patients": [
                {
                    "idPatientMis": "",
                    "status": {
                        "code": 204,
                        "description": "Получатель подписал документ"
                    }
                }
            ]
        }
]

Получение отдельного отправления c телом документа по трекинг номеру

МЕТОД: GET /signing/{trackingId}

Метод получения конкретного отправления. Возвращает  одно конкретное  подписание с  PDF вложением комплекта документов и визуализацией подписи.

Параметры запроса:

Параметр

Тип

Расположение

Обязательность

Описание

Пример значения

trackingId

string

URL (path)

Да

это возвращаемый при направлении документа на подпись в ответ на запрос о подписании или при выполнении списочного метода

a1b2c3d4-5678-90ef-1234-567890abcdef

Пример запроса:

Host: b2b-demo.n3health.ru
Authorization: 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu: 12346afd-0e84-b847-2322-75999668f500a
GET /sep/api/signing/a1b2c3d4-5678-90ef-1234-567890abcdef
Формат
 
ответа
 GET /signing/{id} (200 OK):
{
"data": {
"id": "2eb002f0-5e9e-4ddd-886e-b5c3bcbbdb28",
"status": "210",
"createdAt": "2025-11-10T12:15:27.787Z",
"cdaId": "...",
"documentSource": "s3",
"qesStatus": {
"signedAt": "2026-02-24T10:21:57.320Z",
"iemkSaved": "pending",
"thumbprint": "023B6DEE3B71848A3C6DACF993EFD7332B8E23EC",
"certificateSubject": "CN=...",
"certificateSerialNumber": "133E5FE6110BB240B99AB9123B00AF89D3"
},
"practitioner": {
"mrProxyNumber": "10-test-223",
"familyName": "Иванов",
"givenName": "Иван",
"middleName": "Иванович",
"userIdLpu": "doc-123",
"status": {
"code": 204,
"description": "Получатель подписал документ"
}
},
"patients": [
{
"idPatientMis": "sepTestProd07102025",
"familyName": "Виноградов",
"givenName": "Вячеслав",
"middleName": "Александрович",
"status": {
"code": 204,
"description": "Получатель подписал документ"
}
}
],
"medDocument": {
"attachments": [
{
"content": "JVB...."
}
],
"sign": "base64_подписи_КЭП..."
}
}
}

Ошибки

400 Bad Request Неверный формат UUID.
401 Unauthorized Отсутствует/недействительный токен.
404 Not Found
Для /signing/{id}: "Подписание с указанным ID не найдено"
404 Not Found Для /signing: «Документы для указанного пациента (idPatientMis) в данной МО (idLpu) не найдены»
{
"error": {
"code": "invalid_uuid",
"message": "Неправильный формат UUID"
}
}
{
"error": {
"code": "signing_not_found",
"message": "Подписание с ID a1b2c3d4-... не найдено"
}
}

Получение статуса конкретного отправления

Эндпоинт:
 GET /signing/{id}/status

Описание:  Возвращает статус и сведения по конкретному подписанию  без тела PDF   по trackingID.

Параметры запроса:

id string URL (path) Да UUID подписания a1b2c3d4-5678-90ef-1234-567890abcdef
Пример запроса:
        

       GET /sep/api/signing/a1b2c3d4-5678-90ef-1234-567890abcdef/status Authorization: 44556afd-0e84-b847-2322-75999668f590 X-Id-Lpu: 0003937e-fad5-402d-bgfd-3ce6nf2by7ye

Ответ

{
"data": {
"id": "29b9c188-b89b-4c45-67b7-5b6d098d28a3",
"status": "207",
"createdAt": "2026-04-25T07:43:39.002Z",
"cdaId": null,
"practitioner": {
"mrProxyNumber": "",
"familyName": "Сепов",
"givenName": "Сэп",
"middleName": "Доккодович",
"userIdLpu": "sepdev3_123@sepdev.ru",
"status": {
"code": 204,
"description": "Получатель подписал документ"
}
},
"patients": [
{
"idPatientMis": "644224645",
"mpiId": "cc851214-d8ce-4573-af62-99f8d0271a39",
"familyName": "Тестовая",
"givenName": "Владислава",
"middleName": "Владимировна",
"birthDate": "1986-01-01",
"sex": "female",
"telecom": [
{
"system": "Email",
"value": "2111111@gmail.com"
},
{
"system": "Telephone",
"value": "+79161111111"
}
],
"email": "2111111@gmail.com",
"phone": "+79260000000",
"telephone": "+79260000000",
"documentNumber": "0022bbcc",
"documentDto": [
{
"docN": "6546446466",
"issuedDate": "2006-12-16T00:00:00.000Z",
"documentName": "Пенсионное страховое свидетельство (СНИЛС)",
"providerName": "ПФР",
"idDocumentType": 223
}
],
"status": {
"code": 202,
"description": "Документ направлен конкретному получателю"
}
}
]
}
}

Обработка ошибок

400 INVALID_SIGNTOKEN Неверный SIGNTOKEN: проверьте, что токен выдан для передаваемых guid и IdLpu 
403 ESIA_AUTH_REQUIRED Ошибка авторизации ЕСИА
403 PATIENT_NO_DATA Не все обязательные поля переданы ВЫВОДИТ СПИСОК ТРЕБУЕМЫХ ПОЛЕЙ 
403 PATIENTS_DENIED Запрет со стороны пациента
403 INVALID_BASE64  «Некорректные данные в поле Content»
403 EMPTY_ARRAY Обязательное поле не может быть пустым.
429 RATE_LIMIT_EXCEEDED Превышен лимит запросов

Получение согласий на использование сервиса СЭП в т.ч. в Mila

GET /approvals

Метод возвращает список согласий и соглашений пациента (ПДн / ЭДО), найденных по идентификатору пациента или по trackingId отправления. Используется, когда МИС знает контакт, СНИЛС, idPatientMis, milaId, mpiId или trackingId пакета документов и нужно получить актуальные согласия без скачивания PDF по каждому id.

Источники данных (source):

  • sep — согласия из БД СЭП 
  • mila — согласия из контекста подписания MILA (mila_tmk_signing, пакеты документов)
  • all — объединённый результат из СЭП и MILA
  • default 
    all
     (ищет везде)

  • sep
     и 
    mila
     — фильтры

Приоритет trackingId: если в запросе передан trackingId, поиск выполняется только по нему. Параметры identifierType / identifierValue игнорируются (перечисляются в meta.ignoredParams).

Сортировка: по дате обновления (updatedAt), сначала новые.

Фильтр подтверждённых: по умолчанию approvedOnly=true — в ответ попадают только записи с approved: true.

«в meta — нормализованное имя типа».

Базовый URL:

Демонстрационный (demo) —  https://b2b-demo.n3health.ru  Продакшен (production) —  https://b2b.n3health.ru

Базовый путь API: /sep/api Полный URL поиска (demo): GET 
       

        https://b2b-demo.n3health.ru/sep/api/approvals
       

        Полный URL скачивания (demo): GET 
       

        https://b2b-demo.n3health.ru/sep/api/approvals/{approvalId}

Заголовки запроса


Authorization
string Да Токен доступа СЭП
44556afd-0e84-b847-2322-75999668f590

X-Id-Lpu
string Да** Идентификатор МО (из регионального справочника) 
0453937e-fad5-402d-aacb-3ce6df2bf6fe
  • В каждой записи 
    data[]
     (и при скачивании) добавляется 
    idLpu
  • Скачивание без 
    X-Id-Lpu
    — org определяется из записи (patient_mis / mila_tmk_signing)

1. GET /approvals — список согласий (gateway, для МИС)

QUERY-ПАРАМЕТРЫ

source string Нет sep | mila | all.  По умолчанию all
trackingId string Нет* UUID отправления ( doc_package.id ). При наличии — единственный критерий поиска
identifierType string Нет* Тип идентификатора пациента (см. таблицу ниже)
identifierValue string Нет* Значение идентификатора
type string Нет Фильтр: pdn (ПДн) | edo (согласие на электронный документооборот). Алиасы: pdp, edm
approvedOnly boolean Нет Только подтверждённые. По умолчанию true (true/1/yes или false/0/no)
  • Обязателен либо trackingId, либо пара identifierType + identifierValue. Если оба отсутствуют — ответ 400.

Допустимые значения identifierType

СЭП нормализует тип на входе (регистр, _ и — игнорируются).

snils СНИЛС (11 цифр) только цифры
phone Номер телефона формат +7926…
email Адрес электронной почты нижний регистр
idPatientMis ID пациента в МИС (НЕ UUID организации) trim
milaid ID пациента в MILA trim
mpiid ID в MPI trim

ПРИМЕРЫ ЗАПРОСА (demo)

Пример 1 — по телефону, оба источника:

GET 
       

        https://b2b-demo.n3health.ru/sep/api/approvals?source=all&identifierType=phone&identifierValue=%2B79261234567&approvedOnly=true
       

        Authorization: 44556afd-0e84-b847-2322-75999668f590 X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe

или

GET /sep/api/approvals?identifierType=phone&identifierValue=%2B79261234567

Пример 2 — по idPatientMis, только СЭП:

GET 
       

        https://b2b-demo.n3health.ru/sep/api/approvals?source=sep&identifierType=idPatientMis&identifierValue=sepTestProd07102025&type=pdn
       

        Authorization: 44556afd-0e84-b847-2322-75999668f590 X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe

Пример 3 — по trackingId (идентификаторы пациента игнорируются):

GET 
       

        https://b2b-demo.n3health.ru/sep/api/approvals?source=all&trackingId=8da15c45-3b27-8727-77dd-9de51d0aa920
       

        Authorization: 44556afd-0e84-b847-2322-75999668f590 X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe

ОТВЕТ (успех, 200)

PDF и attachments в списке не возвращаются. Для файла используйте GET /approvals/{approvalId} (раздел 2).

Поиск по идентификатору (searchMode: identifier):

{ "data": [ { "id": "uuid-approval-1", "source": "sep", "patientId": "c18cba94-38a4-4846-8269-118e04c5ef72", "type": "pdn", "approved": true, "cdaId": "12345-67890", "createdAt": "2026-04-02T10:36:21.647+03:00", "updatedAt": "2026-04-02T10:37:55.466+03:00" }, { "id": "8da15c45-3b27-8727-77dd-9de51d0aa920", "source": "mila", "patientId": "c18cba94-38a4-4846-8269-118e04c5ef72", "type": "edo", "approved": true, "cdaId": null, "milaId": "mila-patient-uuid", "tmkSigningId": "tmk-signing-uuid", "docPackageId": "8da15c45-3b27-8727-77dd-9de51d0aa920", "docPackageIds": ["8da15c45-3b27-8727-77dd-9de51d0aa920"], "createdAt": "2026-04-02T10:36:21.648+03:00", "updatedAt": "2026-04-02T10:37:55.709+03:00" } ], "meta": { "total": 2, "searchMode": "identifier", "source": "all", "identifierType": "phone", "identifierValue": "+79261234567", "normalizedIdentifierValue": "+79261234567", "approvedOnly": true, "sourcesFound": ["sep", "mila"], } }

Поиск по trackingId (searchMode: tracking). Дополнительно блок patients — ФИО подписантов:

{ "data": [ { "id": "uuid-approval-1", "source": "sep", "patientId": "c18cba94-38a4-4846-8269-118e04c5ef72", "type": "pdn", "approved": true, "cdaId": null, "createdAt": "2026-04-02T10:36:21.647+03:00", "updatedAt": "2026-04-02T10:37:55.466+03:00" } ], "meta": { "total": 1, "searchMode": "tracking", "source": "all", "trackingId": "8da15c45-3b27-8727-77dd-9de51d0aa920", "trackingFound": true, "approvedOnly": true, "ignoredParams": ["identifierType", "identifierValue"], "message": "Поиск выполнен только по trackingId; остальные параметры запроса игнорированы." }, "patients": [ { "idPatientMis": "sepTestProd07102025", "familyName": "Виноградов", "givenName": "Вячеслав", "middleName": "Александрович", "sourcesFound": ["sep", "mila"], } ] }

Отправление по trackingId не найдено (200, не ошибка):

{ "data": [], "patients": [], "meta": { "total": 0, "searchMode": "tracking", "source": "all", "trackingId": "TRK-2026-001234", "trackingFound": false, "approvedOnly": true, "ignoredParams": ["identifierType", "identifierValue"], "message": "Поиск выполнен только по trackingId. Отправление не найдено; остальные параметры запроса игнорированы." } }

ПОЛЯ ЭЛЕМЕНТА data[]

id string (UUID) Идентификатор согласия. Для source=mila может совпадать с docPackageId
source string sep | mila — откуда получена запись
patientId string (UUID) Внутренний ID пациента в СЭП
type string pdn (ПДн) | edo (ЭДО)
approved boolean Подтверждено ли согласие
cdaId string | null ID документа в ИЭМК (SDS)
createdAt string (ISO 8601) Дата создания
updatedAt string (ISO 8601) Дата последнего изменения
milaId string (только mila) ID пациента в MILA
tmkSigningId string (только mila) ID записи mila_tmk_signing
docPackageId string (только mila) ID пакета документов
docPackageIds string[] (только mila) Все связанные пакеты
idLpu string idLpu — Идентификатор МО

Блок meta

total integer Число записей в data
searchMode string identifier | tracking 
По какому ресурсу был поиск.
source string Запрошенный источник (sep | mila | all)
identifierType string (identifier) Тип идентификатора
identifierValue string (identifier) Исходное значение
normalizedIdentifierValue string (identifier) Нормализованное значение
trackingId string (tracking) Переданный trackingId
trackingFound boolean (tracking) Найдено ли отправление
ignoredParams string[] (tracking) Проигнорированные параметры поиска
message string (tracking) Пояснение режима поиска
type string Фильтр типа, если был передан
approvedOnly boolean Фактический фильтр подтверждённых
sourcesFound string какие источники реально есть в 
data[]

Блок patients[] (только searchMode: tracking)

idPatientMis ID пациента в МИС
familyName Фамилия
givenName Имя
middleName Отчество
milaId ID в MILA
mpiId ID в MPI (string или массив)

ТИПОВЫЕ ОШИБКИ (GET /approvals)

HTTP код Условие Пример сообщения
400  Не передан trackingId и нет пары идентификаторов trackingId or identifierType+identifierValue is required
400 Неверный identifierType Invalid identifierType. Allowed values: snils, phone, email, idPatientMis, milaId, mpiId
400 Пустой identifierValue identifierValue is required when trackingId is not set
400 Неверный source Invalid source. Allowed values: sep, mila, all
400 Неверный type Invalid type. Allowed values: pdn, edo
401 Нет или неверный токен Authorization required: X-Mila-Token, N3M-TOKEN, or Authorization + X-Id-Lpu
401 Токен не совпадает с X-Id-Lpu Invalid or inactive token / idLpu does not match organisation
404 Пациент не найден (режим identifier) Patient with specified identifier was not found
200 Согласия не найдены (пациент/отправление есть) data: [] — не ошибка

2. GET /approvals/{approvalId} — скачивание согласия

Возвращает файл согласия/соглашения (PDF и при наличии XML) по id из data[].id результата поиска.

В списке (GET /approvals) PDF не отдаётся — только метаданные. Аналогия: GET /invites (без PDF) и POST /InviteInfo (с PDF).

Заголовки — те же, что для GET /approvals.


source
 не нужен — API сам определяет источник:

  1. Сначала ищет в SEP (
    approve
     по 
    approvalId
    )
  2. Если не найдено → ищет в MILA (пакет / 
    tmkSigningId
    )

В ответе всегда есть 
data.source

"sep"
 или 
"mila"
.


source
 в query оставлен опционально — только если хотите явно ограничить (
sep
 или 
mila
). 
source=all
 при download трактуется как автоопределение. 

Достаточно:
GET /sep/api/approvals/{id из data[].id}

Параметр Расположение Тип Обязательно Описание
approvalId path string (UUID) Да ID из data[].id
docPackageId query string (UUID) Условно


tmkSigningId
 + 
?docPackageId=…

Один выбранный документ если несколько документов найдено по tmkSigningId (опциональный фильтр) для Mila


source

query  string опционально 

sep | mila | all (= авто) |

Ответ всегда JSON (
       

        Content-Type: application/json
       

       ). PDF/XML — в 
       

        attachments[]
       

        как base64.

Параметр 
source
 не обязателен: API сам ищет сначала в СЭП (
approve
), затем в MILA. В ответе поле 
data.source
 показывает, откуда взята запись. 
source=sep
 или 
source=mila
 — только если нужно явно ограничить источник.


Пример 1 — согласие СЭП (МО, source можно не передавать):

GET https://b2b-demo.n3health.ru/sep/api/approvals/2eb002f0-5e9e-4ddd-886e-b5c3bcbbdb28

Authorization: 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe

Тот же запрос с явным источником (опционально):

GET https://b2b-demo.n3health.ru/sep/api/approvals/2eb002f0-5e9e-4ddd-886e-b5c3bcbbdb28?source=sep

Authorization: 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe

Пример 2 — MILA, один документ по UUID пакета (
data[].id
 из поиска):

GET 
       

        https://b2b-demo.n3health.ru/sep/api/approvals/8da15c45-3b27-8727-77dd-9de51d0aa920
       

       Authorization: 44556afd-0e84-b847-2322-75999668f590
       

       X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe

С явным source=mila (опционально):

GET https://b2b-demo.n3health.ru/sep/api/approvals/8da15c45-3b27-8727-77dd-9de51d0aa920?source=mila

Authorization: 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe


docPackageId
 в query не нужен, если в path уже UUID пакета.


Пример 3 — MILA, все документы подписания по 
tmkSigningId
 (ПДн + ЭДО сразу):

GET  https://b2b-demo.n3health.ru/sep/api/approvals/tmk-signing-uuid
N3M-TOKEN: <системный-токен>


Пример 4 — MILA, один документ из подписания с несколькими пакетами (опциональный фильтр):
GET  https://b2b-demo.n3health.ru/sep/api/approvals/tmk-signing-uuid?docPackageId=8da15c45-3b27-8727-77dd-9de51d0aa920
N3M-TOKEN: <системный-токен>


ОТВЕТ (успех, 200)

Один документ (SEP или MILA по UUID пакета / одному пакету в подписании)

{
"data": {
"id": "2eb002f0-5e9e-4ddd-886e-b5c3bcbbdb28",
"source": "sep",
"createdAt": "2025-11-10T12:15:27.787Z",
"cdaId": "12345-67890",
"documentSource": "s3",
"patients": [
{
"idPatientMis": "sepTestProd07102025",
"familyName": "Виноградов",
"givenName": "Вячеслав",
"middleName": "Александрович"
}
],
"attachments": [
{
"fileName": "document1.pdf",
"contentType": "application/pdf",
"content": "JVBERi0xLjQK... (base64)"
}
]
}
}

Для MILA в том же формате дополнительно могут быть: 
tmkSigningId

milaId

patientId

type

docPackageId

docPackageIds

idLpu
.


Несколько документов MILA по 
tmkSigningId

{
"data": {
"source": "mila",
"tmkSigningId": "tmk-signing-uuid",
"milaId": "mila-patient-uuid",
"patientId": "c18cba94-38a4-4846-8269-118e04c5ef72",
"patients": [ ... ],
"documents": [
{
"docPackageId": "aaa-pdn-uuid",
"type": "pdn",
"cdaId": "12345-67890",
"createdAt": "2025-11-10T12:15:27.787Z",
"updatedAt": "2025-11-10T12:17:55.466Z",
"documentSource": "s3",
"attachments": [
{
"fileName": "pdn.pdf",
"contentType": "application/pdf",
"content": "JVBERi0xLjQK... (base64)"
}
]
},
{
"docPackageId": "bbb-edo-uuid",
"type": "edo",
"cdaId": null,
"createdAt": "2025-11-10T12:15:28.100Z",
"updatedAt": "2025-11-10T12:17:56.200Z",
"documentSource": "s3",
"attachments": [ ... ]
}
]
},
"meta": {
"downloadMode": "tmkSigningId",
"tmkSigningId": "tmk-signing-uuid",
"totalDocuments": 2,
"docPackageIds": ["aaa-pdn-uuid", "bbb-edo-uuid"]
}
}

Поля 
data
 (один документ)


id

ID согласия (SEP) или пакета (MILA)


source


sep
 | 
mila
 — где найдено


createdAt

Дата создания (ISO 8601)


cdaId

ID в ИЭМК (
null
 если нет)


documentSource

Источник файла: 
s3

sds
 и т.д.


type

(mila)
pdn
 | 
edo


tmkSigningId

(mila)  ID записи 
mila_tmk_signing


milaId

(mila)  ID пациента в MILA


patientId

(mila)  ID пациента в СЭП


docPackageId

(mila)  ID пакета (обычно = 
id
)


docPackageIds

(mila)  все пакеты того же подписания


idLpu

UUID медицинской организации


patients

Массив данных пациентов


attachments

Массив вложений (см. ниже)

Поля 
data.documents[]
 (multi-document по 
tmkSigningId
)

docPackageId

UUID пакета документов

type

pdn | edo


cdaId

ID в ИЭМК


createdAt
 / 
updatedAt

Даты пакета (ISO 8601)


documentSource


s3

sds
 и т.д.


attachments

Вложения этого пакета

Блок 
meta
 (только multi-document)

downloadMode tmkSigningId
tmkSigningId UUID подписания MILA
totalDocuments Число элементов в data.documents
docPackageIds Полный список пакетов подписания

Объект 
attachments[]

fileName Имя файла
contentType MIME (application/pdf, application/xml, …)
content Содержимое в base64

Типовые ошибки (
GET /approvals/{approvalId}
)

400

Неверный UUID в path

Invalid approvalId format

400

Неверный 
source

Invalid source. Allowed values: sep, mila, all

401

Нет / неверная авторизация

см. раздел 1

403

Нет доступа к пациенту / документу

No access to patient data / No access to requested Mila document

404

Согласие не найдено ни в SEP, ни в MILA

Approval was not found / Mila approval was not found / Submission document(s) was not found


ПРИМЕЧАНИЯ ДЛЯ ИНТЕГРАЦИИ

  1. Единый URL поиска: все критерии в query string GET /approvals. Тело GET не используется.
  2. Приоритет trackingId: при одновременной передаче trackingId и идентификаторов поиск только по треку; смотрите meta.ignoredParams и meta.message.
  3. Пустой список data: [] при найденном пациенте/отправлении — не ошибка. 404 только если пациент не найден (режим identifier).
  4. idPatientMis (ID пациента в МИС), не UUID организации (X-Id-Lpu).
  5. Телефон: допустимы 926…, +7926…, 8926… — СЭП приведёт к +7….
  6. GET /approvals не содержит PDF файл — GET /approvals/{approvalId}.

Получить список приглашений

GET /invites — список по телефону/email (gateway, для МИС)

Базовый URL: https://b2b-demo.n3health.ru/sep/api/invites

Метод возвращает список приглашений (invite) пациента, найденных по контактам, с пагинацией. Используется, когда МИС знает телефон и/или email пациента и нужно получить историю или актуальное состояние приглашений без вызова InviteInfo по каждому inviteId.

Область поиска: только приглашения текущей организации (определяется парой Authorization + X-Id-Lpu).

Сопоставление контактов: для каждого переданного параметра выполняется поиск по полям phone или originalPhone, email или originalEmail. Если переданы оба параметра (phone и email), условия объединяются через ИЛИ — вернутся приглашения, совпадающие хотя бы по одному из контактов.

Сортировка: по дате создания (createdAt), сначала новые.

Истечение срока: перед формированием ответа для каждой записи в выборке выполняется проверка expiresAt. Просроченные приглашения (кроме статусов «заполнено» и «отменено») автоматически переводятся в статус 206 (Expired).

ЗАГОЛОВКИ ЗАПРОСА

 

Authorization string Да Токен доступа СЭП 44556afd-0e84-b847-2322-75999668f590
X-Id-Lpu string (UUID) Да Идентификатор МО в СЭП 0453937e-fad5-402d-aacb-3ce6df2bf6fe

QUERY-ПАРАМЕТРЫ

phone string Нет* Телефон пациента. Нормализуется на стороне СЭП (типично в формат +7…)
email string Нет* Email пациента. Приводится к нижнему регистру, обрезаются пробелы
limit integer Нет Размер страницы. По умолчанию 50, максимум 100
offset integer Нет Смещение. По умолчанию 0
  • Обязателен хотя бы один из phone / email. Если оба отсутствуют или после нормализации пустые — ответ 400.

ПРИМЕР ЗАПРОСА (demo)

Пример 1 — по телефону:

GET 
       

        https://b2b-demo.n3health.ru/sep/api/invites?phone=9261234567&limit=50&offset=0
       

        Authorization: 44556afd-0e84-b847-2322-75999668f590 X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe

Пример 2 — по email:

GET 
       

        https://b2b-demo.n3health.ru/sep/api/invites?email=patient@example.com
       

        Authorization: 44556afd-0e84-b847-2322-75999668f590 X-Id-Lpu: 0453937e-fad5-402d-aacb-3ce6df2bf6fe

ОТВЕТ (успех, 200)

Структура совпадает с InviteInfo, но в виде массива + блок pagination. Поле pdnApprove (PDF подписанного согласия) не возвращается. Для получения PDF используйте POST /InviteInfo с withApprove: true по конкретному inviteId.

Пример тела ответа:

{ "data": [ { "inviteId": "8da15c45-3b27-8727-77dd-9de51d0aa920", "originalPhone": "+79261234567", "originalEmail": null, "statusCode": 203, "status": { "code": 203, "alias": "viewed", "nameRu": "Просмотрено", "nameEn": "Viewed" }, "createdAt": "2026-05-29T10:15:00.000Z", "updatedAt": "2026-05-29T10:16:12.000Z", "inviteData": { "confirmed": false, "firstName": "Иван", "middleName": "Иванович", "lastName": "Иванов", "birthDay": "1990-01-15", "birthDayTimeStamp": "1990-01-15T00:00:00.000Z", "snils": "12345678901", "phone": "+79261234567", "email": null, "passport": { "series": "1234", "number": "567890", "docS": "1234", "docN": "567890", "issuedBy": "ОВД …", "issuedDate": "2010-05-20", "departmentCode": "770-001", "raw": null } } } ], "pagination": { "limit": 50, "offset": 0, "total": 3 } }

ПОЛЯ ЭЛЕМЕНТА data[]

inviteId string (UUID) Идентификатор приглашения
originalPhone string или null Телефон, указанный при создании (или текущий phone)
originalEmail string или null Email, указанный при создании (или текущий email)
statusCode integer Числовой код статуса из справочника СЭП
status object или null Метаданные статуса (code, alias, nameRu, nameEn)
createdAt string (ISO 8601) или null Дата создания
updatedAt string (ISO 8601) или null Дата последнего изменения
inviteData object Нормализованные данные пациента (см. ниже)

ОБЪЕКТ inviteData

confirmed boolean true, если приглашение заполнено (статус 210) или подтверждено через ЕСИА
firstName string или null Имя
middleName string или null Отчество
lastName string или null Фамилия
birthDay string или null Дата рождения (как сохранена в приглашении)
birthDayTimeStamp string или null Дата рождения в ISO (полночь UTC), если удалось распарсить
snils string или null СНИЛС
phone string или null Телефон из данных пациента / ЕСИА
email string или null Email из данных пациента / ЕСИА
passport object или null Паспортные данные; null, если все поля пустые

БЛОК pagination

limit integer Фактический размер страницы (после ограничения max 100)
offset integer Смещение
total integer Общее число найденных приглашений по запросу

ТИПОВЫЕ КОДЫ СТАТУСА ПРИГЛАШЕНИЯ

201 created Создано, ссылка отправлена
203 viewed Пациент открыл ссылку
206 expired Срок действия истёк
210 filled Пациент заполнил и подписал согласие
213 cancelled Приглашение отменено

Точные значения nameRu / nameEn / alias берутся из справочника статусов СЭП и могут отличаться по контуру.

ТИПОВЫЕ ОШИБКИ

400 Не передан phone и email Укажите phone или email для поиска приглашений
401 Неверный или отсутствующий токен (стандартная ошибка авторизации СЭП)
403 Токен не привязан к указанному X-Id-Lpu (стандартная ошибка доступа СЭП)

СВЯЗАННЫЕ МЕТОДЫ

POST /initInvite Создание нового приглашения
POST /InviteInfo Детали одного приглашения по inviteId; опционально PDF (withApprove: true)
POST /InviteCancel Отмена приглашения
POST /InviteResend Повторная отправка ссылки

ПРИМЕЧАНИЯ ДЛЯ ИНТЕГРАЦИИ

  1. Нормализация телефона: рекомендуется передавать номер в любом удобном формате (926…, +7926…, 8926…) — СЭП приведёт его к единому виду перед поиском.

  2. Пустой результат: при отсутствии совпадений возвращается data: [], pagination.total: 0 — это не ошибка.

  3. Пагинация: для обхода всего списка увеличивайте offset шагами limit, пока offset + data.length < total.

  4. Отличие от InviteInfo: список не содержит PDF и не требует inviteId в запросе; для архивного PDF по конкретному приглашению используйте InviteInfo.


Получение ссылки MAX бота и QR и персональной ссылки для размещения на сайте клиники + QR код по idLpu

 

Статусы

201 Создан Created Документ создан через API, готов к обработке
202 Отправлен на подписание Sent for Signing Документ отправлен получателю
203 Просмотрел Viewed Документ просмотрен получателем
204 Подписал Signed Документ подписан получателем
205 Отказался Rejected Получатель отказался от подписания
206 Срок для подписания истек Signing Period Expired Срок действия ссылки истек до момента проставления подписи или отказа
207 Ожидание действий всех получателей Awaiting Actions from All Recipients Ожидание действий от всех получателей
210 Завершено. Подписано всеми Completed. Fully Signed Все получатели подписали, документ сохранен
211 Завершено. Подписано не всеми Completed. Partially Signed Не все получатели подписали, документ сохранен
212 Отменен для получателя Cancelled for Recipient Подписание отменено для конкретного получателя
213 Завершено. Отменено для всех Completed. Cancelled for All Подписание отменено для всех получателей
214 Успешно. Требуется подписание УКЭП UKEP required Требуется подписание УКЭП медицинского работника
215 Черновик Draft Подписание в отношении пациента создано
216 Черновки индивидуальный Draft for Recipient Черновки для конкретного подписанта
217 Архив Archived Используется для отправлений, которые были «удалены», отменены (после года), и черновиков с истекшим сроком жизни
498 Завершено. Отклонено всеми Completed. Rejected by All Все получатели отказались от подписания
499 Завершено. Истекло для всех Completed. Expired for All Срок ссылки истек для всех получателей
500 Ошибка обработки Processing Error Ошибка во время обработки документа
501 Ошибка доставки получателю Delivery Error Произошла ошибка при доставке конкретному получателю

Лимиты DEMO стенда

В текущей конфигурации можно делать 50 запросов к POST /signing в 10 минут, если больше — блокировка на 15 минут