メッセージングAPI
複数の番号に送信API
1回のリクエストで、同じWhatsAppメッセージを複数の電話番号やグループに送信します。ニュースレター、特典のご案内、お知らせなど、小規模な一斉送信に利用できます。
https://wbiztool.com/api/v1/send_msg/multi/リクエストボディ: JSONまたはフォームフィールド
Wbiztoolは受信者ごとに1件のメッセージを作成し、それぞれのmsg_idを返します。これを使って、各メッセージのステータスを個別に確認できます。
クイック例#
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');
}12345、YOUR_API_KEY、678はご自身の値に置き換えてください。値の確認場所は認証をご覧ください。
リクエストパラメータ#
認証
client_idinteger必須設定 → APIキーに表示されるAPIクライアントIDです。
api_keystring必須同じページにあるAPIキーです。
whatsapp_clientinteger必須送信に使うWhatsApp番号のIDです。WhatsApp設定で確認できます。メッセージ送信APIとは異なり、このエンドポイントが番号を自動で選ぶことはありません。
受信者とメッセージ
phonestring必須電話番号とグループ名をカンマ区切りの1つの文字列で指定します(例:
9876543210,9812345670,Sales Team Mumbai)。JSON配列は送信しないでください。受信者の解釈方法を参照してください。country_codestring任意+を除いた国番号です(例:91)。番号がすでにこの国番号で始まっていない限り、各電話番号の先頭に付加されます。JSONでは数値ではなく文字列("91")で送信してください。数値で送信すると、リスト内のすべての電話番号がグループ名として扱われ(is_group: true)、それらのメッセージは失敗します。msg_typeinteger任意0テキスト(デフォルト)、1画像、2ファイルまたはドキュメント。msgstringmsg_typeが0の場合は必須メッセージ本文です。画像やファイルの場合はキャプションになり、空でもかまいません。WhatsAppの書式(
*bold*、_italic_、~strikethrough~)が使えます。エイリアスとしてmessageも受け付けます。
画像とファイル
img_urlstringmsg_typeが1の場合は必須画像の公開
httpまたはhttpsURLです。file_urlstringmsg_typeが2の場合は必須ファイルを直接ダウンロードできる公開
httpまたはhttpsURLです。file_namestring任意受信者に表示されるファイル名です(例:
price-list.pdf)。小文字で送信され、& : ? * $ ;などの文字は_に置き換えられ、150文字に切り詰められます。省略した場合は、URLから名前が取得されます。
配信オプション
webhookstring任意各メッセージが送信されたとき、または失敗したときに
POSTを受け取るURLです。ペイロードはメッセージ送信と同じです。
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."
}'受信者の解釈方法#
Wbiztoolはphoneをカンマで分割し、各項目の前後のスペースを取り除いたうえで、それぞれの項目の種類を判定します。
- 数字のみ(先頭の
+や先頭のゼロは問題ありません):電話番号として扱われます。番号がすでにcountry_codeで始まっていない限り国コードが付加され、その結果の番号は6〜15桁である必要があります。 - それ以外:WhatsAppのグループ名として扱われ、グループに送信と同じ方法で検索されます。
- 名前が数字のみのグループ(例:
2024)は電話番号として扱われ、カンマを含むグループ名はこのエンドポイントからは送信できません。これらにはグループに送信を使用してください。
そのほかの注意点:
- 国コードを付加した結果、短すぎる・長すぎる番号は通知なくスキップされます。レスポンスには表示されず、
msg_idも発行されません。 - 重複は削除されません。2回指定された番号には2件のメッセージが送信されます。
- ローカル番号がたまたま
country_codeと同じ数字で始まっている場合(例:country_codeが91で番号が9123456780)、国コードは付加されません。そのような番号は国コードを含めた形(919123456780)で送信してください。 - 画像とファイルのURLはAPIの呼び出し時には確認されません。各メッセージの送信時にダウンロードされるため、リンク切れの場合はリクエストではなく、後でメッセージが失敗します。メッセージ送信と同じ送信時のルールが適用されます。16 MBを超える画像と64 MBを超える動画は失敗し、WAVとOGGの音声はサポートされず、対応する拡張子のないファイル(
msg_type2)には.pdfが付加されます。画像とファイルの送信をご覧ください。
クレジット#
メッセージを作成する前に、バッチ全体が残りクレジットと照合されます。phone内の空でない項目はすべて、後でスキップされる項目も含めてカウントされます。件数が残りクレジットを上回る場合、メッセージは1件も作成されず、次のレスポンスが返ります。
{
"message": "Not enough credits: 120 messages requested, 85 credits remaining",
"status": 0
}
キューに登録済みで未送信のメッセージも、残りクレジットから差し引かれます。大きなリストは小さなリクエストに分割するか、プランのクレジットを追加してください。大規模なキャンペーンの場合は、キャンペーンページからスプレッドシートをアップロードしてください。
レスポンス#
リクエストが成功すると、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
}
| フィールド | 型 | 説明 |
|---|---|---|
status | integer | 少なくとも1件のメッセージがキューに登録された場合は1、それ以外は0。 |
message | string | 成功時はSuccessfully created N messages、それ以外はエラー内容。 |
msg_ids | array of integers | キューに登録されたメッセージのID(phoneの順)。成功時のみ含まれます。 |
messages | array | キューに登録されたメッセージごとに1つのオブジェクト。成功時のみ含まれます。 |
messages[].msg_id | integer | メッセージのID。 |
messages[].contact | string | 国コードが適用された電話番号、またはグループ名。 |
messages[].is_group | boolean | 項目がグループ名として扱われた場合はtrue。 |
messagesと送信したリストを照合してスキップされた番号を見つけ、電話番号として指定したすべての項目でis_groupがfalseになっていることを確認してください。
エラー#
ほとんどのエラーはHTTP 200で返り、statusは0になります。必ずボディのstatusを確認してください。HTTP 400と403のエラーを除き、レスポンス(成功時を含む)はContent-Type: text/htmlのJSONとして送信されるため、自動のJSON判定(ノーコードツールなど)に頼らず、ボディをご自身で解析してください。
{ "message": "Invalid whatsapp client", "status": 0 }
| メッセージ | 対処方法 |
|---|---|
Auth Error | client_idとapi_keyの両方を送信してください。 |
Invalid Client Id | client_idを数値で送信してください。HTTP 403で返ります。 |
Auth Error: invalid api key | キーが存在し、削除されておらず、このclient_idに属していることを確認してください。HTTP 400で返ります。 |
Msg cant be null | テキストメッセージ(msg_type 0)にはmsgが必要です。 |
Image Url Can't be null | msg_type 1の場合はimg_urlを送信してください。 |
File Url Can't be null | msg_type 2の場合はfile_urlを送信してください。 |
Not enough credits: … messages requested, … credits remaining | 受信者を減らすか、クレジットを追加してください。クレジットを参照してください。 |
Invalid whatsapp client | そのwhatsapp_client IDはあなたのワークスペースにありません。 |
No valid contacts found | phoneのすべての項目が空か、スキップされました。国コードを含めて6〜15桁の番号になっているか確認してください。 |
Demo Account can not access apis | 通常のアカウントを使用してください。 |
Invalid JSON format: … | JSONボディが無効か、client_idなしでフォームフィールドを送信しています。 |
ヒント#
phoneは文字列で送信する:リストをカンマで連結してください。JSON配列を送ると{}が返ります。- 当面はPythonクライアントの
send_bulk_messagesを使わない:リストをphonesとして送信しますが、このエンドポイントはそれを無視します。上の例のようにエンドポイントを直接呼び出してください。 - 各メッセージを追跡する:
messagesのすべてのmsg_idを保存するか、webhookを指定して各メッセージの送信・失敗の通知を受け取ってください。 - 番号を接続したままにする:すべてのメッセージはあなたのWhatsApp番号から送信されるため、バッチ全体の送信が終わるまでWhatsApp設定で接続を維持する必要があります。
- 受信者ごとに異なるテキスト:このエンドポイントは全員に同じ
msgを送信します。メッセージを個別にパーソナライズするには、受信者ごとにメッセージ送信を呼び出してください。
