Messaging-API
An mehrere Nummern senden (Send to Multiple Numbers API)
Senden Sie dieselbe WhatsApp-Nachricht in einem Request an mehrere Telefonnummern und Gruppen. Nutzen Sie die API für kleine Rundsendungen wie Newsletter, Angebote und Ankündigungen.
https://wbiztool.com/api/v1/send_msg/multi/Body: JSON oder Formularfelder
WbizTool erstellt pro Empfänger eine Nachricht und gibt für jede eine msg_id zurück, damit Sie ihren Status einzeln prüfen können.
Kurzes Beispiel#
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');
}Ersetzen Sie 12345, YOUR_API_KEY und 678 durch Ihre eigenen Werte. Wo Sie diese finden, steht unter Authentifizierung.
Request-Parameter#
Authentifizierung
client_idintegererforderlichIhre API-Client-ID aus Einstellungen → API-Schlüssel.
api_keystringerforderlichIhr API-Schlüssel von derselben Seite.
whatsapp_clientintegererforderlichID der WhatsApp-Nummer oder des Telegram-Kontos, von dem gesendet wird, aus den WhatsApp-Einstellungen. Anders als Nachricht senden wählt dieser Endpoint nie automatisch eine Nummer für Sie aus.
Empfänger und Nachricht
phonestringerforderlichTelefonnummern und Gruppennamen in einem kommagetrennten String, zum Beispiel
9876543210,9812345670,Sales Team Mumbai. Senden Sie kein JSON-Array. Siehe Wie Empfänger gelesen werden.country_codestringoptionalInternationale Vorwahl ohne
+, zum Beispiel91. Sie wird vor jede Telefonnummer gesetzt, sofern die Nummer nicht bereits damit beginnt oder mit+oder00geschrieben ist. In JSON funktionieren ein String ("91") und eine Zahl (91) gleichermaßen.msg_typeintegeroptional0Text (Standard),1Bild,2Datei oder Dokument.msgstringErforderlich, wenn msg_type 0 istNachrichtentext. Bei Bildern und Dateien ist es die Bildunterschrift, die leer sein darf. WhatsApp-Formatierung funktioniert:
*bold*,_italic_,~strikethrough~.messagewird als Alias akzeptiert.
Bilder und Dateien
img_urlstringErforderlich, wenn msg_type 1 istÖffentliche
http- oderhttps-URL des Bildes.file_urlstringErforderlich, wenn msg_type 2 istÖffentliche
http- oderhttps-URL, von der die Datei direkt heruntergeladen werden kann.file_namestringoptionalDateiname, den die Empfänger sehen, zum Beispiel
price-list.pdf. Er wird in Kleinbuchstaben gesendet, Zeichen wie& : ? * $ ;werden durch_ersetzt, und er wird auf 150 Zeichen gekürzt. Wenn Sie den Parameter weglassen, wird der Name aus der URL übernommen.
Zustelloptionen
webhookstringoptionalURL, die für jede Nachricht einen
POSTerhält, wenn sie gesendet wird, fehlschlägt, storniert wird oder abläuft. Der Payload ist derselbe wie bei Nachricht senden.
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."
}'Wie Empfänger gelesen werden#
WbizTool teilt phone an den Kommas auf, entfernt Leerzeichen um jeden Eintrag und entscheidet dann, was jeder Eintrag ist:
- Telefonnummern können so geschrieben werden, wie Sie sie haben:
+91 98765 43210,98765-43210,(987) 654-3210,0091 98765 43210und+44 (0)20 7946 0018funktionieren alle, ebenso Tabellenwerte wie919876543210.0und9.19876543210E+11. country_codewird vorangestellt, sofern die Nummer nicht bereits damit beginnt oder mit+oder00geschrieben ist:+44 20 7946 0018mitcountry_code91bleibt442079460018. Eine Liste kann also Länder mischen: Schreiben Sie die Nummern der anderen Länder mit+.- Eine örtliche Nummer mit ihrer führenden
0funktioniert auch:09876543210mitcountry_code91geht an919876543210, und0612345678mit39(Italien, wo die0zur Nummer gehört) geht an390612345678. - Einschließlich Ländervorwahl muss eine Nummer 7 bis 15 Ziffern lang sein.
- Text mit Buchstaben oder anderen Zeichen, zum Beispiel
Sales Team MumbaioderFamily 2024, wird als Name einer WhatsApp-Gruppe behandelt, die genauso gesucht wird wie bei An Gruppe senden. - Ein Gruppenname ohne Buchstaben, zum Beispiel
2024-2025, wird als Telefonnummer gelesen, außer er hat weniger als 10 Ziffern und Ihr Arbeitsbereich hat schon eine Nachricht an eine Gruppe mit genau diesem Namen gesendet (sie steht unter Gruppen in Kontakte). Ein kurzer mit weniger als 7 Ziffern und einem Bindestrich, Punkt oder Klammern, zum Beispiel2024-25oder(2024), ist immer ein Gruppenname. Gruppennamen mit Kommas können über diesen Endpoint nicht gesendet werden. Verwenden Sie dafür An Gruppe senden. - Von einem Telegram-Konto aus ist ein
@username, ein Linkt.me/usernameodertg:<id>eine Person, kein Gruppenname, und eine Telefonnummer geht an diese Person auf Telegram. Von einer WhatsApp-Nummer aus werden Benutzernamen,t.me-Links undtg:<id>übersprungen.
Außerdem wichtig:
- Nummern, die nach dem Hinzufügen der Ländervorwahl zu kurz oder zu lang sind, gerundete Tabellenwerte und Einträge, die nur aus Nullen bestehen (
0,00), werden stillschweigend übersprungen. Sie erscheinen nicht in der Antwort und erhalten keinemsg_id. - Duplikate werden nicht entfernt. Eine doppelt aufgeführte Nummer erhält zwei Nachrichten.
- Wenn eine lokale Nummer zufällig mit denselben Ziffern wie
country_codebeginnt (zum Beispiel9123456780mitcountry_code91), wird die Vorwahl nicht hinzugefügt. Senden Sie solche Nummern mit bereits enthaltener Ländervorwahl (919123456780). - Bild- und Datei-URLs werden beim Aufruf der API nicht geprüft. Sie werden erst beim Senden jeder Nachricht heruntergeladen, daher führt ein defekter Link später zum Fehlschlagen der Nachrichten und nicht des Requests. Es gelten dieselben Regeln beim Senden wie bei Nachricht senden: Bilder über 16 MB und Videos über 64 MB schlagen fehl, WAV- und OGG-Audio kann nicht als Bild (
msg_type1) gesendet werden, und an Dateien (msg_type2) ohne Endung oder mit einer nicht unterstützten wird.pdfangehängt. Siehe Bilder und Dateien senden.
Nachrichtenlimits#
Der gesamte Stapel wird geprüft, bevor etwas erstellt wird, sodass eine Liste nie nur teilweise gesendet wird. Jeder nicht leere Eintrag in phone zählt, auch Einträge, die später übersprungen werden, und Nachrichten, die in der Warteschlange stehen, aber noch nicht gesendet wurden, zählen ebenfalls.
- Jeder Plan: Der Stapel muss in das tägliche Fair-Use-Limit der Absendernummer passen – 1.000 Nachrichten in beliebigen 24 Stunden. Sonst werden keine Nachrichten erstellt und Sie erhalten:
{
"message": "Daily limit reached: a number can send 1,000 messages in 24 hours (fair use). Send the rest tomorrow. 1200 messages requested, 640 more can go out from this number in the next 24 hours.",
"code": "daily_limit_reached",
"status": 0
}
- Kostenloser Plan: Der Stapel muss außerdem in die verbleibenden kostenlosen Nachrichten des Arbeitsbereichs passen (50 in beliebigen 30 Tagen). Sonst erhalten Sie:
{
"message": "Not enough credits: 120 messages requested, 35 credits remaining",
"status": 0
}
Verteilen Sie große Listen auf mehrere Nummern oder Tage. Für große Kampagnen laden Sie stattdessen eine Tabelle auf der Seite Kampagnen hoch.
Antwort#
Ein erfolgreicher Request gibt HTTP 200 zurück:
{
"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
}
| Feld | Typ | Beschreibung |
|---|---|---|
status | integer | 1, wenn mindestens eine Nachricht in die Warteschlange gestellt wurde, sonst 0. |
message | string | Successfully created N messages bei Erfolg, andernfalls der Fehler. |
msg_ids | array of integers | IDs der Nachrichten in der Warteschlange, in der Reihenfolge von phone. Nur bei Erfolg vorhanden. |
messages | array | Ein Objekt pro Nachricht in der Warteschlange. Nur bei Erfolg vorhanden. |
messages[].msg_id | integer | ID der Nachricht. |
messages[].contact | string | Die Telefonnummer mit angewendeter Ländervorwahl oder der Gruppenname. |
messages[].is_group | boolean | true, wenn der Eintrag als Gruppenname behandelt wurde. |
Vergleichen Sie messages mit der gesendeten Liste, um übersprungene Nummern zu finden, und prüfen Sie, dass is_group bei jedem Eintrag, den Sie als Telefonnummer gemeint haben, false ist.
Fehler#
Die meisten Fehler geben HTTP 200 mit status gleich 0 zurück. Prüfen Sie daher immer status im Body. Mit Ausnahme der Fehler mit HTTP 400 und 403 werden Antworten (auch erfolgreiche) als JSON mit Content-Type: text/html gesendet. Parsen Sie den Body daher selbst, statt sich auf die automatische JSON-Erkennung zu verlassen (zum Beispiel in No-Code-Tools):
{ "message": "Invalid whatsapp client", "status": 0 }
| Meldung | Lösung |
|---|---|
Auth Error | Senden Sie client_id und api_key. |
Invalid Client Id | Senden Sie client_id als Zahl. Wird mit HTTP 403 zurückgegeben. |
Auth Error: invalid api key | Prüfen Sie, ob der Schlüssel existiert, nicht gelöscht wurde und zu dieser client_id gehört. Wird mit HTTP 400 zurückgegeben. |
Msg cant be null | Textnachrichten (msg_type 0) benötigen msg. |
Image Url Can't be null | Senden Sie für msg_type 1 eine img_url. |
File Url Can't be null | Senden Sie für msg_type 2 eine file_url. |
Not enough credits: … messages requested, … credits remaining | Die Nachrichten des kostenlosen Plans reichen nicht für die Liste. Senden Sie an weniger Empfänger oder wählen Sie einen Plan. Siehe Nachrichtenlimits. |
Daily limit reached: … messages requested, … more can go out from this number in the next 24 hours. | Verteilen Sie die Liste auf mehrere Tage oder Nummern. Siehe Nachrichtenlimits. |
Invalid whatsapp client | Diese whatsapp_client-ID gehört nicht zu Ihrem Arbeitsbereich. |
No valid contacts found | Jeder Eintrag in phone war leer oder wurde übersprungen. Prüfen Sie, ob die Nummern mit Ländervorwahl 7 bis 15 Ziffern haben. |
Demo Account can not access apis | Verwenden Sie ein reguläres Konto. |
Invalid JSON format: … | Der JSON-Body ist ungültig, oder Sie haben Formularfelder ohne client_id gesendet. |
Tipps#
- Senden Sie
phoneals String: Verbinden Sie Ihre Liste mit Kommas. Ein JSON-Array liefert{}zurück. - Verwenden Sie
send_bulk_messagesdes Python-Clients vorerst nicht: Die Methode sendet die Liste alsphones, was dieser Endpoint ignoriert. Rufen Sie den Endpoint direkt auf, wie in den Beispielen oben. - Jede Nachricht verfolgen: Speichern Sie jede
msg_idausmessagesoder übergeben Sie einenwebhook, um benachrichtigt zu werden, sobald jede Nachricht gesendet wird, fehlschlägt, storniert wird oder abläuft. - Halten Sie Ihre Nummer verbunden: Jede Nachricht wird von Ihrer WhatsApp-Nummer gesendet, daher muss sie in den WhatsApp-Einstellungen verbunden bleiben, bis der gesamte Stapel versendet ist.
- Unterschiedlicher Text pro Person: Dieser Endpoint sendet allen dieselbe
msg. Rufen Sie Nachricht senden einmal pro Empfänger auf, um jede Nachricht zu personalisieren.
