Webhookovi Događaji u stvarnom vremenu
Povratni pozivi potpisani s HMAC za svaki događaj dokumenta, posla, radnog prostora i zadatka. 22 vrste događaja, eksponencijalni ponovni pokušaji, preporučuje se HTTPS.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Povjerenje vodećih tvrtki širom svijeta
22 vrste događaja, grupirano po entitetu
Pretplatite se na pojedinačne događaje ili koristite zamjenski znak * za sve.
Dokumenti
14-
document.uploadedNovi dokument učitan u radni prostor -
document.createdAlias za document.uploaded (kompatibilnost) -
document.processedOCR/IDP pipeline uspješno završen -
document.editedMetapodaci, oznake ili sadržaj ažurirani -
document.deletedDokument premješten u smeće -
document.restoredDokument oporavljen iz smeća -
document.movedDokument premješten između radnih prostora -
document.version_createdNova verzija dodana postojećem dokumentu -
document.lifecycle_changedStatus zadržavanja / arhiviranja promijenjen -
document.comment_addedKomentar objavljen na dokumentu -
document.note_addedInterna bilješka priložena -
document.tag_addedOznaka dodijeljena dokumentu -
document.legal_hold_placedPravno zadržavanje aktivirano (nepromjenjivo) -
document.legal_hold_releasedPravno zadržavanje oslobođeno
Poslovi
3-
job.completedAsinkroni posao uspješno završen -
posao.neuspjeloAsinkroni posao trajno neuspješan -
posao.napredakAžuriranje napretka tijekom dugotrajnih poslova
Radni prostori
2-
radni-prostor.dijeljenoRadni prostor podijeljen s korisnikom ili timom -
radni-prostor.nije-dijeljenoPristup radnom prostoru opozvan
Zadaci
3-
zadatak.stvorenoNovi zadatak stvoren -
zadatak.dovršenoZadatak označen kao dovršen -
zadatak.prošlo-rokZadatak je prošao svoj rok
Pretplatite se na ["*"] za primanje svakog događaja vašeg računa.
Svaka isporuka slijedi istu shemu
Predvidljivo JSON tijelo, pet potpisanih HTTP zaglavlja, ISO-8601 UTC vremenske oznake.
{
"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 Uvijek JSON, UTF-8 kodiran User-Agent PaperOffice-Webhook/1.0 Fiksni identifikator za popise dopuštenih vatrozida X-PaperOffice-Event document.processed Vrsta događaja koji se isporučuje X-PaperOffice-Event-ID a3b7f9c1… 128-bitni jedinstveni ID. Koristiti za idempotentnost. X-PaperOffice-Subscription-ID 42 ID pretplate koja prima događaj X-PaperOffice-Signature sha256=… HMAC-SHA256 sirovog tijela, heksadecimalno kodirano Verificirajte svaku isporuku s HMAC-SHA256
Izračunajte HMAC-SHA256 nad sirovim tijelom zahtjeva koristeći svoju dijeljenu tajnu, zatim usporedite s X-PaperOffice-Signature koristeći usporedbu konstantnog vremena (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');
}); Tri strategije ponovnog pokušaja, do 10 pokušaja
Odaberite politiku po pretplati. Svaki pokušaj se bilježi sa status kodom, tijelom odgovora i vremenskim označavanjem.
exponential Eksponencijalno (zadano)
Pauza se udvostručuje nakon svakog pokušaja: 30s, 60s, 120s, 240s, 480s…
linear Linearno
Fiksni rast: 30s, 60s, 90s, 120s, 150s…
none Nijedan
Pošalji i zaboravi. Nema ponovnih pokušaja čak ni kod 5xx. Korisno za testne web-kuke.
9 krajnjih točaka pod /latest/webhooks/
Potpuni CRUD za pretplate, dnevnike isporuke, jednokratne pretplate na poslove i testnu krajnju točku — sve OAuth2 Bearer, sve spremno za MCP.
/webhooks/subscribe Stvorite novu pretplatu (neograničeno po računu) po_webhooks_subscribe /webhooks/list Popis svih pretplata računa po_webhooks_list /webhooks/update Ažurirajte postojeću pretplatu po_webhooks_update /webhooks/delete Brisanje pretplate uz zadržavanje podataka (dnevnik isporuke sačuvan) po_webhooks_delete /webhooks/deliveries Dohvati dnevnik isporuke s filtrima (event_type, success_only) po_webhooks_deliveries /webhooks/test Pošaljite događaj test.ping za verifikaciju isporuke po_webhooks_test /webhooks/subscribe-job Jednokratna web-kuka za specifični job_id po_webhooks_subscribe_job /webhooks/job-subscriptions Popis pretplata vezanih uz posao po_webhooks_job_subscriptions /webhooks/info Dostupni događaji, krajnje točke, politike ponovnog pokušaja, informacije o potpisu po_webhooks_info Ojačano po dizajnu
HMAC-SHA256
Svaki potpisan payload s vašom tajnom. Usporedba konstantnog vremena je obavezna.
SSRF zaštita
Privatni / interni IP-ovi, localhost i krajnje točke metapodataka u oblaku blokirani su pri pretplati i slanju.
Sigurno od DNS rebindinga
IP se ponovno validira u vrijeme slanja, fiksiran putem CURLOPT_RESOLVE.
HTTPS snažno preferiran
http i https prihvaćeni. HTTPS preporučen za produkciju.
Event-ID idempotentnost
Svaka isporuka nosi jedinstveni X-PaperOffice-Event-ID. Deduplicirajte na svojoj strani.
Potpuni revizijski trag
Svi pokušaji zabilježeni: status kod, tijelo odgovora, vrijeme, poruka o grešci.
Neograničene pretplate, ponašanje isporuke potpuno konfigurabilno
Dostupno na svim planovima. Plaćanje po korištenju: 1 kredit po uspješnoj isporuci (HTTP 2xx). Ponovni pokušaji, testni događaji i neuspjele isporuke su besplatni.
Vaša prva web-kuka u 60 sekundi
Stvorite krajnju točku, pretplatite se putem API-ja, okinite testni događaj. To je to.