वेबहुक्स वास्तविक-समय घटनाएं
प्रत्येक दस्तावेज़, नौकरी, वर्कस्पेस और कार्य घटना के लिए HMAC-हस्ताक्षरित कॉलबैक। 22 घटना प्रकार, घातांक पुनः प्रयास, HTTPS अनुशंसित।
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} 22 घटना प्रकार, इकाई द्वारा समूहीकृत
व्यक्तिगत घटनाओं की सदस्यता लें या सब कुछ के लिए वाइल्डकार्ड * का उपयोग करें।
दस्तावेज़
14-
दस्तावेज़ अपलोड किया गयानया दस्तावेज़ वर्कस्पेस में अपलोड किया गया -
दस्तावेज़ बनाया गयाdocument.uploaded के लिए उपनाम (संगतता) -
दस्तावेज़ संसाधितOCR/IDP पाइपलाइन सफलतापूर्वक समाप्त हुई -
दस्तावेज़ संपादितमेटाडेटा, टैग या सामग्री अपडेट की गई -
दस्तावेज़ हटाया गयादस्तावेज़ कचरे में ले जाया गया -
दस्तावेज़ पुनर्स्थापितदस्तावेज़ कचरे से पुनर्प्राप्त किया गया -
document.movedदस्तावेज़ को वर्कस्पेस के बीच ले जाया गया -
दस्तावेज़ संस्करण बनाया गयामौजूदा दस्तावेज़ में नया संस्करण जोड़ा गया -
document.lifecycle_changedधारण / अभिलेखागार स्थिति बदली गई -
document.comment_addedदस्तावेज़ पर टिप्पणी पोस्ट की गई -
document.note_addedआंतरिक नोट संलग्न किया गया -
document.tag_addedदस्तावेज़ को टैग सौंपा गया -
document.legal_hold_placedकानूनी होल्ड सक्रिय किया गया (अपरिवर्तनीय) -
document.legal_hold_releasedकानूनी होल्ड जारी किया गया
नौकरियां
3-
job.completedअतुल्यकालिक नौकरी सफलतापूर्वक समाप्त हुई -
job.failedअतुल्यकालिक नौकरी अंततः विफल रही -
job.progressलंबे समय तक चलने वाली नौकरियों के दौरान प्रगति अपडेट
वर्कस्पेस
2-
workspace.sharedवर्कस्पेस किसी उपयोगकर्ता या टीम के साथ साझा किया गया -
workspace.unsharedवर्कस्पेस एक्सेस रद्द किया गया
कार्य
3-
task.createdनया कार्य बनाया गया -
task.completedकार्य पूर्ण के रूप में चिह्नित किया गया -
task.overdueकार्य अपनी नियत तारीख से आगे निकल गया
अपने खाते की हर घटना प्राप्त करने के लिए ["*"] की सदस्यता लें।
प्रत्येक डिलीवरी एक ही स्कीमा का पालन करती है
पूर्वानुमेय JSON बॉडी, पांच हस्ताक्षरित HTTP हेडर, 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 हमेशा JSON, UTF-8 एन्कोडेड User-Agent PaperOffice-Webhook/1.0 फ़ायरवॉल अनुमति सूचियों के लिए निश्चित पहचानकर्ता X-PaperOffice-Event document.processed वितरित की जा रही घटना का प्रकार X-PaperOffice-Event-ID a3b7f9c1… 128-बिट अद्वितीय ID। इडेमपोटेंसी के लिए उपयोग करें। X-PaperOffice-Subscription-ID 42 घटना प्राप्त करने वाली सदस्यता का ID X-PaperOffice-Signature sha256=… कच्चे बॉडी का HMAC-SHA256, हेक्स-एन्कोडेड प्रत्येक डिलीवरी को HMAC-SHA256 के साथ सत्यापित करें
अपने साझा गुप्त का उपयोग करके कच्चे अनुरोध बॉडी पर HMAC-SHA256 की गणना करें, फिर स्थिर-समय तुलना (hash_equals, crypto.timingSafeEqual) का उपयोग करके X-PaperOffice-Signature के खिलाफ तुलना करें।
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');
}); तीन पुनः प्रयास रणनीतियां, 10 प्रयासों तक
प्रति सदस्यता एक नीति चुनें। प्रत्येक प्रयास स्थिति कोड, प्रतिक्रिया बॉडी और समय के साथ लॉग किया जाता है।
exponential घातांक (डिफ़ॉल्ट)
प्रत्येक प्रयास के बाद बैक-ऑफ दोगुना हो जाता है: 30s, 60s, 120s, 240s, 480s…
linear रैखिक
निश्चित वृद्धि: 30s, 60s, 90s, 120s, 150s…
none कोई नहीं
फायर-एंड-फॉरगेट। 5xx त्रुटियों पर भी कोई पुनः प्रयास नहीं। परीक्षण हुक के लिए उपयोगी।
/latest/webhooks/ के तहत 9 एंडपॉइंट
सदस्यताओं, डिलीवरी लॉग, वन-टाइम जॉब सदस्यताओं और एक परीक्षण एंडपॉइंट के लिए पूर्ण CRUD — सभी OAuth2 बेयरर, सभी MCP-तैयार।
/webhooks/subscribe एक नई सदस्यता बनाएं (प्रति खाता असीमित) po_webhooks_subscribe /webhooks/list खाते की सभी सदस्यताओं की सूची देखें po_webhooks_list /webhooks/update मौजूदा सदस्यता अपडेट करें po_webhooks_update /webhooks/delete सदस्यता को सॉफ्ट-डिलीट करें (डिलीवरी लॉग संरक्षित) po_webhooks_delete /webhooks/deliveries फ़िल्टर के साथ डिलीवरी लॉग पुनः प्राप्त करें (event_type, success_only) po_webhooks_deliveries /webhooks/test डिलीवरी सत्यापित करने के लिए एक test.ping इवेंट भेजें po_webhooks_test /webhooks/subscribe-job विशिष्ट job_id के लिए वन-टाइम वेबहुक po_webhooks_subscribe_job /webhooks/job-subscriptions जॉब-स्कोप्ड सदस्यताओं की सूची देखें po_webhooks_job_subscriptions /webhooks/info उपलब्ध इवेंट, एंडपॉइंट, पुनः प्रयास नीतियां, हस्ताक्षर जानकारी po_webhooks_info डिज़ाइन द्वारा सुरक्षित
HMAC-SHA256
प्रत्येक पेडलोड आपके सीक्रेट के साथ हस्ताक्षरित। स्थिर-समय तुलना अनिवार्य है।
SSRF सुरक्षा
निजी/आंतरिक IP, localhost और क्लाउड मेटाडेटा एंडपॉइंट सदस्यता और डिस्पैच पर अवरुद्ध।
DNS रीबाइंडिंग सुरक्षित
डिस्पैच समय पर IP पुनः सत्यापित, CURLOPT_RESOLVE के माध्यम से पिन किया गया।
HTTPS दृढ़ता से предпочित
http और https स्वीकार्य। उत्पादन के लिए HTTPS अनुशंसित।
इवेंट-ID इडेमपोटेंसी
प्रत्येक डिलीवरी एक अद्वितीय X-PaperOffice-Event-ID ले जाती है। अपने पक्ष पर डेडुप्लिकेशन करें।
पूर्ण ऑडिट ट्रेल
सभी प्रयास लॉग किए गए: स्थिति कोड, प्रतिक्रिया बॉडी, समय, त्रुटि संदेश।
असीमित सदस्यताएं, डिलीवरी व्यवहार पूरी तरह से कॉन्फ़िगर करने योग्य
सभी योजनाओं पर उपलब्ध। पे-पर-यूज: प्रति सफल डिलीवरी 1 क्रेडिट (HTTP 2xx)। पुनः प्रयास, परीक्षण इवेंट और विफल डिलीवरी मुफ्त हैं।
60 सेकंड में आपका पहला वेबहुक
एक एंडपॉइंट बनाएं, API के माध्यम से सदस्यता लें, एक परीक्षण इवेंट फायर करें। बस इतना ही।