Tidak semua OTP harus dikirim sebagai chat atau SMS. Ada situasi ketika pengguna lebih mudah menerima panggilan telepon: koneksi data sedang tidak stabil, SMS terlambat, aplikasi chat tidak aktif, atau flow produk memang lebih cocok memakai suara.
Di titik itu, Voice OTP menjadi pilihan yang layak dipertimbangkan. Bukan sebagai pengganti permanen WhatsApp atau SMS, tapi sebagai channel verifikasi tambahan yang sengaja ditawarkan ke End User.
OTP.ID sudah membuka Voice OTP sebagai channel publik. Harganya Rp595 per OTP, berjalan di API V3, dan dipanggil lewat endpoint request yang sama dengan channel lain.
Apa itu Voice OTP?
Voice OTP adalah metode verifikasi yang mengirim kode OTP lewat panggilan suara. End User menerima panggilan, mendengar kode dibacakan, lalu memasukkan kode itu kembali di aplikasi atau website Client.
Secara konsep, alurnya tetap sama dengan OTP lain: backend Client meminta kode, OTP.ID mengirim kode lewat channel yang dipilih, End User memasukkan kode, lalu backend Client memverifikasi hasilnya. Bedanya ada pada pengalaman penerimaan kode. Voice tidak mengandalkan inbox SMS, chat WhatsApp, atau email. Kode didengar lewat telepon.
Riset eksternal juga menempatkan Voice OTP di posisi yang mirip: cocok saat SMS tidak tersedia atau tidak disukai, membantu kebutuhan aksesibilitas, berguna untuk pengguna yang lebih mudah menerima panggilan, dan bisa menjadi opsi ketika pesan teks bukan jalur paling ideal. Di sisi lain, Voice kurang cocok untuk situasi ketika pengguna tidak bisa menjawab panggilan, berada di lingkungan terlalu bising, sedang rapat, atau ketika biaya per verifikasi menjadi perhatian besar.

Kapan Voice lebih masuk akal dibanding SMS atau WhatsApp?
Voice paling masuk akal ketika produk ingin memberi opsi verifikasi berbasis panggilan. Misalnya, aplikasi melayani pengguna yang kadang tidak aktif di WhatsApp, mengalami keterlambatan SMS, atau lebih cepat merespons telepon daripada membaca pesan.
Voice juga relevan untuk flow yang membutuhkan instruksi audio singkat. OTP.ID Voice selalu memakai kode 4 digit, sehingga layar input di aplikasi tetap sederhana. End User tidak perlu membaca pesan panjang; cukup dengar angka yang dibacakan, lalu memasukkannya.
Namun jangan menjual Voice sebagai channel yang “pasti lebih baik”. Tidak ada channel OTP yang selalu unggul dalam semua kondisi. WhatsApp kuat untuk pengguna yang aktif di chat. SMS punya jangkauan luas. Voice berguna ketika pengalaman panggilan lebih cocok. Pilihan yang sehat adalah memberi opsi channel sesuai konteks, bukan memaksa satu jalur untuk semua user.
Cara kerja Voice OTP di OTP.ID
Di OTP.ID, Voice adalah channel publik V3 yang bersifat request-only. Artinya, Voice hanya dipakai lewat POST /v3/request. Client tidak bisa memakai POST /v3/send untuk memasukkan kode OTP sendiri pada channel Voice.
Request Voice memakai channel: "voice", nomor tujuan di destination, dan brand yang wajib diisi. Sistem selalu menghasilkan kode 4 digit untuk Voice, meskipun Client mengirim otp_length berbeda.
Contoh request:
curl -X POST https://api.otp.id/v3/request \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{
"channel": "voice",
"destination": "628xxxxxxxxxx",
"brand": "TokoAnda",
"external_id": "voice-login-1042"
}'
Response sukses tetap memakai pola V3: ada otp_id, status, channel, number, price, last_balance, dan expires_at. Simpan otp_id di database aplikasi karena nilai itu dipakai saat verifikasi.
{
"success": true,
"data": {
"otp_id": "OTP20260816VOICE00123",
"status": "sent",
"channel": "voice",
"number": "628xxxxxxxxxx",
"price": 595,
"last_balance": 9405,
"expires_at": "2026-08-16 10:05:00"
},
"error": null
}
Angka price dan last_balance di atas adalah contoh bentuk response. Harga publik Voice OTP saat artikel ini ditulis adalah Rp595 per OTP, sesuai katalog publik OTP.ID.
Verifikasi kode Voice
Setelah End User mendengar kode dan memasukkannya ke aplikasi, backend Client memanggil endpoint verify yang sama:
curl -X POST https://api.otp.id/v3/verify \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{
"otp_id": "OTP20260816VOICE00123",
"otp": "1234"
}'
Perilaku verify tetap mengikuti kontrak V3:
| Kondisi | HTTP | Makna |
|---|---|---|
| Kode benar | 200 | verified: true |
| Kode salah | 200 | verified: false, reason: "mismatch" |
| Kode kedaluwarsa | 422 | OTP_EXPIRED |
| Terlalu banyak percobaan | 422 | TOO_MANY_ATTEMPTS |
| Kode sudah dipakai | 422 | ALREADY_USED |
Kode salah bukan exception. Perlakukan verified:false sebagai kondisi normal, lalu tampilkan pesan yang bisa dipahami End User. Exception handler lebih cocok untuk error seperti UNAUTHORIZED, INSUFFICIENT_BALANCE, RATE_LIMITED, atau DESTINATION_RATE_LIMITED.
UX dan proteksi produksi
Voice OTP tetap membutuhkan pagar UX. Jangan biarkan tombol “kirim ulang lewat panggilan” bisa ditekan terus-menerus. Selain boros biaya, panggilan berulang bisa terasa mengganggu bagi End User.
Gunakan external_id untuk menjaga idempotency saat retry jaringan. Kalau request dengan external_id dan parameter yang sama diulang dalam 24 jam, server mengembalikan response pertama tanpa mengirim ulang dan tanpa debit ulang. Kalau external_id sama dipakai dengan parameter berbeda, server mengembalikan 409 DUPLICATE_EXTERNAL_ID.

