Webhook Sự kiện thời gian thực
Nhận thông báo thời gian thực cho tất cả các sự kiện. Tài liệu đã xử lý, OCR hoàn tất, phân loại xong.
{
"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-
tài_liệu.đã_tải_lênTài liệu mới được tải lên không gian làm việc -
tài_liệu.đã_tạoBiệt danh cho document.uploaded (tương thích) -
tài_liệu.đã_xử_lýĐường ống OCR/AI-IDP hoàn thành thành công -
tài_liệu.đã_chỉnh_sửaSiêu dữ liệu, thẻ hoặc nội dung được cập nhật -
tài_liệu.đã_xóaTài liệu được chuyển vào thùng rác -
tài_liệu.đã_khôi_phụcTà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 -
tài_liệu.phiên_bản_đã_tạoPhiên bản mới được thêm vào tài liệu hiện có -
tài_liệu.vòng_đời_đã_thay_đổiTrạ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
Workspaces
2-
Không gian làm việc đã chia sẻWorkspace được chia sẻ với một người dùng hoặc nhóm -
Không gian làm việc chưa chia sẻQuyền truy cập Workspace đã 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
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í.
Nhận sự kiện?
Cấu hình webhook của bạn.