Endpoint OTP
Semua endpoint OTP di bawah ini dilindungi oleh API key yang dikirim via header Authorization: Bearer <api_key>. API key dibuat dan dikelola di menu API Key pada dashboard SnapOTP. Body request menggunakan format JSON dengan Content-Type: application/json (kecuali Cek Kredit / Riwayat Pengiriman / Statistik yang GET).
Base URL:
https://api.snapotp.com
Autentikasi
Setiap permintaan ke endpoint OTP wajib menyertakan header:
Authorization: Bearer snap_xxxxx
API key tidak boleh diletakkan di body, query string, atau URL path. Hanya lewat header
Authorization.
Kirim OTP
POST /api/otp/send
Authorization: Bearer snap_xxxxx
Content-Type: application/json
Body Parameter
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
phone | string | Ya | Nomor WhatsApp penerima (08xx atau 62xx) |
otp_code | string | Ya | Kode OTP (4–10 digit angka) |
company_name | string | Ya | Nama perusahaan/brand (maks 20 karakter) |
Contoh Permintaan (cURL)
curl -X POST "https://api.snapotp.com/api/otp/send" \
-H "Authorization: Bearer snap_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"phone": "6281234567890",
"otp_code": "482910",
"company_name": "Toko Sumber Jaya"
}'
Contoh Permintaan (JavaScript / fetch)
const response = await fetch('https://api.snapotp.com/api/otp/send', {
method: 'POST',
headers: {
'Authorization': 'Bearer snap_xxxxx',
'Content-Type': 'application/json',
},
body: JSON.stringify({
phone: '6281234567890',
otp_code: '482910',
company_name: 'Toko Sumber Jaya',
}),
});
const result = await response.json();
console.log(result);
Contoh Permintaan (PHP)
$ch = curl_init('https://api.snapotp.com/api/otp/send');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer snap_xxxxx',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'phone' => '6281234567890',
'otp_code' => '482910',
'company_name' => 'Toko Sumber Jaya',
]),
]);
$body = curl_exec($ch);
curl_close($ch);
$result = json_decode($body, true);
Response Sukses (HTTP 200)
{
"success": true,
"message": "OTP berhasil dikirim.",
"data": {
"message_id": "whatsapp_message_id",
"recipient": "0812****xxx",
"credit_used": 200,
"credit_balance": 5000
}
}
Response Gagal
{
"success": false,
"message": "Kredit tidak cukup.",
"credit_balance": 100
}
Daftar Pesan Gagal Umum
| Pesan | Penyebab |
|---|---|
API key diperlukan. Kirim via header Authorization: Bearer <api_key>. | Header Authorization kosong |
API key tidak valid atau tidak aktif. | API key salah atau non-aktif |
Parameter tidak lengkap... | Ada field wajib kosong |
Nomor telepon tidak valid. | Bukan format 62xxx/10–15 digit |
Nama perusahaan maksimal 20 karakter. | company_name lebih dari 20 karakter |
Kode OTP harus 4-10 digit angka. | otp_code di luar jangkauan |
Rate limit tercapai... | Sudah melewati batas kirim per menit |
Kredit tidak cukup. | Saldo kredit < 200 |
OTP serupa baru saja dikirim... | Idempotency 5 menit untuk nomor + kode yang sama |
Tidak ada device WhatsApp yang tersedia... | Pool device kosong |
Gagal mengirim OTP: ... | Waha mengembalikan error (lihat error_message) |
Cek Kredit
GET /api/otp/credit
Authorization: Bearer snap_xxxxx
Contoh Permintaan (cURL)
curl "https://api.snapotp.com/api/otp/credit" \
-H "Authorization: Bearer snap_xxxxx"
Response
{
"success": true,
"data": {
"credit_balance": 5000,
"currency": "IDR",
"rate": "1 IDR = 1 kredit"
}
}
Riwayat Pengiriman
GET /api/otp/history?page=1&limit=20
Authorization: Bearer snap_xxxxx
Contoh Permintaan (cURL)
curl "https://api.snapotp.com/api/otp/history?page=1&limit=20" \
-H "Authorization: Bearer snap_xxxxx"
Response
{
"success": true,
"data": {
"total": 150,
"page": 1,
"limit": 20,
"items": [
{
"id": 1,
"recipient": "0812****xxx",
"company_name": "SnapOTP",
"status": "sent",
"credit_used": 200,
"created_at": "2025-01-01 12:00:00"
}
]
}
}
Statistik
GET /api/otp/stats
Authorization: Bearer snap_xxxxx
Contoh Permintaan (cURL)
curl "https://api.snapotp.com/api/otp/stats" \
-H "Authorization: Bearer snap_xxxxx"
Response
{
"success": true,
"data": {
"total_sent": 120,
"total_failed": 3,
"today_count": 12
}
}