Webhooks Événements en temps réel
Recevez des notifications en temps réel pour tous les événements. Documents traités, OCR terminé, classification effectuée.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} La confiance des entreprises leaders dans le monde
22 types d'événements, regroupés par entité
Abonnez-vous à des événements individuels ou utilisez le caractère générique * pour tout recevoir.
Documents
14-
document.téléverséNouveau document téléchargé dans un espace de travail -
document.crééAlias pour document.uploaded (compatibilité) -
document.traitéPipelines OCR/AI-IDP terminés avec succès -
document.modifiéMétadonnées, balises ou contenu mis à jour -
document.suppriméDocument déplacé vers la corbeille -
document.restauréDocument récupéré depuis la corbeille -
document.movedDocument déplacé entre des espaces de travail -
version_du_document_crééeNouvelle version ajoutée à un document existant -
cycle_de_vie_du_document_modifiéStatut de rétention/archivage modifié -
commentaire_ajouté_au_documentCommentaire publié sur un document -
note_ajoutée_au_documentNote interne jointe -
étiquette_ajoutée_au_documentBalise attribuée à un document -
document.mise_en_conservation_appliquéeGel juridique activé (immuable) -
document.mise_en_conservation_levéeGel juridique levé
Tâches
3-
job.terminéTâche asynchrone terminée avec succès -
job.échecÉchec terminal d'une tâche asynchrone -
progression.tâcheMise à jour de la progression lors de tâches de longue durée
Workspaces
2-
espace.partagéWorkspace partagé avec un utilisateur ou une équipe -
espace.non_partagéaccès à Workspace révoqué
Éléments
3-
tâche.crééeNouvel élément créé -
tâche.terminéeÉlément marqué comme terminé -
tâche.en_retardL'échéance de l'élément est dépassée
Chaque livraison suit le même schéma
Corps JSON prévisible, cinq en-têtes HTTP signés, horodatages UTC ISO-8601.
{
"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 Toujours en JSON, encodé UTF-8 User-Agent PaperOffice-Webhook/1.0 Identifiant fixe pour les listes d'autorisation de pare-feu X-PaperOffice-Event document.traité Type d'événement en cours de livraison X-PaperOffice-Event-ID a3b7f9c1… ID unique de 128 bits. À utiliser pour l'idempotence. X-PaperOffice-Subscription-ID 42 ID de l'abonnement recevant l'événement X-PaperOffice-Signature sha256=… HMAC-SHA256 du corps brut, encodé en hexadécimal Vérifiez chaque livraison avec HMAC-SHA256
Calculez HMAC-SHA256 sur le corps brut de la requête en utilisant votre secret partagé, puis comparez-le avec X-PaperOffice-Signature en utilisant une comparaison à temps 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');
}); Trois stratégies de nouvelle tentative, jusqu'à 10 tentatives
Choisissez une politique par abonnement. Chaque tentative est enregistrée avec le code d'état, le corps de la réponse et le timing.
exponential Exponentielle (par défaut)
Le délai double après chaque tentative : 30s, 60s, 120s, 240s, 480s…
linear Linéaire
Croissance fixe : 30s, 60s, 90s, 120s, 150s…
none Aucune
Fire-and-forget. Aucune nouvelle tentative même en cas d'erreur 5xx. Utile pour les webhooks de test.
9 points de terminaison sous /latest/webhooks/
CRUD complet pour les abonnements, les journaux de livraison, les abonnements de tâches ponctuels et un point de terminaison de test — tous OAuth2 Bearer, tous prêts pour MCP.
/webhooks/subscribe Créer un nouvel abonnement (illimité par compte) po_webhooks_subscribe /webhooks/list Lister tous les abonnements du compte po_webhooks_list /webhooks/update Mettre à jour un abonnement existant po_webhooks_update /webhooks/delete Supprimer doucement un abonnement (le journal de livraison est conservé) po_webhooks_delete /webhooks/deliveries Récupérer le journal de livraison avec des filtres (event_type, success_only) po_webhooks_deliveries /webhooks/test Envoyer un événement test.ping pour vérifier la livraison po_webhooks_test /webhooks/subscribe-job Webhook ponctuel pour un job_id spécifique po_webhooks_subscribe_job /webhooks/job-subscriptions Lister les abonnements limités aux tâches po_webhooks_job_subscriptions /webhooks/info Événements disponibles, points de terminaison, politiques de nouvelle tentative, informations de signature po_webhooks_info Renforcé par conception
HMAC-SHA256
Chaque charge utile est signée avec votre secret. La comparaison à temps constant est obligatoire.
Protection SSRF
IP privées/internes, localhost et points de terminaison de métadonnées cloud bloqués lors de l'abonnement et de la distribution.
Sûr contre le rebondissement DNS
IP revalidée au moment de la distribution, épinglée via CURLOPT_RESOLVE.
HTTPS fortement préféré
http et https acceptés. HTTPS recommandé pour la production.
Idempotence Event-ID
Chaque livraison porte un X-PaperOffice-Event-ID unique. Dédupliquez de votre côté.
Piste d'audit complète
Toutes les tentatives sont enregistrées : code d'état, corps de la réponse, timing, message d'erreur.
Abonnements illimités, comportement de livraison entièrement configurable
Disponible sur tous les plans. Paiement à l'usage : 1 crédit par livraison réussie (HTTP 2xx). Les nouvelles tentatives, les événements de test et les livraisons échouées sont gratuits.
Recevoir des événements ?
Configurez vos webhooks.