Dokumentasi API
Integrasikan OTP & verifikasi WhatsApp lewat qwa. Base URL: https://wa.supatmini.com
Mulai cepat
- Login dashboard → Tambah perangkat → tautkan nomor WhatsApp (scan QR).
- Buka perangkat → Buat token. Salin token (hanya tampil sekali).
- Panggil API di bawah dengan header
Authorization: Bearer <token>.
Dua cara verifikasi: Metode 1 — kirim kode OTP ke user (/api/send). Metode 2 — user mengirim pesan berisi token ke nomormu, qwa memverifikasi otomatis (/api/verify/*), risiko ban paling rendah.
Autentikasi
Setiap request API butuh token per-perangkat (dari dashboard). Kirim via header:
Authorization: Bearer <token> # atau X-API-Key: <token>
Token terikat ke satu perangkat. Balasan gagal: 401 token tidak valid, 403 token tak terikat perangkat, 503 perangkat tidak terhubung.
Cek koneksi perangkat sebelum mengirim.
# 200 OK
{"device":"qshop","phone":"628...","status":"connected","connected":true}
Kirim pesan / OTP — Metode 1
3. User mengetik kode di aplikasimu → aplikasimu yang memverifikasi kode.
| to | Nomor tujuan (mis. 628123456789; awalan 0 otomatis jadi 62). |
| text | Isi pesan (kode OTP disusun oleh aplikasimu). |
curl -X POST https://wa.supatmini.com/api/send \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"to":"628123456789","text":"Kode kamu: 4821. Berlaku 5 menit."}'
# 200 OK
{"queued": true, "to": "628123456789"}
Pesan masuk antrean throttle qwa (jeda acak antar kirim) lalu dikirim.
Verifikasi reverse — Metode 2
User membuktikan kepemilikan nomor dengan mengirim pesan berisi token ke nomor perangkatmu. Karena pesan datang dari nomor itu sendiri, kepemilikan terbukti — dan risiko ban rendah (percakapan diawali user).
Kepemilikan terbukti karena pesan datang dari nomor itu sendiri — tak perlu user mengetik kode.
| phone | Nomor yang mau diverifikasi. |
| success_text | Opsional. Balasan otomatis saat verifikasi berhasil. |
| prefill | Opsional. Teks pesan siap-kirim; boleh berisi {token}. |
curl -X POST https://wa.supatmini.com/api/verify/start \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"phone":"628123456789","prefill":"Verifikasi akunku: {token}"}'
# 200 OK
{
"token": "AB2CD",
"wa_number": "628999...",
"wa_link": "https://wa.me/628999...?text=Verifikasi%20akunku%3A%20AB2CD",
"expires_in": 600
}
Arahkan user membuka wa_link (WhatsApp terbuka dengan pesan terisi) lalu kirim. Lalu polling status:
# {"status":"pending"} → belum
# {"status":"verified"} → user sudah mengirim dari nomor yang benar
# {"status":"expired"} → token kedaluwarsa
# {"status":"not_found"}
verified di sisi server. Jangan percaya event/klaim dari klien — qwa hanya menandai verified bila pesan token datang dari nomor yang diklaim.Webhook (opsional, untuk Metode 2)
Set URL webhook per-perangkat di dashboard. qwa mengirim ping saat verifikasi berhasil — kamu tak perlu polling terus-menerus.
# body yang dikirim qwa:
{"event":"verify.verified","token":"AB2CD","phone":"628...","device_id":1,"at":"2026-..."}
GET /api/verify/status?token= (terautentikasi Bearer). Ping palsu tak berbahaya karena otoritas ada di panggilan API bertoken — integrasi jadi simpel, tanpa kriptografi.// Laravel — terima ping → cek status → lanjutkan
Route::post('/api/qwa/webhook', function (Request $r) {
$status = Http::withToken(config('otp.qwa.token'))
->get(config('otp.qwa.url').'/api/verify/status', ['token' => $r->input('token')])
->json('status');
if ($status === 'verified') {
// tandai verified / broadcast ke browser (mis. via WebSocket)
}
return response()->noContent();
});
Contoh integrasi (Laravel)
Driver pluggable: aplikasi membuat & memverifikasi kode; qwa hanya transport. Metode 1:
// config/otp.php → OTP_DRIVER=qwa, QWA_URL, QWA_TOKEN
Http::withToken(config('otp.qwa.token'))
->post(config('otp.qwa.url').'/api/send', [
'to' => $phone, // 62xxxx
'text' => "Kode kamu: $code",
]);
// Metode 2 — induk pegang token, cek status server-side:
$r = Http::withToken($t)->post($url.'/api/verify/start', ['phone'=>$phone])->json();
// tampilkan $r['wa_link'], lalu polling:
$status = Http::withToken($t)->get($url.'/api/verify/status', ['token'=>$r['token']])->json('status');
if ($status === 'verified') { /* lolos */ }
Kirim OTP sebaiknya lewat queue/job agar tidak memblokir request.
Anti-ban
qwa memberi throttle per perangkat: jeda acak antar kirim, batas harian, cooldown per nomor. Balasan metode 2 dikirim langsung (percakapan diawali user).