Riferimento API WapFlow OTP
Invii e verifichi i codici di verifica dal Suo numero WhatsApp. Tutte le risposte sono in JSON.
URL di base: https://wapflow.net/api/otp/v1
Autenticazione
Invii l'header Authorization: Bearer <key> in ogni richiesta. Le chiavi si creano nella pagina WapFlow OTP del pannello WapFlow; le chiavi live iniziano con wfo_live_, quelle di test con wfo_test_. La chiave viene mostrata solo una volta, al momento della creazione: la conservi in modo sicuro e la usi solo lato server.
Una risposta positiva ha la forma { "success": true, ... }; un errore ha la forma { "success": false, "error": { "code": "...", "message": "..." } }.
Invia un codice
phone (obbligatorio) è il numero del destinatario. Facoltativi: code_length (4–8), ttl (60–900 s), lang (es. tr, en) e app_name. Ciò che omette viene preso dalle impostazioni del pannello.
{
"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"
}
Verifica un codice
phone e code sono obbligatori. Con request_id viene verificata esattamente quella richiesta; senza, l'ultimo codice non scaduto inviato a quel numero con questa chiave. Dopo 5 tentativi errati la richiesta viene bloccata, e un codice già verificato non può essere riutilizzato.
{ "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 }
Controlla lo stato
Restituisce lo stato della richiesta: queued, sent, delivered, read, failed, verified o expired.
{ "success": true, "request_id": "req_...", "status": "delivered",
"sent_at": "...", "delivered_at": "...", "verified_at": null }
Verifica la connessione
Mostra che la chiave è valida, il piano, il numero di account collegati e l'utilizzo della quota del mese (lo usa il pulsante "Verifica connessione" del plugin WordPress).
{ "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" }
Esempi
Questi esempi inviano un codice e poi verificano quello inserito dall'utente. Sostituisca wfo_live_XXXX con la Sua chiave.
# 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 inCodici di errore
| HTTP | Codice | Significato |
|---|---|---|
| 400 | invalid_request | Il corpo della richiesta o i parametri non sono validi. |
| 401 | invalid_key | La chiave API non è valida o è stata revocata. |
| 402 | no_subscription | Questo account non ha un abbonamento WapFlow OTP. |
| 402 | subscription_expired | L'abbonamento è scaduto; lo rinnovi. |
| 403 | sales_disabled | Il servizio è temporaneamente non disponibile. |
| 422 | invalid_phone | Il numero di telefono non è valido. |
| 429 | rate_limited | Limite di frequenza superato; riprovi dopo i secondi indicati in retry_after nella risposta. |
| 429 | quota_exceeded | La quota mensile di codici è esaurita. |
| 429 | daily_limit_reached | È stato raggiunto il limite giornaliero di invio degli account WhatsApp collegati; riprovi dopo i secondi indicati in retry_after nella risposta (il giorno successivo alle 00:00, ora di Istanbul). Non viene consumata alcuna quota. |
| 503 | no_account_connected | Non c'è nessun account WhatsApp collegato e attivo. |
| 503 | send_failed | Impossibile inviare il messaggio; riprovi tra poco. |
Limiti di frequenza
- Per numero: 1 codice ogni 60 secondi, 5 all'ora e 10 al giorno.
- Per chiave API: 60 invii al minuto.
- Per indirizzo IP: 120 richieste al minuto (verifica inclusa).
- Verifica: 10 tentativi al minuto per numero e al massimo 5 tentativi errati per codice.
- La quota mensile dipende dal piano; quando si esaurisce viene restituito
quota_exceeded. Le chiavi di test non consumano quota.
Riscaldamento dell'account e limite giornaliero
- I numeri WhatsApp appena collegati vengono riscaldati per ridurre il rischio di ban: 30 codici al giorno per i primi 3 giorni, 100 al giorno nei giorni 4–7, poi 500 al giorno per account (valori predefiniti).
- Un account che raggiunge il limite giornaliero viene saltato e i codici partono dagli altri account collegati. Se sono tutti esauriti, viene restituito
429 daily_limit_reached; il contatore si azzera a mezzanotte, ora di Istanbul. - Per volumi maggiori, scelga un pacchetto con più account. Le chiavi di test non sono soggette a questi limiti.
Chiavi di test
Le chiavi che iniziano con wfo_test_ non inviano messaggi WhatsApp e non consumano quota; il codice viene restituito nel campo test_code. Le regole di invio e di frequenza sono le stesse delle chiavi live, ed è comunque richiesto un abbonamento attivo. Per passare al live basta cambiare la chiave.
{ "success": true, "request_id": "req_...", "status": "sent", "test_code": "482913" }
Formato del numero di telefono
- Il numero viene ridotto alle sole cifre (+, spazi e trattini vengono eliminati) e deve avere da 10 a 15 cifre.
- Includa il prefisso internazionale (es.
905321234567). Un numero di 11 cifre che inizia con 0 viene considerato turco e gli viene anteposto 90. - Un numero non valido restituisce
422 invalid_phone.
Note sulla sicurezza
- I codici sono generati con un generatore casuale crittograficamente sicuro e non vengono mai memorizzati in chiaro.
- Non usi mai la chiave API in un browser, in un'app mobile o in codice pubblico; effettui le chiamate dal Suo server.
- Controlli sempre il codice sul server con
/verify. - WapFlow OTP non è l'API ufficiale WhatsApp e non garantisce la consegna; per le operazioni critiche mantenga un canale di backup.
Plugin per WordPress
- Scarichi wapflow-otp.zip.
- Nel pannello di amministrazione di WordPress vada su Plugin → Aggiungi nuovo → Carica plugin, carichi lo zip e lo attivi.
- Nelle impostazioni del plugin incolli la chiave API creata nel pannello WapFlow.
- Usi il pulsante "Verifica connessione" per controllare la chiave e il piano.
- Provi prima con una chiave di test, poi inserisca la chiave live.