Webhookове Събития в реално време
HMAC-подписани обратно извиквания за всяко събитие на документ, задача, работно пространство и задача. 22 типа събития, експоненциални повторни опити, препоръчва се HTTPS.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Доверието на водещи компании по целия свят
22 типа събития, групирани по entidad
Абонирайте се за отделни събития или използвайте заместващия символ * за всичко.
Документи
14-
документ.каченНов документ е качен в работно пространство -
документ.създаденПсевдоним за document.uploaded (съвместимост) -
документ.обработенOCR/IDP конвейерът завърши успешно -
документ.редактиранМетаданни, тагове или съдържание са актуализирани -
документ.изтритДокументът е преместен в кошчето -
документ.възстановенДокументът е възстановен от кошчето -
document.movedДокументът е преместен между работни пространства -
документ.верзия_създаденаНова версия е добавена към съществуващ документ -
документ.жизнен_цикъл_промененСтатусът на задържане / архивиране е променен -
документ.коментар_добавенКоментар е публикуван върху документ -
документ.бележка_добавенаПрикачена е вътрешна бележка -
документ.етикет_добавенТаг е присвоен на документ -
документ.правно_задържане_наложеноЮридическо задържане е активирано (непроменимо) -
документ.правно_задържане_премахнатоЮридическото задържане е освободено
Задачи
3-
задача.завършенаАсинхронна задача завърши успешно -
задача.неуспешнаАсинхронна задача се провали окончателно -
задача.напредъкАктуализация на прогреса по време на дълготрайни задачи
Работни пространства
2-
работно_пространство.споделеноРаботното пространство е споделено с потребител или екип -
работно_пространство.несподеленоДостъпът до работното пространство е отнет
Задачи
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 Фиксиран идентификатор за списъци с разрешени IP адреси във防火墙 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 Еднократен webhook за конкретен 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 адресът се пре validating при време на изпращане, закрепен чрез CURLOPT_RESOLVE.
HTTPS силно предпочитано
Приемат се http и https. HTTPS се препоръчва за продукция.
Идемпотентност на Event-ID
Всяка доставка носи уникален X-PaperOffice-Event-ID. Премахнете дубликатите от ваша страна.
Пълен одитен след
Всички опити се записват: статус код, тяло на отговора, време, съобщение за грешка.
Неограничени абонаменти, поведението при доставка е напълно конфигурируемо
Налично на всички планове. Плащане според използването: 1 кредит за успешна доставка (HTTP 2xx). Повторните опити, тестовите събития и неуспешните доставки са безплатни.
Вашият първи webhook за 60 секунди
Създайте крайна точка, абонирайте се чрез API, стартирайте тестово събитие. Това е.