Skip to main content

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

ParameterTipeWajibKeterangan
phonestringYaNomor WhatsApp penerima (08xx atau 62xx)
otp_codestringYaKode OTP (4–10 digit angka)
company_namestringYaNama 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

PesanPenyebab
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
}
}