ウェブフック リアルタイムイベント
すべてのドキュメント、ジョブ、ワークスペース、タスクのイベントに対する 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ドキュメントがワークスペース間で移動されました -
ドキュメントのバージョンが作成されました既存のドキュメントに新しいバージョンが追加されました -
ドキュメント.ライフサイクル_変更保持/アーカイブステータスが変更されました -
ドキュメント.コメント_追加ドキュメントにコメントが投稿されました -
ドキュメント.メモ_追加内部メモが添付されました -
ドキュメント.タグ_追加ドキュメントにタグが割り当てられました -
ドキュメント.法的保持_設定法的保持が有効化されました(不変) -
ドキュメント.法的保持_解除法的保持が解除されました
ジョブ
3-
ジョブ.完了非同期ジョブが正常に完了しました -
ジョブ.失敗非同期ジョブが致命的なエラーで失敗しました -
ジョブ.進行長時間実行されるジョブ中の進捗更新
ワークスペース
2-
ワークスペース.共有ワークスペースがユーザーまたはチームと共有されました -
ワークスペース.共有_解除ワークスペースへのアクセスが取り消されました
タスク
3-
タスク.作成新しいタスクが作成されました -
タスク.完了タスクが完了としてマークされました -
タスク.期限切れタスクが期限を過ぎました
["*"] を購読すると、アカウントのすべてのイベントを受信できます。
すべての配信は同じスキーマに従います
予測可能な JSON ボディ、5 つの署名済み 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 ドキュメント.処理済み 配信されるイベントタイプ X-PaperOffice-Event-ID a3b7f9c1… 128 ビット固有 ID。冪等性に使用します。 X-PaperOffice-Subscription-ID 42 イベントを受信するサブスクリプションの ID X-PaperOffice-Signature sha256=… 生ボディの HMAC-SHA256、16 進数エンコード すべての配信を 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');
}); 3 つの再試行戦略、最大 10 回の試行
サブスクリプションごとにポリシーを選択します。すべての試行は、ステータスコード、レスポンスボディ、タイミングとともにログ記録されます。
exponential 指数関数的(デフォルト)
試行ごとにバックオフ時間が倍増:30 秒、60 秒、120 秒、240 秒、480 秒…
linear 線形
固定成長:30 秒、60 秒、90 秒、120 秒、150 秒…
none なし
送信して終了。5xx エラーでも再試行しません。テスト用フックに有用です。
/latest/webhooks/ 配下に 9 つのエンドポイント
サブスクリプション、配信ログ、ワンタイムジョブサブスクリプション、テストエンドポイントのための完全な 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 向けのワンタイム Webhook 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 が付与されます。受信側で重複排除を行ってください。
完全な監査証跡
すべての試行をログ記録:ステータスコード、レスポンスボディ、タイミング、エラーメッセージ。
サブスクリプションは無制限、配信動作は完全に構成可能
すべてのプランで利用可能。従量課金:成功した配信(HTTP 2xx)あたり 1 クレジット。再試行、テストイベント、失敗した配信は無料です。
60 秒で最初の Webhook を作成
エンドポイントを作成し、API でサブスクライブし、テストイベントを発火させる。それだけです。