Langsung ke konten utama
Transaction Monitoring mengirim tiga event webhook yang bersama-sama mencakup seluruh siklus hidup transaksi, ditambah satu event opsional yang memberi tahu saran aturan baru. Semuanya menggunakan infrastruktur webhook standar Didit dengan penandatanganan HMAC-SHA256. Lihat referensi webhook untuk tujuan, penandatanganan, dan pengujian.

Katalog event

Event tingkat entitas (user.status.updated, business.status.updated) juga bisa dipicu sebagai akibat dari aktivitas transaksi - lihat webhook entitas.
Aplikasi sandbox tidak mengirim webhook transaction.created atau transaction.status.updated. Untuk menguji event tersebut, gunakan aplikasi live atau API & Webhooks → Try Webhook di konsol. Pertukaran Travel Rule di sandbox mengirim webhook travel_rule.status.updated dengan environment: sandbox; gunakan Didit Test VASP untuk menguji pertukaran sebelum beralih ke produksi.

Struktur envelope

Body webhook Didit bersifat datar: kolom event berada di level teratas bersama kolom envelope, dan tidak ada objek data bertingkat. Setiap pengiriman memuat:

Bentuk payload

transaction.created dan transaction.status.updated

Kedua event ini memakai satu payload yang sama - ringkasan singkat ditambah blok action_required (atau null):
Payload ini sengaja dibuat ringkas: saat menerima, ambil data lengkap dengan GET /v3/transactions/{transaction_id}/. Endpoint ini mengembalikan detail lengkap (pihak terkait, rule_runs, provider_results, travel_rule, cost_breakdown, decision_reason_code), termasuk alasan perubahan status.

transaction_rule_suggestions.created

Event ini berkaitan dengan kumpulan aturan Anda, bukan satu transaksi, sehingga tidak memuat ID transaksi. Event ini tidak pernah berisi data pribadi: hanya ID saran, jenis, judul, dan jumlah.
Kolom envelope yang biasa (event_id, timestamp, application_id, environment) ditambahkan ke body.

travel_rule.status.updated

Event ini dipicu pada setiap transisi, termasuk perpindahan ke FINISHED, CANCELLED, atau EXPIRED; setelah transfer mencapai salah satu status tersebut, tidak ada event travel rule lagi yang dikirim untuknya. Sebuah event dapat mengulang status sebelumnya, misalnya ketika pengiriman ulang tidak menemukan rail dan transfer tetap berada di COUNTERPARTY_VASP_NOT_FOUND. rail bernilai INTERNAL, TRP, GTR, TRUST, VERIFYVASP, SYGNA, EMAIL, TEST_VASP (transfer sandbox yang dijawab oleh Didit Test VASP, yang juga memuat test_vasp: true dan test_vasp_scenario), atau "" selama belum ada rail yang dipilih (selalu "" pada pendaftaran sunrise). Saat transaksi dibuat, untuk pendaftaran sunrise, permintaan TRP masuk, atau leg masuk rail INTERNAL, Didit mengirim transaction.created terlebih dahulu, lalu event travel_rule.status.updated untuk transaksi tersebut setelahnya. Aturan yang mengubah status transaksi pada langkah itu juga dapat mengirim transaction.status.updated sebelum transaction.created. Pendaftaran sunrise yang terhubung ke transaksi deposit yang sudah Anda buat tidak mengirim transaction.created. Setiap webhook dikirim dan dicoba ulang secara terpisah, sehingga event yang dicoba ulang bisa tiba setelah event yang lebih baru: gunakan transaction_id sebagai kunci handler Anda, dan ambil kembali data transaksi ketika Anda memerlukan status terkini.

Contoh alur status

Persetujuan sederhana

Tinjau lalu setujui

Verifikasi tambahan

Transfer Travel Rule

Dua event pertama berasal dari permintaan yang sama, dan transaction.created masuk antrean lebih dulu; setiap webhook dikirim secara terpisah, jadi jangan mengandalkan urutan kedatangan. Transfer yang dikirim melalui TRUST tidak pernah menerima event COMPLETED, karena TRUST tidak mengirim balasan yang bisa dibaca Didit: transfer tetap di AWAITING_COUNTERPARTY hingga batas waktu konfirmasi, lalu berakhir di EXPIRED. Melalui GTR, VerifyVASP, dan Sygna Bridge, Didit membaca jawaban pihak lawan dari jaringan, dan event mengikuti jawaban tersebut.

Verifikasi tanda tangan

Setiap pengiriman ditandatangani dengan HMAC-SHA256 menggunakan rahasia bersama tujuan webhook dan membawa tiga header tanda tangan serta satu timestamp:
Lihat referensi webhook untuk kode verifikasi lengkap, termasuk pemeriksaan apakah timestamp masih dalam batas waktu yang diizinkan.

Coba lagi dan jaminan pengiriman

  • Saat 5xx, 404, timeout, atau kegagalan koneksi, Didit mencoba lagi hingga 2 kali: sekitar 1 menit setelah kegagalan awal, lalu sekitar 4 menit lagi setelahnya.
  • Pengiriman ulang memakai event_id yang sama - lakukan deduplikasi berdasarkan ID tersebut di handler Anda.
  • Setelah kegagalan terakhir, pengiriman untuk event tersebut dihentikan dan organisasi Anda diberi tahu; tujuan webhook tidak pernah dinonaktifkan secara diam-diam.
  • Kembalikan 2xx dengan cepat (masukkan ke antrean, lalu proses) - ACK yang lambat berisiko menyebabkan timeout dan pengiriman duplikat.

Idempotensi

Proses setiap webhook tepat satu kali dengan menyimpan event_id di penyimpanan deduplikasi Anda sendiri. Pengiriman ulang event yang sama dapat terjadi jika endpoint Anda mengirim ACK secara lambat atau koneksi terputus di tengah permintaan.

Berlangganan

Langkah selanjutnya

Referensi webhook

Tujuan, penandatanganan, coba lagi.

Status

Mesin status lengkap.

Panduan integrasi

Menangani webhook di produksi.
Terakhir diubah pada 7 November 2026