Webhooks อีเวนต์แบบเรียลไทม์
การเรียกกลับที่ลงชื่อด้วย 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อัปโหลดเอกสารใหม่ไปยังเวิร์กสเปซ -
document.createdนามแฝงสำหรับ document.uploaded (ความเข้ากันได้) -
document.processedไปป์ไลน์ OCR/IDP เสร็จสิ้นสำเร็จ -
document.editedอัปเดตเมตาดาแท็ก แท็ก หรือเนื้อหา -
เอกสารถูกลบย้ายเอกสารไปยังถังขยะ -
เอกสารถูกกู้คืนกู้คืนเอกสารจากถังขยะ -
document.movedย้ายเอกสารระหว่างเวิร์กสเปซ -
สร้างเวอร์ชันเอกสารแล้วเพิ่มเวอร์ชันใหม่ให้กับเอกสารที่มีอยู่ -
เปลี่ยนวงจรชีวิตเอกสารเปลี่ยนสถานะการเก็บรักษา/การจัดเก็บถาวร -
เพิ่มความคิดเห็นแล้วโพสต์ความคิดเห็นบนเอกสาร -
เพิ่มบันทึกแล้วแนบโน้ตภายใน -
เพิ่มแท็กแล้วกำหนดแท็กให้กับเอกสาร -
กำหนดการระงับทางกฎหมายเปิดใช้งานการระงับทางกฎหมาย (ไม่เปลี่ยนแปลง) -
ยกเลิกการระงับทางกฎหมายปล่อยการระงับทางกฎหมาย
งาน
3-
งานเสร็จสิ้นงานแบบอะซิงโครนัสเสร็จสิ้นสำเร็จ -
งานล้มเหลวงานแบบอะซิงโครนัสล้มเหลวอย่างถาวร -
ความคืบหน้างานการอัปเดตความคืบหน้าระหว่างงานที่ใช้เวลานาน
พื้นที่ทำงาน
2-
พื้นที่ทำงานถูกแชร์พื้นที่ทำงานถูกแชร์กับผู้ใช้หรือทีม -
พื้นที่ทำงานถูกยกเลิกการแชร์การเข้าถึงพื้นที่ทำงานถูกเพิกถอน
งาน
3-
งานถูกสร้างสร้างงานใหม่ -
งานเสร็จสิ้นงานถูกทำเครื่องหมายว่าเสร็จสมบูรณ์ -
งานเกินกำหนดงานเกินกำหนดส่งแล้ว
สมัครสมาชิก ["*"] เพื่อรับทุกเหตุการณ์ของบัญชีคุณ
การส่งทุกครั้งเป็นไปตามโครงสร้างเดียวกัน
โครงสร้าง 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-bit ใช้สำหรับการป้องกันการทำงานซ้ำ X-PaperOffice-Subscription-ID 42 รหัสของการสมัครรับที่กำลังรับเหตุการณ์ X-PaperOffice-Signature sha256=… HMAC-SHA256 ของเนื้อหาดิบ, เข้ารหัสแบบฐานสิบหก ตรวจสอบการส่งทุกครั้งด้วย HMAC-SHA256
คำนวณ HMAC-SHA256 บนเนื้อหาคำขอดิบโดยใช้รหัสลับร่วมกันของคุณ จากนั้นเปรียบเทียบค่ากับ X-PaperOffice-Signature โดยใช้การเปรียบเทียบแบบคงที่เวลา (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');
}); สามกลยุทธ์การลองใหม่ สูงสุด 10 ครั้ง
เลือกนโยบายต่อการสมัครรับ ทุกความพยายามจะถูกบันทึกพร้อมรหัสสถานะ, เนื้อหาการตอบกลับ และเวลา
exponential เอกซ์โพเนนเชียล (ค่าเริ่มต้น)
การหน่วงเวลาเพิ่มขึ้นเป็นสองเท่าหลังจากทุกความพยายาม: 30 วินาที, 60 วินาที, 120 วินาที, 240 วินาที, 480 วินาที…
linear เชิงเส้น
การเพิ่มขึ้นแบบคงที่: 30 วินาที, 60 วินาที, 90 วินาที, 120 วินาที, 150 วินาที…
none ไม่มี
ส่งแล้วจบ ไม่ต้องลองใหม่แม้เกิดข้อผิดพลาด 5xx มีประโยชน์สำหรับฮุคทดสอบ
9 เอนด์พอยต์ภายใต้ /latest/webhooks/
CRUD แบบเต็มสำหรับการสมัครรับ, บันทึกการส่ง, การสมัครรับงานครั้งเดียว และเอนด์พอยต์ทดสอบ — ทั้งหมดใช้ OAuth2 Bearer, พร้อมใช้งาน 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
ไอพีส่วนตัว/ภายใน, localhost และเอนด์พอยต์เมตาดาต้าของคลาวด์ถูกบล็อกขณะสมัครรับและส่ง
ปลอดภัยจาก DNS rebinding
ตรวจสอบไอพีอีกครั้งขณะส่ง, ยึดตรึงผ่าน CURLOPT_RESOLVE
แนะนำ HTTPS อย่างยิ่ง
ยอมรับ http และ https แนะนำ HTTPS สำหรับการผลิต
ความเป็นเอกลักษณ์ของ Event-ID
ทุกการส่งมี X-PaperOffice-Event-ID ที่ไม่ซ้ำกัน ทำการตัดซ้ำทางด้านของคุณ
เส้นทางตรวจสอบแบบเต็ม
บันทึกทุกความพยายาม: รหัสสถานะ, เนื้อหาการตอบกลับ, เวลา, ข้อความข้อผิดพลาด
การสมัครรับไม่จำกัด, พฤติกรรมการส่งกำหนดค่าได้เต็มที่
มีใน ทุกแผน จ่ายตามการใช้งาน: 1 เครดิตต่อการส่งที่สำเร็จ (HTTP 2xx) การลองใหม่, เหตุการณ์ทดสอบ และการส่งที่ล้มเหลวไม่เสียค่าใช้จ่าย
เว็บฮุคแรกของคุณใน 60 วินาที
สร้างเอนด์พอยต์, สมัครสมาชิกผ่าน API, เรียกเหตุการณ์ทดสอบ เพียงเท่านี้