WhatsApp Business API 무료로 사용하는 방법 (2026년)
초기 비용 없이 프로그래밍 방식으로 메시지 전송
Hypereal로 구축 시작하기
단일 API를 통해 Kling, Flux, Sora, Veo 등에 액세스하세요. 무료 크레딧으로 시작하고 수백만으로 확장하세요.
신용카드 불필요 • 10만 명 이상의 개발자 • 엔터프라이즈 지원
WhatsApp Business API 무료 사용 방법 (2026)
WhatsApp Business API를 사용하면 프로그래밍 방식으로 메시지를 송수신하고, 고객 지원을 자동화하며, 챗봇을 구축할 수 있습니다. 이전에는 이 API에 액세스하려면 고가의 Business Solution Provider (BSP)가 필요했습니다. 하지만 2026년 현재 Meta의 Cloud API를 통해 무료로 시작할 수 있게 되었습니다. 이 가이드에서는 실제 작동하는 코드 예제와 함께 전체 설정 과정을 안내합니다.
WhatsApp Business API: 무료 등급(Free Tier) 개요
Meta는 WhatsApp Business Cloud API에 대해 다음과 같은 제한 사항이 포함된 무료 등급을 제공합니다.
| 기능 | 무료 등급 | 유료 등급 |
|---|---|---|
| 서비스 대화 (사용자 시작) | 월 1,000건 무료 | 대화당 $0.005-0.08 |
| 마케팅 대화 | 포함되지 않음 | 대화당 $0.01-0.15 |
| 테스트 전화번호 | 테스트 번호 1개 포함 | 무제한 인증 번호 |
| 메시지 템플릿 | 250개 템플릿 | 250개 템플릿 |
| 미디어 메시지 | 지원됨 | 지원됨 |
| Webhook 알림 | 지원됨 | 지원됨 |
| 속도 제한 (Rate limit) | 80 메시지/초 | 500+ 메시지/초 |
월 1,000건의 무료 서비스 대화는 매월 1일에 초기화됩니다. 서비스 대화는 사용자가 먼저 메시지를 보낸 경우를 의미하며, 각 대화 창은 24시간 동안 유지됩니다.
사전 요구 사항
시작하기 전에 다음이 필요합니다.
- Meta (Facebook) 계정
- Meta Business 계정 (무료 생성 가능)
- 인증용 SMS 또는 음성 전화를 받을 수 있는 전화번호
- REST API에 대한 기본 지식
단계별 설정 방법
1단계: Meta Developer 계정 생성
1. https://developers.facebook.com 접속
2. "시작하기" 또는 "내 앱" 클릭
3. Facebook 계정으로 로그인
4. 개발자 약관 동의
5. 전화번호로 계정 인증
2단계: 새 앱 생성
1. 개발자 대시보드에서 "앱 만들기" 클릭
2. 앱 유형으로 "Business" 선택
3. 앱 이름 입력 (예: "My WhatsApp Bot")
4. Meta Business 계정 선택 (또는 새로 생성)
5. "앱 만들기" 클릭
3단계: 앱에 WhatsApp 추가
1. 앱 대시보드에서 "제품 추가"를 찾음
2. WhatsApp 카드의 "설정" 클릭
3. 자동으로 테스트용 WhatsApp Business Account가 생성됨
4. 테스트 전화번호와 임시 액세스 토큰(Access Token) 확인 가능
4단계: 액세스 토큰 가져오기
대시보드의 임시 토큰은 24시간 후에 만료됩니다. 실제 운영을 위해서는 영구적인 System User 토큰을 생성해야 합니다.
1. Meta Business Suite > 설정 > 비즈니스 설정 이동
2. 시스템 사용자(System Users)로 이동
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": "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", "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", "Python에서 보내는 인사말!")
리치 메시지(Rich Messages) 전송
이미지 메시지
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 = "ko_KR"):
payload = {
"messaging_product": "whatsapp",
"to": to,
"type": "template",
"template": {
"name": template_name,
"language": {"code": language},
"components": [
{
"type": "body",
"parameters": [
{"type": "text", "text": "홍길동님"},
{"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()
Webhooks 설정
수신 메시지를 받으려면 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
그 후 Meta 앱 대시보드의 WhatsApp > 설정 > Webhook URL에 해당 공개 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" | 새 System User 토큰을 생성하세요. |
| 368 | "Temporarily blocked for policies" | Meta의 커머스 및 메시지 정책을 검토하세요. |
결론
WhatsApp Business API는 Meta Cloud API를 통해 월 1,000건의 서비스 대화를 무료로 제공하며, 누구나 접근 가능합니다. 이는 소규모 기업, 프로토타입 또는 개인 프로젝트에 충분한 수량입니다. Meta 개발자 포털을 통한 설정 과정은 약 30분 정도 소요되며, 이후에는 텍스트, 미디어, 대화형 메시지를 프로그래밍 방식으로 보낼 수 있습니다.
개인화된 제품 데모 비디오나 AI 아바타 인사말과 같은 AI 기반 비디오 콘텐츠로 WhatsApp 커뮤니케이션을 강화하려는 기업의 경우, Hypereal AI는 WhatsApp 리치 미디어 메시지와 잘 어울리는 비디오 생성 및 아바타 제작을 위한 합리적인 API를 제공합니다.
