17 KiB
WhatsApp Gateway API Documentation
Overview
WhatsApp Gateway API adalah REST API lengkap untuk mengirim berbagai jenis pesan WhatsApp menggunakan library Baileys. API ini menyediakan endpoints untuk mengirim text, gambar, dokumen, audio, video, dan sticker melalui WhatsApp.
API Information
- Base URL:
http://your-server:5000
- Version: 2.0.0
- Protocol: HTTP/HTTPS
- Format: JSON
- Authentication: Optional (API Key)
Table of Contents
- Authentication
- Base Endpoints
- Message Endpoints
- File Upload Guidelines
- Error Handling
- Rate Limiting
- Examples
- Response Codes
Authentication
API authentication bersifat opsional dan dikonfigurasi melalui environment variables.
API Key (Optional)
Jika enabled, sertakan API key di header request:
X-API-Key: your-api-key-here
Atau menggunakan Authorization header:
Authorization: Bearer your-api-key-here
Base Endpoints
1. Health Check / API Information
Endpoint: GET /
Description: Mendapatkan informasi lengkap tentang API, status bot, dan fitur yang tersedia.
Request:
GET / HTTP/1.1
Host: localhost:5000
Response:
{
"service": "WhatsApp Gateway Production",
"status": "running",
"bot_connected": true,
"version": "2.0.0",
"environment": "production",
"features": {
"text_messages": "✅ Working",
"image_messages": "✅ Working",
"document_messages": "✅ Working",
"audio_messages": "✅ Available",
"video_messages": "✅ Available",
"sticker_messages": "✅ Available",
"webhooks": "❌ Disabled",
"analytics": "✅ Enabled",
"rate_limiting": "✅ Enabled",
"api_auth": "❌ Disabled"
},
"supported_formats": {
"images": ["jpg", "jpeg", "png", "gif", "webp"],
"documents": ["pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt", "zip", "rar", "7z"],
"audio": ["mp3", "wav", "ogg", "m4a", "aac", "flac"],
"video": ["mp4", "avi", "mov", "mkv", "webm", "3gp", "flv"],
"stickers": ["webp"]
},
"file_size_limits": {
"images": "16MB",
"documents": "32MB",
"audio": "16MB",
"video": "64MB",
"stickers": "1MB"
},
"endpoints": [
"POST /api/send-message - Send text message",
"POST /api/send-image - Send image with caption",
"POST /api/send-document - Send document with caption",
"POST /api/send-audio - Send audio file",
"POST /api/send-video - Send video with caption",
"POST /api/send-sticker - Send WebP sticker",
"GET /api/status - Bot status",
"GET /api/health - Health check"
],
"limits": {
"max_requests": 100,
"time_window": "3600s"
},
"uptime": 1234.56,
"memory": {
"used": 85,
"total": 128
}
}
2. Bot Status
Endpoint: GET /api/status
Description: Mendapatkan status detail bot WhatsApp dan sistem.
Request:
GET /api/status HTTP/1.1
Host: localhost:5000
Response:
{
"bot_connected": true,
"connection_attempts": 0,
"max_attempts": 5,
"thread_alive": true,
"upload_folder": "./uploads",
"session_folder": "./session",
"environment": "production",
"features": {
"webhooks": false,
"analytics": true,
"rate_limiting": true,
"api_authentication": false
},
"supported_formats": {
"images": ["jpg", "jpeg", "png", "gif", "webp"],
"documents": ["pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt", "zip", "rar", "7z"],
"audio": ["mp3", "wav", "ogg", "m4a", "aac", "flac"],
"video": ["mp4", "avi", "mov", "mkv", "webm", "3gp", "flv"],
"stickers": ["webp"]
},
"system": {
"uptime": 1234.56,
"memory_usage_mb": 85,
"node_version": "v20.11.0",
"platform": "linux"
},
"message": "Bot status retrieved"
}
3. Health Check
Endpoint: GET /api/health
Description: Simple health check untuk monitoring.
Request:
GET /api/health HTTP/1.1
Host: localhost:5000
Response (Bot Connected):
{
"status": "ok",
"timestamp": "2025-09-23T13:45:30.123Z",
"uptime": 1234.56,
"environment": "production",
"services": {
"whatsapp_bot": "connected",
"api_server": "running"
}
}
Response (Bot Disconnected):
{
"status": "ok",
"timestamp": "2025-09-23T13:45:30.123Z",
"uptime": 1234.56,
"environment": "production",
"services": {
"whatsapp_bot": "disconnected",
"api_server": "running"
}
}
4. QR Code
Endpoint: GET /api/qr
Description: Mendapatkan QR code untuk koneksi WhatsApp (jika tersedia).
Request:
GET /api/qr HTTP/1.1
Host: localhost:5000
Response (QR Available):
{
"status": "success",
"qr": "2@8QJwrEjN8hKDGkjgh...",
"message": "QR code available for scanning"
}
Response (Already Connected):
{
"status": "success",
"message": "Bot already connected, no QR needed"
}
Message Endpoints
1. Send Text Message
Endpoint: POST /api/send-message
Description: Mengirim pesan text ke nomor WhatsApp.
Request:
POST /api/send-message HTTP/1.1
Host: localhost:5000
Content-Type: application/json
{
"phone": "6281234567890",
"message": "Hello from WhatsApp Gateway API!"
}
Response (Success):
{
"status": "success",
"message": "Text message sent successfully",
"data": {
"phone": "6281234567890",
"message": "Hello from WhatsApp Gateway API!",
"type": "text",
"timestamp": "2025-09-23 13:45:30"
}
}
2. Send Image
Endpoint: POST /api/send-image
Description: Mengirim gambar dengan caption opsional.
Request:
POST /api/send-image HTTP/1.1
Host: localhost:5000
Content-Type: multipart/form-data
--boundary
Content-Disposition: form-data; name="phone"
6281234567890
--boundary
Content-Disposition: form-data; name="caption"
Beautiful sunset photo!
--boundary
Content-Disposition: form-data; name="file"; filename="sunset.jpg"
Content-Type: image/jpeg
[binary image data]
--boundary--
cURL Example:
curl -X POST http://localhost:5000/api/send-image \
-F "phone=6281234567890" \
-F "caption=Beautiful sunset photo!" \
-F "file=@sunset.jpg"
Response (Success):
{
"status": "success",
"message": "Image sent successfully",
"data": {
"phone": "6281234567890",
"filename": "sunset.jpg",
"caption": "Beautiful sunset photo!",
"type": "image",
"file_size_kb": 245.67,
"timestamp": "2025-09-23 13:45:30"
}
}
3. Send Document
Endpoint: POST /api/send-document
Description: Mengirim dokumen dengan caption opsional.
Request (Form Data):
phone
(required): Nomor WhatsApp tujuanfile
(required): File dokumencaption
(optional): Caption untuk dokumen
cURL Example:
curl -X POST http://localhost:5000/api/send-document \
-F "phone=6281234567890" \
-F "caption=Important document" \
-F "file=@report.pdf"
Response (Success):
{
"status": "success",
"message": "Document sent successfully",
"data": {
"phone": "6281234567890",
"filename": "report.pdf",
"caption": "Important document",
"type": "document",
"file_size_kb": 1024.50,
"timestamp": "2025-09-23 13:45:30"
}
}
4. Send Audio
Endpoint: POST /api/send-audio
Description: Mengirim file audio sebagai voice note.
Request (Form Data):
phone
(required): Nomor WhatsApp tujuanfile
(required): File audio
cURL Example:
curl -X POST http://localhost:5000/api/send-audio \
-F "phone=6281234567890" \
-F "file=@voice_message.mp3"
Response (Success):
{
"status": "success",
"message": "Audio sent successfully",
"data": {
"phone": "6281234567890",
"filename": "voice_message.mp3",
"type": "audio",
"file_size_kb": 512.25,
"timestamp": "2025-09-23 13:45:30"
}
}
5. Send Video
Endpoint: POST /api/send-video
Description: Mengirim video dengan caption opsional.
Request (Form Data):
phone
(required): Nomor WhatsApp tujuanfile
(required): File videocaption
(optional): Caption untuk video
cURL Example:
curl -X POST http://localhost:5000/api/send-video \
-F "phone=6281234567890" \
-F "caption=Amazing video!" \
-F "file=@demo.mp4"
Response (Success):
{
"status": "success",
"message": "Video sent successfully",
"data": {
"phone": "6281234567890",
"filename": "demo.mp4",
"caption": "Amazing video!",
"type": "video",
"file_size_kb": 2048.75,
"timestamp": "2025-09-23 13:45:30"
}
}
6. Send Sticker
Endpoint: POST /api/send-sticker
Description: Mengirim sticker dalam format WebP.
Request (Form Data):
phone
(required): Nomor WhatsApp tujuanfile
(required): File sticker (WebP)
cURL Example:
curl -X POST http://localhost:5000/api/send-sticker \
-F "phone=6281234567890" \
-F "file=@funny_sticker.webp"
Response (Success):
{
"status": "success",
"message": "Sticker sent successfully",
"data": {
"phone": "6281234567890",
"filename": "funny_sticker.webp",
"type": "sticker",
"file_size_kb": 23.45,
"timestamp": "2025-09-23 13:45:30"
}
}
File Upload Guidelines
Supported File Types
Media Type | Extensions | Max Size | Caption Support |
---|---|---|---|
Images | jpg, jpeg, png, gif, webp | 16MB | ✅ Yes |
Documents | pdf, doc, docx, xls, xlsx, ppt, pptx, txt, zip, rar, 7z | 32MB | ✅ Yes |
Audio | mp3, wav, ogg, m4a, aac, flac | 16MB | ❌ No |
Video | mp4, avi, mov, mkv, webm, 3gp, flv | 64MB | ✅ Yes |
Stickers | webp | 1MB | ❌ No |
Phone Number Format
API mendukung berbagai format nomor telepon:
6281234567890
(format internasional Indonesia)+6281234567890
(dengan tanda plus)081234567890
(format lokal, otomatis dikonversi)
Semua format akan dikonversi ke format WhatsApp: 6281234567890@s.whatsapp.net
Error Handling
Semua error menggunakan format JSON yang konsisten:
Error Response Format
{
"status": "error",
"message": "Error description here",
"timestamp": "2025-09-23T13:45:30.123Z"
}
Common Errors
400 - Bad Request
{
"status": "error",
"message": "Phone number required",
"timestamp": "2025-09-23T13:45:30.123Z"
}
{
"status": "error",
"message": "Invalid file type. Allowed: [\"jpg\",\"jpeg\",\"png\",\"gif\",\"webp\"]",
"timestamp": "2025-09-23T13:45:30.123Z"
}
401 - Unauthorized (jika API key enabled)
{
"status": "error",
"message": "Unauthorized: Invalid or missing API key",
"timestamp": "2025-09-23T13:45:30.123Z"
}
404 - Not Found
{
"status": "error",
"message": "Endpoint not found",
"timestamp": "2025-09-23T13:45:30.123Z"
}
429 - Rate Limit Exceeded
{
"status": "error",
"message": "Too many requests. Please try again later.",
"timestamp": "2025-09-23T13:45:30.123Z",
"limit": 100,
"window": 3600
}
500 - Internal Server Error
{
"status": "error",
"message": "Failed to send message: connection timeout",
"timestamp": "2025-09-23T13:45:30.123Z"
}
503 - Service Unavailable
{
"status": "error",
"message": "Bot not connected",
"timestamp": "2025-09-23T13:45:30.123Z"
}
Rate Limiting
Rate limiting dapat dikonfigurasi melalui environment variables:
- Default Limit: 100 requests per hour
- Time Window: 3600 seconds (1 hour)
- Headers: Response tidak include rate limit headers
- Scope: Per IP address
Ketika limit tercapai, API akan mengembalikan HTTP 429 dengan pesan error.
Examples
JavaScript (Node.js)
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const API_BASE = 'http://localhost:5000';
// Send text message
async function sendText(phone, message) {
try {
const response = await axios.post(`${API_BASE}/api/send-message`, {
phone: phone,
message: message
});
console.log('Success:', response.data);
} catch (error) {
console.error('Error:', error.response?.data || error.message);
}
}
// Send image
async function sendImage(phone, imagePath, caption) {
try {
const form = new FormData();
form.append('phone', phone);
form.append('caption', caption);
form.append('file', fs.createReadStream(imagePath));
const response = await axios.post(`${API_BASE}/api/send-image`, form, {
headers: form.getHeaders()
});
console.log('Success:', response.data);
} catch (error) {
console.error('Error:', error.response?.data || error.message);
}
}
// Usage
sendText('6281234567890', 'Hello from Node.js!');
sendImage('6281234567890', './image.jpg', 'Sample image');
Python
import requests
API_BASE = 'http://localhost:5000'
# Send text message
def send_text(phone, message):
response = requests.post(f'{API_BASE}/api/send-message', json={
'phone': phone,
'message': message
})
return response.json()
# Send image
def send_image(phone, image_path, caption=None):
with open(image_path, 'rb') as f:
files = {'file': f}
data = {'phone': phone}
if caption:
data['caption'] = caption
response = requests.post(f'{API_BASE}/api/send-image',
files=files, data=data)
return response.json()
# Usage
result = send_text('6281234567890', 'Hello from Python!')
print(result)
result = send_image('6281234567890', './image.jpg', 'Sample image')
print(result)
PHP
<?php
$apiBase = 'http://localhost:5000';
// Send text message
function sendText($phone, $message) {
global $apiBase;
$data = json_encode([
'phone' => $phone,
'message' => $message
]);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$apiBase/api/send-message");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
// Send image
function sendImage($phone, $imagePath, $caption = null) {
global $apiBase;
$postData = [
'phone' => $phone,
'file' => new CURLFile($imagePath)
];
if ($caption) {
$postData['caption'] = $caption;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$apiBase/api/send-image");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
// Usage
$result = sendText('6281234567890', 'Hello from PHP!');
print_r($result);
?>
cURL Commands
# Send text message
curl -X POST http://localhost:5000/api/send-message \
-H "Content-Type: application/json" \
-d '{"phone":"6281234567890","message":"Hello from cURL!"}'
# Send image
curl -X POST http://localhost:5000/api/send-image \
-F "phone=6281234567890" \
-F "caption=Sample image" \
-F "file=@image.jpg"
# Send document
curl -X POST http://localhost:5000/api/send-document \
-F "phone=6281234567890" \
-F "caption=Important document" \
-F "file=@document.pdf"
# Check status
curl http://localhost:5000/api/status
# Health check
curl http://localhost:5000/api/health
Response Codes
Code | Description | Meaning |
---|---|---|
200 | OK | Request successful |
400 | Bad Request | Invalid request parameters |
401 | Unauthorized | Invalid or missing API key |
404 | Not Found | Endpoint not found |
429 | Too Many Requests | Rate limit exceeded |
500 | Internal Server Error | Server error occurred |
503 | Service Unavailable | Bot not connected |
Troubleshooting
Common Issues
-
Bot Not Connected
- Check
/api/status
endpoint - Look for QR code in server logs
- Scan QR code with WhatsApp
- Check
-
File Upload Fails
- Check file size limits
- Verify file extension is supported
- Ensure proper Content-Type header
-
Rate Limit Hit
- Wait for time window to reset
- Reduce request frequency
- Contact admin to adjust limits
-
Authentication Error
- Check if API key is required
- Verify API key in headers
- Ensure correct header format
Support
For technical support or questions:
- Check server logs:
sudo journalctl -u wa -f
- Verify bot connection:
curl http://localhost:5000/api/status
- Test basic connectivity:
curl http://localhost:5000/api/health
API Version: 2.0.0
Last Updated: September 23, 2025
Status: Production Ready