WapFlow OTP API Belgesi
Kendi WhatsApp numaranızdan doğrulama kodu gönderin ve doğrulayın. Tüm yanıtlar JSON'dur.
Temel adres: https://wapflow.net/api/otp/v1
Kimlik doğrulama
Her istekte Authorization: Bearer <anahtar> başlığını gönderin. Anahtarları WapFlow panelindeki WapFlow OTP sayfasından oluşturursunuz; canlı anahtarlar wfo_live_, test anahtarları wfo_test_ ile başlar. Anahtar yalnızca oluşturulurken bir kez gösterilir; güvenle saklayın ve yalnızca sunucu tarafında kullanın.
Başarılı yanıt { "success": true, ... }, hata yanıtı { "success": false, "error": { "code": "...", "message": "..." } } biçimindedir.
Kod gönder
phone (zorunlu) alıcı numarasıdır. İsteğe bağlı: code_length (4–8, varsayılan panel ayarı), ttl (60–900 sn), lang (ör. tr, en) ve app_name. Verilmeyenler panel ayarlarından alınır.
{
"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"
}
Kodu doğrula
phone ve code zorunludur. request_id verirseniz o istek kontrol edilir; vermezseniz bu numaraya bu anahtarla gönderilmiş, süresi dolmamış en son kod. En fazla 5 yanlış denemeden sonra istek kilitlenir; doğrulanan kod tekrar kullanılamaz.
{ "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 }
Durum sorgula
İsteğin durumunu döndürür: queued, sent, delivered, read, failed, verified, expired.
{ "success": true, "request_id": "req_...", "status": "delivered",
"sent_at": "...", "delivered_at": "...", "verified_at": null }
Bağlantıyı test et
Anahtarın geçerli olduğunu, paketinizi, bağlı hesap sayısını ve bu ayki kota kullanımını gösterir (WordPress eklentisindeki "Bağlantıyı test et" düğmesi bunu kullanır).
{ "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" }
Örnekler
Aşağıdaki örnekler kod gönderir ve ardından kullanıcının girdiği kodu doğrular. wfo_live_XXXX yerine kendi anahtarınızı yazın.
# 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 inHata kodları
| HTTP | Kod | Anlamı |
|---|---|---|
| 400 | invalid_request | İstek gövdesi ya da parametreler geçersiz. |
| 401 | invalid_key | API anahtarı geçersiz ya da iptal edilmiş. |
| 402 | no_subscription | Bu hesapta WapFlow OTP aboneliği yok. |
| 402 | subscription_expired | Aboneliğin süresi dolmuş; yenileyin. |
| 403 | sales_disabled | Hizmet geçici olarak kullanıma kapalı. |
| 422 | invalid_phone | Telefon numarası geçersiz. |
| 429 | rate_limited | Hız sınırı aşıldı; yanıttaki retry_after saniye sonra tekrar deneyin. |
| 429 | quota_exceeded | Bu ayki kod kotası doldu. |
| 429 | daily_limit_reached | Bağlı WhatsApp hesaplarının günlük gönderim sınırına ulaşıldı; yanıttaki retry_after saniye sonra (ertesi gün 00:00, Türkiye saati) tekrar deneyin. Kota harcanmaz. |
| 503 | no_account_connected | Bağlı ve açık bir WhatsApp hesabı yok. |
| 503 | send_failed | Mesaj gönderilemedi; kısa süre sonra tekrar deneyin. |
Hız sınırları
- Aynı numaraya: 60 saniyede 1, saatte 5, günde 10 kod.
- API anahtarı başına dakikada 60 gönderim.
- IP adresi başına dakikada 120 istek (doğrulama dahil).
- Doğrulama: numara başına dakikada 10 deneme; kod başına en fazla 5 yanlış deneme.
- Aylık kota paketinize göre değişir; kota dolunca
quota_exceededdöner. Test anahtarı kota harcamaz.
Hesap ısınması ve günlük sınır
- Yeni bağlanan WhatsApp numaraları ban riskini azaltmak için ısınır: ilk 3 gün günde 30, 4–7. gün günde 100 kod; sonrasında hesap başına günde 500 kod (varsayılan değerler).
- Günlük sınırına ulaşan hesap atlanır ve kodlar bağlı diğer hesaplarınızdan gider. Hepsi dolarsa
429 daily_limit_reacheddöner; sayaç Türkiye saatiyle gece yarısı sıfırlanır. - Daha fazla hacim için birden çok hesaplı bir paket seçin. Test anahtarı bu sınırlardan etkilenmez.
Test anahtarları
wfo_test_ ile başlayan anahtarlar WhatsApp'a mesaj göndermez ve kota harcamaz; yanıtta kodu test_code alanında döndürür. Gönderim ve hız kuralları canlı anahtarla aynıdır; aktif abonelik yine gereklidir. Canlıya geçerken yalnızca anahtarı değiştirin.
{ "success": true, "request_id": "req_...", "status": "sent", "test_code": "482913" }
Telefon numarası biçimi
- Numara yalnızca rakamlara indirgenir (+, boşluk ve tireler atılır); 10–15 hane olmalıdır.
- Ülke kodunu ekleyin (ör.
905321234567). 0 ile başlayan 11 haneli numaralar Türkiye sayılır ve başına 90 eklenir. - Geçersiz numara
422 invalid_phonedöndürür.
Güvenlik notları
- Kodlar kriptografik rastgele üretilir ve düz metin olarak saklanmaz.
- API anahtarını tarayıcıda, mobil uygulamada ya da herkese açık kodda kullanmayın; çağrıları sunucunuzdan yapın.
- Kodun doğruluğunu her zaman
/verifyile sunucuda kontrol edin. - WapFlow OTP resmî WhatsApp API'si değildir ve teslimat garantisi vermez; kritik işlemler için yedek kanal bulundurun.
WordPress eklentisi
- wapflow-otp.zip dosyasını indirin.
- WordPress yönetiminde Eklentiler → Yeni ekle → Eklenti yükle ile zip dosyasını yükleyip etkinleştirin.
- Eklenti ayarlarında WapFlow panelinden oluşturduğunuz API anahtarını yapıştırın.
- "Bağlantıyı test et" düğmesiyle anahtarı ve paketinizi doğrulayın.
- Önce test anahtarıyla deneyin, ardından canlı anahtarı girin.