Webhooker Sanntidshendelser
HMAC-signerte tilbakekall for hver hendelse knyttet til dokument, jobb, arbeidsområde og oppgave. 22 hendelsestyper, eksponentielle gjenforsøk, HTTPS anbefales.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Betrodd av ledende selskaper over hele verden
22 hendelsestyper, gruppert etter entitet
Abonner på enkelte hendelser eller bruk jokertegnet * for alt.
Dokumenter
14-
dokument.lastet_oppNytt dokument lastet opp til et arbeidsområde -
dokument.opprettetAlias for document.uploaded (kompatibilitet) -
dokument.behandletOCR/IDP-pipeline fullført vellykket -
dokument.redigertMetadata, tagger eller innhold oppdatert -
dokument.slettetDokument flyttet til papirkurv -
dokument.gjenopprettetDokument gjenopprettet fra papirkurv -
dokument.flyttetDokument flyttet mellom arbeidsområder -
dokument.versjon_opprettetNy versjon lagt til et eksisterende dokument -
dokument.livssyklus_endretStatus for oppbevaring/arkivering endret -
dokument.kommentar_lagt_tilKommentar postert på et dokument -
dokument.notat_lagt_tilInternt notat vedlagt -
dokument.tagg_lagt_tilTag tildelt et dokument -
dokument.juridisk_sikring_aktivertJuridisk sperre aktivert (uendelig) -
dokument.juridisk_sikring_deaktivertJuridisk sperre opphevet
Jobber
3-
jobb.fullførtAsynkron jobb fullført vellykket -
jobb.mislyktesAsynkron jobb feilet terminalt -
jobb.framdriftFremdriftsoppdatering under langvarige jobber
Arbeidsområder
2-
arbeidsområde.deltArbeidsområde delt med en bruker eller team -
arbeidsområde.ikke_deltTilgang til arbeidsområde trukket tilbake
Oppgaver
3-
oppgave.opprettetNy oppgave opprettet -
oppgave.fullførtOppgave merket som fullført -
oppgave.forfaltOppgave har passert forfallsdato
Abonner på ["*"] for å motta hver hendelse på kontoen din.
Hver levering følger samme skjema
Forutsigbar JSON-brødtekst, fem signerte HTTP-hodere, 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 Alltid JSON, UTF-8-kodet User-Agent PaperOffice-Webhook/1.0 Fast identifikator for brannmur-allowlist X-PaperOffice-Event dokument.behandlet Hendelsestype som leveres X-PaperOffice-Hendelses-ID a3b7f9c1… 128-biters unik ID. Bruk for idempotens. X-PaperOffice-Abonnements-ID 42 ID for abonnementet som mottar hendelsen X-PaperOffice-Signatur sha256=… HMAC-SHA256 av rå brødtekst, heksadesimal-kodet Verifiser hver levering med HMAC-SHA256
Beregn HMAC-SHA256 over den rå forespørselsbrødteksten ved hjelp av din delte hemmelighet, og sammenlign deretter mot X-PaperOffice-Signature ved bruk av 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 gjenforsøksstrategier, opptil 10 forsøk
Velg en policy per abonnement. Hvert forsøk loggføres med statuskode, svarbrødtekst og timing.
exponential Eksponentiell (standard)
Back-off dobles etter hvert forsøk: 30s, 60s, 120s, 240s, 480s…
linear Lineær
Fast vekst: 30s, 60s, 90s, 120s, 150s…
none Ingen
Fire-og-glem. Ingen gjenforsøk selv ved 5xx. Nyttig for test-hooks.
9 endepunkter under /latest/webhooks/
Full CRUD for abonnementer, leveringslogger, engangsjobb-abonnementer og et testendepunkt — alt OAuth2 Bearer, alt MCP-klart.
/webhooks/abonner Opprett et nytt abonnement (ubegrenset per konto) po_webhooks_subscribe /webhooks/liste List opp alle abonnementer på kontoen po_webhooks_list /webhooks/oppdater Oppdater et eksisterende abonnement po_webhooks_update /webhooks/slett Slett et abonnement mykt (leveringslogg bevart) po_webhooks_delete /webhooks/leveranser Hent leveringslogg med filtre (event_type, success_only) po_webhooks_deliveries /webhooks/test Send en test.ping-hendelse for å verifisere levering po_webhooks_test /webhooks/abonner-jobb Engangs-webhook for en spesifikk job_id po_webhooks_subscribe_job /webhooks/jobb-abonnementer List opp jobb-spesifikke abonnementer po_webhooks_job_subscriptions /webhooks/info Tilgjengelige hendelser, endepunkter, gjenforsøkspolicyer, signaturinfo po_webhooks_info Herdet etter design
HMAC-SHA256
Hver nyttelast signert med din hemmelighet. Tidskonstant sammenligning er obligatorisk.
SSRF-beskyttelse
Private / interne IP-er, localhost og sky-metadata-endepunkter blokkert ved abonnement og utsending.
Trygg mot DNS-rebinding
IP re-valideres ved utsendingstidspunkt, festet via CURLOPT_RESOLVE.
HTTPS sterkt foretrukket
http og https aksepteres. HTTPS anbefales for produksjon.
Event-ID idempotens
Hver levering bærer en unik X-PaperOffice-Event-ID. Dedupliser på din side.
Full revisjonsspor
Alle forsøk loggført: statuskode, svarbrødtekst, timing, feilmelding.
Ubegrensede abonnementer, leveringsatferd fullt konfigurerbar
Tilgjengelig på alle planer. Betaling per bruk: 1 kreditt per vellykket levering (HTTP 2xx). Gjenforsøk, testhendelser og mislykkede leveringer er gratis.
Din første webhook på 60 sekunder
Opprett et endepunkt, abonner via API, utløs en testhendelse. Det var det.