WhatsApp Business APIを無料で利用する方法 (2026年版)
初期費用なしで、プログラムからメッセージを送信。
Hyperealで構築を始めよう
Kling、Flux、Sora、Veoなどに単一のAPIでアクセス。無料クレジットで開始、数百万規模まで拡張可能。
クレジットカード不要 • 10万人以上の開発者 • エンタープライズ対応
WhatsApp Business APIを無料で利用する方法 (2026年版)
WhatsApp Business APIを使用すると、メッセージの送受信をプログラムで制御したり、カスタマーサポートの自動化やチャットボットの構築が可能になります。以前は、このAPIにアクセスするために高価な Business Solution Provider (BSP) が必要でした。しかし2026年現在、Metaの Cloud API を利用することで無料で開始することができます。このガイドでは、動作するコード例を交えながら、セットアップの全工程を解説します。
WhatsApp Business API: 無料枠の概要
Metaは WhatsApp Business Cloud API に対して以下の制限付きの無料枠を提供しています。
| 機能 | 無料枠 | 有料枠 |
|---|---|---|
| サービス会話(ユーザー起点) | 毎月1,000件まで無料 | 1会話あたり $0.005 - 0.08 |
| マーケティング会話 | 含まれません | 1会話あたり $0.01 - 0.15 |
| テスト用電話番号 | 1つのテスト番号が付属 | 無制限の認証済み番号 |
| メッセージテンプレート | 250個のテンプレート | 250個のテンプレート |
| メディアメッセージ | 対応 | 対応 |
| Webhook通知 | 対応 | 対応 |
| レート制限 | 80メッセージ/秒 | 500メッセージ/秒以上 |
毎月1,000件の無料サービス会話は、各月の1日にリセットされます。サービス会話とは、ユーザーから開始されたもの(ユーザーが最初にメッセージを送信したもの)を指し、各会話のウィンドウは24時間持続します。
前提条件
開始する前に、以下が必要になります。
- Meta (Facebook) アカウント
- Metaビジネスアカウント(作成は無料)
- 認証用のSMSまたは音声通話を受信できる電話番号
- REST APIに関する基礎知識
ステップバイステップ・セットアップ
ステップ1: Meta Developerアカウントの作成
1. https://developers.facebook.com にアクセスします
2. 「スタート」または「マイアプリ」をクリックします
3. Facebookアカウントでサインインします
4. 開発者規約に同意します
5. 電話番号でアカウントを認証します
ステップ2: 新しいアプリを作成する
1. 開発者ダッシュボードで「アプリを作成」をクリックします
2. アプリタイプとして「ビジネス」を選択します
3. アプリ名を入力します(例: 「My WhatsApp Bot」)
4. Metaビジネスアカウントを選択(または作成)します
5. 「アプリを作成」をクリックします
ステップ3: アプリにWhatsAppを追加する
1. アプリダッシュボードで「プロダクトを追加」を見つけます
2. WhatsAppカードの「設定」をクリックします
3. これにより、WhatsApp Businessアカウントが自動的に作成されます
4. テスト用電話番号と一時的なアクセストークンが表示されます
ステップ4: アクセストークンの取得
ダッシュボードの一時的なトークンは24時間で期限切れになります。本番環境で使用するには、恒久的なシステムユーザー(System User)トークンを生成します。
1. Metaビジネススイート > 設定 > ビジネス設定 に移動します
2. 「システムユーザー」に移動します
3. 「追加」をクリックして新しいシステムユーザーを作成します
4. ロールを「管理者(Admin)」に設定します
5. 「トークンを生成」をクリックします
6. 対象のWhatsAppアプリを選択します
7. 以下の権限を付与します:
- whatsapp_business_management
- whatsapp_business_messaging
8. トークンをコピーして安全に保存します
ステップ5: テスト受信者の追加
メッセージを送信する前に、受信者の電話番号をテストリストに追加する必要があります。
1. アプリダッシュボードのWhatsAppセクションに移動します
2. 「API設定」に移動します
3. 「メッセージを送信」の下にある「電話番号リストを管理」をクリックします
4. テストメッセージを送信したい電話番号を追加します
5. 各受信者は、確認メッセージに返信して認証を完了する必要があります
最初のメッセージを送信する
cURLを使用する場合
curl -X POST \
"https://graph.facebook.com/v21.0/YOUR_PHONE_NUMBER_ID/messages" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "1234567890",
"type": "text",
"text": {
"body": "Hello from the WhatsApp Business API!"
}
}'
Node.jsを使用する場合
const axios = require("axios");
const PHONE_NUMBER_ID = "your_phone_number_id";
const ACCESS_TOKEN = "your_access_token";
async function sendWhatsAppMessage(to, message) {
try {
const response = await axios.post(
`https://graph.facebook.com/v21.0/${PHONE_NUMBER_ID}/messages`,
{
messaging_product: "whatsapp",
to: to,
type: "text",
text: { body: message }
},
{
headers: {
Authorization: `Bearer ${ACCESS_TOKEN}`,
"Content-Type": "application/json"
}
}
);
console.log("Message sent:", response.data);
return response.data;
} catch (error) {
console.error("Error:", error.response?.data || error.message);
throw error;
}
}
// メッセージを送信
sendWhatsAppMessage("1234567890", "Hello from Node.js!");
Pythonを使用する場合
import requests
PHONE_NUMBER_ID = "your_phone_number_id"
ACCESS_TOKEN = "your_access_token"
def send_whatsapp_message(to: str, message: str):
url = f"https://graph.facebook.com/v21.0/{PHONE_NUMBER_ID}/messages"
headers = {
"Authorization": f"Bearer {ACCESS_TOKEN}",
"Content-Type": "application/json"
}
payload = {
"messaging_product": "whatsapp",
"to": to,
"type": "text",
"text": {"body": message}
}
response = requests.post(url, json=payload, headers=headers)
response.raise_for_status()
print("Message sent:", response.json())
return response.json()
# メッセージを送信
send_whatsapp_message("1234567890", "Hello from Python!")
リッチメッセージの送信
画像メッセージ
def send_image(to: str, image_url: str, caption: str = ""):
payload = {
"messaging_product": "whatsapp",
"to": to,
"type": "image",
"image": {
"link": image_url,
"caption": caption
}
}
response = requests.post(
f"https://graph.facebook.com/v21.0/{PHONE_NUMBER_ID}/messages",
json=payload,
headers={"Authorization": f"Bearer {ACCESS_TOKEN}"}
)
return response.json()
インタラクティブボタンメッセージ
def send_buttons(to: str, body_text: str, buttons: list):
payload = {
"messaging_product": "whatsapp",
"to": to,
"type": "interactive",
"interactive": {
"type": "button",
"body": {"text": body_text},
"action": {
"buttons": [
{
"type": "reply",
"reply": {"id": btn["id"], "title": btn["title"]}
}
for btn in buttons
]
}
}
}
response = requests.post(
f"https://graph.facebook.com/v21.0/{PHONE_NUMBER_ID}/messages",
json=payload,
headers={"Authorization": f"Bearer {ACCESS_TOKEN}"}
)
return response.json()
# ボタン付きメッセージを送信
send_buttons(
"1234567890",
"本日はどのようなご用件でしょうか?",
[
{"id": "support", "title": "サポートを受ける"},
{"id": "pricing", "title": "価格を見る"},
{"id": "demo", "title": "デモを予約する"}
]
)
テンプレートメッセージ(アウトバウンド通知用)
ユーザーに自分から最初にメッセージを送る場合(24時間のウィンドウ外)、承認されたテンプレートを使用する必要があります。
def send_template(to: str, template_name: str, language: str = "en_US"):
payload = {
"messaging_product": "whatsapp",
"to": to,
"type": "template",
"template": {
"name": template_name,
"language": {"code": language},
"components": [
{
"type": "body",
"parameters": [
{"type": "text", "text": "John"},
{"type": "text", "text": "注文番号 #12345"}
]
}
]
}
}
response = requests.post(
f"https://graph.facebook.com/v21.0/{PHONE_NUMBER_ID}/messages",
json=payload,
headers={"Authorization": f"Bearer {ACCESS_TOKEN}"}
)
return response.json()
Webhookのセットアップ
受信メッセージを受け取るには、Webhookエンドポイントを設定する必要があります。
Express.js Webhookサーバー
const express = require("express");
const app = express();
app.use(express.json());
const VERIFY_TOKEN = "your_custom_verify_token";
// Webhookの検証 (GET)
app.get("/webhook", (req, res) => {
const mode = req.query["hub.mode"];
const token = req.query["hub.verify_token"];
const challenge = req.query["hub.challenge"];
if (mode === "subscribe" && token === VERIFY_TOKEN) {
console.log("Webhook verified");
res.status(200).send(challenge);
} else {
res.sendStatus(403);
}
});
// メッセージの受信 (POST)
app.post("/webhook", (req, res) => {
const body = req.body;
if (body.object === "whatsapp_business_account") {
body.entry?.forEach((entry) => {
entry.changes?.forEach((change) => {
const messages = change.value?.messages;
if (messages) {
messages.forEach((message) => {
console.log("From:", message.from);
console.log("Type:", message.type);
if (message.type === "text") {
console.log("Text:", message.text.body);
}
});
}
});
});
res.sendStatus(200);
} else {
res.sendStatus(404);
}
});
app.listen(3000, () => {
console.log("Webhook server running on port 3000");
});
ローカルサーバーの公開
開発時には、トンネリングサービスを使用してローカルのWebhookを公開します。
# ngrokを使用する場合
ngrok http 3000
# Cloudflare Tunnelを使用する場合
cloudflared tunnel --url http://localhost:3000
その後、公開されたURLをMetaアプリダッシュボードの WhatsApp > 設定 > Webhook URL に登録します。
無料の代替案と補完サービス
無料枠の制限が厳しすぎる場合は、以下のオプションを検討してください。
| オプション | 無料メッセージ | 備考 |
|---|---|---|
| Meta Cloud API (公式) | 毎月1,000件のサービス会話 | 小規模プロジェクトに最適 |
| Twilio WhatsApp Sandbox | 開発期間中は無料 | Twilioアカウントが必要。本番は有料 |
| WhatsApp Business App (手動) | 無制限 | APIアクセス不可。手動送信のみ |
| WATI 無料トライアル | 14日間 | ダッシュボードとチャットボット構築機能を備えたBSP |
よくあるエラーと解決策
| エラーコード | メッセージ | 解決策 |
|---|---|---|
| 131030 | "Recipient phone number not in allowed list" | テスト受信者に電話番号を追加してください |
| 131047 | "Re-engagement message" | 最初の接触には承認済みテンプレートを使用してください |
| 100 | "Invalid parameter" | 電話番号の形式を確認してください(国番号を含み、+やスペースは不要) |
| 190 | "Access token expired" | 新しいシステムユーザートークンを生成してください |
| 368 | "Temporarily blocked for policies" | Metaのコマースおよびメッセージングポリシーを確認してください |
結論
WhatsApp Business APIは、Metaの Cloud API を通じて無料で利用可能であり、毎月1,000件のサービス会話を無償で提供しています。これは小規模ビジネス、プロトタイプ、個人プロジェクトに十分な量です。Metaの開発者ポータルでのセットアップには約30分かかります。そこからはプログラムによってテキスト、メディア、インタラクティブメッセージを送信できるようになります。
パーソナライズされた製品デモ動画やAIアバターによる挨拶など、AI生成ビデオコンテンツでWhatsAppコミュニケーションを強化したい企業様にとって、Hypereal AI はビデオ生成やアバター作成のための手頃な価格のAPIを提供しており、WhatsAppのリッチメディアメッセージとの相性も抜群です。
