Dokumentasi
Satu kontrak untuk
SMS, WhatsApp, dan OTP.
REST, JSON, dan bearer token. Halaman ini merangkum bagian yang paling sering dipakai. Kontrak lengkap, contoh respons, dan daftar field ada di dokumentasi aplikasi.
01 / Autentikasi
Token membawa izin, bukan hanya identitas.
Kirim token di header Authorization. Izin dibaca per endpoint, jadi token yang hanya punya sms:read tidak bisa membuat batch. Sebaiknya buat token per integrasi supaya bisa dicabut tanpa mengganggu yang lain.
Authorization: Bearer notif.<64 karakter hex>Content-Type: application/jsonAccept: application/jsonIdempotency-Key: <unik per operasi tulis># Buat token dari halaman API Token di dashboard.# Setiap token punya daftar izin sendiri:# sms:create, sms:read, rcs:create, rcs:read,# mms:create, mms:read,# whatsapp:create, whatsapp:read,# otp-sms:create, otp-sms:verify, otp-sms:read,# otp-whatsapp:create, otp-whatsapp:verify, otp-whatsapp:read# Jangan menaruh token di browser atau kode klien.02 / OTP
Kirim, verifikasi, pantau.
Kanal SMS dan WhatsApp memakai bentuk request yang sama. Template maksimal 255 karakter dan wajib ada {otp} atau {code}. Masa berlakunya 60 sampai 900 detik.
- POST
/api/v1/otp/sms/sendMembuat request OTP lewat SMS.
otp-sms:create - POST
/api/v1/otp/whatsapp/sendMembuat request OTP lewat WhatsApp.
otp-whatsapp:create - POST
/api/v1/otp/verifyVerifikasi kode untuk nomor dan kanal.
otp-sms:verify | otp-whatsapp:verify - GET
/api/v1/otp/{id}Lihat status satu request.
otp-sms:read | otp-whatsapp:read
curl -s -X POST "$NOTIF_API_URL/api/v1/otp/sms/send" \ -H "Authorization: Bearer $NOTIF_TOKEN" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: login-2026-11-07-001" \ -d '{"recipient":"081234567890","ttl":300}'curl -s -X POST "$NOTIF_API_URL/api/v1/otp/verify" \ -H "Authorization: Bearer $NOTIF_TOKEN" \ -H "Content-Type: application/json" \ -d '{"recipient":"081234567890","code":"123456","channel":"sms"}'03 / SMS, RCS, MMS
Satu endpoint, tiga tipe pesan.
Header Idempotency-Key wajib untuk membuat batch. Isi type dengan SMS, RCS, atau MMS. RCS boleh memakai media, MMS wajib. Penerima per request 1 sampai 1.000 dan harus unik.
- POST
/api/v1/smsMembuat batch SMS, RCS, atau MMS.
sms:create - GET
/api/v1/smsDaftar batch, 20 per halaman.
sms:read - GET
/api/v1/sms/{id}Detail batch dan pesan di dalamnya.
sms:read - GET
/api/v1/sms/batches/{id}Daftar pesan dalam satu batch.
sms:read
04 / WhatsApp
Satu penerima per request.
Endpoint WhatsApp membuat batch berisi satu penerima. Kalau daftarnya besar, pakai sesi blast di dashboard. Media dikirim sebagai URL HTTPS, bukan base64.
- POST
/api/v1/whatsappKirim satu pesan WhatsApp.
whatsapp:create - GET
/api/v1/whatsappDaftar batch WhatsApp.
whatsapp:read - GET
/api/v1/whatsapp/{id}Detail satu batch.
whatsapp:read - GET
/api/v1/whatsapp/batches/{id}Daftar pesan dalam batch.
whatsapp:read
05 / Nomor Virtual
Status order yang perlu dikenal.
Nomor virtual dikelola dari panel notif, bukan dari endpoint publik SMS atau WhatsApp. Status order dan kode OTP muncul di dashboard, lalu kode bisa diteruskan ke perangkat WhatsApp lewat integrasi.
Geser tabel ke samping untuk melihat kolom lain.
| Item | Nilai | Catatan |
|---|---|---|
| ACTIVE | Menunggu SMS | Nomor siap. Pembatalan mengikuti jendela yang diizinkan mitra. |
| OTP_RECEIVED | Kode masuk | Kode tersedia. Order bisa diselesaikan atau diminta ulang kalau flag mengizinkan. |
| COMPLETED | Selesai | Order ditutup setelah kodenya dipakai. |
| CANCELED | Dibatalkan | Order dihentikan sebelum kode diterima. |
| EXPIRED | Kedaluwarsa | Masa aktif habis tanpa kode. |
06 / Webhook
Periksa tanda tangan sebelum memercayai payload.
Webhook batch mengirim event sms.batch.updated dan whatsapp.batch.updated ke URL HTTPS publik di port 443. Setiap request membawa X-Webhook-Id, X-Webhook-Timestamp, dan X-Webhook-Signature dengan format sha256=HMAC(timestamp.body, secret).
{ "id": "9a51d6de-7f0c-4c1b-9f8a-2f7b5a6d8c31", "event": "sms.batch.updated", "created_at": "2026-11-07T09:30:00+00:00", "data": { "id": "01JBCDEFGHJKMNPQRSTVWXYZ", "status": "running", "lifecycle_status": "running" }}import { createHmac, timingSafeEqual } from "node:crypto";const timestamp = request.headers["x-webhook-timestamp"];const signature = request.headers["x-webhook-signature"];const expected = "sha256=" + createHmac("sha256", process.env.NOTIF_WEBHOOK_SECRET) .update(`${timestamp}.${rawBody}`) .digest("hex");const valid = timingSafeEqual( Buffer.from(expected), Buffer.from(String(signature)),);Verifikasi tanda tangan memakai raw body, bukan JSON yang sudah di-parse. Tolak request dengan timestamp lama dan jangan mengikuti redirect.
07 / Batas
Angka yang membentuk kontrak API.
Geser tabel ke samping untuk melihat kolom lain.
| Item | Nilai | Catatan |
|---|---|---|
| Batas request | 120 / menit | Per token dan per akun. Respons 429 bawa Retry-After. |
| Penerima per batch SMS | 1 sampai 1.000 | Harus unik dalam satu request. |
| Panjang pesan | 5.000 karakter | Berlaku untuk SMS, RCS, dan WhatsApp. |
| Media | URL HTTPS | Maksimal 2.048 karakter. Batas file 25 MB berlaku untuk RCS dan MMS. |
| Masa berlaku OTP | 60 sampai 900 detik | Bawaan 300 detik. |
| Percobaan OTP | 5 kali | Habis itu request berstatus failed. |
| Jeda OTP | 60 detik | Maksimal 5 request per jam untuk nomor dan kanal yang sama. |
| Halaman pesan | 1 sampai 1.000 | Bawaan 100 pesan per halaman di detail batch. |
08 / Kode error
Tentukan tindakan dari kode error, bukan pesan.
Pesan error bisa berubah. Kode error adalah enum yang stabil dan dipakai untuk menentukan tindakan.
Geser tabel ke samping untuk melihat kolom lain.
| Item | Nilai | Catatan |
|---|---|---|
| UNAUTHORIZED | 401 | Token tidak dikirim, salah, dicabut, atau kedaluwarsa. |
| FORBIDDEN | 403 | Token tidak punya izin untuk endpoint ini. |
| NOT_FOUND | 404 | ID tidak ada atau bukan milik akun token. |
| IDEMPOTENCY_KEY_REUSED | 409 | Key yang sama dipakai dengan body berbeda. |
| VALIDATION_ERROR | 422 | Field wajib kosong, format salah, atau batas terlampaui. |
| RATE_LIMIT_EXCEEDED | 429 | Tunggu sesuai Retry-After sebelum mencoba lagi. |
| SERVICE_UNAVAILABLE | 503 | Layanan nonaktif atau perangkat WhatsApp tidak tersedia. |
| OTP_DISABLED | 503 | Layanan OTP sedang dinonaktifkan. |
| WHATSAPP_DISABLED | 503 | Layanan WhatsApp sedang dinonaktifkan. |
Daftar lengkap termasuk kode khusus kanal ada di dokumentasi aplikasi.
Butuh contoh lain?
Dokumentasi aplikasi berisi contoh respons, field per endpoint, dan penjelasan setiap nilai enum. Mulai dari sana sebelum menulis integrasi baru.
Buka dokumentasi aplikasiMulai dari token yang tepat.
Buat token dengan izin yang sempit, lalu kirim request pertama dari server kamu.