Webhooks Realtidsbegivenheder
Modtag realtidsnotifikationer for alle begivenheder. Dokumenter behandlet, OCR fuldført, klassificering færdig.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Betroet af førende virksomheder verden over
22 begivenhedstyper, grupperet efter enhed
Abonner på individuelle begivenheder eller brug jokertegnet * for alt.
Dokumenter
14-
dokument.uploadetNyt dokument uploadet til et arbejdsområde -
dokument.oprettetAlias for document.uploaded (kompatibilitet) -
dokument.behandletOCR/AI-IDP pipeline afsluttet succesfuldt -
dokument.redigeretMetadata, tags eller indhold opdateret -
dokument.slettetDokument flyttet til papirkurv -
dokument.gendannetDokument gendannet fra papirkurv -
dokument.flyttetDokument flyttet mellem arbejdsområder -
dokument.version_oprettetNy version tilføjet til et eksisterende dokument -
dokument.livscyklus_ændretStatus for opbevaring/archivering ændret -
dokument.kommentar_tilføjetKommentar posted på et dokument -
dokument.note_tilføjetIntern note vedhæftet -
dokument.mærke_tilføjetTag tildelt til et dokument -
dokument.juridisk_sikring_aktiveretJuridisk sperre aktiveret (uforanderlig) -
dokument.juridisk_sikring_frigivetJuridisk sperre ophævet
Job
3-
job.afsluttetAsynkront job fuldført succesfuldt -
job.mislykkedesAsynkront job fejlede terminalt -
job.fremskridtFremskridtsopdatering under langvarige job
Workspaces
2-
arbejdsområde.deltWorkspace delt med en bruger eller et team -
arbejdsområde.ikke_deltWorkspace adgang tilbagekaldt
Opgaver
3-
opgave.oprettetNy opgave oprettet -
opgave.afsluttetOpgave markeret som fuldført -
opgave.forfaldenOpgave har passeret sin forfaldsdato
Hver levering følger samme skema
Forudsigelig JSON-body, fem signerede HTTP-headere, ISO-8601 UTC-tidsstempler.
{
"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 Altid JSON, UTF-8 kodet User-Agent PaperOffice-Webhook/1.0 Fast identifikator til firewall-allowlists X-PaperOffice-Event dokument.behandlet Begivenhedstype der leveres X-PaperOffice-Event-ID a3b7f9c1… 128-bit unik ID. Brug til idempotens. X-PaperOffice-Abonnements-ID 42 ID for abonnementet der modtager begivenheden X-PaperOffice-Signatur sha256=… HMAC-SHA256 af den rå body, hex-kodet Verificér hver levering med HMAC-SHA256
Beregn HMAC-SHA256 over den rå anmodningsbody ved hjælp af din delte hemmelighed, og sammenlign derefter med X-PaperOffice-Signature ved brug af tidskonstant sammenligning (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 genforsøgsstrategier, op til 10 forsøg
Vælg en politik pr. abonnement. Hvert forsøg logges med statuskode, responsbody og timing.
exponential Eksponentiel (standard)
Back-off fordobles efter hvert forsøg: 30s, 60s, 120s, 240s, 480s…
linear Lineær
Fast vækst: 30s, 60s, 90s, 120s, 150s…
none Ingen
Fire-and-forget. Ingen genforsøg selv ved 5xx. Nyttigt til test-webhooks.
9 endepunkter under /latest/webhooks/
Fuld CRUD for abonnementer, leveringslogs, engangsjob-abonnementer og et test-endepunkt — alt OAuth2 Bearer, alt MCP-klart.
/webhooks/subscribe Opret et nyt abonnement (ubegrænset pr. konto) po_webhooks_subscribe /webhooks/list List alle abonnementer på kontoen po_webhooks_list /webhooks/update Opdater et eksisterende abonnement po_webhooks_update /webhooks/delete Blød sletning af et abonnement (leveringslog bevares) po_webhooks_delete /webhooks/deliveries Hent leveringslog med filtre (event_type, success_only) po_webhooks_deliveries /webhooks/test Send en test.ping-begivenhed for at verificere levering po_webhooks_test /webhooks/subscribe-job Engangs-webhook for et specifikt job_id po_webhooks_subscribe_job /webhooks/job-subscriptions List job-specifikke abonnementer po_webhooks_job_subscriptions /webhooks/info Tilgængelige begivenheder, endepunkter, genforsøgspolitikker, signaturinfo po_webhooks_info Hærdet ved design
HMAC-SHA256
Hver payload signeret med din hemmelighed. Tidskonstant sammenligning er obligatorisk.
SSRF-beskyttelse
Private / interne IP'er, localhost og cloud-metadata-endepunkter blokeres ved abonnement og dispatch.
DNS-rebinding sikker
IP genvalideres ved dispatch-tidspunktet, fastlåst via CURLOPT_RESOLVE.
HTTPS stærkt foretrukket
http og https accepteres. HTTPS anbefales til produktion.
Event-ID idempotens
Hver levering indeholder en unik X-PaperOffice-Event-ID. Dedublér på din side.
Fuld revisionslog
Alle forsøg logget: statuskode, responsbody, timing, fejlmeddelelse.
Ubegrænsede abonnementer, leveringsadfærd fuldt konfigurerbar
Tilgængelig på alle planer. Pay-per-use: 1 kredit pr. succesfuld levering (HTTP 2xx). Genforsøg, testbegivenheder og mislykkede leveringer er gratis.
Modtage begivenheder?
Konfigurer dine webhooks.