Webhooks Real-time gebeurtenissen
HMAC-ondertekende callbacks voor elke gebeurtenis van documenten, taken, werkruimten en opdrachten. 22 gebeurtenistypen, exponentiële opnieuw proberen-pogingen, HTTPS aanbevolen.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Vertrouwd door toonaangevende bedrijven wereldwijd
22 gebeurtenistypen, gegroepeerd per entiteit
Abonneer u op individuele gebeurtenissen of gebruik het jokerteken * voor alles.
Documenten
14-
document.uploadedNieuw document geüpload naar een werkruimte -
document.createdAlias voor document.uploaded (compatibiliteit) -
document.processedOCR/IDP-pipeline succesvol voltooid -
document.bewerktMetadata, tags of inhoud bijgewerkt -
document.verwijderdDocument verplaatst naar prullenbak -
document.hersteldDocument hersteld vanuit prullenbak -
document.verplaatstDocument verplaatst tussen werkruimten -
document.versie_aangemaaktNieuwe versie toegevoegd aan een bestaand document -
document.levenscyclus_gewijzigdBewaar-/archiveringsstatus gewijzigd -
document.opmerking_toegevoegdReactie geplaatst op een document -
document.notitie_toegevoegdInterne notitie bijgevoegd -
document.label_toegevoegdTag toegewezen aan een document -
document.juridische_bevriezing_geplaatstJuridische vergrendeling geactiveerd (onveranderlijk) -
document.juridische_bevriezing_opgehevenJuridische vergrendeling opgeheven
Taken
3-
taak.voltooidAsynchrone taak succesvol voltooid -
taak.misluktAsynchrone taak definitief mislukt -
taak.voortgangVoortgangsupdate tijdens langlopende taken
Werkruimten
2-
werkruimte.gedeeldWerkruimte gedeeld met een gebruiker of team -
werkruimte.delen_opgehevenToegang tot werkruimte ingetrokken
Opdrachten
3-
taak.aangemaaktNieuwe opdracht aangemaakt -
taak.voltooidOpdracht gemarkeerd als voltooid -
taak.verlopenOpdracht heeft de vervaldatum overschreden
Abonneer u op ["*"] om elke gebeurtenis van uw account te ontvangen.
Elke levering volgt hetzelfde schema
Voorspelbare JSON-body, vijf ondertekende HTTP-headers, ISO-8601 UTC-tijdstempels.
{
"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 Altijd JSON, UTF-8 gecodeerd User-Agent PaperOffice-Webhook/1.0 Vaste identifier voor firewall-toestemmingslijsten X-PaperOffice-Event document.verwerkt Gebeurtenistype dat wordt geleverd X-PaperOffice-Event-ID a3b7f9c1… 128-bit unieke ID. Gebruik voor idempotentie. X-PaperOffice-Subscription-ID 42 ID van het abonnement dat de gebeurtenis ontvangt X-PaperOffice-Signature sha256=… HMAC-SHA256 van de ruwe body, hex-gecodeerd Verifieer elke levering met HMAC-SHA256
Bereken HMAC-SHA256 over de ruwe verzoekbody met uw gedeelde geheim en vergelijk dit vervolgens met X-PaperOffice-Signature met behulp van een constant-tijdvergelijking (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');
}); Drie opnieuw proberen-strategieën, tot 10 pogingen
Kies een beleid per abonnement. Elke poging wordt gelogd met statuscode, antwoordbody en timing.
exponential Exponentieel (standaard)
Back-off verdubbelt na elke poging: 30s, 60s, 120s, 240s, 480s…
linear Lineair
Vaste groei: 30s, 60s, 90s, 120s, 150s…
none Geen
Fire-and-forget. Geen opnieuw proberen, zelfs niet bij 5xx. Handig voor test-webhooks.
9 eindpunten onder /latest/webhooks/
Volledige CRUD voor abonnementen, leveringslogboeken, eenmalige taakabonnementen en een test-eindpunt — allemaal OAuth2 Bearer, allemaal MCP-gereed.
/webhooks/subscribe Maak een nieuw abonnement aan (onbeperkt per account) po_webhooks_subscribe /webhooks/list Toon alle abonnementen van het account po_webhooks_list /webhooks/update Werk een bestaand abonnement bij po_webhooks_update /webhooks/delete Zacht verwijderen van een abonnement (leveringslogboek behouden) po_webhooks_delete /webhooks/deliveries Haal leveringslogboek op met filters (event_type, success_only) po_webhooks_deliveries /webhooks/test Verzend een test.ping-gebeurtenis om de levering te verifiëren po_webhooks_test /webhooks/subscribe-job Eenmalige webhook voor een specifieke job_id po_webhooks_subscribe_job /webhooks/job-subscriptions Toon taak-gebonden abonnementen po_webhooks_job_subscriptions /webhooks/info Beschikbare gebeurtenissen, eindpunten, opnieuw proberen-beleidsregels, handtekeninginformatie po_webhooks_info Ontworpen voor verharding
HMAC-SHA256
Elke payload ondertekend met uw geheim. Constant-tijdvergelijking verplicht.
SSRF-bescherming
Privé-/interne IP's, localhost en cloud-metadata-eindpunten geblokkeerd bij abonneren en verzenden.
Veilig tegen DNS-rebinding
IP opnieuw gevalideerd op verzendtijdstip, vastgezet via CURLOPT_RESOLVE.
HTTPS sterk aanbevolen
http en https geaccepteerd. HTTPS aanbevolen voor productie.
Event-ID idempotentie
Elke levering bevat een unieke X-PaperOffice-Event-ID. Dedupliceer aan uw kant.
Volledig audittrail
Alle pogingen gelogd: statuscode, antwoordbody, timing, foutmelding.
Onbeperkte abonnementen, leveringsgedrag volledig configureerbaar
Beschikbaar op alle abonnementen. Pay-per-use: 1 credit per succesvolle levering (HTTP 2xx). Opnieuw proberen, testgebeurtenissen en mislukte leveringen zijn gratis.
Uw eerste webhook in 60 seconden
Maak een eindpunt aan, abonneer via API, vuur een testgebeurtenis af. Dat is alles.