Webhook Sự kiện thời gian thực
Gọi lại được ký HMAC cho mọi sự kiện về tài liệu, công việc, không gian làm việc và nhiệm vụ. 22 loại sự kiện, thử lại theo cấp số nhân, khuyến nghị sử dụng HTTPS.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Được tin tưởng bởi các công ty hàng đầu trên toàn thế giới
22 loại sự kiện, được nhóm theo thực thể
Đăng ký các sự kiện riêng lẻ hoặc sử dụng ký tự đại diện * cho tất cả.
Tài liệu
14-
document.uploadedTài liệu mới được tải lên không gian làm việc -
document.createdBiệt danh cho document.uploaded (tương thích) -
document.processedQuy trình OCR/IDP hoàn tất thành công -
document.editedSiêu dữ liệu, thẻ hoặc nội dung được cập nhật -
document.deletedTài liệu được chuyển vào thùng rác -
document.restoredTài liệu được khôi phục từ thùng rác -
document.movedTài liệu được di chuyển giữa các không gian làm việc -
document.version_createdPhiên bản mới được thêm vào tài liệu hiện có -
document.lifecycle_changedTrạng thái lưu trữ/lưu giữ thay đổi -
document.comment_addedBình luận được đăng trên tài liệu -
document.note_addedGhi chú nội bộ được đính kèm -
document.tag_addedThẻ được gán cho tài liệu -
document.legal_hold_placedLệnh pháp lý được kích hoạt (bất biến) -
document.legal_hold_releasedLệnh pháp lý được hủy bỏ
Công việc
3-
job.completedCông việc không đồng bộ hoàn tất thành công -
job.failedCông việc không đồng bộ thất bại hoàn toàn -
Tiến độ công việcCập nhật tiến độ trong các công việc chạy dài
Không gian làm việc
2-
Không gian làm việc đã chia sẻKhông gian làm việc được chia sẻ với người dùng hoặc nhóm -
Không gian làm việc chưa chia sẻQuyền truy cập không gian làm việc bị thu hồi
Nhiệm vụ
3-
Nhiệm vụ đã tạoNhiệm vụ mới được tạo -
Nhiệm vụ đã hoàn thànhNhiệm vụ được đánh dấu là hoàn thành -
Nhiệm vụ quá hạnNhiệm vụ đã quá hạn chót
Đăng ký ["*"] để nhận mọi sự kiện của tài khoản bạn.
Mọi lần phân phối đều tuân theo cùng một lược đồ
Nội dung JSON có thể dự đoán, năm tiêu đề HTTP được ký, dấu thời gian 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 Luôn là JSON, mã hóa UTF-8 User-Agent PaperOffice-Webhook/1.0 Định danh cố định cho danh sách cho phép tường lửa X-PaperOffice-Event document.processed Loại sự kiện đang được phân phối X-PaperOffice-Event-ID a3b7f9c1… ID duy nhất 128-bit. Sử dụng cho tính lũy đẳng. X-PaperOffice-Subscription-ID 42 ID của gói đăng ký nhận sự kiện X-PaperOffice-Signature sha256=… HMAC-SHA256 của nội dung thô, mã hóa hex Xác minh mọi lần phân phối bằng HMAC-SHA256
Tính toán HMAC-SHA256 trên nội dung yêu cầu thô sử dụng khóa bí mật chung của bạn, sau đó so sánh với X-PaperOffice-Signature bằng phép so sánh thời gian không đổi (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');
}); Ba chiến lược thử lại, tối đa 10 lần thử
Chọn một chính sách cho mỗi gói đăng ký. Mọi lần thử đều được ghi lại với mã trạng thái, nội dung phản hồi và thời gian.
exponential Theo cấp số nhân (mặc định)
Thời gian chờ tăng gấp đôi sau mỗi lần thử: 30s, 60s, 120s, 240s, 480s…
linear Tuyến tính
Tăng trưởng cố định: 30s, 60s, 90s, 120s, 150s…
none Không có
Gửi và quên. Không thử lại ngay cả khi lỗi 5xx. Hữu ích cho các hook kiểm tra.
9 điểm cuối dưới /latest/webhooks/
CRUD đầy đủ cho các gói đăng ký, nhật ký phân phối, gói đăng ký công việc một lần và điểm cuối kiểm tra — tất cả đều dùng OAuth2 Bearer, sẵn sàng MCP.
/webhooks/subscribe Tạo gói đăng ký mới (không giới hạn mỗi tài khoản) po_webhooks_subscribe /webhooks/list Liệt kê tất cả các gói đăng ký của tài khoản po_webhooks_list /webhooks/update Cập nhật gói đăng ký hiện có po_webhooks_update /webhooks/delete Xóa mềm gói đăng ký (nhật ký phân phối được giữ lại) po_webhooks_delete /webhooks/deliveries Truy xuất nhật ký phân phối với bộ lọc (loại_sự_kiện, chỉ_thành_công) po_webhooks_deliveries /webhooks/test Gửi sự kiện test.ping để xác minh phân phối po_webhooks_test /webhooks/subscribe-job Webhook một lần cho một job_id cụ thể po_webhooks_subscribe_job /webhooks/job-subscriptions Liệt kê các gói đăng ký phạm vi công việc po_webhooks_job_subscriptions /webhooks/info Các sự kiện khả dụng, điểm cuối, chính sách thử lại, thông tin chữ ký po_webhooks_info Được củng cố bởi thiết kế
HMAC-SHA256
Mọi tải trọng được ký bằng khóa bí mật của bạn. Bắt buộc so sánh thời gian không đổi.
Bảo vệ SSRF
IP riêng/nội bộ, localhost và các điểm cuối siêu dữ liệu đám mây bị chặn tại lúc đăng ký và phân phối.
An toàn trước tái liên kết DNS
IP được xác thực lại tại thời điểm phân phối, ghim qua CURLOPT_RESOLVE.
Ưu tiên mạnh mẽ HTTPS
Chấp nhận http và https. Khuyến nghị HTTPS cho môi trường sản xuất.
Tính lũy đẳng Event-ID
Mọi lần phân phối mang một X-PaperOffice-Event-ID duy nhất. Khử trùng lặp ở phía bạn.
Nhật ký kiểm toán đầy đủ
Tất cả các lần thử được ghi lại: mã trạng thái, nội dung phản hồi, thời gian, thông báo lỗi.
Gói đăng ký không giới hạn, hành vi phân phối hoàn toàn có thể cấu hình
Có sẵn trên tất cả các gói. Thanh toán theo mức sử dụng: 1 tín dụng cho mỗi lần phân phối thành công (HTTP 2xx). Các lần thử lại, sự kiện kiểm tra và phân phối thất bại đều miễn phí.
Webhook đầu tiên của bạn trong 60 giây
Tạo một điểm cuối, đăng ký qua API, kích hoạt sự kiện kiểm tra. Thế là xong.