Header request
| Header | Keterangan |
|---|---|
| Content-Type | application/json |
| User-Agent | KiPay-Webhook/1.0 |
| X-Webhook-Event | Sama dengan field event pada payload |
| X-Webhook-Delivery | ID delivery unik dan stabil — sama persis pada percobaan ulang untuk event yang sama |
| X-Webhook-Timestamp | Waktu pengiriman (ISO 8601), ikut ditandatangani |
| X-Webhook-Signature | sha256=<hex> — HMAC-SHA256("{timestamp}.{deliveryId}.{rawBody}", webhook_secret). Lihat panduan "Terima webhook" untuk cara verifikasi. |
Payload
net_amount hanya muncul di sini dan di dashboard merchant — tidak ada di response API checkout publik (lihat POST /transactions).
{
"event": "transaction.paid",
"sent_at": "2026-08-26T06:35:14Z",
"transaction": {
"trx_id": "SBX-20260825-VG57V5",
"mode": "sandbox",
"requested_amount": 285000,
"unique_code": 215,
"amount": 285215,
"fee_amount": 2925,
"net_amount": 282290,
"fee_bearer": "merchant",
"status": "paid",
"provider": "shopeepay",
"note": "order_nusa_2048",
"matched_at": "2026-08-26 06:35:14",
"created_at": "2026-08-26 06:35:08",
"expires_at": "2026-08-26 06:50:08"
}
}Jenis event
| Event | Makna |
|---|---|
| transaction.paid | Transaksi berubah menjadi paid |
| transaction.expired | Transaksi melewati expires_at |
| webhook.test | Tes koneksi dari project |
Kontrak keamanan
Hitung ulang HMAC-SHA256 atas "{timestamp}.{deliveryId}.{rawBody}" memakai webhook secret project, bandingkan dengan X-Webhook-Signature memakai constant-time comparison, dan tolak timestamp yang sudah terlalu lama (replay window disarankan 5 menit). SDK kipay-node menyediakan verifyWebhookSignature() untuk ini. Signature yang valid membuktikan payload asli dari KiPay — tetap baca ulang status transaksi lewat API sebelum memenuhi order.
Retry saat gagal
Kalau endpoint Anda tidak merespons 2xx (atau timeout), KiPay mencoba ulang hingga 6 kali dengan jeda meningkat (~10 detik sampai ~160 detik), lalu berhenti. X-Webhook-Delivery tetap sama di setiap percobaan ulang untuk event yang sama.