Вебхуки События в реальном времени
Получайте уведомления в реальном времени по всем событиям. Документы обработаны, OCR завершён, классификация выполнена.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Доверие ведущих компаний по всему миру
22 типа событий, сгруппированных по сущностям
Подпишитесь на отдельные события или используйте подстановочный знак * для всего.
Документы
14-
документ.загруженНовый документ загружен в рабочее пространство -
документ.созданПсевдоним для document.uploaded (совместимость) -
документ.обработанКонвейер OCR/AI-IDP успешно завершен -
документ.отредактированМетаданные, теги или содержимое обновлены -
документ.удаленДокумент перемещен в корзину -
документ.восстановленДокумент восстановлен из корзины -
document.movedДокумент перемещен между рабочими пространствами -
документ.версия_созданаНовая версия добавлена к существующему документу -
документ.жизненный_цикл_измененСтатус хранения / архивирования изменен -
документ.комментарий_добавленКомментарий опубликован на документе -
document.note_addedПрикреплена внутренняя заметка -
document.tag_addedТег назначен документу -
document.legal_hold_placedЮридический запрет активирован (неизменяемый) -
document.legal_hold_releasedЮридический запрет снят
Задания
3-
job.completedАсинхронное задание успешно завершено -
Задача не выполненаАсинхронное задание окончательно не выполнено -
Выполнение задачиОбновление прогресса во время длительных заданий
Workspaces
2-
Рабочее пространство: общий доступWorkspace предоставлено пользователю или команде -
Рабочее пространство: доступ ограничендоступ к Workspace отозван
Задачи
3-
Задача созданаСоздана новая задача -
Задача завершенаЗадача отмечена как выполненная -
Задача просроченаЗадача просрочена
Каждая доставка следует одной схеме
Предсказуемое тело JSON, пять подписанных HTTP-заголовков, метки времени ISO-8601 UTC.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6c9f1d4e7b2a5c8f1",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": {
"pofid": "doc_01HZY8K3M7P2Q9R5T1V6W4X2Y8",
"workspace_id": 17,
"filename": "invoice-2026-04-17.pdf",
"mime_type": "application/pdf",
"size_bytes": 284521,
"processing_result": {
"ocr_done": true,
"classification": "invoice",
"confidence": 0.98
}
}
} Content-Type application/json Всегда JSON, кодировка UTF-8 User-Agent PaperOffice-Webhook/1.0 Фиксированный идентификатор для списков разрешения брандмауэра X-PaperOffice-Event document.processed Тип доставляемого события X-PaperOffice-Event-ID a3b7f9c1… Уникальный 128-битный ID. Используйте для идемпотентности. X-PaperOffice-Subscription-ID 42 ID подписки, получающей событие X-PaperOffice-Signature sha256=… HMAC-SHA256 необработанного тела, в шестнадцатеричном формате Проверяйте каждую доставку с помощью HMAC-SHA256
Вычислите HMAC-SHA256 для необработанного тела запроса, используя ваш общий секрет, затем сравните с X-PaperOffice-Signature, используя сравнение с постоянным временем (hash_equals, crypto.timingSafeEqual).
import crypto from 'crypto';
import express from 'express';
const app = express();
const WEBHOOK_SECRET = process.env.PAPEROFFICE_WEBHOOK_SECRET;
app.post('/webhooks/paperoffice', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.header('X-PaperOffice-Signature'); // "sha256=..."
const eventId = req.header('X-PaperOffice-Event-ID');
const eventType = req.header('X-PaperOffice-Event');
const expected = 'sha256=' + crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(req.body)
.digest('hex');
if (!signature || !crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
return res.status(401).send('invalid signature');
}
const event = JSON.parse(req.body.toString());
// eventId als Idempotency-Key speichern -> gleiche ID nicht zweimal verarbeiten
console.log(eventType, event.data);
res.status(200).send('ok');
}); Три стратегии повторных попыток, до 10 попыток
Выберите политику для каждой подписки. Каждая попытка регистрируется с кодом состояния, телом ответа и временем.
exponential Экспоненциальная (по умолчанию)
Экспоненциальная задержка удваивается после каждой попытки: 30 с, 60 с, 120 с, 240 с, 480 с…
linear Линейная
Фиксированный рост: 30 с, 60 с, 90 с, 120 с, 150 с…
none Отсутствует
Отправил и забыл. Повторные попытки не выполняются даже при ошибках 5xx. Полезно для тестовых хуков.
9 конечных точек в разделе /latest/webhooks/
Полный CRUD для подписок, журналов доставки, одноразовых подписок на задачи и тестовой конечной точки — всё с использованием OAuth2 Bearer, готово к MCP.
/webhooks/subscribe Создать новую подписку (неограниченно на аккаунт) po_webhooks_subscribe /webhooks/list Список всех подписок аккаунта po_webhooks_list /webhooks/update Обновить существующую подписку po_webhooks_update /webhooks/delete Мягкое удаление подписки (журнал доставки сохраняется) po_webhooks_delete /webhooks/deliveries Получить журнал доставки с фильтрами (event_type, success_only) po_webhooks_deliveries /webhooks/test Отправить событие test.ping для проверки доставки po_webhooks_test /webhooks/subscribe-job Одноразовый вебхук для конкретного job_id po_webhooks_subscribe_job /webhooks/job-subscriptions Список подписок, ограниченных задачами po_webhooks_job_subscriptions /webhooks/info Доступные события, конечные точки, политики повторных попыток, информация о подписи po_webhooks_info Защита по дизайну
HMAC-SHA256
Каждая полезная нагрузка подписана вашим секретным ключом. Обязательно сравнение за постоянное время.
Защита от SSRF
Частные / внутренние IP-адреса, localhost и конечные точки метаданных облака блокируются при подписке и отправке.
Безопасность от DNS-ребайдинга
IP-адрес повторно проверяется во время отправки, закрепляется через CURLOPT_RESOLVE.
HTTPS настоятельно рекомендуется
Принимаются http и https. Для производства рекомендуется HTTPS.
Идемпотентность Event-ID
Каждая доставка содержит уникальный X-PaperOffice-Event-ID. Дедупликация на вашей стороне.
Полный аудиторский след
Все попытки логируются: код состояния, тело ответа, время, сообщение об ошибке.
Неограниченные подписки, поведение доставки полностью настраиваемо
Доступно на всех тарифах. Оплата за использование: 1 кредит за успешную доставку (HTTP 2xx). Повторные попытки, тестовые события и неудачные доставки бесплатны.
Получать события?
Настройте webhooks.