Webhook Eventi in tempo reale
Callback firmati HMAC per ogni evento di documento, lavoro, spazio di lavoro e attività. 22 tipi di eventi, ritentativi esponenziali, HTTPS raccomandato.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} 22 tipi di eventi, raggruppati per entità
Iscriviti a singoli eventi o usa il jolly * per tutto.
Documenti
14-
documento.caricatoNuovo documento caricato in uno spazio di lavoro -
documento.creatoAlias per document.uploaded (compatibilità) -
documento.elaboratoPipeline OCR/IDP completata con successo -
documento.modificatoMetadati, tag o contenuto aggiornati -
documento.eliminatoDocumento spostato nel cestino -
documento.ripristinatoDocumento recuperato dal cestino -
document.movedDocumento spostato tra spazi di lavoro -
documento.versione_creataNuova versione aggiunta a un documento esistente -
documento.ciclo_di_vita_modificatoStato di conservazione/archiviazione modificato -
documento.commento_aggiuntoCommento pubblicato su un documento -
documento.nota_aggiuntaNota interna allegata -
documento.etichetta_aggiuntaTag assegnato a un documento -
documento.sequestro_legale_applicatoBlocco legale attivato (immutabile) -
documento.sequestro_legale_rimossoBlocco legale rilasciato
Lavori
3-
lavoro.completatoLavoro asincrono completato con successo -
lavoro.fallitoLavoro asincrono fallito definitivamente -
lavoro.in_corsoAggiornamento progresso durante lavori di lunga durata
Spazi di lavoro
2-
spazio_di_lavoro.condivisoSpazio di lavoro condiviso con un utente o team -
spazio_di_lavoro.condivisione_annullataAccesso allo spazio di lavoro revocato
Attività
3-
attività.creataNuova attività creata -
attività.completataAttività contrassegnata come completata -
attività.scadutaAttività scaduta rispetto alla data limite
Iscriviti a ["*"] per ricevere ogni evento del tuo account.
Ogni consegna segue lo stesso schema
Corpo JSON prevedibile, cinque intestazioni HTTP firmate, timestamp 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 Sempre JSON, codificato UTF-8 User-Agent PaperOffice-Webhook/1.0 Identificatore fisso per allowlist firewall X-PaperOffice-Event documento.elaborato Tipo di evento consegnato X-PaperOffice-Event-ID a3b7f9c1… ID univoco a 128 bit. Da utilizzare per l'idempotenza. X-PaperOffice-Subscription-ID 42 ID della sottoscrizione che riceve l'evento X-PaperOffice-Signature sha256=… HMAC-SHA256 del corpo grezzo, codificato in esadecimale Verificare ogni consegna con HMAC-SHA256
Calcolare l'HMAC-SHA256 sul corpo grezzo della richiesta utilizzando il segreto condiviso, quindi confrontarlo con X-PaperOffice-Signature usando un confronto a tempo costante (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 strategie di riprova, fino a 10 tentativi
Scegliere una politica per sottoscrizione. Ogni tentativo viene registrato con codice di stato, corpo della risposta e tempistica.
exponential Esponenziale (predefinito)
Il back-off raddoppia dopo ogni tentativo: 30s, 60s, 120s, 240s, 480s…
linear Lineare
Crescita fissa: 30s, 60s, 90s, 120s, 150s…
none Nessuno
Fire-and-forget. Nessun nuovo tentativo anche in caso di errori 5xx. Utile per hook di test.
9 endpoint sotto /latest/webhooks/
CRUD completo per sottoscrizioni, registri di consegna, sottoscrizioni job one-time e un endpoint di test — tutto OAuth2 Bearer, tutto pronto per MCP.
/webhooks/subscribe Creare una nuova sottoscrizione (illimitate per account) po_webhooks_subscribe /webhooks/list Elencare tutte le sottoscrizioni dell'account po_webhooks_list /webhooks/update Aggiornare una sottoscrizione esistente po_webhooks_update /webhooks/delete Eliminazione soft di una sottoscrizione (registro consegne preservato) po_webhooks_delete /webhooks/deliveries Recuperare il registro delle consegne con filtri (event_type, success_only) po_webhooks_deliveries /webhooks/test Inviare un evento test.ping per verificare la consegna po_webhooks_test /webhooks/subscribe-job Webhook one-time per uno specifico job_id po_webhooks_subscribe_job /webhooks/job-subscriptions Elencare le sottoscrizioni scoped per job po_webhooks_job_subscriptions /webhooks/info Eventi disponibili, endpoint, politiche di riprova, informazioni sulla firma po_webhooks_info Progettato per essere blindato
HMAC-SHA256
Ogni payload firmato con il tuo segreto. Confronto a tempo costante obbligatorio.
Protezione SSRF
IP privati/interni, localhost ed endpoint metadati cloud bloccati in fase di sottoscrizione e dispatch.
Sicuro contro DNS rebinding
IP rivalidato al momento del dispatch, fissato tramite CURLOPT_RESOLVE.
HTTPS fortemente preferito
Accettati http e https. HTTPS raccomandato per la produzione.
Idempotenza Event-ID
Ogni consegna include un X-PaperOffice-Event-ID univoco. Effettuare dedupe lato utente.
Traccia di audit completa
Tutti i tentativi registrati: codice di stato, corpo della risposta, tempistica, messaggio di errore.
Sottoscrizioni illimitate, comportamento di consegna completamente configurabile
Disponibile su tutti i piani. Pay-per-use: 1 credito per consegna riuscita (HTTP 2xx). Riprove, eventi di test e consegne fallite sono gratuiti.
Il tuo primo webhook in 60 secondi
Crea un endpoint, sottoscrivi via API, genera un evento di test. Tutto qui.