Вебхуки Події в реальному часі
Отримуйте сповіщення в реальному часі про всі події. Документи оброблені, 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Новий документ завантажено до робочого простору -
document.createdПсевдонім для document.uploaded (сумісність) -
document.processedПотік OCR/<a href="/uk/ai-idp-intelektualna-obrobka-dokumentiv/">AI-IDP</a> завершено успішно -
document.editedОновлено метадані, теги або вміст -
document.deletedДокумент переміщено до кошика -
document.restoredДокумент відновлено з кошика -
document.movedДокумент переміщено між робочими просторами -
document.version_createdДодано нову версію до існуючого документа -
document.lifecycle_changedЗмінено статус зберігання / архівування -
document.comment_addedОпубліковано коментар до документа -
document.note_addedДодано внутрішню нотатку -
document.tag_addedДо документа призначено тег -
document.legal_hold_placedАктивовано юридичне блокування (незмінне) -
document.legal_hold_releasedЮридичне блокування знято
Завдання
3-
job.completedАсинхронне завдання успішно завершено -
job.failedАсинхронне завдання остаточно не виконано -
job.progressОновлення прогресу під час тривалих завдань
Workspaces
2-
workspace.sharedWorkspace спільно використано з користувачем або командою -
workspace.unsharedWorkspace доступ скасовано
Задачі
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… Унікальний ID 128 біт. Використовуйте для ідемпотентності. 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-rebinding
IP-адреса повторно перевіряється під час відправки, закріплюється через CURLOPT_RESOLVE.
HTTPS наполегливо рекомендується
Приймаються http та https. HTTPS рекомендується для виробничого середовища.
Ідемпотентність Event-ID
Кожна доставка містить унікальний X-PaperOffice-Event-ID. Виконайте дедуплікацію на своїй стороні.
Повний аудиторський слід
Усі спроби зареєстровано: код статусу, тіло відповіді, час виконання, повідомлення про помилку.
Необмежені підписки, поведінка доставки повністю налаштовується
Доступно на усіх тарифах. Оплата за використання: 1 кредит за успішну доставку (HTTP 2xx). Повторні спроби, тестові події та невдалі доставки безкоштовні.
Отримувати події?
Налаштуйте свої вебхуки.