Webhook-uri Evenimente în timp real
Callback-uri semnate HMAC pentru fiecare eveniment legat de documente, joburi, spații de lucru și sarcini. 22 de tipuri de evenimente, reîncercări exponențiale, HTTPS recomandat.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Încrederea companiilor de top din întreaga lume
22 de tipuri de evenimente, grupate după entitate
Abonează-te la evenimente individuale sau folosește wildcard-ul * pentru toate.
Documente
14-
document.încărcatDocument nou încărcat într-un spațiu de lucru -
document.creatAlias pentru document.uploaded (compatibilitate) -
document.procesatPipeline OCR/IDP finalizat cu succes -
document.editatMetadate, etichete sau conținut actualizate -
document.ștersDocument mutat la coșul de gunoi -
document.restauratDocument recuperat din coșul de gunoi -
document.mutatDocument mutat între spații de lucru -
document.versiune_creatăVersiune nouă adăugată unui document existent -
document.ciclu_de_viață_modificatStatut de retenție / arhivare modificat -
document.comentariu_adăugatComentariu postat pe un document -
document.notă_adăugatăNotă internă atașată -
document.etichetă_adăugatăEtichetă atribuită unui document -
document.reținere_legală_activatăBlocaj legal activat (imutabil) -
document.reținere_legală_eliberatăBlocaj legal eliberat
Joburi
3-
job.finalizatJob asincron finalizat cu succes -
job.eșuatJob asincron eșuat terminal -
job.progresActualizare progres în timpul joburilor de lungă durată
Spații de lucru
2-
spațiu_lucru.partajatSpațiu de lucru partajat cu un utilizator sau echipă -
spațiu_lucru.nepartajatAcces la spațiul de lucru revocat
Sarcini
3-
sarcină.creatăSarcină nouă creată -
sarcină.finalizatăSarcină marcată ca finalizată -
sarcină.întârziatăSarcină depășită termenul limită
Abonează-te la ["*"] pentru a primi fiecare eveniment din contul tău.
Fiecare livrare urmează aceeași schemă
Corp JSON predictibil, cinci antete HTTP semnate, timestamp-uri 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 Întotdeauna JSON, codificat UTF-8 User-Agent PaperOffice-Webhook/1.0 Identificator fix pentru listele de permisiuni firewall X-PaperOffice-Event document.processed Tipul evenimentului livrat X-PaperOffice-Event-ID a3b7f9c1… ID unic pe 128 biți. Utilizați-l pentru idempotență. X-PaperOffice-Subscription-ID 42 ID-ul abonamentului care primește evenimentul X-PaperOffice-Signature sha256=… HMAC-SHA256 al corpului brut, codificat hexazecimal Verificați fiecare livrare cu HMAC-SHA256
Calculați HMAC-SHA256 peste corpul brut al cererii folosind secretul dvs. partajat, apoi comparați-l cu X-PaperOffice-Signature utilizând o comparare cu timp constant (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');
}); Trei strategii de reîncercare, până la 10 încercări
Alegeți o politică per abonament. Fiecare încercare este jurnalizată cu codul de stare, corpul răspunsului și timing-ul.
exponential Exponențială (implicit)
Întârzierea se dublează după fiecare încercare: 30s, 60s, 120s, 240s, 480s…
linear Liniară
Creștere fixă: 30s, 60s, 90s, 120s, 150s…
none Niciuna
Fire-and-forget. Fără reîncercări chiar și la erori 5xx. Util pentru hook-uri de test.
9 endpoint-uri sub /latest/webhooks/
CRUD complet pentru abonamente, jurnale de livrare, abonamente pentru joburi unice și un endpoint de test — toate OAuth2 Bearer, toate compatibile MCP.
/webhooks/subscribe Creează un nou abonament (nelimitat per cont) po_webhooks_subscribe /webhooks/list Listează toate abonamentele contului po_webhooks_list /webhooks/update Actualizează un abonament existent po_webhooks_update /webhooks/delete Ștergere soft a unui abonament (jurnalul de livrare este păstrat) po_webhooks_delete /webhooks/deliveries Preluare jurnal livrare cu filtre (event_type, success_only) po_webhooks_deliveries /webhooks/test Trimite un eveniment test.ping pentru a verifica livrarea po_webhooks_test /webhooks/subscribe-job Webhook unic pentru un job_id specific po_webhooks_subscribe_job /webhooks/job-subscriptions Listează abonamentele limitate la joburi po_webhooks_job_subscriptions /webhooks/info Evenimente disponibile, endpoint-uri, politici de reîncercare, informații despre semnătură po_webhooks_info Consolidat prin design
HMAC-SHA256
Fiecare payload semnat cu secretul dvs. Compararea cu timp constant este obligatorie.
Protecție SSRF
IP-uri private/internale, localhost și endpoint-uri de metadate cloud blocate la abonare și dispatch.
Sigur împotriva DNS rebinding
IP re-validat la momentul dispatch-ului, fixat via CURLOPT_RESOLVE.
HTTPS puternic preferat
http și https acceptate. HTTPS recomandat pentru producție.
Idempotență Event-ID
Fiecare livrare conține un X-PaperOffice-Event-ID unic. Deduplicați în partea dvs.
Jurnal de audit complet
Toate încercările jurnalizate: cod stare, corp răspuns, timing, mesaj eroare.
Abonamente nelimitate, comportament livrare complet configurabil
Disponibil în toate planurile. Pay-per-use: 1 credit per livrare reușită (HTTP 2xx). Reîncercările, evenimentele de test și livrările eșuate sunt gratuite.
Primul dvs. webhook în 60 de secunde
Creați un endpoint, abonați-vă via API, declanșați un eveniment de test. Asta e tot.