Referensi API WapFlow OTP
Kirim dan verifikasi kode verifikasi dari nomor WhatsApp Anda sendiri. Semua respons berformat JSON.
Base URL: https://wapflow.net/api/otp/v1
Autentikasi
Kirim header Authorization: Bearer <key> pada setiap permintaan. Anda membuat kunci di halaman WapFlow OTP pada panel WapFlow; kunci live diawali wfo_live_ dan kunci uji diawali wfo_test_. Kunci hanya ditampilkan sekali, saat dibuat — simpan dengan aman dan gunakan hanya di server Anda.
Respons sukses terlihat seperti { "success": true, ... }; respons error terlihat seperti { "success": false, "error": { "code": "...", "message": "..." } }.
Kirim kode
phone (wajib) adalah nomor penerima. Opsional: code_length (4–8), ttl (60–900 dtk), lang (mis. tr, en) dan app_name. Parameter yang tidak Anda isi diambil dari pengaturan panel Anda.
{
"phone": "905321234567",
"code_length": 6,
"ttl": 300,
"lang": "tr",
"app_name": "Acme"
}
{
"success": true,
"request_id": "req_...",
"phone": "905321234567",
"expires_at": "2026-11-12T10:05:00.000Z",
"status": "sent" // "sent" | "queued"
}
Verifikasi kode
phone dan code wajib diisi. Dengan request_id, permintaan tersebut yang diperiksa; tanpa itu, kode terakhir yang belum kedaluwarsa dan dikirim ke nomor tersebut dengan kunci ini. Setelah 5 percobaan salah, permintaan dikunci, dan kode yang sudah terverifikasi tidak bisa dipakai ulang.
{ "request_id": "req_...", "phone": "905321234567", "code": "123456" }
{ "success": true, "valid": true }
{ "success": true, "valid": false,
"reason": "invalid_code", // invalid_code | expired | too_many_attempts | already_verified | not_found
"attempts_left": 3 }
Cek status
Mengembalikan status permintaan: queued, sent, delivered, read, failed, verified, atau expired.
{ "success": true, "request_id": "req_...", "status": "delivered",
"sent_at": "...", "delivered_at": "...", "verified_at": null }
Uji koneksi
Menampilkan bahwa kunci valid, paket Anda, jumlah akun yang terhubung, dan pemakaian kuota bulan ini (tombol "Uji koneksi" pada plugin WordPress menggunakannya).
{ "success": true, "plan": "otp-2",
"accounts": { "limit": 2, "connected": 1 },
"quota": { "monthly": 15000, "used": 42, "period": "2026-11" },
"ends_at": "2026-12-12T10:00:00.000Z", "mode": "live" }
Contoh
Contoh-contoh ini mengirim kode lalu memverifikasi apa yang dimasukkan pengguna. Ganti wfo_live_XXXX dengan kunci Anda sendiri.
# 1) send
curl -X POST https://wapflow.net/api/otp/v1/send \
-H "Authorization: Bearer wfo_live_XXXX" \
-H "Content-Type: application/json" \
-d '{"phone":"905321234567","app_name":"Acme"}'
# 2) verify
curl -X POST https://wapflow.net/api/otp/v1/verify \
-H "Authorization: Bearer wfo_live_XXXX" \
-H "Content-Type: application/json" \
-d '{"request_id":"req_...","phone":"905321234567","code":"123456"}'<?php
function wapflow_otp(string $path, array $body): array {
$ch = curl_init('https://wapflow.net/api/otp/v1' . $path);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('WAPFLOW_OTP_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($body),
]);
$res = json_decode(curl_exec($ch), true) ?: [];
curl_close($ch);
return $res;
}
$sent = wapflow_otp('/send', ['phone' => '905321234567', 'app_name' => 'Acme']);
// ... kullanıcı kodu girince:
$check = wapflow_otp('/verify', ['request_id' => $sent['request_id'], 'phone' => '905321234567', 'code' => $_POST['code']]);
if (!empty($check['valid'])) { /* giriş başarılı */ }const BASE = 'https://wapflow.net/api/otp/v1';
async function otp(path, body) {
const res = await fetch(BASE + path, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WAPFLOW_OTP_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(body),
});
return res.json();
}
const sent = await otp('/send', { phone: '905321234567', app_name: 'Acme' });
// ... when the user submits the code:
const check = await otp('/verify', { request_id: sent.request_id, phone: '905321234567', code: '123456' });
if (check.valid) { /* signed in */ }import os
import requests
BASE = "https://wapflow.net/api/otp/v1"
HEADERS = {"Authorization": "Bearer " + os.environ["WAPFLOW_OTP_KEY"]}
def otp(path, body):
return requests.post(BASE + path, json=body, headers=HEADERS, timeout=15).json()
sent = otp("/send", {"phone": "905321234567", "app_name": "Acme"})
# ... when the user submits the code:
check = otp("/verify", {"request_id": sent["request_id"], "phone": "905321234567", "code": "123456"})
if check.get("valid"):
pass # signed inKode error
| HTTP | Kode | Arti |
|---|---|---|
| 400 | invalid_request | Isi permintaan atau parameter tidak valid. |
| 401 | invalid_key | Kunci API tidak valid atau sudah dicabut. |
| 402 | no_subscription | Akun ini tidak memiliki langganan WapFlow OTP. |
| 402 | subscription_expired | Langganan telah berakhir; silakan perpanjang. |
| 403 | sales_disabled | Layanan sementara tidak tersedia. |
| 422 | invalid_phone | Nomor telepon tidak valid. |
| 429 | rate_limited | Batas laju terlampaui; coba lagi setelah retry_after detik yang ada di respons. |
| 429 | quota_exceeded | Kuota kode bulan ini sudah habis. |
| 429 | daily_limit_reached | Batas pengiriman harian akun WhatsApp yang terhubung telah tercapai; coba lagi setelah jumlah detik retry_after dalam respons (keesokan hari pukul 00:00, waktu Istanbul). Kuota tidak terpakai. |
| 503 | no_account_connected | Tidak ada akun WhatsApp yang terhubung dan aktif. |
| 503 | send_failed | Pesan tidak dapat dikirim; coba lagi sebentar lagi. |
Batas laju
- Per nomor: 1 kode per 60 detik, 5 per jam, dan 10 per hari.
- Per kunci API: 60 pengiriman per menit.
- Per alamat IP: 120 permintaan per menit (termasuk verifikasi).
- Verifikasi: 10 percobaan per menit per nomor, dan maksimal 5 percobaan salah per kode.
- Kuota bulanan bergantung pada paket Anda; jika sudah habis,
quota_exceededdikembalikan. Kunci uji tidak memakai kuota.
Pemanasan akun dan batas harian
- Nomor WhatsApp yang baru terhubung dipanaskan secara bertahap untuk mengurangi risiko pemblokiran: 30 kode per hari selama 3 hari pertama, 100 kode per hari pada hari ke-4–7, lalu 500 kode per hari per akun (nilai default).
- Akun yang mencapai batas harian akan dilewati dan kode dikirim dari akun terhubung lainnya. Jika semua penuh,
429 daily_limit_reacheddikembalikan; penghitung direset pukul 00:00 waktu Istanbul. - Untuk volume lebih besar, pilih paket dengan beberapa akun. Kunci uji tidak terpengaruh oleh batasan ini.
Kunci uji
Kunci yang diawali wfo_test_ tidak mengirim pesan WhatsApp dan tidak memakai kuota; kode dikembalikan pada kolom test_code. Aturan pengiriman dan batas laju sama seperti kunci live, dan langganan aktif tetap diperlukan. Untuk beralih ke mode live, cukup ganti kuncinya.
{ "success": true, "request_id": "req_...", "status": "sent", "test_code": "482913" }
Format nomor telepon
- Nomor diubah menjadi digit saja (+, spasi, dan tanda hubung dibuang) dan harus terdiri dari 10–15 digit.
- Sertakan kode negara (mis.
905321234567). Nomor 11 digit yang diawali 0 dianggap nomor Turki dan 90 ditambahkan di depannya. - Nomor tidak valid mengembalikan
422 invalid_phone.
Catatan keamanan
- Kode dibuat dengan generator acak yang aman secara kriptografis dan tidak pernah disimpan dalam teks biasa.
- Jangan pernah menggunakan kunci API di browser, aplikasi seluler, atau kode publik; lakukan panggilan API dari server Anda.
- Selalu periksa kode di server dengan
/verify. - WapFlow OTP bukan API WhatsApp resmi dan tidak menjamin pengiriman; sediakan saluran cadangan untuk tindakan penting.
Plugin WordPress
- Unduh wapflow-otp.zip.
- Di admin WordPress, buka Plugin → Tambah Baru → Unggah Plugin, unggah file zip, lalu aktifkan.
- Di pengaturan plugin, tempelkan kunci API yang Anda buat di panel WapFlow.
- Gunakan tombol "Uji koneksi" untuk memeriksa kunci dan paket Anda.
- Coba dulu dengan kunci uji, lalu beralih ke kunci live.