API di messaggistica
API Pianifica messaggi WhatsApp
Pianifica l'invio di un testo, un'immagine o un documento WhatsApp a un numero di telefono o a un gruppo, alla data e all'ora che scegli. Usala per promemoria di appuntamenti, auguri di compleanno, follow-up e offerte a tempo.
https://wbiztool.com/api/v1/schedule_msg/Corpo: JSON o campi di un modulo
Il messaggio attende nella tua coda fino all'orario pianificato e viene poi inviato dal tuo numero WhatsApp. La risposta ti restituisce un msg_id che puoi usare per verificarne lo stato o annullarlo.
Esempio rapido#
curl -X POST https://wbiztool.com/api/v1/schedule_msg/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"country_code": "91",
"phone": "9876543210",
"msg": "Hi Aman, a reminder that your appointment is today at 11:30 AM.",
"date": "24/12/2026",
"time": "09:00",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/schedule_msg/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"country_code": "91",
"phone": "9876543210",
"msg": "Hi Aman, a reminder that your appointment is today at 11:30 AM.",
"date": "24/12/2026",
"time": "09:00",
"timezone": "Asia/Kolkata",
},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 400
if result.get("status") == 1:
print("Scheduled with msg_id", result["msg_id"])
else:
print("Failed:", result.get("message", "no message in response"))// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/schedule_msg/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
msg_type: 0,
country_code: "91",
phone: "9876543210",
msg: "Hi Aman, a reminder that your appointment is today at 11:30 AM.",
date: "24/12/2026",
time: "09:00",
timezone: "Asia/Kolkata",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.status === 1) {
console.log("Scheduled with msg_id", result.msg_id);
} else {
console.error("Failed:", result.message ?? "no message in response");
}<?php
$payload = [
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'msg_type' => 0,
'country_code' => '91',
'phone' => '9876543210',
'msg' => 'Hi Aman, a reminder that your appointment is today at 11:30 AM.',
'date' => '24/12/2026',
'time' => '09:00',
'timezone' => 'Asia/Kolkata',
];
$ch = curl_init('https://wbiztool.com/api/v1/schedule_msg/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($result['status'] ?? 0) === 1) {
echo 'Scheduled with msg_id ' . $result['msg_id'];
} else {
echo 'Failed: ' . ($result['message'] ?? 'no message in response');
}Sostituisci 12345, YOUR_API_KEY e 678 con i tuoi valori. Consulta Autenticazione per sapere dove trovarli.
Parametri della richiesta#
Autenticazione
client_idintegerobbligatorioIl tuo ID Client API, da Impostazioni → Chiavi API.
api_keystringobbligatorioLa tua chiave API, dalla stessa pagina.
whatsapp_clientintegerobbligatorioID del numero WhatsApp da cui inviare, dalle Impostazioni WhatsApp. A differenza di Invia messaggio, questo endpoint non sceglie mai un numero al posto tuo.
Pianificazione
datestringobbligatorioGiorno di invio del messaggio, nel formato
dd/mm/yyyy, ad esempio24/12/2026.timestringobbligatorioOra di invio del messaggio, nel formato 24 ore
HH:MM, ad esempio09:00o18:45. Non includere i secondi.timezonestringfacoltativoFuso orario in cui sono espressi
dateetime. Se lo ometti, il valore predefinito èIST(India). Vedi Fusi orari.
Destinatario e messaggio
phonestringObbligatorio se non invii group_nameIl numero WhatsApp del destinatario, solo cifre. Spazi,
+,-,.e parentesi vengono rimossi automaticamente. Invia il numero con il prefisso internazionale (919876543210) oppure senza (9876543210) insieme acountry_code.group_namestringObbligatorio se non invii phoneNome di un gruppo WhatsApp di cui fa parte il tuo numero. Viene trovato nello stesso modo di Invia a un gruppo. Invia
phoneogroup_name, mai entrambi.country_codestringfacoltativoPrefisso internazionale senza
+, ad esempio91per l'India o1per gli USA. Viene aggiunto davanti aphone, a meno che il numero non inizi già con esso. Eccezione: con91, a un numero di 10 cifre viene sempre aggiunto il prefisso. Con altri prefissi, invia i numeri locali che iniziano con le stesse cifre già comprensivi del prefisso internazionale. Ignorato per i gruppi.msg_typeintegerfacoltativo0testo (predefinito),1immagine,2file o documento.msgstringObbligatorio quando msg_type è 0Testo del messaggio. Per immagini e file è la didascalia e può essere vuoto. La formattazione di WhatsApp funziona:
*bold*,_italic_,~strikethrough~.messageè accettato come alias.
Immagini e file
img_urlstringObbligatorio quando msg_type è 1URL pubblico
httpohttpsdell'immagine.file_urlstringObbligatorio quando msg_type è 2URL pubblico
httpohttpsda cui il file può essere scaricato direttamente.file_namestringfacoltativoNome del file che vede il destinatario, ad esempio
invoice-4821.pdf. Viene inviato in minuscolo, caratteri come& : ? * $ ;vengono sostituiti con_e viene troncato a 150 caratteri. Se lo ometti, il nome viene preso dall'URL.
Opzioni di consegna
webhookstringfacoltativoURL che riceve una
POSTquando il messaggio viene inviato o non riesce. Il payload è lo stesso di Invia messaggio.
Quando viene inviato il messaggio#
- Wbiztool converte
date,timeetimezonein un unico istante e invia il messaggio una volta superato quell'istante, purché il tuo numero WhatsApp sia collegato. - È accettato anche un orario nel passato. Il messaggio viene inviato subito, come un invio normale. Ricontrolla il formato della data (
dd/mm/yyyy, prima il giorno) per non inviare un messaggio con mesi di anticipo. - Se il tuo numero è scollegato all'orario pianificato, il messaggio attende e parte non appena il numero si ricollega, anche se ciò avviene molto più tardi del previsto. Questo endpoint non prevede una scadenza, quindi annulla il messaggio se non è più rilevante. Un messaggio ancora in attesa su un numero disconnesso o eliminato 90 giorni dopo l'orario pianificato viene eliminato.
- Finché non viene inviato, il messaggio ha stato
0(Created) e può essere annullato. Mentre attende, viene anche conteggiato sui tuoi crediti rimanenti.
Fusi orari#
timezone accetta un nome di fuso orario oppure una delle abbreviazioni riportate sotto.
Nomi di fuso orario come Asia/Kolkata, America/New_York, Europe/London o Australia/Sydney. Funziona qualsiasi nome del database dei fusi orari IANA. È l'opzione più affidabile. Consulta il Riferimento fusi orari per un elenco.
Abbreviazioni: devono essere in lettere maiuscole. Ognuna corrisponde a una regione e l'ora legale di quella regione viene applicata automaticamente:
| Abbreviazione | Interpretata come |
|---|---|
IST | Asia/Kolkata |
UTC | UTC |
GMT | GMT |
EST | US/Eastern |
CST | US/Central |
MST | US/Mountain |
PST | US/Pacific |
CET, CEST | Europe/Paris |
EET, EEST | Europe/Athens |
JST | Asia/Tokyo |
AEST, AEDT | Australia/Sydney |
Ad esempio, EST a luglio indica l'ora legale di New York (UTC−4), non un UTC−5 fisso.
Pianificare per un gruppo#
curl -X POST https://wbiztool.com/api/v1/schedule_msg/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"group_name": "Sales Team Mumbai",
"msg": "Team meeting starts in 15 minutes.",
"date": "24/12/2026",
"time": "14:45",
"timezone": "Asia/Kolkata"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/schedule_msg/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"group_name": "Sales Team Mumbai",
"msg": "Team meeting starts in 15 minutes.",
"date": "24/12/2026",
"time": "14:45",
"timezone": "Asia/Kolkata",
},
timeout=60,
)
print(response.json())// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/schedule_msg/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
msg_type: 0,
group_name: "Sales Team Mumbai",
msg: "Team meeting starts in 15 minutes.",
date: "24/12/2026",
time: "14:45",
timezone: "Asia/Kolkata",
}),
});
console.log(await response.json());<?php
$ch = curl_init('https://wbiztool.com/api/v1/schedule_msg/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'msg_type' => 0,
'group_name' => 'Sales Team Mumbai',
'msg' => 'Team meeting starts in 15 minutes.',
'date' => '24/12/2026',
'time' => '14:45',
'timezone' => 'Asia/Kolkata',
]),
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
curl_close($ch);Risposta#
Una richiesta riuscita restituisce HTTP 200:
{
"msg_id": 9817263,
"message": "Created",
"status": 1
}
| Campo | Tipo | Descrizione |
|---|---|---|
status | integer | 1 se il messaggio è stato pianificato, 0 se la richiesta non è riuscita. |
message | string | Created in caso di successo, altrimenti l'errore. |
msg_id | integer | ID del messaggio pianificato. Salvalo per verificarne lo stato o annullarlo in seguito. Presente solo in caso di successo. |
La risposta non riporta l'orario né il fuso orario pianificati, quindi registra tu ciò che hai inviato.
Errori#
La maggior parte degli errori restituisce HTTP 200 con status impostato su 0, quindi controlla sempre status nel corpo:
{ "message": "Scheduled date & time is not in valid format", "status": 0 }
| Messaggio | Come risolvere |
|---|---|
Auth Error | Invia sia client_id sia api_key. |
Invalid Client Id | Invia client_id come numero. Restituito con HTTP 403. |
Auth Error: invalid api key | Verifica che la chiave esista, non sia stata eliminata e appartenga a questo client_id. Restituito con HTTP 400. |
Either phone or group_name parameter is required | Aggiungi phone o group_name. |
Please provide either phone OR group_name, not both | Rimuovi uno dei due. |
Invalid phone number | phone deve contenere solo cifre (da 6 a 17), eventualmente precedute da +. |
Invalid Contact Number "…" | Con il prefisso internazionale aggiunto, il numero deve avere da 6 a 15 cifre. |
Msg cant be null | I messaggi di testo (msg_type 0) richiedono msg. |
Image Url Can't be null | Per msg_type 1, invia img_url. |
File Url Can't be null | Per msg_type 2, invia file_url. |
Scheduled date & time is not in valid format | date o time mancano, oppure timezone è una stringa vuota. |
Not enough credits | Il tuo piano non ha più messaggi disponibili. |
Demo Account can not access apis | Usa un account normale. |
Invalid JSON format: … | Il corpo JSON non è valido, oppure hai inviato campi di un modulo senza client_id. |
Suggerimenti#
-
Costruisci la data con attenzione: in Python usa
strftime("%d/%m/%Y")estrftime("%H:%M"). In JavaScript, formatta data e ora nello stesso fuso orario che invii intimezone, non nell'ora locale del tuo server:const tz = "Asia/Kolkata"; // d is the Date to send at const date = new Intl.DateTimeFormat("en-GB", { timeZone: tz, day: "2-digit", month: "2-digit", year: "numeric" }).format(d); // "24/12/2026" const time = new Intl.DateTimeFormat("en-GB", { timeZone: tz, hour: "2-digit", minute: "2-digit", hourCycle: "h23" }).format(d); // "09:00" -
Verifica l'orario: pianifica un messaggio di prova cinque minuti più avanti e controlla che arrivi quando te lo aspetti.
-
Cambio di programma: per ripianificare, annulla il messaggio e pianificane uno nuovo.
-
Per ora non usare i client ufficiali per pianificare:
schedule_messagedi Python invia la data comeYYYY-MM-DD(la risposta è{}), escheduleMessagedi Node inviaschedule_time, che questo endpoint non legge. Chiama direttamente l'endpoint come mostrato sopra. -
Messaggi ricorrenti: per i messaggi che si ripetono, come i promemoria di pagamento mensili, consulta Crea promemoria.
