Сервис «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 /signing, GET /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_SIZE,LIMIT_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 |
| 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 | Опционально |
Допустимые значения: |
|
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. В вышеуказанном примере:
|
| documentType | string | Опционально | Тип документа: .doc .docx .pdf .odt |
| MIME Type | |
|---|---|
| .doc | application/msword |
| .docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document |
| applicatiapplication/pdfon/pdf | |
| .odt | application/vnd.oasis.opendocument.text |
6. Доставка (delivery)
| Поле | Тип | Обязательность | Описание |
| delivery | array | Обязательно |
Способы доставки: • «sms» • «max» • «mila» (по умолчанию SMS, если не указано) |
Важные примечания:
- Если esiaAuth: true, пациент должен авторизоваться через ЕСИА для подписи.
- Все даты — в формате ISO 8601 (YYYY-MM-DD).
ЧЕРНОВИКИ
Краткая последовательность по черновикам для интегратора
- 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 Архивировать черновик.
В визуализацию подписи и в отправление (подписание) идут данные работника отправившего черновик пациенту. Срок жизни черновика 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 или не передаётся — файлы из запроса дополняют уже сохранённые в черновике вложения. |
|
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 не существует" }
Важные примечания
-
Формат IdPatientMis: Параметр передается как массив строк для поддержки будущей функциональности отправки уведомлений нескольким пациентам по одному отправлению.
-
Соответствие ID: IdPatientMis должен соответствовать тому, который был указан при первоначальной отправке документа.
-
Способы доставки: Доступные значения для поля delivery :
- sms — SMS-сообщение
- max — MAX-сообщение
- mila — Mila-сообщение
-
Таймауты : Рекомендуемый таймаут для запроса — 30 секунд.
- Логика биллинга на текущий момент. Если ранее было отправлено не СМС, то отправление снимается тарификации, создается новая биллинговая запись с новым указанными типом. Если СМС, то тарификация по факту отправки.
Запрос на локальное подписание КЭП
Базовые параметры
Демо-окружение: 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…», // опционально
|
|
| 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) По умолчанию false. |
| onlyPractitionerCertificateThumbprint | boolean | нет | Фильтр по сертификату из текущего запроса (certificateThumbprint) Если указан, то осуществить подписание возможно будет только с сертификатом работника указанного в certificateThumbprint из текущего запроса. Если true, то обязательно наличие certificateThumbprint, иначе возвращается ошибка.
Если onlyPractitionerCertificateThumbprint = false или не указан:
|
| 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 | бесплатно |
| бесплатно | |
| sms | платно, только РФ +7 9XX |
| max | платно, только РФ +7 9XX |
| mid | недоступен (400) |
Запрос на самостоятельное подписание КЭПа
SelfQES используется, когда МИС самостоятельно формирует откреплённую КЭП-подпись для документа.
Сценарий работы:
- МИС вызывает
.
POST /initselfqes
- SEP возвращает PDF в base64 и идентификатор одноразовой сессии
.
signingSessionId
- МИС подписывает ровно этот PDF на своей стороне и формирует откреплённую подпись
в base64.
.sig
- МИС вызывает
и передаёт подпись.
POST /attachselfqes
- SEP проверяет подпись, сохраняет её и добавляет КЭП к отправлению.
- Результат доступен через
GET /signing/{trackingId}
Метод доступен для статусов отправления:
| 214 | Требуется подписание КЭП |
| 210 | Завершено. Подписано всеми |
| 211 | Завершено. Подписано не всеми |
Метод 1. POST /sep/api/initselfqes
Базовые параметры
|
Демо-окружение |
|
|
Базовый путь API |
/sep/api |
|
Полный базовый URL |
|
|
Метод |
Инициализация самостоятельного КЭП-подписания: выдача PDF в base64 и создание сессии |
Допустимые статусы trackingId
|
214 |
Требует подписания КЭП |
UKEP required |
Первичное КЭП |
|
210 |
Завершено. Подписано всеми |
Completed. Fully Signed |
Доп. подпись, если |
|
211 |
Завершено. Подписано не всеми |
Completed. Partially Signed |
Доп. подпись, если |
Описание
Метод для получения PDF комплекта документов для локального подписания УКЭП на стороне МИС (без браузера и без ). После подписания PDF на стороне МИС откреплённая подпись передаётся методом
qesLink
.
attachselfqes
Для статуса 214 на PDF накладывается визуализация КЭП. Для 210/211 при уже существующих PDF выдаётся без повторной визуализации (режим дополнительной подписи).
qesKeys
В ответе: (обязателен для attach),
signingSessionId
, PDF в
expiresAt
(base64).
document.content
является одноразовой сессией подписания. По одной сессии можно успешно загрузить подпись только один раз. Повторный или параллельный
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 |
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)
|
Ошибки (примеры)
(404) — документ не найден / не принадлежит ЛПУ
NOT_FOUND
(403) — несовпадение X-Id-Lpu
ACCESS_DENIED
(400) — статус не 214 / 210 / 211
INVALID_STATUS
(400) — не передан snils и userIdLpu
PRACTITIONER_IDENTIFIER_REQUIRED
(500) — ошибка подготовки PDF
PROCESSING_ERROR
Метод 2. POST /sep/api/attachselfqes
Базовые параметры
|
Полный URL (demo) |
|
|
Метод |
Прикрепление откреплённой подписи |
Описание
Метод принимает откреплённую подпись, проверяет её через CryptoPro Service, сверяет с PDF из сессии , сохраняет в S3 и обновляет
initselfqes
. При первичном КЭП (214) статус переходит в 210/211. Результат доступен через GET по
qesKeys
после индексации.
trackingId
В необходимо передать того же practitioner, который был указан в
attachselfqes
: совпадение проверяется по
initselfqes
и/или
snils
.
userIdLpu
Тело запроса
|
Успешный ответ (200 OK)
|
Коды ошибок:
HTTP 422 Unprocessable Entity со структурированным ответом на русском:
|
|
После успешного
attachselfqes
результат доступен через
GET /sep/api/signing/{trackingId}
.
data.medDocument.sign
содержит первую откреплённую подпись.
data.medDocument.signatures
содержит массив всех откреплённых КЭП-подписей, включая вторую и последующие.
Пример:
|
Типовые ошибки
| 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 получить список приглашений
Базовые параметры
| Демо-окружение | |
| Базовый путь API | |
| Полный базовый URL | |
Заголовки (общие для всех методов)
| Authorization | string | Да | Токен доступа СЭП (без префикса Bearer) | |
| X-Id-Lpu | string (UUID) | Да | Идентификатор МО из регионального справочника | |
| Content-Type | string | Да | Формат тела запроса | |
Общие правила
— отдельная сущность, не
inviteId
trackingId
- Invite API ≠ метод
(тот работает с
/resend
отправления документов).
trackingId
- Каналы доставки invite: только
,
sms
,
max
(
email
).
mila пока нет
- Уведомления отправляются асинхронно: ответ API приходит сразу, доставка SMS/MAX/Email — в фоне.
Блок
practitioner
(для методов изменения invite)
practitioner
Обязателен в initInvite, InviteResend, InviteCancel.
|
Нет* | ID работника в МИС |
|
Нет* | СНИЛС работника |
|
Да | Фамилия |
|
Да | Имя |
|
Нет | Отчество |
, , |
Нет | Дополнительные поля |
* Обязателен хотя бы один из или
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 | Нет** | Телефон ( ) |
| patient.email | string | Нет** | |
| practitioner | object | Да | Работник, инициировавший invite |
| practitioner.userIdLpu | string | Нет* | ID работника в МИС |
| practitioner.snils | string | Нет* | СНИЛС работника |
| practitioner.familyName |
string |
Да |
Фамилия |
|
practitioner.givenName |
string |
Да |
Имя |
|
practitioner.middleName |
string |
Нет |
Отчество |
|
channels |
array[string] |
Нет |
|
* Хотя бы или
userIdLpu
.
snils
** Хотя бы или
phone
.
email
Каналы (
channels
)
channels
|
Нужен |
Платно |
|
Нужен |
Платно; бесплатно, если в invite есть SMS |
|
Нужен |
Бесплатно |
Пример — 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 | |
| 400 | |
| 400 | |
| 400 | |
| 400 | |
| 409 | Активный invite уже есть. Используйте inviteId для InviteCancel или InviteResend. |
| 401 | |
Получение данных и статуса приглашения
Описание
Возвращает статус invite и данные, заполненные пациентом. Опционально — подписанное согласие ПДН в base64.
Работник ( ) не требуется.
practitioner
Запрос POST https://b2b-demo.n3health.ru/sep/api/InviteInfo
Тело запроса { «inviteId»: «a8cc6886-956f-42e4-aa3c-742df306930f», «withApprove»: true }
| inviteId | Да | ID из |
| withApprove | Нет | Вернуть PDF подписанного ПДН (base64) |
Ответ — 200 OK (заполнено, statusCode = 210)
Структура — как в вашем черновике ( ,
inviteData
,
pdnApprove
,
originalPhone
).
originalEmail
Коды statusCode
| 201 | Создано, ожидает заполнения |
| 206 | Срок ссылки истёк |
| 210 | Форма заполнена, ПДН подписано |
| 213 | Отменено |
Ошибки
| 404 | |
Повторная отправка приглашения
Описание
Повторно отправляет уведомление с ссылкой. Можно выбрать каналы. Если 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 | Нет | , , . Без указания — все доступные |
Пример 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 | Ошибки валидации (как в initInvite) |
| 400 | |
| 400 | |
| 404 | |
Отмена приглашения
Описание
Отменяет активное приглашение. Ссылка перестаёт действовать ( ).
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 | Ошибки валидации |
| 400 | |
| 404 | |
Важные примечания
- Authorization — чистый UUID, без
.
Bearer
- X-Id-Lpu должен совпадать с организацией токена.
- При успешном initInvite сохраните inviteId в МИС. При повторной попытке создания на тот же контакт (409) используйте сохранённый inviteId для InviteResend (переотправить) или InviteCancel (отменить и создать новый). Поиск invite по телефону/email через API не поддерживается.
- Срок ссылки — 30 дней по умолчанию (
). После истечения —
INVITE_LINK_TTL_DAYS
.
statusCode = 206
- Повторное создание на тот же телефон/email блокируется при активном invite (
). Сначала
201
или дождитесь
InviteCancel
.
206
- Форма для заполнения пациента — по
в браузере; поддерживается ручной ввод и ЕСИА (Госуслуги).
link
— строка из ЕСИА:
inviteData.passport.raw
.
series:number:issuedDate:issuedBy
- Billing — каждая отправка по каналу создаёт запись с
. Email — free; SMS — платно; MAX — платно (или free, если в invite есть SMS).
entityType: invite
Тарификация
InviteResend
Платно только SMS. Остальное — бесплатно:
sms
Платно (каждая отправка)
max
Бесплатно (если у invite указан телефон)
email
Бесплатно Правило для MAX: бесплатно, когда у invite есть
(т.е. SMS технически доступен). Не важно, отправляли ли SMS при первом
patient.phone
или только MAX — достаточно наличия телефона в invite.
initInvite
Примеры:
- resend
→ бесплатно
["max"]
- resend
→ платно
["sms"]
- resend
→ платно только SMS, MAX и email — бесплатно
["sms", "max", "email"]
- resend
МЕТОДЫ 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) | Святославович |
| 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 |
|
| 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}
Заголовки запроса
|
string | Да | Токен доступа СЭП | |
|
string | Да** | Идентификатор МО (из регионального справочника) | |
- В каждой записи
(и при скачивании) добавляется
data[]
idLpu
- Скачивание без
— org определяется из записи (patient_mis / mila_tmk_signing)
X-Id-Lpu
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… |
| Адрес электронной почты | нижний регистр | |
| 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 | какие источники реально есть в |
Блок 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.
не нужен — API сам определяет источник:
source
- Сначала ищет в SEP (
по
approve
)
approvalId
- Если не найдено → ищет в MILA (пакет /
)
tmkSigningId
В ответе всегда есть :
data.source
или
"sep"
.
"mila"
в query оставлен опционально — только если хотите явно ограничить (
source
или
sep
).
mila
при download трактуется как автоопределение.
source=all
Достаточно:
GET /sep/api/approvals/{id из data[].id}
| Параметр | Расположение | Тип | Обязательно | Описание | |
|---|---|---|---|---|---|
| approvalId | path | string (UUID) | Да | ID из data[].id | |
| docPackageId | query | string (UUID) | Условно |
Один выбранный документ если несколько документов найдено по tmkSigningId (опциональный фильтр) для Mila |
|
source |
query | string | опционально |
sep | mila | all (= авто) | |
|
Ответ всегда JSON (
Content-Type: application/json
). PDF/XML — в
attachments[]
как base64.
Параметр не обязателен: API сам ищет сначала в СЭП (
source
), затем в MILA. В ответе поле
approve
показывает, откуда взята запись.
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
в query не нужен, если в path уже UUID пакета.
docPackageId
Пример 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
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
(один документ)
data
|
|
ID согласия (SEP) или пакета (MILA) |
|
|
|
|
|
Дата создания (ISO 8601) |
|
|
ID в ИЭМК ( |
|
|
Источник файла: |
|
|
(mila) |
|
|
(mila) ID записи |
|
|
(mila) ID пациента в MILA |
|
|
(mila) ID пациента в СЭП |
|
|
(mila) ID пакета (обычно = |
|
|
(mila) все пакеты того же подписания |
|
|
UUID медицинской организации |
|
|
Массив данных пациентов |
|
|
Массив вложений (см. ниже) |
Поля
data.documents[]
(multi-document по
tmkSigningId
)
data.documents[]
tmkSigningId
|
docPackageId |
UUID пакета документов |
|
type |
pdn | edo |
|
|
ID в ИЭМК |
|
|
Даты пакета (ISO 8601) |
|
|
|
|
|
Вложения этого пакета |
Блок
meta
(только multi-document)
meta
| downloadMode | tmkSigningId |
| tmkSigningId | UUID подписания MILA |
| totalDocuments | Число элементов в data.documents |
| docPackageIds | Полный список пакетов подписания |
Объект
attachments[]
attachments[]
| fileName | Имя файла |
| contentType | MIME (application/pdf, application/xml, …) |
| content | Содержимое в base64 |
Типовые ошибки (
GET /approvals/{approvalId}
)
GET /approvals/{approvalId}
|
400 |
Неверный UUID в path |
Invalid approvalId format |
|
400 |
Неверный |
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 |
ПРИМЕЧАНИЯ ДЛЯ ИНТЕГРАЦИИ
- Единый URL поиска: все критерии в query string GET /approvals. Тело GET не используется.
- Приоритет trackingId: при одновременной передаче trackingId и идентификаторов поиск только по треку; смотрите meta.ignoredParams и meta.message.
- Пустой список data: [] при найденном пациенте/отправлении — не ошибка. 404 только если пациент не найден (режим identifier).
- idPatientMis (ID пациента в МИС), не UUID организации (X-Id-Lpu).
- Телефон: допустимы 926…, +7926…, 8926… — СЭП приведёт к +7….
- 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…) |
| 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 | Телефон из данных пациента / ЕСИА |
| 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 | Повторная отправка ссылки |
ПРИМЕЧАНИЯ ДЛЯ ИНТЕГРАЦИИ
-
Нормализация телефона: рекомендуется передавать номер в любом удобном формате (926…, +7926…, 8926…) — СЭП приведёт его к единому виду перед поиском.
-
Пустой результат: при отсутствии совпадений возвращается data: [], pagination.total: 0 — это не ошибка.
-
Пагинация: для обхода всего списка увеличивайте offset шагами limit, пока offset + data.length < total.
-
Отличие от 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 минут