REST API электронной подписи — интеграция подписания УКЭП и ПЭП (21 метод)

API Cert4U встраивает юридически значимое подписание документов прямо в вашу CRM, ERP, бухгалтерию или 1С. Все вызовы идут на один эндпоинт https://cert4u.ru/api.php?action=<ACTION> с авторизацией по ключу из личного кабинета. 21 метод (включая 3 метода вебхуков) покрывает полный цикл: загрузка документа, серверная подпись, отправка клиенту на УКЭП или ПЭП, проверка подписей и скачивание ZIP-архива с протоколом.

api 21 метод lock X-Api-Key / Bearer webhook Вебхуки + HMAC science Песочница

Содержание

vpn_key Базовый адрес и авторизация

Cert4U — это не REST с путями вида /api/v1/.... Все запросы идут на единый файл, а нужный метод задаётся параметром action:

https://cert4u.ru/api.php?action=<ACTION>

Где взять API-ключ

Ключ выдаётся самостоятельно в личном кабинете: раздел Настройки → API-ключи → создать ключ. API доступен на тарифах Бизнес и Корпорат. На тарифе Старт API нет; на Тестовом — до 10 операций в день для ознакомления. Подробнее о применении для компаний — на странице электронная подпись для бизнеса.

Три способа передать ключ

Заголовок предпочтителен. Поддерживаются три варианта (любой):

# 1) Заголовок X-Api-Key (рекомендуется)
X-Api-Key: ВАШ_КЛЮЧ

# 2) Authorization: Bearer
Authorization: Bearer ВАШ_КЛЮЧ

# 3) Параметр запроса (legacy)
https://cert4u.ru/api.php?action=api_1c_documents&api_key=ВАШ_КЛЮЧ

Мультиарендность

Каждый ключ видит только данные своего аккаунта — фильтр по владельцу применяется ко всем спискам документов, клиентов, вебхуков. Чужие документы по API недоступны.

Лимиты

Формат ответа

Кодировка — UTF-8, ответ — JSON:

# Успех
{ "success": true, ... }

# Ошибка
{ "success": false, "message": "Описание ошибки" }

rocket_launch Быстрый старт

Три рабочих примера. Полные параметры каждого метода — в справочнике API (api-docs.html).

1

Получить ключ и проверить связь — список документов

curl "https://cert4u.ru/api.php?action=api_1c_documents&limit=20" \
  -H "X-Api-Key: ВАШ_КЛЮЧ"

# Ответ:
{
  "success": true,
  "documents": [
    { "id": "d_001", "name": "Договор №14.pdf", "status": "new" }
  ]
}
2

Загрузить документ с вашей УКЭП (multipart)

Подпишите файл УКЭП организации в 1С (МенеджерКриптографии), КриптоАРМ или cryptcp и загрузите вместе с .sig. Прикреплённая или открепленная — задаётся при подписании, см. как выбрать формат.

curl -X POST "https://cert4u.ru/api.php?action=api_1c_upload_signed" \
  -H "X-Api-Key: ВАШ_КЛЮЧ" \
  -F "document=@dogovor.pdf" \
  -F "signature=@dogovor.pdf.sig" \
  -F "doc_name=Договор №14" \
  -F "description=Поставка"

# Ответ:
{ "success": true, "document": { "id": "d_042", "status": "signed_admin", ... },
  "crypto_verify": true, "sig_format": "attached" }

Подпись вашей организации не нужна (подписывает только контрагент)? Используйте api_1c_send_document — загрузка и отправка одним запросом.

3

Отправить клиенту на подпись

Документ в статусе signed_admin отправляется клиенту — он получает ссылку и код ПЭП:

# Отправка клиенту (ПЭП по SMS)
curl -X POST "https://cert4u.ru/api.php?action=api_1c_send" \
  -H "X-Api-Key: ВАШ_КЛЮЧ" \
  -d "doc_id=d_042" \
  -d "client_id=c_007" \
  -d "sign_type=pep_only"

# Ответ:
{
  "success": true,
  "document": { "id": "d_042", "status": "sent", ... },
  "sign_url": "https://cert4u.ru/client.html?token=...",
  "pep_code": "483920",
  "sandbox": false
}

