Skip to main content

Integrasi WhatsApp

Layanan WhatsApp Notification Gateway ini menyediakan antarmuka REST API yang memungkinkan aplikasi internal maupun pihak ketiga untuk mengirimkan pesan notifikasi secara otomatis ke pengguna melalui platform WhatsApp.

Integrasi ini dirancang sebagai middleware yang menjembatani sistem Anda dengan protokol WhatsApp Web Multi-device, memungkinkan pengiriman informasi yang cepat, personal, dan real-time.

Fitur Utama

Layanan ini mendukung beberapa kapabilitas pengiriman pesan, antara lain:

  • Text Messaging: Pengiriman pesan teks standar dengan dukungan pemformatan (tebal, miring, monospace).
  • Media Messaging: Pengiriman file gambar (JPG/PNG) yang disertai dengan caption.
  • Secure Access: Dilindungi menggunakan standar Basic Authentication.

Kapan Menggunakan Layanan Ini?

API ini ideal digunakan untuk skenario komunikasi satu arah (server-to-user), seperti:

  • Pengiriman kode OTP (One Time Password).
  • Notifikasi status transaksi atau layanan publik.
  • Peringatan sistem (System Alerting) untuk tim teknis.
  • Pengiriman bukti laporan atau tiket antrian dalam bentuk gambar.
Disclaimer Teknis

Layanan ini berjalan di atas protokol WhatsApp Web Multi-device (Unofficial Wrapper).

  • Anti-Spam: Gunakan layanan ini dengan bijak. Pengiriman pesan massal (bulk) yang agresif ke nomor yang tidak menyimpan kontak sender berisiko menyebabkan pemblokiran nomor oleh pihak WhatsApp.
Base URL

Pastikan Anda menggunakan Base URL yang sesuai dengan environment (Staging/Production).

  • Base URL: https://dev.denpasarkota.go.id/whatsapp

Alur Integrasi (Sequence Diagram)

Berikut adalah alur pengiriman pesan dari aplikasi klien ke WhatsApp Gateway:

Autentikasi

API ini menggunakan mekanisme Basic Authentication. Setiap permintaan (request) ke API harus menyertakan header Authorization yang valid.

Kredensial terdiri dari username dan password yang digabungkan dengan format username:password.

Credentials

Pastikan Anda tidak menyimpan kredensial (Username & Password) langsung di dalam source code frontend (client-side). Selalu lakukan request dari sisi server (backend) untuk menjaga keamanan.

Format Header

Authorization: Basic <base64_encoded_credentials>

1. Mengirim Pesan Teks

Endpoint ini digunakan untuk mengirim pesan teks biasa ke nomor tujuan. Mendukung formatting teks dasar WhatsApp (Bold, Italic, Strikethrough, ```Monospace```).

POST /send/message

Request Body

Format body menggunakan JSON.

ParameterTipeWajibDeskripsi
phonestringYaNomor telepon tujuan dengan kode negara (tanpa + atau 0). Contoh: 6281234567890.
messagestringYaIsi pesan teks yang akan dikirimkan.

Contoh Request

# Gunakan flag -u untuk Basic Auth (curl otomatis melakukan encode)
curl -X POST https://dev.denpasarkota.go.id/whatsapp/send/message \
-u "username:password" \
-H "Content-Type: application/json" \
-d '{
"phone": "6281234567890",
"message": "Halo, ini pesan dengan autentikasi."
}'

Response Sukses (200 OK)

{
"status": true,
"data": {
"id": "3EB0...",
"status": "PENDING",
"message": "Message sent successfully"
}
}

2. Mengirim Pesan Gambar

Endpoint ini digunakan untuk mengirimkan file gambar (berupa upload file lokal atau melalui URL) disertai dengan caption dan pengaturan spesifik lainnya.

POST /send/image

Request Body

Format request menggunakan multipart/form-data.

ParameterTipeWajibDeskripsi
phonestringYaNomor telepon tujuan dengan kode negara. Contoh: 6281234567890@s.whatsapp.net atau 6281234567890.
imagebinaryOpsional*File gambar yang akan diunggah. (Wajib jika tidak menggunakan image_url)
image_urlstringOpsional*Tautan URL gambar. Contoh: https://example.com/image.jpg. (Wajib jika tidak menggunakan image)
captionstringTidakTeks deskripsi atau caption yang menyertai gambar.
view_oncebooleanTidakAtur ke true agar gambar hanya dapat dilihat satu kali oleh penerima. Default: false.
compressbooleanTidakAtur ke true untuk melakukan kompresi ukuran gambar sebelum dikirim. Default: false.
durationintegerTidakDurasi (dalam detik) sebelum pesan menghilang (disappearing message). Contoh: 3600 (1 jam).
is_forwardedbooleanTidakMenandai pesan seolah-olah diteruskan dari percakapan lain. Default: false.
Praktik Terbaik Pengiriman Gambar

