Dokumentasi · Referensi
Referensi webhook
Enam event keluar, bentuk payload per event, header tanda tangan, cara verifikasi, dan kebijakan percobaan ulang.
Cara kerja singkat
- Buat endpoint di
/admin/integrasiatau lewatPOST /api/v1/webhooks. Rahasia tanda tangan ditampilkan sekali saat itu. - Pilih event: nama persis, prefiks seperti
attempt.*, atau*untuk semua. - Balas
2xxsecepat mungkin. Pekerjaan berat diantrekan setelah balasan dikirim; pengiriman yang gagal diulang otomatis. - Verifikasi tanda tangan pada body mentah sebelum membaca JSON, lalu deduplikasi memakai
Idempotency-Key.
Amplop event
Setiap pengiriman memakai bentuk yang sama. Isi data berbeda per event dan hanya memuat field yang relevan untuk mitra — jawaban mentah dan catatan klinis tidak pernah dikirim.
Header permintaan
| Header | Contoh | Keterangan |
|---|---|---|
X-Sikotes-Event | attempt.submitted | Nama event; sama dengan `type` di payload. |
X-Sikotes-Delivery | dlv_01HQ8Z3K4M5N6P7Q8R9S0T | ID pengiriman; stabil antar percobaan ulang. |
X-Sikotes-Signature | t=1770000000,v1=6f3a… | HMAC-SHA256 atas `${t}.${rawBody}`. |
Idempotency-Key | dlv_01HQ8Z3K4M5N6P7Q8R9S0T | Sama dengan ID pengiriman; pakai untuk deduplikasi. |
Content-Type | application/json | Selalu JSON, UTF-8. |
Event yang tersedia
Berlangganan memakai nama persis, prefiks seperti attempt.*, atau * untuk semua event.
attempt.started5 fieldPeserta memulai sesi tes.
| Field | Tipe | Keterangan |
|---|---|---|
sessionId | string | ID sesi tes. |
participantId | string | ID peserta. |
instrumentId | string | ID instrumen. |
instrumentSlug | string | Slug instrumen, mis. `dass-21`. |
proctored | boolean | null | Apakah sesi diawasi. |
attempt.submitted13 fieldSesi tes dikirim dan hasilnya tersimpan.
| Field | Tipe | Keterangan |
|---|---|---|
sessionId | string | ID sesi tes. |
resultId | string | ID hasil. |
participantId | string | ID peserta. |
instrumentId | string | ID instrumen. |
instrumentSlug | string | Slug instrumen. |
instrumentName | string | Nama instrumen. |
attemptNo | number | null | Urutan percobaan peserta. |
level | string | Tingkat hasil menurut norma instrumen. |
band | string | null | Kategori ringkas hasil. |
riskLevel | string | null | Penanda risiko bila instrumen menyediakannya. |
integrityScore | number | null | Skor integritas sesi (0–100). |
needsReview | boolean | null | Perlu tinjauan psikolog. |
durationSeconds | number | null | Durasi pengerjaan (detik). |
commerce.order.paid5 fieldPesanan dinyatakan lunas dan hak akses diberikan.
| Field | Tipe | Keterangan |
|---|---|---|
orderId | string | ID pesanan. |
orderNumber | string | Nomor pesanan yang tercetak di invoice. |
participantId | string | ID peserta pemilik pesanan. |
totalIdr | number | null | Total dibayar dalam rupiah. |
provider | string | null | Penyedia pembayaran. |
report.reviewed4 fieldPsikolog menandatangani atau mencabut laporan hasil.
| Field | Tipe | Keterangan |
|---|---|---|
reportId | string | ID laporan. |
resultId | string | ID hasil yang dilaporkan. |
participantId | string | ID peserta. |
status | string | Status laporan setelah tinjauan. |
result.invalidated5 fieldStaf menginvalidasi hasil tes.
| Field | Tipe | Keterangan |
|---|---|---|
resultId | string | ID hasil. |
sessionId | string | ID sesi tes. |
participantId | string | ID peserta. |
attemptNo | number | null | Urutan percobaan peserta. |
reason | string | null | Alasan invalidasi. |
result.reinstated4 fieldHasil tes yang sebelumnya invalid dipulihkan.
| Field | Tipe | Keterangan |
|---|---|---|
resultId | string | ID hasil. |
sessionId | string | ID sesi tes. |
participantId | string | ID peserta. |
attemptNo | number | null | Urutan percobaan peserta. |
Verifikasi tanda tangan
Tanda tangan dihitung atas ${t}.${rawBody} memakai rahasia endpoint. Verifikasi wajib memakai body mentah, bukan hasil parse ulang, dan perbandingan harus waktu-konstan.
Percobaan ulang
| Aspek | Nilai | Keterangan |
|---|---|---|
| Percobaan maksimum | 8 | Setelah itu status pengiriman menjadi gagal permanen dan dapat dijadwalkan ulang dari konsol. |
| Jeda antar percobaan | Eksponensial, 5 detik → 1 jam | Ditambah jitter per pengiriman agar endpoint tidak menerima gelombang serentak. |
| Batas waktu satu permintaan | 10 detik | Balas `2xx` lebih cepat dari itu; pekerjaan berat diantrekan setelah balasan. |
| Nonaktif otomatis | 25 kegagalan beruntun | Endpoint dinonaktifkan dan ditandai di konsol; mengaktifkan kembali mereset penghitung. |
| Urutan | Tidak dijamin | Urutkan memakai `occurredAt`, dan deteksi duplikat memakai `id`. |