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

POST/send

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.

Anfrage
{
  "phone": "905321234567",
  "code_length": 6,
  "ttl": 300,
  "lang": "tr",
  "app_name": "Acme"
}
Antwort (200)
{
  "success": true,
  "request_id": "req_...",
  "phone": "905321234567",
  "expires_at": "2026-11-12T10:05:00.000Z",
  "status": "sent"            // "sent" | "queued"
}

Code prüfen

POST/verify

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.

Anfrage
{ "request_id": "req_...", "phone": "905321234567", "code": "123456" }
Antwort (200)
{ "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

GET/status/:request_id

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

GET/me

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 in

Fehlercodes

HTTPCodeBedeutung
400invalid_requestDer Anfragetext oder die Parameter sind ungültig.
401invalid_keyDer API-Schlüssel ist ungültig oder wurde widerrufen.
402no_subscriptionFür dieses Konto gibt es kein WapFlow OTP-Abonnement.
402subscription_expiredDas Abonnement ist abgelaufen; bitte verlängern Sie es.
403sales_disabledDer Dienst ist vorübergehend nicht verfügbar.
422invalid_phoneDie Telefonnummer ist ungültig.
429rate_limitedRatenlimit überschritten; versuchen Sie es nach den in der Antwort angegebenen Sekunden in retry_after erneut.
429quota_exceededDas Code-Kontingent für diesen Monat ist aufgebraucht.
429daily_limit_reachedDas 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.
503no_account_connectedEs gibt kein verbundenes, aktiviertes WhatsApp-Konto.
503send_failedDie Nachricht konnte nicht gesendet werden; versuchen Sie es in Kürze erneut.

Ratenlimits

Kontoaufwärmung und Tageslimit

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

Sicherheitshinweise

WordPress-Plugin

  1. Laden Sie wapflow-otp.zip herunter.
  2. Gehen Sie im WordPress-Administrationsbereich zu Plugins → Neu hinzufügen → Plugin hochladen, laden Sie die ZIP-Datei hoch und aktivieren Sie sie.
  3. Fügen Sie in den Plugin-Einstellungen den API-Schlüssel ein, den Sie im WapFlow-Panel erstellt haben.
  4. Prüfen Sie mit dem Button „Verbindung testen“ Schlüssel und Paket.
  5. Probieren Sie es zuerst mit einem Testschlüssel aus und wechseln Sie dann zum Live-Schlüssel.