Webbhookar Händelser i realtid
HMAC-signerade återuppringningar för varje händelse gällande dokument, jobb, arbetsytor och uppgifter. 22 händelsetyper, exponentiella återförsök, HTTPS rekommenderas.
{
"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/IDP-pipeline slutförd 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
Arbetsytor
2-
arbetsyta.deladArbetsyta delad med en användare eller team -
arbetsyta.delad_inteÅtkomst till arbetsyta återkallad
Uppgifter
3-
uppgift.skapadNy uppgift skapad -
uppgift.slutfördUppgift markerad som slutförd -
uppgift.förfallenUppgift passerat sitt förfallodatum
Prenumerera på ["*"] för att ta emot varje händelse på ditt konto.
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.
Din första webbhook på 60 sekunder
Skapa en slutpunkt, prenumerera via API, utlös en testhändelse. Det var allt.