Клиента можно не создавать заранее: вместо client_id передайте client_name + client_phone и/или client_email — получатель найдётся среди контактов вашего аккаунта или будет создан скрытый контакт.

Совет: чтобы протестировать шаги без реальной SMS и расхода лимитов, включите песочницу — код ПЭП тогда всегда 000000.

4

Или всё одним запросом — без создания клиента

api_1c_send_document загружает файл и сразу отправляет его получателю на подпись (ПЭП или УКЭП — на выбор). Клиента заводить не нужно:

curl -X POST "https://cert4u.ru/api.php?action=api_1c_send_document" \
  -H "X-Api-Key: ВАШ_КЛЮЧ" \
  -H "Idempotency-Key: 1c-doc-000123" \
  -F "document=@dogovor.pdf" \
  -F "client_name=Петров Пётр Петрович" \
  -F "client_phone=+79001234567" \
  -F "sign_type=pep_only"

# Ответ:
{
  "success": true,
  "document_id": "d_043",
  "sign_url": "https://cert4u.ru/client.html?token=...",
  "sign_token": "...",
  "pep_code": "533441",
  "client": { "id": "c_015", "name": "Петров Пётр Петрович", ... },
  "sandbox": false
}

list_alt 21 метод API

Базовый вызов для любого метода: https://cert4u.ru/api.php?action=<action>. Полные параметры, форматы ответов и примеры — в справочнике api-docs.html. Для готовой интеграции с учётной системой смотрите страницу интеграция 1С и подписание.

Ниже 18 методов работы с документами и клиентами; ещё 3 метода управляют вебхуками.

actionHTTPПараметрыНазначение
api_1c_send_documentPOSTdocument, client_name, client_phone | client_email, sign_type?, doc_name?, description?, company?, inn?Отправка одним запросом: загрузить файл и сразу отправить получателю, без создания клиента. Ответ: document_id, sign_url, sign_token, pep_code, client. Multipart
api_1c_documentsGETlimit?, offset?Список документов аккаунта
api_1c_documentGETidОдин документ
api_1c_uploadPOSTdocument, doc_name?, description?, client_id?Загрузить документ (status new), multipart
api_1c_sign_adminPOSTdoc_idОтключён (HTTP 410): серверная подпись не является УКЭП — используйте api_1c_upload_signed
api_1c_sendPOSTdoc_id, client_id ИЛИ inline client_name + client_phone | client_email, sign_type? (ukep_only|pep_only)Отправить клиенту (нужен signed_admin). Получатель — по ID или напрямую (ФИО + телефон/почта, без создания клиента). Ответ: sign_url, pep_code
api_1c_verifyGETid | doc_idПроверка подписей (КриптоПро, 63-ФЗ), sig_format, блок cosigned_signature при совместной подписи, download_zip_url
api_1c_clientsGET—Список клиентов аккаунта
api_1c_clientsPOSTname, email | phone, company?, inn?, ogrn?, kpp?, address?, contact_person?, position?Создать клиента. Если в аккаунте уже есть клиент с таким телефоном/email — вернёт его (existed: true). Ответ: client, existed
api_1c_download_zipGETidСкачать ZIP: документ, protocol.pdf и подписи — одна совместная Документ.pdf.sig либо отдельные _server.sig / _client.sig (_client.pep.txt для ПЭП)
api_1c_pep_sendPOSTclient_id, и (doc_id ИЛИ document+doc_name)Загрузить (или взять документ в статусе new) и отправить на ПЭП одним вызовом (SMS-код), multipart
api_1c_pep_send_codePOSTdoc_id, method? (sms|email|both)Переотправить ПЭП-код
api_1c_pep_statusGETdoc_id | idСтатус документа и клиента; пока статус sent — sign_url (ссылку можно получить повторно без новой SMS)
api_1c_pep_bulkPOSTdoc_id, client_ids (массив или через запятую)Массовая ПЭП-рассылка одного документа многим
api_1c_revokePOSTdoc_id, reason?Отозвать документ → revoked
api_1c_upload_containerPOSTpin, container | container_base64Загрузить зашифрованный контейнер УКЭП (AES-256, PIN не хранится)
api_1c_delete_containerPOST—Удалить контейнер
api_1c_upload_signedPOSTdocument, signature, doc_name, client_id?, cert_info?Загрузить документ с вашей УКЭП (.sig CAdES-BES, открепленная или прикреплённая, DER или base64), multipart. Ответ: crypto_verify, sig_format, при ошибке crypto_error / content_mismatch
api_1c_settingsGET—Формат УКЭП, выбранный в аккаунте: sig_attached (true/false), sig_format (attached|detached)

