Webhooks
Webhooks 实时事件
针对每个文档、作业、工作空间和任务事件的 HMAC 签名回调。22 种事件类型,指数重试,建议使用 HTTPS。
22+
事件类型
<1 秒
延迟
HMAC
SHA-256 签名
POST /your-endpoint
请求头
X-PaperOffice-Event: document.processed
X-PaperOffice-Event-ID: a3b7f9c1d4e8b2a6
X-PaperOffice-Signature: sha256=9f8a2c…
JSON 主体
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} 签名已验证 HMAC-SHA256 · 事件 ID 已记录
可用事件
22 种事件类型,按实体分组
订阅单个事件或使用通配符 * 接收所有事件。
文档
14-
document.uploaded新文档上传至工作空间 -
document.createddocument.uploaded 的别名(兼容性) -
document.processedOCR/IDP 流水线成功完成 -
document.edited元数据、标签或内容已更新 -
document.deleted文档已移至回收站 -
document.restored文档已从回收站恢复 -
document.moved文档在工作空间之间移动 -
文档.版本已创建现有文档添加了新版本 -
文档.生命周期已变更保留/归档状态已更改 -
文档.评论已添加文档上发布了评论 -
文档.笔记已添加附加了内部备注 -
文档.标签已添加标签已分配给文档 -
文档.法律保留已启用法律保留已激活(不可变) -
文档.法律保留已解除法律保留已释放
作业
3-
作业.已完成异步作业成功完成 -
作业.失败异步作业最终失败 -
作业.进行中长时间运行作业期间的进度更新
工作空间
2-
工作区.已共享工作空间已共享给用户或团队 -
工作区.已取消共享工作空间访问权限已撤销
任务
3-
任务.已创建创建了新任务 -
任务.已完成任务标记为完成 -
任务.已逾期任务已超过截止日期
订阅 ["*"] 以接收您账户的每个事件。
负载和头
每次交付遵循相同的模式
可预测的 JSON 主体,五个签名的 HTTP 头,ISO-8601 UTC 时间戳。
请求主体(JSON)
{
"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
}
}
} HTTP 请求头
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 次尝试
为每个订阅选择策略。每次尝试都会记录状态码、响应主体和计时。
Default
exponential 指数型(默认)
每次尝试后等待时间加倍:30 秒、60 秒、120 秒、240 秒、480 秒…
linear 线性
固定增长:30 秒、60 秒、90 秒、120 秒、150 秒…
none 无
发送即忘。即使出现 5xx 错误也不重试。适用于测试钩子。
成功 在超时窗口内收到 HTTP 2xx 响应
最大重试次数 0–10 次尝试(默认 5 次)
超时 每次尝试 1,000–30,000 毫秒(默认 10,000)
交付日志 每次尝试均存储在 webhook_deliveries 中以便审计
管理 API
/latest/webhooks/ 下的 9 个端点
订阅、交付日志、一次性任务订阅和测试端点的完整 CRUD 操作 — 全部使用 OAuth2 Bearer 认证,全部支持 MCP。
POST
/webhooks/subscribe 创建新订阅(每个账户数量不限) po_webhooks_subscribe GET
/webhooks/list 列出账户的所有订阅 po_webhooks_list POST
/webhooks/update 更新现有订阅 po_webhooks_update POST
/webhooks/delete 软删除订阅(保留交付日志) po_webhooks_delete GET
/webhooks/deliveries 检索带过滤条件的交付日志(event_type, success_only) po_webhooks_deliveries POST
/webhooks/test 发送 test.ping 事件以验证交付 po_webhooks_test POST
/webhooks/subscribe-job 针对特定 job_id 的一次性 Webhook po_webhooks_subscribe_job GET
/webhooks/job-subscriptions 列出任务范围的订阅 po_webhooks_job_subscriptions GET
/webhooks/info 可用事件、端点、重试策略、签名信息 po_webhooks_info Enterprise 安全
设计加固
HMAC-SHA256
每个负载均使用您的密钥签名。必须进行恒定时间比较。
SSRF 防护
在订阅和分发时阻止私有/内部 IP、localhost 和云元数据端点。
DNS 重新绑定安全
在分发时重新验证 IP,通过 CURLOPT_RESOLVE 固定。
强烈推荐使用 HTTPS
接受 http 和 https。生产环境推荐使用 HTTPS。
事件 ID 幂等性
每次交付都携带唯一的 X-PaperOffice-Event-ID。请在您的系统进行去重。
完整审计跟踪
记录所有尝试:状态码、响应体、计时、错误消息。
限制
订阅数量无限,交付行为完全可配置
∞
每个账户的订阅数
∞
活跃的任务订阅
10,000 毫秒
默认超时
5
默认最大重试次数
适用于所有套餐。按使用量付费:每次成功交付 1 个积分(HTTP 2xx)。重试、测试事件和失败的交付免费。
立即开始
60 秒内创建您的第一个 Webhook
创建一个端点,通过 API 订阅,触发一个测试事件。就这么简单。
HMAC-SHA256 指数退避 完整审计跟踪