Langsung ke konten utama
Seluruh request pengelolaan webhook membutuhkan Bearer API Key.

Endpoint webhook

Event yang tersedia:
  • exam_participant.registered — peserta didaftarkan ke ujian
  • exam_participant.unregistered — pendaftaran peserta dibatalkan
  • exam_result.completed — peserta selesai mengerjakan tes
  • exam_result.scored — nilai tes terbit atau berubah
  • question_import.completed — import paket soal selesai
  • question_import.failed — import paket soal gagal
Webhook hanya dikirim selama add-on Integrasi API aktif dan endpoint dalam keadaan aktif.

Kapan event dikirim

  • exam_participant.registered dikirim untuk pendaftaran melalui API dan melalui panel. Pendaftaran mandiri peserta lewat halaman pendaftaran ujian tidak mengirim event ini.
  • exam_participant.unregistered dikirim saat pendaftaran dibatalkan melalui API.
  • exam_result.completed dan exam_result.scored berasal dari pemindaian hasil ujian yang berjalan setiap menit, sehingga event dapat tiba sekitar 1–2 menit setelah peserta selesai.
  • exam_result.completed dapat membawa score: null untuk tes yang dinilai dengan IRT atau secara manual. exam_result.scored menyusul setelah nilainya dihitung.
  • exam_result.scored dikirim lagi setiap kali score atau meta_score berubah, misalnya setelah perhitungan ulang IRT atau perhitungan ulang skor. Nilai yang sama tidak dikirim dua kali.
  • question_import.completed dan question_import.failed dikirim saat import paket soal lewat API Import Soal selesai atau gagal.
  • Urutan kedatangan event tidak dijamin. Gunakan updated_at dari API Hasil Ujian untuk menentukan data terbaru, dan sinkronkan ulang secara berkala dengan GET /exam-results?updated_since=... agar event yang terlewat tetap tertangani.

Parameter

Tidak ada parameter endpoint.

Contoh request

Contoh response

Maksimal lima endpoint webhook per projek; endpoint keenam ditolak dengan status 409. Signing secret hanya dikembalikan saat endpoint dibuat atau secret dirotasi.

Parameter

Contoh request

Contoh response

Endpoint juga menerima metode PUT. Secret baru hanya dikembalikan jika rotate_secret bernilai true. Mengirim is_active: true juga mengaktifkan kembali endpoint yang dinonaktifkan otomatis oleh sistem dan mengatur ulang consecutive_failures ke 0.

Parameter

Contoh request

Contoh response

Parameter

Contoh request

Contoh response

Parameter

Contoh request

Contoh response

Jika event tidak dikirim atau tidak dikenali, event default adalah exam_result.completed. Pengiriman uji coba memakai nama event yang dipilih dan signature yang sama dengan pengiriman asli, tetapi isi data berupa pesan uji coba: { "message": "...", "sent_at": "..." }. Endpoint yang sedang nonaktif ditolak dengan status 409.

Parameter

Contoh request

Contoh response

Payload dan signature webhook

Setiap webhook dikirim sebagai POST dengan body JSON berisi event, created_at (waktu event diantrekan), dan data. Body yang sama dikirim ulang apa adanya pada setiap percobaan ulang.

Payload exam_result.completed dan exam_result.scored

Kedua event memakai struktur data yang sama. Isi meta_score pada setiap metode penilaian dijelaskan pada bagian Struktur meta_score di API Hasil Ujian.

Payload exam_participant.registered

Payload exam_participant.unregistered

Verifikasi signature

v1 adalah HMAC-SHA256 dari <t>.<raw body> menggunakan signing secret endpoint. Nilai t dibuat ulang pada setiap percobaan pengiriman. Tolak request yang signature-nya tidak cocok atau yang t-nya berselisih lebih dari 300 detik dari waktu server Anda.

Percobaan ulang

  • Balas webhook dengan status 2xx dalam 10 detik. Simpan event terlebih dahulu, lalu proses di latar belakang.
  • Respons selain 2xx, timeout, atau kegagalan koneksi dicoba ulang sampai total 4 kali percobaan, dengan jeda 1 menit, 5 menit, lalu 30 menit. Setelah percobaan terakhir gagal, status pengiriman menjadi failed.
  • Endpoint yang gagal 10 kali berturut-turut dinonaktifkan otomatis (is_disabled_by_system: true), dan pemilik projek menerima notifikasi di panel. Aktifkan kembali dengan PATCH /webhooks/{id} berisi is_active: true setelah endpoint diperbaiki.
  • Pengiriman yang sudah berstatus failed tidak dikirim ulang. Gunakan GET /exam-results?updated_since=... untuk mengambil hasil yang terlewat.