Watsapmu API
Kirim pesan WhatsApp dari aplikasi atau website kamu — OTP, invoice, notifikasi, broadcast — lewat REST API sederhana. Semua request pakai HTTPS dan mengembalikan JSON.
Base URL
https://watsapmu.id/api/v1
Autentikasi
Bearer <API_KEY>
Konsep singkat
- API Key — otentikasi akun. Buat di Settings → API Keys.
- Device Token — menentukan nomor WhatsApp pengirim (field
device). - Kirim pesan diproses lewat antrean anti-ban — status
202berarti masuk antrean.
Authentication
Sertakan API key di header Authorization pada setiap request. Key yang salah/absen → 401.
Header
Authorization: Bearer YOUR_API_KEYSemua contoh di bawah pakai cURL & JavaScript. Untuk PHP, polanya sama — cukup ganti body JSON-nya.
Helper PHP
function watsapmu($path, $body) {
$ch = curl_init("https://watsapmu.id/api/v1" . $path);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode($body),
]);
return curl_exec($ch);
}Messaging
Semua tipe pesan lewat satu endpoint POST /messages — bedanya di field type & payload.
Send Message
/messages
Kirim pesan teks biasa. Bisa pakai emoji & baris baru.
Body Parameters
| Field | Tipe | Keterangan |
|---|---|---|
device * |
string | Device Token pengirim |
to * |
string | Nomor tujuan, format 628… |
message * |
string | Isi pesan teks |
curl -X POST https://watsapmu.id/api/v1/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"device": "YOUR_DEVICE_TOKEN",
"to": "628123456789",
"message": "Halo dari Watsapmu 👋"
}'{
"success": true,
"message": "Pesan diterima dan masuk antrean",
"data": { "id": 123, "status": "queued", "to": "628123456789" }
}Send Media
/messages
Kirim gambar, video, audio, atau dokumen. Sumber media 3 cara — media_url, upload file, atau base64 (pilih salah satu).
Non-text (media, sticker, poll, contact, location) butuh plan Pro.
Body Parameters
| Field | Tipe | Keterangan |
|---|---|---|
device * |
string | Device Token pengirim |
to * |
string | Nomor tujuan, format 628… |
type * |
string | image · video · audio · document |
media_url |
string | URL file publik (salah satu sumber) |
file |
file | Upload via multipart/form-data (salah satu) |
media_base64 |
string | Data base64 / data-URI (salah satu) |
filename |
string | Nama file untuk base64 (opsional, bantu deteksi tipe) |
mimetype |
string | MIME base64, mis. image/jpeg (opsional) |
message |
string | Caption (opsional) |
curl -X POST https://watsapmu.id/api/v1/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"device": "YOUR_DEVICE_TOKEN",
"to": "628123456789",
"type": "image",
"media_url": "https://example.com/promo.jpg",
"message": "Promo spesial hari ini!"
}'{
"success": true,
"message": "Pesan diterima dan masuk antrean",
"data": { "id": 123, "status": "queued", "to": "628123456789" }
}Alternatif sumber media
Selain media_url, kamu bisa upload file langsung (multipart) atau kirim base64 — pilih salah satu.
Upload file · multipart/form-data
curl -X POST https://watsapmu.id/api/v1/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "device=YOUR_DEVICE_TOKEN" \
-F "to=628123456789" \
-F "type=image" \
-F "message=Promo hari ini" \
-F "file=@/path/to/image.jpg"Base64 · JSON
{
"device": "YOUR_DEVICE_TOKEN",
"to": "628123456789",
"type": "image",
"media_base64": "/9j/4AAQSkZJRg...",
"filename": "promo.jpg",
"mimetype": "image/jpeg"
}Send Sticker
/messages
Kirim stiker dari file .webp.
Body Parameters
| Field | Tipe | Keterangan |
|---|---|---|
device * |
string | Device Token pengirim |
to * |
string | Nomor tujuan, format 628… |
type * |
string | "sticker" |
media_url * |
string | URL file .webp |
curl -X POST https://watsapmu.id/api/v1/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"device": "YOUR_DEVICE_TOKEN",
"to": "628123456789",
"type": "sticker",
"media_url": "https://example.com/sticker.webp"
}'{
"success": true,
"message": "Pesan diterima dan masuk antrean",
"data": { "id": 123, "status": "queued", "to": "628123456789" }
}Send Location
/messages
Kirim titik lokasi (pin) dengan latitude & longitude.
Body Parameters
| Field | Tipe | Keterangan |
|---|---|---|
device * |
string | Device Token pengirim |
to * |
string | Nomor tujuan, format 628… |
type * |
string | "location" |
location * |
object | { latitude, longitude, name? } |
curl -X POST https://watsapmu.id/api/v1/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"device": "YOUR_DEVICE_TOKEN",
"to": "628123456789",
"type": "location",
"location": {
"latitude": -6.2088,
"longitude": 106.8456,
"name": "Jakarta"
}
}'{
"success": true,
"message": "Pesan diterima dan masuk antrean",
"data": { "id": 123, "status": "queued", "to": "628123456789" }
}Send Contact
/messages
Kirim kartu kontak (vCard).
Body Parameters
| Field | Tipe | Keterangan |
|---|---|---|
device * |
string | Device Token pengirim |
to * |
string | Nomor tujuan, format 628… |
type * |
string | "contact" |
contact * |
object | { name, phone } |
curl -X POST https://watsapmu.id/api/v1/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"device": "YOUR_DEVICE_TOKEN",
"to": "628123456789",
"type": "contact",
"contact": {
"name": "CS Watsapmu",
"phone": "628111222333"
}
}'{
"success": true,
"message": "Pesan diterima dan masuk antrean",
"data": { "id": 123, "status": "queued", "to": "628123456789" }
}Send Poll
/messages
Kirim polling ke penerima.
Body Parameters
| Field | Tipe | Keterangan |
|---|---|---|
device * |
string | Device Token pengirim |
to * |
string | Nomor tujuan, format 628… |
type * |
string | "poll" |
poll * |
object | { name, options[], selectableCount? }. selectableCount default 1. |
curl -X POST https://watsapmu.id/api/v1/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"device": "YOUR_DEVICE_TOKEN",
"to": "628123456789",
"type": "poll",
"poll": {
"name": "Pilih jadwal meeting?",
"options": ["Senin", "Rabu", "Jumat"],
"selectableCount": 1
}
}'{
"success": true,
"message": "Pesan diterima dan masuk antrean",
"data": { "id": 123, "status": "queued", "to": "628123456789" }
}Device
Validate Number
/devices/:token/check
Cek apakah nomor terdaftar di WhatsApp.
Butuh plan Pro & device terhubung.
Path Parameters
| Field | Tipe | Keterangan |
|---|---|---|
token * |
string | Device Token |
Body Parameters
| Field | Tipe | Keterangan |
|---|---|---|
numbers * |
string[] | Daftar nomor yang dicek (maks 50) |
curl -X POST https://watsapmu.id/api/v1/devices/YOUR_DEVICE_TOKEN/check \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "numbers": ["628123456789", "628987654321"] }'{
"success": true,
"data": [
{ "number": "628123456789", "exists": true, "jid": "628123456789@s.whatsapp.net" },
{ "number": "628987654321", "exists": false, "jid": null }
]
}Get Device Info
/devices/:token/status
Cek status koneksi & langganan sebuah device.
Path Parameters
| Field | Tipe | Keterangan |
|---|---|---|
token * |
string | Device Token |
curl https://watsapmu.id/api/v1/devices/YOUR_DEVICE_TOKEN/status \
-H "Authorization: Bearer YOUR_API_KEY"{
"success": true,
"data": {
"device": "YOUR_DEVICE_TOKEN",
"name": "CS 1",
"phone": "628123456789",
"connection_status": "connected",
"billing_status": "active",
"period_end": "2026-08-01T00:00:00.000Z"
}
}Webhooks
Terima notifikasi real-time ke URL kamu. Daftarkan URL + pilih event di Dashboard → Webhooks. Watsapmu akan POST JSON ke URL itu tiap event terjadi.
Event Types
| Event | Status | Trigger | Field payload |
|---|---|---|---|
message.inbound |
Aktif | Ada pesan masuk ke device | from, name, message, wa_message_id |
message.status |
Segera | Update status pesan keluar (sent/failed) | — belum aktif — |
Contoh payload — message.inbound
{
"event": "message.inbound",
"device": "YOUR_DEVICE_TOKEN",
"from": "628123456789",
"name": "Budi",
"message": "Halo, mau tanya dong",
"wa_message_id": "3EB0...",
"timestamp": "2026-07-08T10:24:00.000Z"
}Verifikasi Signature
Jika webhook diberi secret, tiap request menyertakan header HMAC-SHA256 dari raw body:
X-Watsapmu-Signature: sha256=<hmac>
// Node.js verify
const crypto = require("crypto");
const sig = "sha256=" + crypto
.createHmac("sha256", SECRET)
.update(rawBody)
.digest("hex");
if (sig === req.headers["x-watsapmu-signature"]) {
// valid ✅
}Tips & Troubleshooting
Format nomor
Format internasional tanpa +/0 — mis. 628123456789.
202 tapi belum sampai?
202 = masuk antrean. Pengiriman melewati jeda anti-ban. Cek status akhir di Riwayat Pesan.
401 Unauthorized
API key salah/nonaktif. Cek header Authorization.
409 Device belum terhubung
Device offline. Hubungkan di Dashboard → Kelola Device.
403 / fitur terkunci
Tipe non-text & Validate Number butuh plan Pro.
Jaga rahasia API key
Jangan taruh key di frontend. Bocor? revoke/regenerate di Settings → API Keys.