API di messaggistica
API Invia a più numeri
Invia lo stesso messaggio WhatsApp a più numeri di telefono e gruppi in un'unica richiesta. Usala per piccoli invii broadcast come newsletter, offerte e annunci.
https://wbiztool.com/api/v1/send_msg/multi/Corpo: JSON o campi di un modulo
Wbiztool crea un messaggio per ogni destinatario e restituisce un msg_id per ciascuno, così puoi verificarne lo stato singolarmente.
Esempio rapido#
curl -X POST https://wbiztool.com/api/v1/send_msg/multi/ \
-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,9812345670,Sales Team Mumbai",
"msg": "Our Diwali sale starts tomorrow. Get 20% off on all orders!"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/send_msg/multi/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"country_code": "91",
"phone": ",".join(["9876543210", "9812345670", "Sales Team Mumbai"]),
"msg": "Our Diwali sale starts tomorrow. Get 20% off on all orders!",
},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 400
if result.get("status") == 1:
for item in result["messages"]:
print(item["contact"], "->", item["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/send_msg/multi/", {
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", "9812345670", "Sales Team Mumbai"].join(","),
msg: "Our Diwali sale starts tomorrow. Get 20% off on all orders!",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.status === 1) {
for (const item of result.messages) {
console.log(item.contact, "->", item.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' => implode(',', ['9876543210', '9812345670', 'Sales Team Mumbai']),
'msg' => 'Our Diwali sale starts tomorrow. Get 20% off on all orders!',
];
$ch = curl_init('https://wbiztool.com/api/v1/send_msg/multi/');
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) {
foreach ($result['messages'] as $item) {
echo $item['contact'] . ' -> ' . $item['msg_id'] . PHP_EOL;
}
} 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.
Destinatari e messaggio
phonestringobbligatorioNumeri di telefono e nomi di gruppi in un'unica stringa separata da virgole, ad esempio
9876543210,9812345670,Sales Team Mumbai. Non inviare un array JSON. Vedi Come vengono letti i destinatari.country_codestringfacoltativoPrefisso internazionale senza
+, ad esempio91. Viene aggiunto davanti a ogni numero di telefono, a meno che il numero non inizi già con esso. In JSON, invialo come stringa ("91"), non come numero. Se lo invii come numero, ogni numero di telefono dell'elenco viene trattato come nome di gruppo (is_group: true) e quei messaggi non riescono.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 vedono i destinatari, ad esempio
price-list.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
POSTper ogni messaggio quando viene inviato o non riesce. Il payload è lo stesso di Invia messaggio.
curl -X POST https://wbiztool.com/api/v1/send_msg/multi/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 1,
"country_code": "91",
"phone": "9876543210,9812345670",
"img_url": "https://example.com/offers/diwali-sale.jpg",
"msg": "Our Diwali sale starts tomorrow."
}'Come vengono letti i destinatari#
Wbiztool divide phone in corrispondenza delle virgole, rimuove gli spazi attorno a ogni elemento e poi decide che cos'è ciascun elemento:
- Solo cifre (un
+iniziale o degli zeri iniziali vanno bene): viene trattato come numero di telefono.country_codeviene aggiunto a meno che il numero non inizi già con esso; poi il numero deve avere da 6 a 15 cifre. - Qualsiasi altra cosa: viene trattata come nome di un gruppo WhatsApp, trovato nello stesso modo di Invia a un gruppo.
- Un gruppo il cui nome è composto solo da cifre (ad esempio
2024) viene trattato come numero di telefono, e i nomi di gruppo che contengono virgole non possono essere inviati da questo endpoint. Per questi usa Invia a un gruppo.
Altre cose da sapere:
- I numeri troppo corti o troppo lunghi dopo l'aggiunta del prefisso internazionale vengono saltati senza avviso. Non compaiono nella risposta e non ricevono un
msg_id. - I duplicati non vengono rimossi. Un numero presente due volte riceve due messaggi.
- Se un numero locale inizia per caso con le stesse cifre di
country_code(ad esempio9123456780concountry_code91), il prefisso non viene aggiunto. Invia questi numeri con il prefisso internazionale già incluso (919123456780). - Gli URL di immagini e file non vengono controllati quando chiami l'API. Vengono scaricati al momento dell'invio di ogni messaggio, quindi un link non funzionante fa fallire i messaggi in un secondo momento anziché la richiesta. Valgono le stesse regole di Invia messaggio al momento dell'invio: le immagini oltre 16 MB e i video oltre 64 MB non riescono, l'audio WAV e OGG non è supportato, e ai file (
msg_type2) senza un'estensione supportata viene aggiunto.pdf. Vedi Invio di immagini e file.
Crediti#
L'intero lotto viene confrontato con i tuoi crediti rimanenti prima che venga creato qualsiasi messaggio. Ogni elemento non vuoto di phone conta, compresi quelli che vengono poi saltati. Se il totale supera i tuoi crediti rimanenti, non viene creato alcun messaggio e ricevi:
{
"message": "Not enough credits: 120 messages requested, 85 credits remaining",
"status": 0
}
Anche i messaggi in coda ma non ancora inviati vengono conteggiati sui crediti rimanenti. Dividi gli elenchi grandi in richieste più piccole o ricarica il tuo piano. Per campagne di grandi dimensioni, carica invece un foglio di calcolo dalla pagina Campagne.
Risposta#
Una richiesta riuscita restituisce HTTP 200:
{
"msg_ids": [9817263, 9817264, 9817265],
"messages": [
{ "msg_id": 9817263, "contact": "919876543210", "is_group": false },
{ "msg_id": 9817264, "contact": "919812345670", "is_group": false },
{ "msg_id": 9817265, "contact": "Sales Team Mumbai", "is_group": true }
],
"message": "Successfully created 3 messages",
"status": 1
}
| Campo | Tipo | Descrizione |
|---|---|---|
status | integer | 1 se almeno un messaggio è stato messo in coda, altrimenti 0. |
message | string | Successfully created N messages in caso di successo, altrimenti l'errore. |
msg_ids | array of integers | ID dei messaggi in coda, nell'ordine di phone. Presente solo in caso di successo. |
messages | array | Un oggetto per ogni messaggio in coda. Presente solo in caso di successo. |
messages[].msg_id | integer | ID del messaggio. |
messages[].contact | string | Il numero di telefono con il prefisso internazionale applicato, oppure il nome del gruppo. |
messages[].is_group | boolean | true se l'elemento è stato trattato come nome di gruppo. |
Confronta messages con l'elenco che hai inviato per individuare i numeri saltati e verifica che is_group sia false per ogni elemento che intendevi come numero di telefono.
Errori#
La maggior parte degli errori restituisce HTTP 200 con status impostato su 0, quindi controlla sempre status nel corpo. Tranne che per gli errori HTTP 400 e 403, le risposte (comprese quelle riuscite) sono JSON inviati con Content-Type: text/html, quindi analizza tu stesso il corpo invece di affidarti al rilevamento automatico del JSON (ad esempio negli strumenti no-code):
{ "message": "Invalid whatsapp client", "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. |
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. |
Not enough credits: … messages requested, … credits remaining | Invia a meno destinatari o aggiungi crediti. Vedi Crediti. |
Invalid whatsapp client | Quell'ID whatsapp_client non è nel tuo spazio di lavoro. |
No valid contacts found | Ogni elemento di phone era vuoto o è stato saltato. Verifica che i numeri abbiano da 6 a 15 cifre con il prefisso internazionale. |
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#
- Invia
phonecome stringa: unisci il tuo elenco con le virgole. Un array JSON restituisce{}. - Per ora non usare
send_bulk_messagesdel client Python: invia l'elenco comephones, che questo endpoint ignora. Chiama l'endpoint direttamente come negli esempi sopra. - Traccia ogni messaggio: salva ogni
msg_iddamessages, oppure passa unwebhookper ricevere una notifica quando ciascun messaggio viene inviato o non riesce. - Mantieni il numero collegato: ogni messaggio viene inviato dal tuo numero WhatsApp, quindi deve restare collegato nelle Impostazioni WhatsApp finché non è partito l'intero lotto.
- Testo diverso per ogni persona: questo endpoint invia lo stesso
msga tutti. Chiama Invia messaggio una volta per destinatario per personalizzare ogni messaggio.
