Référence de l'API WapFlow OTP
Envoyez et vérifiez des codes de vérification depuis votre propre numéro WhatsApp. Toutes les réponses sont au format JSON.
URL de base: https://wapflow.net/api/otp/v1
Authentification
Envoyez l'en-tête Authorization: Bearer <key> avec chaque requête. Vous créez les clés sur la page WapFlow OTP de votre panneau WapFlow ; les clés live commencent par wfo_live_ et les clés de test par wfo_test_. Une clé n'est affichée qu'une seule fois, lors de sa création : conservez-la en lieu sûr et utilisez-la uniquement côté serveur.
Une réponse réussie ressemble à { "success": true, ... } ; une erreur ressemble à { "success": false, "error": { "code": "...", "message": "..." } }.
Envoyer un code
phone (obligatoire) est le numéro du destinataire. Facultatifs : code_length (4–8), ttl (60–900 s), lang (ex. tr, en) et app_name. Ce que vous omettez provient des paramètres de votre panneau.
{
"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"
}
Vérifier un code
phone et code sont obligatoires. Avec request_id, cette requête précise est vérifiée ; sans lui, c'est le dernier code non expiré envoyé à ce numéro avec cette clé. Après 5 mauvaises tentatives, la requête est verrouillée, et un code déjà vérifié ne peut pas être réutilisé.
{ "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 }
Consulter le statut
Renvoie le statut de la requête : queued, sent, delivered, read, failed, verified ou expired.
{ "success": true, "request_id": "req_...", "status": "delivered",
"sent_at": "...", "delivered_at": "...", "verified_at": null }
Tester la connexion
Indique que la clé est valide, votre offre, le nombre de comptes connectés et l'utilisation du quota de ce mois-ci (le bouton « Tester la connexion » de l'extension WordPress l'utilise).
{ "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" }
Exemples
Ces exemples envoient un code puis vérifient la saisie de l'utilisateur. Remplacez wfo_live_XXXX par votre propre clé.
# 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 inCodes d'erreur
| HTTP | Code | Signification |
|---|---|---|
| 400 | invalid_request | Le corps de la requête ou les paramètres sont invalides. |
| 401 | invalid_key | La clé API est invalide ou a été révoquée. |
| 402 | no_subscription | Ce compte n'a pas d'abonnement WapFlow OTP. |
| 402 | subscription_expired | L'abonnement a expiré ; veuillez le renouveler. |
| 403 | sales_disabled | Le service est temporairement indisponible. |
| 422 | invalid_phone | Le numéro de téléphone est invalide. |
| 429 | rate_limited | Limite de débit dépassée ; réessayez après les retry_after secondes indiquées dans la réponse. |
| 429 | quota_exceeded | Le quota de codes de ce mois-ci est épuisé. |
| 429 | daily_limit_reached | La limite d'envoi quotidienne des comptes WhatsApp connectés a été atteinte ; réessayez après les secondes indiquées dans retry_after de la réponse (le lendemain à 00h00, heure d'Istanbul). Aucun quota n'est consommé. |
| 503 | no_account_connected | Aucun compte WhatsApp connecté et activé n'existe. |
| 503 | send_failed | Le message n'a pas pu être envoyé ; réessayez dans quelques instants. |
Limites de débit
- Par numéro : 1 code toutes les 60 secondes, 5 par heure et 10 par jour.
- Par clé API : 60 envois par minute.
- Par adresse IP : 120 requêtes par minute (vérification incluse).
- Vérification : 10 tentatives par minute et par numéro, et au plus 5 mauvaises tentatives par code.
- Le quota mensuel dépend de votre offre ; une fois épuisé,
quota_exceededest renvoyé. Les clés de test ne consomment aucun quota.
Préchauffage du compte et limite quotidienne
- Les numéros WhatsApp nouvellement connectés se préchauffent pour réduire le risque de bannissement : 30 codes par jour pendant les 3 premiers jours, 100 par jour les jours 4 à 7, puis 500 par jour et par compte (valeurs par défaut).
- Un compte ayant atteint sa limite quotidienne est ignoré et les codes partent de vos autres comptes connectés. Si tous sont saturés,
429 daily_limit_reachedest renvoyé ; le compteur se réinitialise à minuit, heure d'Istanbul. - Pour plus de volume, choisissez un forfait avec plusieurs comptes. Les clés de test ne sont pas concernées par ces limites.
Clés de test
Les clés commençant par wfo_test_ n'envoient aucun message WhatsApp et ne consomment aucun quota ; le code est renvoyé dans le champ test_code. Les règles d'envoi et de débit sont identiques à celles des clés live, et un abonnement actif reste nécessaire. Pour passer en production, il suffit de remplacer la clé.
{ "success": true, "request_id": "req_...", "status": "sent", "test_code": "482913" }
Format du numéro de téléphone
- Le numéro est réduit à ses chiffres (les +, espaces et tirets sont supprimés) et doit comporter de 10 à 15 chiffres.
- Indiquez l'indicatif pays (ex.
905321234567). Un numéro de 11 chiffres commençant par 0 est considéré comme turc et le préfixe 90 est ajouté. - Un numéro invalide renvoie
422 invalid_phone.
Notes de sécurité
- Les codes sont générés par un générateur aléatoire cryptographiquement sûr et ne sont jamais stockés en clair.
- N'utilisez jamais la clé API dans un navigateur, une application mobile ou du code public ; effectuez les appels depuis votre serveur.
- Vérifiez toujours le code côté serveur avec
/verify. - WapFlow OTP n'est pas l'API WhatsApp officielle et ne garantit pas la livraison ; gardez un canal de secours pour les opérations critiques.
Extension WordPress
- Téléchargez wapflow-otp.zip.
- Dans l'administration WordPress, allez dans Extensions → Ajouter → Téléverser une extension, importez le fichier zip et activez-le.
- Dans les réglages de l'extension, collez la clé API créée dans le panneau WapFlow.
- Utilisez le bouton « Tester la connexion » pour vérifier la clé et votre offre.
- Essayez d'abord avec une clé de test, puis saisissez la clé live.