1. Pengenalan & Autentikasi

API Gateway ini sepenuhnya universal dan agnostik, dapat diintegrasikan dengan aplikasi apapun (Laravel, PHP murni, Node.js, Python, Golang, mobile apps, CRM, ERP, dll).

STANDAR REQUEST
  • Base URL: http://domain-anda.com/send atau /send-message
  • Content-Type: application/json atau multipart/form-data
  • Autentikasi: Setiap request wajib menyertakan userId dan api_key.
FORMAT RESPON STANDAR
{ "status": true, "message": "Message queued successfully", "queue_position": 1 }
POST

2. Kirim Pesan Teks & Reaksi Emoji

Mengirim pesan teks berformat ke nomor personal (628xxx) atau grup (...g.us), serta memberi reaksi emoji.

{ "userId": 1, "api_key": "YOUR_API_KEY", "number": "628123456789", "message": "Halo! Ini pesan *tebal*, _miring_, dan ~coret~.", // Opsional: kirim reaksi emoji ke pesan tertentu "reaction": "👍", "message_id": "3EB0ABC123456789" }
POST

3. Kirim Media & Voice Note PTT Asli

Kirim Foto, Video, atau Voice Note (PTT) asli dengan gelombang suara bulat.

CONTOH KIRIM GAMBAR / FOTO
{ "userId": 1, "api_key": "YOUR_API_KEY", "number": "628123456789", "type": "image", "image": "https://example.com/foto.jpg", "caption": "Berikut foto produk / bukti transaksi." }
CONTOH KIRIM VOICE NOTE (PTT ASLI)
{ "userId": 1, "api_key": "YOUR_API_KEY", "number": "628123456789", "type": "ptt", "audio": "https://example.com/audio.mp3", "ptt": true }
POST

4. Kirim Dokumen & Berkas

Kirim dokumen PDF, Excel, Word, Zip, dll dengan nama berkas (*filename*) kustom.

{ "userId": 1, "api_key": "YOUR_API_KEY", "number": "628123456789", "type": "document", "document": "https://example.com/laporan_tahunan.pdf", "filename": "Laporan_Keuangan_2026.pdf", "mimetype": "application/pdf", "message": "Silakan unduh berkas laporan di atas." }
POST

5. Polling WhatsApp Interaktif

Mengirim polling interaktif dengan opsi pilihan tunggal atau ganda ke chat personal maupun grup.

{ "userId": 1, "api_key": "YOUR_API_KEY", "number": "628123456789", "type": "poll", "poll_name": "Kapan jadwal rapat evaluasi proyek?", "poll_options": ["Senin Pagi", "Rabu Siang", "Jumat Sore"], "poll_selectable_count": 1 }
POST

6. Tombol Quick Reply (Balasan Cepat)

Mengirim pesan dengan tombol balasan cepat (maksimal 3 tombol) via format Interactive Message.

{ "userId": 1, "api_key": "YOUR_API_KEY", "number": "628123456789", "type": "buttons", "title": "Konfirmasi Peminjaman Buku", "message": "Apakah Anda ingin memperpanjang masa peminjaman buku?", "footer": "Adhi SLiMS Gateway", "buttons": [ "Ya, Perpanjang", "Kembalikan", "Bantuan CS" ] }
POST

7. List Message (Pesan Menu Daftar Pop-up)

Mengirim satu tombol utama yang jika diklik akan membuka jendela pop-up berisi daftar pilihan layanan.

{ "userId": 1, "api_key": "YOUR_API_KEY", "number": "628123456789", "type": "list", "title": "Layanan Mandiri Perpustakaan", "button_text": "Pilih Layanan", "message": "Silakan pilih salah satu layanan di bawah ini:", "footer": "Buka Senin - Jumat 08:00 - 16:00", "sections": [ { "title": "Menu Utama", "rows": [ { "id": "srv_1", "title": "Katalog Buku", "description": "Cari koleksi pustaka" }, { "id": "srv_2", "title": "Perpanjangan", "description": "Perpanjang masa pinjam" }, { "id": "srv_3", "title": "Cek Denda", "description": "Informasi tagihan denda" } ] } ] }
POST

8. Acara / Event Grup WhatsApp

Membuat agenda acara / kalender resmi WhatsApp dengan fitur RSVP di dalam grup WhatsApp (...@g.us).

{ "userId": 1, "api_key": "YOUR_API_KEY", "number": "1203630123456789@g.us", "type": "event", "event_name": "Webinar WhatsApp Gateway & AI", "event_description": "Membahas integrasi webhook dan otomatisasi pesan.", "event_start_time": "2026-09-10T14:00:00Z", "event_location": "Google Meet / Kantor Pusat" }
POST

9. Posting WhatsApp Story / Status

Endpoint khusus untuk mempublikasikan status/cerita ke akun WhatsApp Anda sendiri (POST /send-status). Mendukung teks dengan warna latar belakang (*hex color*), foto/gambar, maupun video.

CONTOH 1: STATUS TEKS DENGAN WARNA BACKGROUND
{ "userId": 1, "api_key": "YOUR_API_KEY", "message": "Pengumuman: Sistem WhatsApp Gateway beroperasi normal 24/7!", "bg_color": "#1e88e5", "status_recipients": "628123456789,628987654321" // Opsional: target kontak spesifik }
CONTOH 2: STATUS GAMBAR / FOTO
{ "userId": 1, "api_key": "YOUR_API_KEY", "image": "https://example.com/poster_promo.jpg", "message": "Promo Spesial Hari Ini! Hubungi admin untuk detailnya.", "status_recipients": "628123456789" }
GET

10. Saluran / Channel WhatsApp

Mengambil daftar saluran/channel yang diikuti atau dikelola oleh akun bot (GET /channels). Anda dapat mengirim postingan ke saluran menggunakan endpoint POST /send dengan target ID ...@newsletter.

// Request GET: /channels?userId=1&api_key=YOUR_API_KEY // Respon: { "status": true, "total": 1, "channels": [ { "id": "120363123456789012@newsletter", "name": "Kabar Terkini Perpustakaan", "subscribers": 520, "role": "ADMIN" } ] }
GET

11. Daftar Grup WhatsApp

Mengambil daftar semua grup WhatsApp yang diikuti bot beserta total anggota (GET /groups).

// Request GET: /groups?userId=1&api_key=YOUR_API_KEY { "status": true, "total": 2, "groups": [ { "id": "1203630123456789@g.us", "name": "Grup Diskusi Utama", "participants": 45 } ] }
WEBHOOK

12. Integrasi Webhook ke Aplikasi Kustom Anda

Sistem WhatsApp Gateway ini dirancang 100% Universal & Agnostik. Anda dapat menghubungkan gateway ini ke aplikasi apapun yang Anda buat (Laravel, PHP Native, CodeIgniter, Express JS, Django, Flask, FastAPI, Go, dll) secara dua arah (Two-Way):

1. Pesan Masuk (Inbound Webhook)

Setiap ada pesan teks, polling, media, atau klik tombol dari pengguna WhatsApp, gateway akan mengirimkan HTTP POST secara real-time ke URL Webhook aplikasi Anda.

2. Respon Balasan Langsung (Auto-Reply)

Aplikasi Anda cukup mengembalikan JSON {"reply": "Teks Jawaban"}, dan gateway akan langsung membalas ke pengguna WhatsApp secara otomatis.

A. Struktur Payload HTTP POST dari Gateway ke Webhook Anda

Header yang dikirim: Content-Type: application/json dan X-Webhook-Secret: [SECRET_KEY_ANDA]

{ "app": "adhislims-gateway", "userId": 1, "chat": { "type": "private", // "private" (personal) atau "group" (grup WA) "jid": "628123456789@s.whatsapp.net", "from": "628123456789", // Nomor HP asli pengirim "pushName": "Budi Santoso" // Nama profil WhatsApp pengirim }, "message": { "type": "conversation", // "conversation", "imageMessage", "pollUpdateMessage", dll "text": "Cek denda buku saya", // Teks pesan yang dikirim user "timestamp": 1725280000 }, "id_user": 1, "from": "628123456789", "pushname": "Budi Santoso" }
B. Cara Aplikasi Anda Membalas Pesan Pengguna

Server Webhook Anda cukup mencetak respon berformat JSON berikut:

// 1. Balas Pesan Teks { "reply": "Halo Budi! Saat ini Anda memiliki 1 buku pinjaman dan bebas denda." } // 2. Tandai pesan sudah ditangani tanpa membalas { "status": "captured" }
C. Contoh Kode Implementasi Webhook di Aplikasi Kustom

File: app/Http/Controllers/WhatsAppWebhookController.php

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class WhatsAppWebhookController extends Controller { public function handle(Request $request) { // 1. Verifikasi Secret Key (Opsional untuk keamanan) $secret = $request->header('X-Webhook-Secret'); if ($secret !== config('services.wa_gateway.secret')) { return response()->json(['error' => 'Unauthorized'], 401); } // 2. Ambil data pesan masuk $sender = $request->input('from'); // 628123456789 $message = strtolower(trim($request->input('message.text', $request->input('message')))); $name = $request->input('pushname', 'Pelanggan'); // 3. Logika Bisnis Aplikasi Anda if ($message === 'halo' || $message === 'menu') { return response()->json([ 'reply' => "Halo {$name}! Selamat datang di sistem kami.\nKetik *BANTUAN* untuk melihat opsi layanan." ]); } // Respon default jika tidak ada kecocokan return response()->json([ 'reply' => "Pesan diterima: \"{$message}\". Kami akan segera menindaklanjutinya." ]); } }

File: webhook.php

<?php header('Content-Type: application/json'); // Ambil input JSON dari gateway $raw = file_get_contents('php://input'); $data = json_decode($raw, true); if (!$data) { echo json_encode(['status' => false, 'error' => 'Empty payload']); exit; } $from = $data['from'] ?? ''; $pesan = strtolower(trim($data['message']['text'] ?? ($data['message'] ?? ''))); $nama = $data['pushname'] ?? 'Kak'; // Balas otomatis if ($pesan === 'tagihan') { echo json_encode([ 'reply' => "Halo {$nama}, tagihan Anda bulan ini: Lunas (Rp 0)." ]); } else { echo json_encode([ 'reply' => "Halo {$nama}, terima kasih telah menghubungi kami!" ]); } ?>

File: webhook.js

const express = require('express'); const app = express(); app.use(express.json()); app.post('/webhook', (req, res) => { const { from, pushname, message } = req.body; const text = (message && message.text) ? message.text.toLowerCase() : ''; console.log(`[Pesan Masuk] Dari ${from} (${pushname}): ${text}`); if (text.includes('harga')) { return res.json({ reply: `Halo ${pushname}! Paket langganan kami mulai dari Rp 50.000/bulan.` }); } res.json({ reply: `Pesan Anda telah kami terima, ${pushname}!` }); }); app.listen(8000, () => console.log('Webhook server running on port 8000'));

File: main.py (FastAPI)

from fastapi import FastAPI, Request app = FastAPI() @app.post("/webhook") async def receive_webhook(request: Request): payload = await request.json() from_number = payload.get("from") push_name = payload.get("pushname", "User") message_text = payload.get("message", {}).get("text", "").lower() if "bantuan" in message_text: return {"reply": f"Halo {push_name}! Butuh bantuan apa hari ini?"} return {"reply": f"Terima kasih {push_name}, pesan Anda sedang diproses."}