Webhooks Événements en temps réel
Rappels signés HMAC pour chaque événement de document, de tâche, d'espace de travail et d'élément. 22 types d'événements, nouvelles tentatives exponentielles, HTTPS recommandé.
{
"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.uploadedNouveau document téléchargé dans un espace de travail -
document.createdAlias pour document.uploaded (compatibilité) -
document.processedLe pipeline OCR/IDP s'est terminé avec succès -
document.editedMétadonnées, balises ou contenu mis à jour -
document.deletedDocument déplacé vers la corbeille -
document.restoredDocument récupéré depuis la corbeille -
document.movedDocument déplacé entre des espaces de travail -
document.version_createdNouvelle version ajoutée à un document existant -
document.lifecycle_changedStatut de rétention/archivage modifié -
document.comment_addedCommentaire publié sur un document -
document.note_addedNote interne jointe -
document.tag_addedBalise attribuée à un document -
document.legal_hold_placedGel juridique activé (immuable) -
document.legal_hold_releasedGel juridique levé
Tâches
3-
job.completedTâche asynchrone terminée avec succès -
job.failedÉchec terminal d'une tâche asynchrone -
progression.tâcheMise à jour de la progression lors de tâches de longue durée
Espaces de travail
2-
espace.partagéEspace de travail partagé avec un utilisateur ou une équipe -
espace.non_partagéAccès à l'espace de travail 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
Abonnez-vous à ["*"] pour recevoir tous les événements de votre compte.
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.
Votre premier webhook en 60 secondes
Créez un point de terminaison, abonnez-vous via l'API, déclenchez un événement de test. C'est tout.