API Reference
REST API · v1

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 202 berarti masuk antrean.

Authentication

Sertakan API key di header Authorization pada setiap request. Key yang salah/absen → 401.

Header

Authorization: Bearer YOUR_API_KEY

Semua 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

POST /messages

Kirim pesan teks biasa. Bisa pakai emoji & baris baru.

Body Parameters

FieldTipeKeterangan
device * string Device Token pengirim
to * string Nomor tujuan, format 628…
message * string Isi pesan teks
Request
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 👋"
  }'
Response 202 Accepted
{
  "success": true,
  "message": "Pesan diterima dan masuk antrean",
  "data": { "id": 123, "status": "queued", "to": "628123456789" }
}

Send Media

POST /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

FieldTipeKeterangan
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)
Request
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!"
  }'
Response 202 Accepted
{
  "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

POST /messages

Kirim stiker dari file .webp.

Body Parameters

FieldTipeKeterangan
device * string Device Token pengirim
to * string Nomor tujuan, format 628…
type * string "sticker"
media_url * string URL file .webp
Request
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"
  }'
Response 202 Accepted
{
  "success": true,
  "message": "Pesan diterima dan masuk antrean",
  "data": { "id": 123, "status": "queued", "to": "628123456789" }
}

Send Location

POST /messages

Kirim titik lokasi (pin) dengan latitude & longitude.

Body Parameters

FieldTipeKeterangan
device * string Device Token pengirim
to * string Nomor tujuan, format 628…
type * string "location"
location * object { latitude, longitude, name? }
Request
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"
    }
  }'
Response 202 Accepted
{
  "success": true,
  "message": "Pesan diterima dan masuk antrean",
  "data": { "id": 123, "status": "queued", "to": "628123456789" }
}

Send Contact

POST /messages

Kirim kartu kontak (vCard).

Body Parameters

FieldTipeKeterangan
device * string Device Token pengirim
to * string Nomor tujuan, format 628…
type * string "contact"
contact * object { name, phone }
Request
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"
    }
  }'
Response 202 Accepted
{
  "success": true,
  "message": "Pesan diterima dan masuk antrean",
  "data": { "id": 123, "status": "queued", "to": "628123456789" }
}

Send Poll

POST /messages

Kirim polling ke penerima.

Body Parameters

FieldTipeKeterangan
device * string Device Token pengirim
to * string Nomor tujuan, format 628…
type * string "poll"
poll * object { name, options[], selectableCount? }. selectableCount default 1.
Request
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
    }
  }'
Response 202 Accepted
{
  "success": true,
  "message": "Pesan diterima dan masuk antrean",
  "data": { "id": 123, "status": "queued", "to": "628123456789" }
}

Device

Validate Number

POST /devices/:token/check

Cek apakah nomor terdaftar di WhatsApp.

Butuh plan Pro & device terhubung.

Path Parameters

FieldTipeKeterangan
token * string Device Token

Body Parameters

FieldTipeKeterangan
numbers * string[] Daftar nomor yang dicek (maks 50)
Request
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"] }'
Response 200 OK
{
  "success": true,
  "data": [
    { "number": "628123456789", "exists": true,  "jid": "628123456789@s.whatsapp.net" },
    { "number": "628987654321", "exists": false, "jid": null }
  ]
}

Get Device Info

GET /devices/:token/status

Cek status koneksi & langganan sebuah device.

Path Parameters

FieldTipeKeterangan
token * string Device Token
Request
curl https://watsapmu.id/api/v1/devices/YOUR_DEVICE_TOKEN/status \
  -H "Authorization: Bearer YOUR_API_KEY"
Response 200 OK
{
  "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

EventStatusTriggerField 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.

© 2026 Watsapmu · Beranda · Dashboard