/v1/otp/sms/sendKirim OTP lewat SMS
Membuat permintaan OTP baru untuk kanal SMS. Sistem membuat kode 6 digit, menyimpan hash-nya, menahan saldo sementara, lalu memasukkan pengiriman ke antrean OTP.
Header
| Nama | Lokasi | Tipe | Wajib | Deskripsi |
|---|---|---|---|---|
AuthorizationBearer YOUR_API_TOKEN | Header | string | Wajib | Token Bearer dari halaman API Token. Formatnya: Bearer notif.<64 karakter hex>. |
Acceptapplication/json | Header | string | Opsional | Isi application/json agar error validasi dan error autentikasi selalu dibalas dalam bentuk JSON. |
Content-Typeapplication/json | Header | string | Wajib | Wajib disertakan jika permintaan punya body. |
Idempotency-Keyotp-login-2026-11-05-001 | Header | string | Opsional | Sebaiknya selalu dikirim. Nilai yang sama akan mengembalikan permintaan OTP yang sudah dibuat sebelumnya. |
Parameter
| Nama | Lokasi | Tipe | Wajib | Deskripsi |
|---|---|---|---|---|
recipient081234567890 | Body | string | Wajib | Nomor tujuan. Bisa diawali 0 atau 62; sistem akan menormalkannya ke format 62. Panjang 9 sampai 16 digit setelah dinormalkan. |
templateKode OTP notif.biz: {otp}. Berlaku 5 menit. Jangan bagikan kode ini kepada siapa pun. | Body | string | Opsional | Template pesan, maksimal 255 karakter. Wajib memuat placeholder {otp} atau {code}. Jika dikosongkan, sistem memakai template bawaan. |
ttl300 | Body | integer | Opsional | Masa berlaku OTP dalam detik, 60 sampai 900. Bawaannya 300. |
Contoh permintaan
Ganti YOUR_API_TOKEN dengan token aktif milik akun Anda.
curl -X POST "https://app.notif.biz/api/v1/otp/sms/send" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: otp-login-2026-11-05-001" \
-d '{
"recipient": "081234567890",
"template": "Kode OTP notif.biz: {otp}. Berlaku 5 menit. Jangan bagikan kode ini kepada siapa pun.",
"ttl": 300
}'Respons berhasil
HTTP 202Permintaan OTP diterima dan sedang dikirim.{
"success": true,
"message": "OTP sedang dikirim.",
"data": {
"id": "01JBCDEFGHJKMNPQRSTVWXYZ",
"channel": "sms",
"recipient": "6281******890",
"status": "pending",
"expires_at": "2026-11-05T16:32:00+00:00",
"created_at": "2026-11-05T16:27:00+00:00"
}
}| Field | Tipe | Deskripsi |
|---|---|---|
success | boolean | true jika permintaan OTP berhasil dibuat. |
message | string | Pesan yang bisa langsung ditampilkan ke pengguna. |
data.id | string (ULID) | ID permintaan OTP. Simpan ID ini untuk memantau status dan memverifikasi kode. |
data.channel | string | Kanal pengiriman: sms atau whatsapp. |
data.recipient | string | Nomor tujuan yang sudah disamarkan. |
data.status | string | Status awal, umumnya pending. |
data.expires_at | string (ISO 8601) | Waktu OTP kedaluwarsa. |
data.created_at | string (ISO 8601) | Waktu permintaan dibuat. |
debug_otp | string | Hanya muncul di environment local dan testing. Jangan diandalkan di production. |
Error yang mungkin muncul
| HTTP | Code | Kondisi |
|---|---|---|
| 401 | UNAUTHORIZED | Token tidak dikirim, tidak valid, sudah dicabut, atau sudah kedaluwarsa. |
| 403 | FORBIDDEN | Token tidak punya izin create atau verify untuk kanal OTP yang dipakai. |
| 422 | VALIDATION_ERROR | Nomor tidak valid, template tidak punya placeholder, TTL di luar rentang, atau masih kena cooldown. |
| 429 | RATE_LIMIT_EXCEEDED | Batas 120 permintaan per menit untuk token atau akun sudah terlampaui. |
| 503 | OTP_DISABLED | Layanan OTP sedang dinonaktifkan. |
| 503 | OTP_SMS_DISABLED | Kanal OTP SMS sedang dinonaktifkan. |
Yang perlu diperhatikan
- Nomor 081234567890 dinormalkan menjadi 6281234567890 sebelum disimpan.
- Jeda 60 detik dan batas 5 permintaan per jam berlaku untuk setiap nomor dan kanal.
- Pakai Idempotency-Key yang sama saat mencoba ulang agar saldo tidak tertahan dua kali.
- Status awalnya pending. Periksa GET /v1/otp/{id} secara berkala untuk melihat apakah statusnya berubah menjadi accepted, delivered, atau failed.