WapFlow OTP API-Referenz
Senden und prüfen Sie Verifizierungscodes von Ihrer eigenen WhatsApp-Nummer. Alle Antworten sind JSON.
Basis-URL: https://wapflow.net/api/otp/v1
Authentifizierung
Senden Sie bei jeder Anfrage den Header Authorization: Bearer <key>. Sie erstellen Schlüssel auf der Seite WapFlow OTP in Ihrem WapFlow-Panel; Live-Schlüssel beginnen mit wfo_live_, Testschlüssel mit wfo_test_. Ein Schlüssel wird nur einmal bei der Erstellung angezeigt – bewahren Sie ihn sicher auf und verwenden Sie ihn ausschließlich auf Ihrem Server.
Eine erfolgreiche Antwort sieht so aus: { "success": true, ... }; ein Fehler so: { "success": false, "error": { "code": "...", "message": "..." } }.
Code senden
phone (erforderlich) ist die Nummer des Empfängers. Optional: code_length (4–8), ttl (60–900 s), lang (z. B. tr, en) und app_name. Was Sie weglassen, wird aus Ihren Panel-Einstellungen übernommen.
{
"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"
}
Code prüfen
phone und code sind erforderlich. Mit request_id wird genau diese Anfrage geprüft; ohne sie der zuletzt an diese Nummer mit diesem Schlüssel gesendete, noch nicht abgelaufene Code. Nach 5 falschen Versuchen wird die Anfrage gesperrt, und ein bestätigter Code kann nicht erneut verwendet werden.
{ "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 }
Status abfragen
Gibt den Status der Anfrage zurück: queued, sent, delivered, read, failed, verified oder expired.
{ "success": true, "request_id": "req_...", "status": "delivered",
"sent_at": "...", "delivered_at": "...", "verified_at": null }
Verbindung testen
Zeigt an, dass der Schlüssel gültig ist, welches Paket Sie haben, wie viele Konten verbunden sind und wie viel vom Kontingent in diesem Monat genutzt wurde (der Button „Verbindung testen“ im WordPress-Plugin verwendet diese Funktion).
{ "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" }
Beispiele
Diese Beispiele senden einen Code und prüfen danach, was der Benutzer eingibt. Ersetzen Sie wfo_live_XXXX durch Ihren eigenen Schlüssel.
# 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 inFehlercodes
| HTTP | Code | Bedeutung |
|---|---|---|
| 400 | invalid_request | Der Anfragetext oder die Parameter sind ungültig. |
| 401 | invalid_key | Der API-Schlüssel ist ungültig oder wurde widerrufen. |
| 402 | no_subscription | Für dieses Konto gibt es kein WapFlow OTP-Abonnement. |
| 402 | subscription_expired | Das Abonnement ist abgelaufen; bitte verlängern Sie es. |
| 403 | sales_disabled | Der Dienst ist vorübergehend nicht verfügbar. |
| 422 | invalid_phone | Die Telefonnummer ist ungültig. |
| 429 | rate_limited | Ratenlimit überschritten; versuchen Sie es nach den in der Antwort angegebenen Sekunden in retry_after erneut. |
| 429 | quota_exceeded | Das Code-Kontingent für diesen Monat ist aufgebraucht. |
| 429 | daily_limit_reached | Das tägliche Versandlimit der verbundenen WhatsApp-Konten wurde erreicht; versuchen Sie es nach den retry_after-Sekunden in der Antwort erneut (am nächsten Tag um 00:00 Uhr, Istanbuler Zeit). Es wird kein Kontingent verbraucht. |
| 503 | no_account_connected | Es gibt kein verbundenes, aktiviertes WhatsApp-Konto. |
| 503 | send_failed | Die Nachricht konnte nicht gesendet werden; versuchen Sie es in Kürze erneut. |
Ratenlimits
- Pro Nummer: 1 Code pro 60 Sekunden, 5 pro Stunde und 10 pro Tag.
- Pro API-Schlüssel: 60 Sendungen pro Minute.
- Pro IP-Adresse: 120 Anfragen pro Minute (inklusive Verifizierung).
- Verifizierung: 10 Versuche pro Minute und Nummer sowie höchstens 5 falsche Versuche pro Code.
- Das monatliche Kontingent richtet sich nach Ihrem Paket; ist es aufgebraucht, wird
quota_exceededzurückgegeben. Testschlüssel verbrauchen kein Kontingent.
Kontoaufwärmung und Tageslimit
- Neu verbundene WhatsApp-Nummern werden aufgewärmt, um das Sperrrisiko zu verringern: an den ersten 3 Tagen 30 Codes pro Tag, an den Tagen 4–7 100 Codes pro Tag, danach 500 Codes pro Tag und Konto (Standardwerte).
- Ein Konto, das sein Tageslimit erreicht, wird übersprungen, und die Codes werden über Ihre anderen verbundenen Konten gesendet. Sind alle ausgelastet, wird
429 daily_limit_reachedzurückgegeben; der Zähler wird um Mitternacht (Istanbuler Zeit) zurückgesetzt. - Für mehr Volumen wählen Sie ein Paket mit mehreren Konten. Testschlüssel sind von diesen Limits nicht betroffen.
Testschlüssel
Schlüssel, die mit wfo_test_ beginnen, senden keine WhatsApp-Nachricht und verbrauchen kein Kontingent; der Code wird im Feld test_code der Antwort zurückgegeben. Die Regeln für Versand und Ratenlimits sind wie bei Live-Schlüsseln, und ein aktives Abonnement ist weiterhin erforderlich. Zum Livebetrieb tauschen Sie einfach den Schlüssel aus.
{ "success": true, "request_id": "req_...", "status": "sent", "test_code": "482913" }
Format der Telefonnummer
- Die Nummer wird auf Ziffern reduziert (+, Leerzeichen und Bindestriche werden entfernt) und muss 10–15 Ziffern lang sein.
- Geben Sie die Ländervorwahl an (z. B.
905321234567). Eine 11-stellige Nummer, die mit 0 beginnt, gilt als türkisch und erhält eine vorangestellte 90. - Eine ungültige Nummer liefert
422 invalid_phone.
Sicherheitshinweise
- Codes werden mit einem kryptografisch sicheren Zufallsgenerator erzeugt und niemals im Klartext gespeichert.
- Verwenden Sie den API-Schlüssel niemals in einem Browser, in einer mobilen App oder in öffentlichem Code; rufen Sie die API von Ihrem Server aus auf.
- Prüfen Sie den Code immer auf dem Server mit
/verify. - WapFlow OTP ist nicht die offizielle WhatsApp-API und garantiert keine Zustellung; halten Sie für kritische Vorgänge einen Ersatzkanal bereit.
WordPress-Plugin
- Laden Sie wapflow-otp.zip herunter.
- Gehen Sie im WordPress-Administrationsbereich zu Plugins → Neu hinzufügen → Plugin hochladen, laden Sie die ZIP-Datei hoch und aktivieren Sie sie.
- Fügen Sie in den Plugin-Einstellungen den API-Schlüssel ein, den Sie im WapFlow-Panel erstellt haben.
- Prüfen Sie mit dem Button „Verbindung testen“ Schlüssel und Paket.
- Probieren Sie es zuerst mit einem Testschlüssel aus und wechseln Sie dann zum Live-Schlüssel.