API Documentation

Otentikasi

Endpoint /api/send, /api/send-media, /api/check, /api/messages, /api/device menggunakan Device API Token. Kirim token dengan salah satu cara:

  • Authorization: Bearer <TOKEN>
  • X-API-Token: <TOKEN>
  • Form/JSON body field token
  • Query string ?token=<TOKEN>

Ambil token dari halaman Devices.

POST /api/send — kirim teks

POST /api/send
Authorization: Bearer DEVICE_API_TOKEN
Content-Type: application/json

{
  "target": "081234567890",          // atau "62812..,62898.." untuk multi
  "message": "Halo dari Banteng"
}

Response:

{
  "ok": true,
  "results": [
    { "target": "081234567890", "ok": true, "msg_id": "ABCD...", "jid": "62812...@s.whatsapp.net" }
  ]
}

POST /api/send-media — kirim gambar/dokumen

Pakai multipart/form-data jika upload file, atau JSON kalau pakai URL publik:

POST /api/send-media   (multipart/form-data)
fields:
  token   = DEVICE_API_TOKEN
  target  = 081234567890
  type    = image | video | audio | voice | document
  caption = (optional)
  file    = <binary>
  url     = https://...   (alternative to file)

POST /api/check — cek nomor terdaftar di WA

POST /api/check
Authorization: Bearer DEVICE_API_TOKEN

{ "target": "081234567890" }
→ { "ok": true, "exists": true, "jid": "62812...@s.whatsapp.net" }

Webhook (incoming message)

Saat pesan masuk ke device, server akan POST JSON ke URL webhook yang kamu set:

POST <your-webhook-url>
Content-Type: application/json
X-Signature: sha256=<hex>     // jika webhook_secret diisi

{
  "event": "message",
  "device_id": "abcdef0123456789",
  "from": "62812...@s.whatsapp.net",
  "phone": "62812...",
  "push_name": "John",
  "type": "text",
  "body": "halo bang",
  "msg_id": "3EB0...",
  "timestamp": 1760000000,
  "is_group": false
}

Verifikasi tanda tangan di server kamu dengan HMAC-SHA256(webhook_secret, raw_body) lalu bandingkan ke header X-Signature.

Contoh cURL

curl -X POST https://wa.bantengcaraka.id/api/send \
  -H "Authorization: Bearer DEVICE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"target":"081234567890","message":"Hello"}'

Anti-Ban Protection

Setiap device punya pengaman bawaan agar nomor tidak ke-ban WhatsApp:

  • Rate limit per menit (default 20) dan per hari (default 1000).
  • Send window: bisa dibatasi jam aktif (mis. 07:00–21:00).
  • Pre-validate: setiap nomor dicek dulu apakah ada di WhatsApp; nomor yang tidak terdaftar tidak dikirim.
  • Typing simulation: presence "composing" sebelum kirim agar terlihat manusiawi.
  • Warmup mode: nomor baru otomatis dibatasi 5/menit · 100/hari selama 24 jam pertama.
  • Random jitter: jeda antar broadcast dirandom (default 4–8 detik).
  • Auto-pause: broadcast otomatis berhenti jika gagal beruntun ≥ N kali.

Atur lewat tombol Anti-ban di halaman Devices, atau via PUT /api/devices/:id/settings.

Jika permintaan ditolak karena pengaman, response: { ok:false, error:"rate limit exceeded (max 20/min)" } dengan kode internal RATE_LIMIT, DAILY_LIMIT, atau OUT_OF_WINDOW.

Broadcast (kirim massal)

POST /api/broadcasts        (JWT)
{
  "device_id": 1,
  "name": "Promo Lebaran",
  "message": "Halo {{nama}}, ada promo!",
  "targets": [
    "081234567890",
    { "phone": "62812...", "vars": { "nama": "Budi" } }
  ],
  "delay_ms": 4000,
  "delay_jitter_ms": 4000,
  "scheduled_at": "2026-05-01 09:00:00"
}

Worker mengirim satu per satu dengan delay random. Jika gagal beruntun, broadcast otomatis dipause.

Pesan Terjadwal

POST /api/broadcasts/scheduled/single   (JWT)
{ "device_id": 1, "target": "081234567890", "message": "Reminder!", "scheduled_at": "2026-05-01 08:00:00" }

Auto-Reply

Buat aturan: bila pesan masuk match keyword, kirim balasan otomatis. Mode match: contains, exact, startswith, regex. Mendukung filter jam aktif (hours_start, hours_end) dan hari aktif (days_of_week).

POST /api/autoreplies   (JWT)
{
  "device_id": 1,
  "name": "Salam pembuka",
  "match_mode": "contains",
  "keyword": "halo",
  "reply": "Hai! Ada yang bisa kami bantu?",
  "cooldown_sec": 300,
  "ignore_groups": true,
  "hours_start": "08:00",
  "hours_end":   "18:00",
  "days_of_week": "mon,tue,wed,thu,fri"
}

SDK Examples

Endpoint /api/send bisa dipanggil dari berbagai bahasa. Ganti DEVICE_API_TOKEN dengan token milik device kamu.

curl -X POST https://wa.bantengcaraka.id/api/send \
  -H "Authorization: Bearer DEVICE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"target":"081234567890","message":"Halo dari Banteng Caraka"}'

Webhook verification (PHP):

<?php
$secret = 'YOUR_WEBHOOK_SECRET';
$body = file_get_contents('php://input');
$sig  = $_SERVER['HTTP_X_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $body, $secret);
if (!hash_equals($expected, $sig)) {
    http_response_code(401);
    exit('invalid signature');
}
$payload = json_decode($body, true);
// process $payload['from'], $payload['body'], etc.