Webhooks Realtidsbegivenheder
HMAC-signerede tilbagekald for hver begivenhed vedrørende dokumenter, job, arbejdsområder og opgaver. 22 begivenhedstyper, eksponentielle genforsøg, HTTPS anbefales.
{
"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/IDP-pipeline fuldført 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
Arbejdsområder
2-
arbejdsområde.deltArbejdsområde delt med en bruger eller et team -
arbejdsområde.ikke_deltAdgang til arbejdsområde trukket tilbage
Opgaver
3-
opgave.oprettetNy opgave oprettet -
opgave.afsluttetOpgave markeret som fuldført -
opgave.forfaldenOpgave har passeret sin forfaldsdato
Abonner på ["*"] for at modtage alle begivenheder på din konto.
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.
Din første webhook på 60 sekunder
Opret et endepunkt, abonner via API, affyr en testbegivenhed. Det var det.