Di sisi aplikasi Client, siapkan beberapa aturan sederhana:
- simpan API key hanya di backend;
- jangan tulis kode OTP ke log, analytics, atau error tracker;
- beri jeda sebelum user bisa meminta panggilan ulang;
- tampilkan pesan bahwa kode akan datang lewat panggilan suara;
- pastikan input kode di UI hanya meminta 4 digit untuk Voice;
- pantau
last_balancedan aktifkan balance alert.
OTP.ID tidak menyediakan sandbox terpisah. Untuk uji awal, gunakan nomor tim sendiri dan siapkan skenario gagal secara terkontrol.
Bagaimana kalau Voice gagal atau tidak cocok?
Jika pengiriman gagal, response request bisa berisi status: "failed" dan saldo tidak didebit. OTP.ID tidak melakukan fallback otomatis antar-channel. Keputusan channel berikutnya tetap berada di aplikasi Client.
Pola yang aman adalah memberi pilihan eksplisit: kirim lewat WhatsApp, SMS, Email, Missed Call, atau ulangi Voice setelah jeda. Dengan begitu, End User tahu apa yang terjadi, dan Client tetap bisa mengontrol biaya serta pengalaman pengguna.
Voice juga tidak perlu selalu muncul sebagai pilihan pertama. Untuk banyak aplikasi, WhatsApp tetap bisa menjadi channel utama. Voice bisa ditaruh sebagai opsi tambahan ketika End User tidak menerima pesan atau ketika produk memang ingin menyediakan jalur panggilan.
Biaya Voice OTP dan mulai integrasi
Voice OTP publik OTP.ID saat ini Rp595 per OTP. Skemanya tetap prepaid pay-per-OTP: request sukses mendebit kredit, sedangkan pengiriman yang gagal tidak didebit.
Untuk mulai mencoba, daftar di app.otp.id. Merchant baru mendapat kredit gratis Rp2.000 untuk testing awal. Setelah punya API key, panggil POST /v3/request dengan channel: "voice", simpan otp_id, lalu verifikasi kode 4 digit lewat POST /v3/verify.
Dokumentasi API lengkap tersedia di docs.otp.id. Untuk melihat posisi Voice dibanding channel lain, buka juga halaman Voice OTP API OTP.ID dan artikel API OTP WhatsApp.