Виды подписи: УКЭП (CAdES, КриптоПро) и ПЭП (одноразовый код по SMS/email). Подробности валидации и юридической значимости — в справочнике.

draw Формат подписи и совместная подпись

Формат выбирается в личном кабинете: Настройки → Формат подписи УКЭП (настройка вашего аккаунта). 1С узнаёт его через api_1c_settings, прежде чем сформировать подпись для api_1c_upload_signed. Проверка подписей принимает оба формата независимо от настройки. Подробнее — в справочнике.

Как сформировать нужный формат: в 1С — последний параметр НачатьПодписаниеДанныхCAdES(…, ТипПодписиCAdES.BES, Отсоединенная): Ложь → прикреплённая, Истина → открепленная; в cryptcp — без ключа -detached → прикреплённая, с ним → открепленная; в КриптоПро Browser plug-in — SignCades(oSigner, CADESCOM_CADES_BES, bDetached). Примеры — в справочнике.

timeline Статусы документа

new  →  signed_admin  →  sent  →  completed   (обе стороны подписали)
                                 ↘  rejected    (клиент отклонил)
                                 ↘  revoked     (отозван через api_1c_revoke)
СтатусЧто значит
newДокумент загружен, ещё не подписан отправителем
signed_adminЗагружен с УКЭП отправителя (api_1c_upload_signed), можно отправлять клиенту
sentОтправлен клиенту, ожидает его подписи
completedПодписали обе стороны — комплект готов
rejectedКлиент отклонил подписание
revokedДокумент отозван отправителем

error_outline Ошибки и коды

При ошибке возвращается {"success":false,"message":"..."} с соответствующим HTTP-кодом.

HTTPКогда
200Успешно
400Ошибка валидации: не хватает обязательного параметра или неверный формат
401Ключ отсутствует или неверный (проверьте X-Api-Key / Bearer / api_key)
402Тариф или лимит операций исчерпан (тариф без API или дневной лимит превышен)
403Метод недоступен этому ключу
404Документ/клиент/ресурс не найден (или принадлежит другому аккаунту)
429Превышен rate limit (60/мин) или дневной лимит операций

Тарифы и лимиты — на странице тарифов. Если получаете 402/403 — проверьте, что тариф включает API (Бизнес/Корпорат).

webhook Вебхуки

Вместо опроса статусов настройте вебхук — Cert4U сам отправит POST на ваш URL при изменении документа. Управление вебхуками — те же методы api.php?action=…, авторизация как у остальных методов, доступ только владельцу ключа.

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

actionHTTPПараметрыНазначение
api_1c_webhook_setPOSTurl (https), events? (массив или csv; по умолчанию — все)Установить/обновить. Возвращает secret (генерится при первой установке)
api_1c_webhook_getGET—Текущая конфигурация (secret маскируется до last6)
api_1c_webhook_deletePOST—Удалить вебхук

События

eventКогдаИсточник
document.sentДокумент отправлен клиентуВстроенно в api_1c_send / api_1c_send_document / api_1c_pep_send / api_1c_pep_bulk (кроме песочницы)
document.signedКлиент подписалКрон-вотчер
document.completedПодписали обе стороныКрон-вотчер
document.rejectedКлиент отклонилКрон-вотчер
document.revokedДокумент отозванВстроенно в api_1c_revoke

Серверные события (sent, revoked) отправляются сразу в момент вызова метода. События клиентского подписания (signed, completed, rejected) ловит крон-вотчер, сравнивающий статусы со снимком состояния и шлющий вебхуки на изменения.

Формат доставки