Gunakan parameter compress: true jika Anda mengirim gambar beresolusi tinggi untuk menghindari timeout atau kegagalan pengiriman pada jaringan lambat.

Contoh Request

# Mengirim file gambar lokal beserta caption dan fitur view once
curl -X POST https://dev.denpasarkota.go.id/whatsapp/send/image \
-u "username:password" \
-H "Content-Type: multipart/form-data" \
-F "phone=6281234567890" \
-F "caption=Ini bukti laporan Anda" \
-F "view_once=true" \
-F "compress=true" \
-F "image=@/path/to/gambar.jpg"

Contoh Responses

Sukses (200 OK)

{
"status": true,
"data": {
"id": "3EB0...",
"status": "PENDING",
"message": "Image sent successfully"
}
}

Gagal - Bad Request (400)

{
"status": false,
"message": "Bad Request: Parameter phone dan image/image_url wajib diisi."
}
Kompresi Gambar

Disarankan untuk melakukan kompresi gambar sebelum dikirim ke API untuk menghindari timeout atau kegagalan pengiriman pada jaringan yang lambat.


3. Mengirim Pesan File

Peringatan (Troubleshooting Content-Type)

PENTING: Saat melakukan pengujian di client seperti Postman atau modifikasi header manual, jangan pernah mengunci atau mengisi secara hardcode header Content-Type: multipart/form-data tanpa boundary yang valid.

  • Di cURL, menggunakan flag -F atau --form secara otomatis menyusun tipe multipart beserta boundary-nya yang tepat.
  • Di Node.js (Axios), pastikan menggunakan penanda ...form.getHeaders() untuk menyertakan boundary dynamic.

Kelalaian dalam pengaturan ini akan memicu error 500 Internal Server Error dengan pesan "request Content-Type has bad boundary or is not multipart/form-data".


Request Body (multipart/form-data)

Anda dapat mengirimkan file menggunakan salah satu dari dua metode alternatif berikut: Menggunakan File URL atau Mengunggah File Fisik secara langsung.

Parameter:

ParameterTipe DataWajibContoh / PilihanDeskripsi
phoneText (String)Ya6281238921xxxNomor WhatsApp tujuan lengkap dengan kode negara tanpa tanda +.
captionText (String)Tidakkirim file ni pakTeks pesan pendamping/caption file.
file_urlText (String)Alternatifhttps://raw.githubusercontent.com/.../logo.pngURL valid langsung ke file yang ingin diunduh dan dikirim oleh sistem.
fileFile (Binary)Alternatifpemandangan.jpgFile fisik yang diunggah langsung dari penyimpanan lokal komputer/server Anda.
reply_message_idText (String)Tidak3EB089B....ID pesan jika ingin membalas (reply) pesan spesifik tertentu.
is_forwardedBooleanTidakfalseMenandai apakah pesan ini diteruskan atau tidak.
durationIntegerTidak0Durasi disappearing message dalam detik (0 = non-aktif).

Contoh Respons API

Respons Sukses (200 OK)

{
"code": "SUCCESS",
"message": "Document sent to 6281238921xxx@s.whatsapp.net (server timestamp: 2026-07-13 05:52:09 +0000 UTC)",
"results": {
"message_id": "3EB030C....",
"status": "Document sent to 6281238921xxx@s.whatsapp.net (server timestamp: 2026-07-13 05:52:09 +0000 UTC)"
}
}

Contoh Implementasi

# Opsi A: Mengirim file menggunakan remote URL direktori internet
curl -X POST https://dev.denpasarkota.go.id/whatsapp/send/file
-u "username_anda:password_anda"
-F "phone=6281238921xxx"
-F "caption=kirim file ni pak"
-F "file_url=https://raw.githubusercontent.com/xxx/logo.png"

# Opsi B: Mengirim file fisik langsung dari storage lokal Anda
curl -X POST https://dev.denpasarkota.go.id/whatsapp/send/file
-u "username_anda:password_anda"
-F "phone=6281238921xxx"
-F "caption=kirim file fisik ni pak"
-F "file=@/path/to/pemandangan.jpg"