qwa

Dokumentasi API

Integrasikan OTP & verifikasi WhatsApp lewat qwa. Base URL: https://wa.supatmini.com

Mulai Autentikasi Kirim OTP Verifikasi (metode 2) Webhook Contoh Laravel Anti-ban

Mulai cepat

  1. Login dashboard → Tambah perangkat → tautkan nomor WhatsApp (scan QR).
  2. Buka perangkat → Buat token. Salin token (hanya tampil sekali).
  3. 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.

GET https://wa.supatmini.com/api/status

Cek koneksi perangkat sebelum mengirim.

# 200 OK
{"device":"qshop","phone":"628...","status":"connected","connected":true}

Kirim pesan / OTP — Metode 1

Aplikasimu
buat kode OTP
1. POST /api/send
2. pesan WhatsApp
User
terima kode

3. User mengetik kode di aplikasimu → aplikasimu yang memverifikasi kode.

POST https://wa.supatmini.com/api/send
toNomor tujuan (mis. 628123456789; awalan 0 otomatis jadi 62).
textIsi 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).

User
buka wa_link
1. kirim pesan + token
2. cek status
Aplikasimu
polling → lolos

Kepemilikan terbukti karena pesan datang dari nomor itu sendiri — tak perlu user mengetik kode.

POST https://wa.supatmini.com/api/verify/start
phoneNomor yang mau diverifikasi.
success_textOpsional. Balasan otomatis saat verifikasi berhasil.
prefillOpsional. 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:

GET https://wa.supatmini.com/api/verify/status?token=AB2CD
# {"status":"pending"}  → belum
# {"status":"verified"} → user sudah mengirim dari nomor yang benar
# {"status":"expired"}  → token kedaluwarsa
# {"status":"not_found"}
Keamanan: putuskan lolos hanya dari status 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.

POST URL webhook-mu
# body yang dikirim qwa:
{"event":"verify.verified","token":"AB2CD","phone":"628...","device_id":1,"at":"2026-..."}
Tanpa HMAC — sengaja. Ping ini hanya pemberitahuan "ada update". Aplikasimu WAJIB cek ulang ke 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).

Gateway tak resmi tidak menjamin bebas ban. Gunakan nomor khusus, warm-up dulu, jaga volume wajar. Untuk skala besar, migrasi ke WhatsApp Business API resmi.

← Kembali ke dashboard