Webhooks Händelser i realtid
Ta emotaviseringar i realtidför alla händelser. Dokument bearbetade, OCR slutförd, klassificering gjord.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Betrodd av ledande företag världen över
22 händelsetyper, grupperade efter entitet
Prenumerera på enskilda händelser eller använd jokertecknet * för allt.
Dokument
14-
dokument.uppladdatNytt dokument uppladdat till en arbetsyta -
dokument.skapatAlias för document.uploaded (kompatibilitet) -
dokument.bearbetatOCR/AI-IDP-pipeline avslutades framgångsrikt -
dokument.redigeratMetadata, taggar eller innehåll uppdaterat -
dokument.raderatDokument flyttat till papperskorgen -
dokument.återställtDokument återställt från papperskorgen -
document.movedDokument flyttat mellan arbetsytor -
dokument.version_skapadNy version tillagd till ett befintligt dokument -
dokument.livscykel_ändradStatus för lagring/archivering ändrad -
dokument.kommentar_tillagdKommentar postad på ett dokument -
dokument.anteckning_tillagdIntern anteckning bifogad -
dokument.tagg_tillagdTagg tilldelad ett dokument -
dokument.juridisk_sperre_placeradJuridisk spärr aktiverad (oföränderlig) -
dokument.juridisk_sperre_upphävdJuridisk spärr hävd
Jobb
3-
jobb.slutförtAsynkront jobb slutfört framgångsrikt -
jobb.misslyckadesAsynkront jobb misslyckades permanent -
jobb.framstegUppdatering av förlopp under långvariga jobb
Workspaces
2-
arbetsyta.deladWorkspace delad med en användare eller ett team -
arbetsyta.delad_inteÅtkomst till Workspace återkallad
Uppgifter
3-
uppgift.skapadNy uppgift skapad -
uppgift.slutfördUppgift markerad som slutförd -
uppgift.förfallenUppgift passerat sitt förfallodatum
Varje leverans följer samma schema
Förutsägbar JSON-brödtext, fem signerade HTTP-headrar, tidsstämplar i 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 Alltid JSON, UTF-8-kodad User-Agent PaperOffice-Webhook/1.0 Fast identifierare för firewall-allowlistor X-PaperOffice-Event document.processed Händelsetyp som levereras X-PaperOffice-Event-ID a3b7f9c1… 128-bitars unikt ID. Använd för idempotens. X-PaperOffice-Subscription-ID 42 ID för prenumerationen som tar emot händelsen X-PaperOffice-Signature sha256=… HMAC-SHA256 av den råa brödtexten, hex-kodad Verifiera varje leverans med HMAC-SHA256
Beräkna HMAC-SHA256 över den råa begäransbrödtexten med din delade hemlighet, jämför sedan mot X-PaperOffice-Signature med hjälp av tidskonstant jämförelse (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');
}); Tre återförsöksstrategier, upp till 10 försök
Välj en policy per prenumeration. Varje försök loggas med statuskod, svarsbrödtext och tidtagning.
exponential Exponentiell (standard)
Back-off fördubblas efter varje försök: 30s, 60s, 120s, 240s, 480s…
linear Linjär
Fast tillväxt: 30s, 60s, 90s, 120s, 150s…
none Ingen
Fire-and-forget. Inga återförsök även vid 5xx. Användbart för test-hookar.
9 slutpunkter under /latest/webhooks/
Fullständig CRUD för prenumerationer, leveransloggar, engångsjobb-prenumerationer och en testslutpunkt — alla med OAuth2 Bearer, alla MCP-redo.
/webhooks/subscribe Skapa en ny prenumeration (obegränsat per konto) po_webhooks_subscribe /webhooks/list Lista alla prenumerationer för kontot po_webhooks_list /webhooks/update Uppdatera en befintlig prenumeration po_webhooks_update /webhooks/delete Mjuk radering av en prenumeration (leveranslogg bevaras) po_webhooks_delete /webhooks/deliveries Hämta leveranslogg med filter (event_type, success_only) po_webhooks_deliveries /webhooks/test Skicka en test.ping-händelse för att verifiera leverans po_webhooks_test /webhooks/subscribe-job Engångswebbhook för ett specifikt job_id po_webhooks_subscribe_job /webhooks/job-subscriptions Lista jobb-specifika prenumerationer po_webhooks_job_subscriptions /webhooks/info Tillgängliga händelser, slutpunkter, återförsökspolicyer, signaturinformation po_webhooks_info Hårdnad genom design
HMAC-SHA256
Varje payload signerad med din hemlighet. Tidskonstant jämförelse är obligatorisk.
SSRF-skydd
Privata/interna IP-adresser, localhost och molnmetadata-slutpunkter blockeras vid prenumeration och distribution.
Säkert mot DNS-rebinding
IP valideras om vid distributionstillfället, fäst via CURLOPT_RESOLVE.
HTTPS starkt föredraget
http och https accepteras. HTTPS rekommenderas för produktion.
Idempotens för Event-ID
Varje leverans bär ett unikt X-PaperOffice-Event-ID. Deduplicera på din sida.
Fullständig granskningshistorik
Alla försök loggade: statuskod, svarsbrödtext, tidtagning, felmeddelande.
Obegränsade prenumerationer, leveransbeteende helt konfigurerbart
Tillgängligt på alla planer. Betala per användning: 1 kredit per lyckad leverans (HTTP 2xx). Återförsök, testhändelser och misslyckade leveranser är gratis.
Ta emot evenemang?
Konfigurera dina webhooks.