Event

Webhook

Terima payment.paid bertanda tangan saat pembayaran terkonfirmasi.

Atur satu URL webhook di dashboard (menu Developer). Saat pembayaran terkonfirmasi, kami mengirim POST dengan payload:

{
  "id": "evt_...",
  "type": "payment.paid",
  "created_at": "2026-08-11T12:05:00+07:00",
  "data": {
    "payment_request_id": "payreq_9b2f...",
    "external_id": "ORD-1234",
    "merchant_ref": "INV-2026-001",
    "amount": 150000,
    "currency": "IDR",
    "customer": { "name": "Budi", "email": "budi@toko.dev" },
    "paid_at": "2026-08-11T12:04:58+07:00"
  }
}

Pengiriman bersifat at-least-once: event yang sama bisa terkirim lebih dari sekali dan selalu membawa id yang sama — dedupe berdasarkan id. Endpoint Anda harus menjawab 2xx; selain itu kami mencoba ulang dengan exponential backoff hingga ±34 jam. URL webhook wajib https dan mengarah ke alamat publik.

Verifikasi signature

Setiap pengiriman ditandatangani HMAC-SHA256 atas body mentah, di header Kasera-Signature. Id event juga ada di Kasera-Event-Id.

// Node.js
const crypto = require("crypto");

function verify(rawBody, signatureHeader, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(rawBody)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(signatureHeader),
    Buffer.from(expected)
  );
}

Verifikasi signature sebelum memproses payload. Gunakan body mentah, bukan hasil parse-ulang JSON.