Webhook Acara waktu nyata
Callback bertanda HMAC untuk setiap acara dokumen, pekerjaan, ruang kerja dan tugas. 22 jenis acara, coba ulang eksponensial, HTTPS direkomendasikan.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Dipercaya oleh perusahaan terkemuka di seluruh dunia
22 jenis acara, dikelompokkan berdasarkan entitas
Berlangganan acara individual atau gunakan wildcard * untuk semuanya.
Dokumen
14-
dokumen.diunggahDokumen baru diunggah ke ruang kerja -
dokumen.dibuatAlias untuk document.uploaded (kompatibilitas) -
dokumen.diprosesPipa OCR/IDP selesai dengan sukses -
dokumen.dieditMetadata, tag atau konten diperbarui -
dokumen.dihapusDokumen dipindahkan ke sampah -
dokumen.dipulihkanDokumen dipulihkan dari sampah -
document.movedDokumen dipindahkan antar ruang kerja -
dokumen.versi_dibuatVersi baru ditambahkan ke dokumen yang ada -
dokumen.siklus_hidup_diubahStatus retensi / arsip diubah -
dokumen.komentar_ditambahkanKomentar diposting pada dokumen -
dokumen.catatan_ditambahkanCatatan internal dilampirkan -
dokumen.tag_ditambahkanTag ditetapkan ke dokumen -
dokumen.penahanan_hukum_diterapkanTahanan hukum diaktifkan (tidak dapat diubah) -
dokumen.penahanan_hukum_dilepaskanTahanan hukum dilepaskan
Pekerjaan
3-
pekerjaan.selesaiPekerjaan async selesai dengan sukses -
pekerjaan.gagalPekerjaan async gagal secara terminal -
pekerjaan.progresPembaruan kemajuan selama pekerjaan jangka panjang
Ruang Kerja
2-
ruang_kerja.dibagikanRuang kerja dibagikan dengan pengguna atau tim -
ruang_kerja.tidak_dibagikanAkses ruang kerja dicabut
Tugas
3-
tugas.dibuatTugas baru dibuat -
tugas.selesaiTugas ditandai sebagai selesai -
tugas.terlambatTugas telah melewati batas waktu
Berlangganan ["*"] untuk menerima setiap event dari akun Anda.
Setiap pengiriman mengikuti skema yang sama
Body JSON yang dapat diprediksi, lima header HTTP bertanda tangan, stempel waktu 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 Selalu JSON, dikodekan UTF-8 User-Agent PaperOffice-Webhook/1.0 Identifikasi tetap untuk daftar izin firewall X-PaperOffice-Event document.processed Jenis event yang dikirimkan X-PaperOffice-Event-ID a3b7f9c1… ID unik 128-bit. Gunakan untuk idempotensi. X-PaperOffice-Subscription-ID 42 ID langganan yang menerima event X-PaperOffice-Signature sha256=… HMAC-SHA256 dari body mentah, dikodekan heksadesimal Verifikasi setiap pengiriman dengan HMAC-SHA256
Hitung HMAC-SHA256 atas body permintaan mentah menggunakan rahasia bersama Anda, lalu bandingkan dengan X-PaperOffice-Signature menggunakan perbandingan waktu-konstan (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');
}); Tiga strategi coba ulang, hingga 10 percobaan
Pilih kebijakan per langganan. Setiap percobaan dicatat dengan kode status, body respons, dan waktu.
exponential Eksponensial (default)
Back-off berlipat ganda setelah setiap percobaan: 30d, 60d, 120d, 240d, 480d…
linear Linier
Pertumbuhan tetap: 30d, 60d, 90d, 120d, 150d…
none Tidak ada
Kirim dan lupakan. Tidak ada coba ulang bahkan pada 5xx. Berguna untuk hook uji.
9 endpoint di bawah /latest/webhooks/
CRUD lengkap untuk langganan, log pengiriman, langganan pekerjaan sekali jalan, dan endpoint uji — semua OAuth2 Bearer, semua siap-MCP.
/webhooks/subscribe Buat langganan baru (tanpa batas per akun) po_webhooks_subscribe /webhooks/list Daftar semua langganan akun po_webhooks_list /webhooks/update Perbarui langganan yang ada po_webhooks_update /webhooks/delete Hapus lunak langganan (log pengiriman dipertahankan) po_webhooks_delete /webhooks/deliveries Ambil log pengiriman dengan filter (event_type, success_only) po_webhooks_deliveries /webhooks/test Kirim event test.ping untuk memverifikasi pengiriman po_webhooks_test /webhooks/subscribe-job Webhook sekali jalan untuk job_id tertentu po_webhooks_subscribe_job /webhooks/job-subscriptions Daftar langganan yang cakupan pekerjaan po_webhooks_job_subscriptions /webhooks/info Event yang tersedia, endpoint, kebijakan coba ulang, info tanda tangan po_webhooks_info Diperkuat berdasarkan desain
HMAC-SHA256
Setiap payload ditandatangani dengan rahasia Anda. Perbandingan waktu-konstan wajib.
Proteksi SSRF
IP pribadi/internal, localhost, dan endpoint metadata cloud diblokir saat berlangganan dan pengiriman.
Aman dari pengikatan ulang DNS
IP divalidasi ulang pada saat pengiriman, dipatok melalui CURLOPT_RESOLVE.
HTTPS sangat disarankan
http dan https diterima. HTTPS direkomendasikan untuk produksi.
Idempotensi Event-ID
Setiap pengiriman membawa X-PaperOffice-Event-ID unik. Deduplikasi di sisi Anda.
Jejak audit lengkap
Semua percobaan dicatat: kode status, body respons, waktu, pesan kesalahan.
Langganan tanpa batas, perilaku pengiriman sepenuhnya dapat dikonfigurasi
Tersedia di semua paket. Bayar-per-penggunaan: 1 kredit per pengiriman berhasil (HTTP 2xx). Coba ulang, event uji, dan pengiriman gagal gratis.
Webhook pertama Anda dalam 60 detik
Buat endpoint, berlangganan via API, kirim event uji. Itu saja.