Kirim Pesan WhatsApp
Kirim pesan teks, media, lokasi, audio, dan video lewat API whatsGo.
Endpoint ini memungkinkan kamu mengirim berbagai tipe pesan WhatsApp — teks, gambar, audio, video, dokumen, lokasi, template, dan pesan interaktif — dari sistem kamu ke nomor WhatsApp tujuan.
Endpoint
POST /external-api/inbox/send-message
Base URL: https://whats.sahabatmobile.com
Header yang dibutuhkan
| Header | Nilai |
|---|---|
Authorization |
Bearer <api_key> |
Content-Type |
application/json |
Idempotency-Key |
Opsional. Kunci unik untuk mencegah pengiriman ganda. |
Body Request — Field Umum
Setiap request harus mengirim JSON body. Berikut field yang berlaku untuk semua tipe pesan.
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
to |
string | Ya | Nomor tujuan dalam format E.164 tanpa tanda + (contoh: 6281234567890). |
type |
string | Ya | Tipe pesan. Salah satu dari: text, image, audio, video, document, location, template, interactive. |
channel_id |
string | Tidak | ID saluran WhatsApp pengirim. Diperlukan jika workspace memiliki lebih dari satu saluran terhubung. |
Tipe Pesan
Field tambahan di body request bergantung pada nilai type. Berikut masing-masing tipe beserta contohnya.
Teks
Mengirim pesan teks biasa. Bisa menyertakan link dan preview URL jika preview_url diaktifkan.
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
text.body |
string | Ya | Isi pesan teks. Maksimal 4.096 karakter. |
text.preview_url |
boolean | Tidak | Jika true, WhatsApp akan menampilkan preview untuk link yang ada di pesan. Default: false. |
Contoh request:
curl -X POST "https://whats.sahabatmobile.com/external-api/inbox/send-message" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "6281234567890",
"type": "text",
"text": {
"body": "Halo! Pesan ini dikirim lewat API whatsGo.",
"preview_url": true
}
}'
Gambar
Mengirim gambar (JPG, PNG) beserta caption opsional.
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
image.link |
string (URL) | Ya | URL publik menuju file gambar. Format: JPG atau PNG. Maksimal 5 MB. |
image.caption |
string | Tidak | Caption yang menyertai gambar. Maksimal 1.024 karakter. |
Contoh request:
curl -X POST "https://whats.sahabatmobile.com/external-api/inbox/send-message" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "6281234567890",
"type": "image",
"image": {
"link": "https://example.com/images/promo.jpg",
"caption": "Promo spesial hari ini!"
}
}'
Audio
Mengirim file audio (MP3, OGG, AMR).
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
audio.link |
string (URL) | Ya | URL publik menuju file audio. Format: MP3, OGG, atau AMR. Maksimal 16 MB. |
Contoh request:
curl -X POST "https://whats.sahabatmobile.com/external-api/inbox/send-message" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "6281234567890",
"type": "audio",
"audio": {
"link": "https://example.com/audio/voice-note.mp3"
}
}'
Video
Mengirim file video beserta caption opsional.
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
video.link |
string (URL) | Ya | URL publik menuju file video. Format: MP4. Maksimal 16 MB. |
video.caption |
string | Tidak | Caption yang menyertai video. Maksimal 1.024 karakter. |
Contoh request:
curl -X POST "https://whats.sahabatmobile.com/external-api/inbox/send-message" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "6281234567890",
"type": "video",
"video": {
"link": "https://example.com/video/product-demo.mp4",
"caption": "Ini video demo produk kami."
}
}'
Dokumen
Mengirim file dokumen beserta caption dan nama file.
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
document.link |
string (URL) | Ya | URL publik menuju file dokumen. Mendukung PDF, DOCX, XLSX, TXT. Maksimal 100 MB. |
document.caption |
string | Tidak | Caption yang menyertai dokumen. Maksimal 1.024 karakter. |
document.filename |
string | Tidak | Nama file yang ditampilkan kepada penerima (contoh: invoice-juni-2026.pdf). |
Contoh request:
curl -X POST "https://whats.sahabatmobile.com/external-api/inbox/send-message" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "6281234567890",
"type": "document",
"document": {
"link": "https://example.com/files/invoice-2026-06.pdf",
"caption": "Invoice bulan Juni 2026.",
"filename": "invoice-2026-06.pdf"
}
}'
Lokasi
Mengirim koordinat lokasi beserta nama dan alamat opsional.
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
location.latitude |
number | Ya | Garis lintang. Rentang: -90 s/d 90. |
location.longitude |
number | Ya | Garis bujur. Rentang: -180 s/d 180. |
location.name |
string | Tidak | Nama lokasi yang ditampilkan (contoh: "Kantor Pusat"). |
location.address |
string | Tidak | Alamat lokasi yang ditampilkan. |
Contoh request:
curl -X POST "https://whats.sahabatmobile.com/external-api/inbox/send-message" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "6281234567890",
"type": "location",
"location": {
"latitude": -6.2088,
"longitude": 106.8456,
"name": "Kantor Pusat Sahabat Mobile",
"address": "Jl. Sudirman No. 123, Jakarta"
}
}'
Multi-Channel
Jika workspace kamu memiliki lebih dari satu saluran WhatsApp terhubung, tentukan channel_id untuk memilih saluran pengirim. Jika hanya ada satu saluran, field ini bersifat opsional — sistem akan menggunakan saluran default secara otomatis.
Untuk mengetahui daftar saluran yang tersedia, gunakan endpoint List Kontak atau lihat di dashboard pada menu Pengaturan > Saluran.
{
"to": "6281234567890",
"type": "text",
"channel_id": "ch_abc123def456",
"text": {
"body": "Pesan ini dikirim dari saluran tertentu."
}
}
Response
Semua response mengikuti format envelope standar whatsGo.
Response sukses
{
"success": true,
"message": "Pesan berhasil dikirim.",
"data": {
"messageId": "msg_7a8b9c0d1e2f",
"whatsappMessageId": "wamid.HBgLMjgxMjM0NTY3ODkw",
"to": "6281234567890",
"type": "text",
"channelId": "ch_abc123def456",
"status": "sent",
"createdAt": "2026-07-16T10:30:00.000000Z"
}
}
Field response
| Field | Tipe | Deskripsi |
|---|---|---|
messageId |
string | ID unik pesan di sistem whatsGo. |
whatsappMessageId |
string | ID pesan dari WhatsApp server. Berguna untuk tracking status delivery. |
to |
string | Nomor tujuan pesan. |
type |
string | Tipe pesan yang dikirim. |
channelId |
string | ID saluran WhatsApp yang digunakan. |
status |
string | Status pengiriman: sent, delivered, read, atau failed. |
createdAt |
string | Timestamp pengiriman (ISO 8601). |
Response error
{
"success": false,
"error": {
"code": "VALIDATION_INVALID_PHONE",
"message": "Format nomor telepon tidak valid.",
"details": {
"field": "to",
"hint": "Gunakan format kode negara + nomor tanpa tanda plus (contoh: 628123456789)."
}
}
}
WhatsApp hanya mengizinkan pesan template di luar jendela 24 jam sejak pesan terakhir diterima dari pengguna. Jika jendela sudah tertutup dan kamu mencoba mengirim pesan tipe selain template, request akan gagal. Pastikan kamu memahami status jendela sebelum mengirim pesan. Lihat Template WhatsApp untuk detail lebih lanjut.
Pesan Error
Berikut daftar error yang mungkin terjadi saat mengirim pesan WhatsApp.
| Kode Error | HTTP Code | Deskripsi |
|---|---|---|
VALIDATION_INVALID_PHONE |
422 | Format nomor telepon tujuan tidak valid. |
VALIDATION_MISSING_TYPE |
422 | Field type wajib diisi. |
VALIDATION_MISSING_FIELD |
422 | Field yang wajib untuk tipe pesan tertentu belum diisi (contoh: text.body untuk tipe text). |
VALIDATION_INVALID_TYPE |
422 | Nilai type tidak dikenali. Harus salah satu dari: text, image, audio, video, document, location, template, interactive. |
VALIDATION_INVALID_URL |
422 | URL media tidak valid atau tidak dapat diakses oleh server whatsGo. |
VALIDATION_FILE_TOO_LARGE |
422 | Ukuran file media melebihi batas yang diizinkan. |
WHATSAPP_TEMPLATE_REQUIRED |
400 | Jendela 24 jam sudah tertutup. Hanya pesan template yang diperbolehkan. |
WHATSAPP_SEND_FAILED |
502 | WhatsApp server menolak pengiriman. Periksa nomor tujuan atau status saluran. |
WHATSAPP_CHANNEL_NOT_FOUND |
404 | ID saluran yang diberikan tidak ditemukan atau tidak aktif. |
RATE_LIMIT_EXCEEDED |
429 | Melebihi batas request rate limit. Coba lagi setelah beberapa saat. |
unauthorized |
401 | API key tidak valid atau belum disediakan. |