POST на ваш url, тело JSON. Таймаут 10 секунд, доставка best-effort.

POST https://ваш-сервер/webhook
Content-Type: application/json
X-Cert4U-Event: document.signed
X-Cert4U-Signature: sha256=<hex hmac_sha256(тело, secret)>

{
  "event": "document.signed",
  "doc_id": "d_042",
  "status": "signed",
  "client_id": "c_007",
  "occurred_at": "2026-06-17T10:15:00Z",
  "document": {
    "id": "d_042",
    "name": "Договор №14",
    "status": "signed",
    "client_name": "Иванов И.И."
  }
}

Проверка подлинности: заголовок X-Cert4U-Signature содержит sha256=<hex>, где hex — это HMAC-SHA256 от тела запроса с вашим secret. Всегда сверяйте подпись перед обработкой.

science Песочница (sandbox)

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

Как включить

Любым из трёх способов:

Поведение

В методах api_1c_send, api_1c_send_document, api_1c_pep_send, api_1c_pep_bulk:

На api_1c_pep_send_code (переотправка кода) песочница не распространяется — код отправляется реально.

curl -X POST "https://cert4u.ru/api.php?action=api_1c_pep_send" \
  -H "X-Api-Key: ВАШ_КЛЮЧ" \
  -H "X-Cert4U-Sandbox: 1" \
  -F "client_id=c_007" \
  -F "document=@dogovor.pdf" \
  -F "doc_name=Тест"

# Ответ:
{ "success": true, "sandbox": true, "pep_code": "000000" }

replay Идемпотентность

Чтобы обрыв связи и повтор запроса не создавали дубли документов и повторные платные SMS, передавайте заголовок Idempotency-Key: <уникальная строка> (или параметр idempotency_key). Поддерживают: api_1c_upload, api_1c_upload_signed, api_1c_send_document, api_1c_pep_send, api_1c_pep_bulk.

Повтор с тем же ключом в течение 24 часов возвращает ранее созданный документ и "idempotent": true (для api_1c_pep_bulk — "results": []) без новой отправки. Ключи действуют в пределах вашего аккаунта. Удобно использовать GUID документа 1С.

curl -X POST "https://cert4u.ru/api.php?action=api_1c_upload" \
  -H "X-Api-Key: ВАШ_КЛЮЧ" \
  -H "Idempotency-Key: 5f0c9a2e-1c-000123" \
  -F "document=@dogovor.pdf" \
  -F "doc_name=Договор №14"

translate Кириллица и 1С

Кодировка API — UTF-8. Кириллицу в query-параметрах необходимо URL-кодировать (urlencode). В 1С:Предприятие используйте встроенную функцию:

КодироватьСтроку(Значение, КодировкаURL.КодировкаURL)

Готовая обработка и пошаговая инструкция по подключению — на странице интеграция 1С и подписание. Параметры всех методов — в справочнике api-docs.html.

help_outline FAQ по интеграции

Как получить API-ключ для интеграции с 1С?

В личном кабинете: Настройки → API-ключи → создать ключ (self-serve). API доступен на тарифах Бизнес и Корпорат. На Старте API нет, на Тестовом — 10 операций в день.

Какой базовый адрес у REST API Cert4U?

Один эндпоинт: https://cert4u.ru/api.php?action=<ACTION>. Это не пути /api/v1/... — метод задаётся параметром action. Авторизация — X-Api-Key, либо Authorization: Bearer, либо api_key в query.

Как передавать кириллицу из 1С в параметрах запроса?

Кодировка UTF-8, query-параметры с кириллицей нужно урл-кодировать. В 1С — КодироватьСтроку(Значение, КодировкаURL.КодировкаURL).

Можно ли тестировать без реальной отправки SMS и расхода лимитов?

Да — включите песочницу (sandbox=true на ключе, X-Cert4U-Sandbox: 1 или sandbox=1). SMS/email не уходят, код ПЭП всегда 000000, лимиты не списываются.

Видит ли мой ключ документы других компаний?

Нет. API мультиарендный: ключ видит только данные своего аккаунта — фильтр по владельцу применяется ко всем методам. Подробнее об использовании в компании — электронная подпись для бизнеса.