メッセージングAPI
WhatsAppメッセージの予約API
WhatsAppのテキスト、画像、ドキュメントを、指定した日時に電話番号またはグループへ送信するよう予約します。予約のリマインダー、誕生日のお祝い、フォローアップ、期間限定のご案内などに利用できます。
https://wbiztool.com/api/v1/schedule_msg/リクエストボディ: JSONまたはフォームフィールド
メッセージは予約した時刻までキューで待機し、その後あなたのWhatsApp番号から送信されます。レスポンスにはmsg_idが含まれ、これを使ってステータスを確認したり、キャンセルしたりできます。
クイック例#
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');
}12345、YOUR_API_KEY、678はご自身の値に置き換えてください。値の確認場所は認証をご覧ください。
リクエストパラメータ#
認証
client_idinteger必須設定 → APIキーに表示されるAPIクライアントIDです。
api_keystring必須同じページにあるAPIキーです。
whatsapp_clientinteger必須送信に使うWhatsApp番号のIDです。WhatsApp設定で確認できます。メッセージ送信APIとは異なり、このエンドポイントが番号を自動で選ぶことはありません。
スケジュール
datestring必須メッセージを送信する日付で、
dd/mm/yyyy形式です(例:24/12/2026)。timestring必須メッセージを送信する時刻で、24時間制の
HH:MM形式です(例:09:00、18:45)。秒は含めないでください。timezonestring任意dateとtimeのタイムゾーンです。省略した場合のデフォルトはIST(インド)です。タイムゾーンを参照してください。
受信者とメッセージ
phonestringgroup_nameを送信しない場合は必須受信者のWhatsApp番号で、数字のみです。スペース、
+、-、.、括弧は自動的に削除されます。番号は国コード付き(919876543210)で送信するか、国コードなし(9876543210)でcountry_codeと一緒に送信してください。group_namestringphoneを送信しない場合は必須あなたの番号がメンバーになっているWhatsAppグループの名前です。グループに送信と同じ方法で検索されます。
phoneとgroup_nameはどちらか一方だけを送信し、両方は送らないでください。country_codestring任意+を除いた国番号です。例:インドは91、米国は1。番号がすでにこの国番号で始まっていない限り、phoneの先頭に付加されます。例外として、91の場合、10桁の番号には常に国番号が付加されます。その他の国番号では、国番号と同じ数字で始まる国内番号は国番号を含めて送信してください。グループの場合は無視されます。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任意受信者に表示されるファイル名です(例:
invoice-4821.pdf)。小文字で送信され、& : ? * $ ;などの文字は_に置き換えられ、150文字に切り詰められます。省略した場合は、URLから名前が取得されます。
配信オプション
webhookstring任意メッセージが送信されたとき、または失敗したときに
POSTを受け取るURLです。ペイロードはメッセージ送信と同じです。
メッセージが送信されるタイミング#
- Wbiztoolは
date、time、timezoneを1つの時点に変換し、その時点を過ぎるとメッセージを送信します(WhatsApp番号が接続されている場合)。 - 過去の時刻も受け付けられます。その場合、通常の送信と同様にメッセージはすぐに送信されます。何か月も早くメッセージを送ってしまわないよう、日付の形式(
dd/mm/yyyy、日が先)をよく確認してください。 - 予約時刻に番号の接続が切れている場合、メッセージは待機し、予定より大幅に遅くなっても、番号が再接続され次第送信されます。このエンドポイントには有効期限がないため、不要になったメッセージはキャンセルしてください。切断または削除された番号で、予約時刻から90日経っても待機しているメッセージは削除されます。
- 送信されるまで、メッセージのステータスは
0(Created)で、キャンセルできます。待機中も残りクレジットから差し引かれます。
タイムゾーン#
timezoneには、タイムゾーン名または下記の略称のいずれかを指定できます。
タイムゾーン名:Asia/Kolkata、America/New_York、Europe/London、Australia/Sydneyなど。IANAタイムゾーンデータベースの名前であれば、どれでも使用できます。最も確実な方法です。一覧はタイムゾーンリファレンスをご覧ください。
略称は大文字で指定する必要があります。各略称は地域に対応しており、その地域の夏時間が自動的に適用されます。
| 略称 | 解釈される値 |
|---|---|
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 |
たとえば、7月のESTは固定のUTC−5ではなく、ニューヨークの夏時間(UTC−4)を意味します。
グループへの予約送信#
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);レスポンス#
リクエストが成功すると、HTTP 200が返ります。
{
"msg_id": 9817263,
"message": "Created",
"status": 1
}
| フィールド | 型 | 説明 |
|---|---|---|
status | integer | メッセージが予約された場合は1、リクエストが失敗した場合は0。 |
message | string | 成功時はCreated、それ以外はエラー内容。 |
msg_id | integer | 予約されたメッセージのID。後でステータスの確認やキャンセルに使うため保存してください。成功時のみ含まれます。 |
レスポンスには予約した時刻やタイムゾーンは含まれないため、送信した内容を記録しておいてください。
エラー#
ほとんどのエラーはHTTP 200で返り、statusは0になります。必ずボディのstatusを確認してください。
{ "message": "Scheduled date & time is not in valid format", "status": 0 }
| メッセージ | 対処方法 |
|---|---|
Auth Error | client_idとapi_keyの両方を送信してください。 |
Invalid Client Id | client_idを数値で送信してください。HTTP 403で返ります。 |
Auth Error: invalid api key | キーが存在し、削除されておらず、このclient_idに属していることを確認してください。HTTP 400で返ります。 |
Either phone or group_name parameter is required | phoneまたはgroup_nameを追加してください。 |
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が必要です。 |
Image Url Can't be null | msg_type 1の場合はimg_urlを送信してください。 |
File Url Can't be null | msg_type 2の場合はfile_urlを送信してください。 |
Scheduled date & time is not in valid format | dateまたはtimeがないか、timezoneが空文字列です。 |
Not enough credits | プランの残りメッセージ数がありません。 |
Demo Account can not access apis | 通常のアカウントを使用してください。 |
Invalid JSON format: … | JSONボディが無効か、client_idなしでフォームフィールドを送信しています。 |
ヒント#
-
日付は慎重に組み立てる:Pythonでは
strftime("%d/%m/%Y")とstrftime("%H:%M")を使用してください。JavaScriptでは、サーバーのローカル時刻ではなく、timezoneで送信するのと同じタイムゾーンで日付と時刻をフォーマットしてください。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" -
時刻を確認する:5分後にテストメッセージを予約し、想定どおりの時刻に届くか確認してください。
-
予定の変更:予約し直すには、メッセージをキャンセルして新しく予約してください。
-
現時点では公式クライアントで予約しないでください:Pythonの
schedule_messageは日付をYYYY-MM-DDで送信し(レスポンスは{})、NodeのscheduleMessageはこのエンドポイントが読み取らないschedule_timeを送信します。上記のようにエンドポイントを直接呼び出してください。 -
繰り返し送信するメッセージ:毎月の支払いリマインダーなど繰り返し送るメッセージについては、リマインダーの作成をご覧ください。
