メッセージングAPI
メッセージ送信API
接続済みのWhatsApp番号から、1つの電話番号にWhatsAppのテキスト、画像、ドキュメントを送信します。注文確認、支払いリマインダー、アラート、サポートの返信などに利用できます。
https://wbiztool.com/api/v1/send_msg/リクエストボディ: JSON、フォームフィールド、またはファイルをアップロードする場合はmultipart/form-data
メッセージはキューに登録され、すぐにあなたのWhatsApp番号から送信されます。レスポンスにはmsg_idが含まれ、これを使ってステータスを確認できます。
クイック例#
curl -X POST https://wbiztool.com/api/v1/send_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, your order #4821 has shipped and will arrive on Thursday."
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/send_msg/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 0,
"country_code": "91",
"phone": "9876543210",
"msg": "Hi Aman, your order #4821 has shipped and will arrive on Thursday.",
},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 400
if result.get("status") == 1:
print("Queued with msg_id", result["msg_id"])
else:
print("Failed:", result.get("message"))// 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/", {
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, your order #4821 has shipped and will arrive on Thursday.",
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.status === 1) {
console.log("Queued with msg_id", result.msg_id);
} else {
console.error("Failed:", result.message);
}<?php
$payload = [
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'msg_type' => 0,
'country_code' => '91',
'phone' => '9876543210',
'msg' => 'Hi Aman, your order #4821 has shipped and will arrive on Thursday.',
];
$ch = curl_init('https://wbiztool.com/api/v1/send_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 'Queued with msg_id ' . $result['msg_id'];
} else {
echo 'Failed: ' . ($result['message'] ?? 'no response');
}12345、YOUR_API_KEY、678はご自身の値に置き換えてください。値の確認場所は認証をご覧ください。
リクエストパラメータ#
認証
client_idinteger必須設定 → APIキーに表示されるAPIクライアントIDです。
api_keystring必須同じページにあるAPIキーです。
whatsapp_clientinteger番号が複数ある場合は必須送信に使うWhatsApp番号のIDです。WhatsApp設定で確認できます。省略した場合、ワークスペースに接続済みの番号がちょうど1つであれば、その番号が使われます。
受信者とメッセージ
phonestring必須受信者のWhatsApp番号で、数字のみです。スペース、
+、-、.、括弧は自動的に削除されます。番号は国コード付き(919876543210)で送信するか、国コードなし(9876543210)でcountry_codeと一緒に送信してください。フォームフィールドでは、先頭の市外局番の0(09876543210)を含めないでください。country_codeが付加される前に削除されないため、メッセージが誤った番号に届きます。JSONリクエストでは自動的に削除されます。country_codestring任意+を除いた国番号です。例:インドは91、米国は1。番号がすでにこの国番号で始まっていない限り、phoneの先頭に付加されます。例外として、91の場合、10桁の番号には常に国番号が付加されます。その他の国番号では、同じ数字で始まる国内番号には付加されないため、国番号を含めた番号で送信してください。msg_typeinteger任意0テキスト(デフォルト)、1画像、2ファイルまたはドキュメント。msgstringmsg_typeが0の場合は必須メッセージ本文で、最大3,000文字です。画像やファイルの場合はキャプションになり、空でもかまいません。WhatsAppの書式(
*bold*、_italic_、~strikethrough~)が使えます。エイリアスとしてmessageも受け付けます。
画像とファイル
img_urlstringmsg_typeが1でファイルをアップロードしない場合は必須画像の公開
httpまたはhttpsURLです。file_urlstringmsg_typeが2でファイルをアップロードしない場合は必須ファイルを直接ダウンロードできる公開
httpまたはhttpsURLです。filefile任意URLを指定する代わりに、画像やファイルをアップロードします。リクエストを
multipart/form-dataとして送信し、フィールド名はfileにしてください。file_namestring任意受信者に表示されるファイル名です(例:
invoice-4821.pdf)。拡張子によってファイルの送信方法が決まるため、必ず拡張子を含めてください。小文字で送信され、& : ? * $ ;などの文字は_に置き換えられ、150文字に切り詰められます。省略した場合は、URLまたはアップロードされたファイルから名前が取得されます。
配信オプション
expire_after_secondsinteger任意この秒数以内に送信されなかった場合、メッセージを期限切れ(ステータス
4)にします。例:1時間なら3600。配達予定時刻など、時間に左右されるメッセージに便利です。この処理は期限から少なくとも30秒後にバックグラウンドジョブで行われるため、1分未満の期限には頼らないでください。webhookstring任意メッセージが送信されたとき、または失敗したときに
POSTを受け取るURLです。Webhookを参照してください。
画像とファイルの送信#
img_urlとfile_urlのダウンロード制限:
- URLは公開されている必要があります。インターネットからアクセスできる
httpまたはhttpsのURLを指定してください。リダイレクトは最大5回までたどられ、各リダイレクト先も公開アドレスである必要があります。 - リンク先のファイルは最大100 MBです。サーバーは45秒以内に応答を開始し、それ以上停止しないようにする必要があります。
- ファイルはAPIを呼び出した時点で取得されるため、リンク切れの場合はその場で
Invalid file urlとして失敗します。
対応している拡張子:.pdf、.xlsx、.xls、.txt、.docx、.png、.jpg、.jpeg、.webp、.mp3、.mpga、.m4a、.mp4、.webm。
以下のチェックはAPIの呼び出し時ではなくメッセージの送信時に行われるため、失敗はメッセージのステータスとWebhookにのみ表示されます。
| 問題 | メッセージのステータスのerror |
|---|---|
16 MBを超える画像(msg_type 1) | File exceeds WhatsApp size limit (16MB max) |
64 MBを超える動画(.mp4、.webm)、または空のファイル | File exceeds WhatsApp size limit (…) |
.oggファイル、または画像(msg_type 1)として送信した.wavファイル | File type not supported |
WAVとOGGの音声はサポートされていません。ファイル(msg_type 2)として送信した.wavファイルは拒否されませんが、recording.wav.pdfとして届きます。音声は事前に.mp3または.m4aに変換してください。
curl -X POST https://wbiztool.com/api/v1/send_msg/ \
-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",
"img_url": "https://example.com/offers/diwali-sale.jpg",
"msg": "Our Diwali sale starts today 🎉"
}'import requests
response = requests.post(
"https://wbiztool.com/api/v1/send_msg/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 1,
"country_code": "91",
"phone": "9876543210",
"img_url": "https://example.com/offers/diwali-sale.jpg",
"msg": "Our Diwali sale starts today 🎉",
},
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/send_msg/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
msg_type: 1,
country_code: "91",
phone: "9876543210",
img_url: "https://example.com/offers/diwali-sale.jpg",
msg: "Our Diwali sale starts today 🎉",
}),
});
console.log(await response.json());<?php
$ch = curl_init('https://wbiztool.com/api/v1/send_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' => 1,
'country_code' => '91',
'phone' => '9876543210',
'img_url' => 'https://example.com/offers/diwali-sale.jpg',
'msg' => 'Our Diwali sale starts today 🎉',
]),
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
curl_close($ch);curl -X POST https://wbiztool.com/api/v1/send_msg/ \
-F client_id=12345 \
-F api_key=YOUR_API_KEY \
-F whatsapp_client=678 \
-F msg_type=2 \
-F country_code=91 \
-F phone=9876543210 \
-F "msg=Your invoice for order #4821 is attached." \
-F file_name=invoice-4821.pdf \
-F file=@./invoice-4821.pdfimport requests
with open("invoice-4821.pdf", "rb") as f:
response = requests.post(
"https://wbiztool.com/api/v1/send_msg/",
data={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"whatsapp_client": 678,
"msg_type": 2,
"country_code": "91",
"phone": "9876543210",
"msg": "Your invoice for order #4821 is attached.",
"file_name": "invoice-4821.pdf",
},
files={"file": f},
timeout=120,
)
print(response.json())// Node.js 20+ (built-in fetch, FormData and fs.openAsBlob). Save as .mjs to use top-level await.
import { openAsBlob } from "node:fs";
const form = new FormData();
form.append("client_id", "12345");
form.append("api_key", "YOUR_API_KEY");
form.append("whatsapp_client", "678");
form.append("msg_type", "2");
form.append("country_code", "91");
form.append("phone", "9876543210");
form.append("msg", "Your invoice for order #4821 is attached.");
form.append("file_name", "invoice-4821.pdf");
form.append("file", await openAsBlob("./invoice-4821.pdf"), "invoice-4821.pdf");
// Don't set Content-Type yourself; fetch adds the multipart boundary.
const response = await fetch("https://wbiztool.com/api/v1/send_msg/", { method: "POST", body: form });
console.log(await response.json());<?php
$ch = curl_init('https://wbiztool.com/api/v1/send_msg/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
// An array body (not json_encode) makes cURL send multipart/form-data.
CURLOPT_POSTFIELDS => [
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'whatsapp_client' => 678,
'msg_type' => 2,
'country_code' => '91',
'phone' => '9876543210',
'msg' => 'Your invoice for order #4821 is attached.',
'file_name' => 'invoice-4821.pdf',
'file' => new CURLFile('/path/to/invoice-4821.pdf', 'application/pdf', 'invoice-4821.pdf'),
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120,
]);
echo curl_exec($ch);
curl_close($ch);公式クライアントを使う#
PythonとNode.jsのクライアントは、このエンドポイントを代わりに呼び出します。
from wbiztool_client import WbizToolClient
client = WbizToolClient(api_key="YOUR_API_KEY", client_id="12345")
result = client.send_message(
phone="9876543210",
country_code="91",
msg="Hi Aman, your order #4821 has shipped.",
whatsapp_client=678,
)
print(result)エラーではrequests.HTTPErrorが発生します。理由はe.response.json()["message"]で確認してください。
const { WbizToolClient } = require("wbiztool-client");
const client = new WbizToolClient({
clientId: 12345,
apiKey: "YOUR_API_KEY",
whatsappClient: 678,
});
(async () => {
// Errors throw, with the API's response in the error message.
const result = await client.sendMessage({
phone: "9876543210",
countryCode: "91",
message: "Hi Aman, your order #4821 has shipped.",
});
console.log(result);
})().catch(console.error);レスポンス#
リクエストが成功すると、HTTP 200が返ります。
{
"status": 1,
"message": "Created",
"msg_id": 9817263
}
| フィールド | 型 | 説明 |
|---|---|---|
status | integer | メッセージがキューに登録された場合は1、リクエストが失敗した場合は0。 |
message | string | 成功時はCreated、それ以外はエラー内容。 |
msg_id | integer | キューに登録されたメッセージのID。後でステータスを確認するために保存してください。成功時のみ含まれます。 |
"status": 1はメッセージがキューに登録されたことを意味し、受信者に届いたことを意味するわけではありません。送信されたことを確認するには、Webhookまたはメッセージのステータスを使用してください。
エラー#
エラーはHTTP 400で返り、statusは0になります(Account Disabledにはstatusフィールドがありません)。
{ "status": 0, "message": "Msg cant be null" }
| メッセージ | 対処方法 |
|---|---|
Auth Error - Please send correct API key and Client id | 空でないapi_keyを送信してください。 |
Invalid client id. | client_idを数値で送信してください。 |
Auth Error: invalid api key | キーが存在し、削除されておらず、このclient_idに属していることを確認してください。 |
Either phone or group_name parameter is required | phoneを追加してください。 |
Please provide either phone OR group_name, not both | どちらか一方を削除してください。 |
Invalid phone number | phoneは数字のみ(6〜17桁)で、先頭に+を付けることもできます。 |
Invalid Contact Number "…" | 国コードを付加した番号が6〜15桁である必要があります。 |
Msg cant be null | テキストメッセージ(msg_type 0)にはmsgが必要です。 |
Message length is too long | msgは3,000文字以内にしてください。 |
Image Url Can't be null | msg_type 1の場合は、img_urlを送信するかfileをアップロードしてください。 |
File Url Can't be null | msg_type 2の場合は、file_urlを送信するかfileをアップロードしてください。 |
Invalid file url, Can't download / Invalid file url | URLが公開されていない、タイムアウトした、またはファイルが100 MBを超えています。 |
Invalid whatsapp client | そのwhatsapp_client IDはあなたのワークスペースにありません。 |
Invalid whatsapp client id. | whatsapp_clientを送信してください。ワークスペースに接続済みの番号が複数ある場合は必須です。 |
Not enough credits | プランの残りメッセージ数がありません。 |
Demo Account can not access apis | 通常のアカウントを使用してください。 |
Account Disabled | アカウントが無効化されています。サポートにお問い合わせください。 |
Invalid JSON format: … | JSONボディが無効です。末尾のカンマや、msg内のエスケープされていない改行が原因であることがよくあります。改行には\nを使用してください。 |
キューに追加されたメッセージも、送信時にFile exceeds WhatsApp size limit (…)などで失敗することがあります。これらのエラーはこのレスポンスには表示されません。画像とファイルの送信を参照し、メッセージのステータスを確認してください。
Webhook#
webhookを指定すると、メッセージが送信されたとき、または失敗したときに、WbiztoolがそのURLにPOSTを送信します。ボディはJSONではなく、フォームエンコード(application/x-www-form-urlencoded)です。
msg_id=9817263&status=SENT
| フィールド | 値 |
|---|---|
msg_id | メッセージ送信時に返されたmsg_id。 |
status | SENTまたはFAILED |
任意の2xxコードで応答してください。エンドポイントがタイムアウトした場合(3秒後)や5xxを返した場合は、合計で最大3回まで再試行されます。4xxレスポンスは再試行されません。メッセージがキャンセルされた場合や期限切れになった場合はWebhookは送信されないため、それらはメッセージのステータスで確認してください。
ヒント#
- 電話番号:番号は国際形式で保存し、あいまいさを避けるために
country_codeと一緒に送信してください。 - JSONでの改行:
msg内では\nと記述してください。そのまま改行を入れるとJSONが無効になります。 - 番号を接続したままにする:メッセージはあなたのWhatsApp番号から送信されるため、WhatsApp設定で接続を維持する必要があります。
- 多数の受信者:同じメッセージを1回のリクエストで複数の番号に送るには、複数の番号に送信を使用してください。大規模なキャンペーンの場合は、キャンペーンページからスプレッドシートをアップロードしてください。
