Dokumentasi API
Kirim dan terima pesan WhatsApp secara programatis melalui REST API Pengantar Pesan — cocok untuk bot, integrasi CRM, notifikasi order, dan sistem otomasi lainnya.
Ringkasan
| Item | Nilai |
|---|---|
| Base URL | https://pengantarpesan.my.id/api/v1/ |
| Metode | POST /messages · GET /devices |
| Autentikasi | Header X-Api-Key: <api_key> atau Authorization: Bearer <api_key> |
| Format | Request & response berformat JSON (UTF-8) |
API Key Anda
Masuk untuk menampilkan API Key Anda. Format key: pp_ diikuti 40 karakter acak.
Kirim Pesan
POST https://pengantarpesan.my.id/api/v1/messages
— mengirim pesan teks WhatsApp melalui session yang terhubung.
Body Request (JSON)
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
session | string | Ya | Nama session WhatsApp Anda (lihat GET /devices), contoh utama. |
phone | string | Ya | Nomor tujuan format internasional tanpa tanda +, contoh 6281234567890. |
message | string | Ya | Isi pesan, maksimal 4000 karakter. |
Contoh cURL
curl -X POST "https://pengantarpesan.my.id/api/v1/messages" \
-H "Content-Type: application/json" \
-H "X-Api-Key: pp_GANTIKAN_DENGAN_API_KEY_ANDA" \
-d '{
"session": "utama",
"phone": "6281234567890",
"message": "Halo, pesanan Anda sudah dikirim ya."
}'Dengan Bearer token:
curl -X POST "https://pengantarpesan.my.id/api/v1/messages" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer pp_GANTIKAN_DENGAN_API_KEY_ANDA" \
-d '{"session": "utama", "phone": "6281234567890", "message": "Halo!"}'Respons Sukses (HTTP 201)
{
"ok": true,
"data": {
"id": 128,
"session": "utama",
"phone": "6281234567890",
"chat_id": "6281234567890@c.us",
"waha_message_id": "true_6281234567890@c.us_3EB0C4A1B2C3D4E5",
"status": "SENT",
"sent_at": "2026-10-16 10:15:00",
"conversation_id": 7
}
}Respons Gagal
{
"ok": false,
"error": {
"code": "device_not_working",
"message": "Session \"utama\" tidak aktif (status: SCAN QR). Hubungkan perangkat terlebih dahulu."
}
}Kode Error
| HTTP | error.code | Keterangan |
|---|---|---|
| 400 | invalid_payload | Field tidak valid atau tidak lengkap (detail pada error.fields). |
| 401 | unauthorized | API Key tidak dikirim atau tidak dikenali. |
| 402 | subscription_expired | Masa uji coba/langganan berakhir. Perpanjang langganan melalui dashboard. |
| 404 | device_not_found | Session tidak ditemukan pada akun Anda. |
| 405 | method_not_allowed | Metode HTTP tidak didukung endpoint. |
| 409 | device_not_working | Session tidak terhubung (bukan status WORKING). |
| 429 | rate_limited | Melebihi batas 60 pesan/menit (cek header Retry-After). |
| 502 | send_failed | WhatsApp server (WA) gagal mengirim pesan. |
Daftar Perangkat / Session
GET https://pengantarpesan.my.id/api/v1/devices
— menampilkan seluruh session beserta statusnya (untuk mengisi field session).
curl -H "X-Api-Key: pp_GANTIKAN_DENGAN_API_KEY_ANDA" "https://pengantarpesan.my.id/api/v1/devices"Respons
{
"ok": true,
"count": 2,
"data": [
{
"session": "utama",
"phone_number": "628111111111",
"status": "WORKING",
"working": true
},
{
"session": "marketing",
"phone_number": null,
"status": "SCAN QR",
"working": false
}
]
} Contoh Integrasi REST API
const response = await fetch('https://pengantarpesan.my.id/api/v1/messages', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Api-Key': 'pp_GANTIKAN_DENGAN_API_KEY_ANDA'
},
body: JSON.stringify({
session: 'utama',
phone: '6281234567890',
message: 'Halo, pesanan Anda sudah dikirim ya.'
})
});
const result = await response.json();
if (result.ok) {
console.log('Terkirim, status:', result.data.status);
} else {
console.error('Gagal:', result.error.code, result.error.message);
}<?php
$payload = [
'session' => 'utama',
'phone' => '6281234567890',
'message' => 'Halo, pesanan Anda sudah dikirim ya.',
];
$ch = curl_init('https://pengantarpesan.my.id/api/v1/messages');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-Api-Key: pp_GANTIKAN_DENGAN_API_KEY_ANDA',
],
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
if ($result && !empty($result['ok'])) {
echo 'Terkirim dengan status ' . $result['data']['status'];
} else {
echo 'Gagal: ' . ($result['error']['message'] ?? 'tidak diketahui');
}import requests
response = requests.post(
"https://pengantarpesan.my.id/api/v1/messages",
headers={"X-Api-Key": "pp_GANTIKAN_DENGAN_API_KEY_ANDA"},
json={
"session": "utama",
"phone": "6281234567890",
"message": "Halo, pesanan Anda sudah dikirim ya.",
},
timeout=30,
)
result = response.json()
if result.get("ok"):
print("Terkirim:", result["data"]["status"])
else:
print("Gagal:", result["error"]["code"], result["error"]["message"])Webhook & JSON Pesan Masuk
Setiap pesan masuk dan perubahan status dapat diteruskan otomatis ke server Anda dalam format JSON, sehingga Anda dapat memproses pesan (mis. chatbot atau sistem order) tanpa perlu polling.
Cara Kerja
- WhatsApp server (WA) mengirim event ke endpoint aplikasi:
https://pengantarpesan.my.id/api/webhook?secret=...(dikonfigurasi oleh admin). - Aplikasi menyimpan pesan ke database, lalu meneruskan (forward) event tersebut sebagai
POSTJSON ke Webhook URL milik Anda. - Daftarkan Webhook URL pada halaman Profil → API & Webhook. Kosongkan untuk menonaktifkan.
Verifikasi Payload
Setiap pengiriman webhook disertai header X-Webhook-Event (jenis event) dan
X-Api-Key (berisi API Key Anda). Selalu bandingkan header X-Api-Key
dengan API Key Anda sendiri sebelum memproses payload.
Contoh JSON: Pesan Masuk (message.received)
{
"event": "message.received",
"delivered_at": "2026-10-16 10:15:12",
"device": {
"session": "utama",
"phone_number": "628111111111"
},
"contact": {
"phone": "628222222222",
"name": "Budi Santoso"
},
"message": {
"id": "true_628222222222@c.us_3EB0C4A1B2C3D4E5",
"direction": "IN",
"type": "text",
"body": "Halo, saya mau tanya status pesanan saya",
"sent_at": "2026-10-16 10:15:10"
}
}Contoh JSON: Status Pesan (message.status)
Dikirim ketika status pesan berubah. Nilai status:
PENDING, SENT, DELIVERED, READ, FAILED.
{
"event": "message.status",
"delivered_at": "2026-10-16 10:15:20",
"device": {
"session": "utama",
"phone_number": "628111111111"
},
"message": {
"id": "true_628222222222@c.us_3EB0C4A1B2C3D4E5",
"status": "READ"
}
}Contoh JSON: Status Session (session.status)
Dikirim ketika koneksi WhatsApp berubah. Nilai status:
WORKING, SCAN QR, FAILED, STOPPED.
{
"event": "session.status",
"delivered_at": "2026-10-16 10:15:25",
"device": {
"session": "utama",
"status": "WORKING",
"phone_number": "628111111111"
}
}Contoh Penerima Webhook (PHP)
<?php
// Contoh penerima webhook (receiver) sederhana.
$API_KEY = 'pp_GANTIKAN_DENGAN_API_KEY_ANDA';
// 1. Verifikasi asal payload dengan API Key milik Anda.
$given = (string) ($_SERVER['HTTP_X_API_KEY'] ?? '');
if (!hash_equals($API_KEY, $given)) {
http_response_code(403);
exit('Unauthorized');
}
// 2. Baca payload JSON.
$payload = json_decode((string) file_get_contents('php://input'), true);
$event = (string) ($payload['event'] ?? '');
// 3. Proses sesuai jenis event.
if ($event === 'message.received') {
$from = $payload['contact']['phone'] ?? '';
$text = $payload['message']['body'] ?? '';
// ... simpan / proses pesan masuk, mis. balas otomatis
// melalui POST /api/v1/messages.
}
// 4. Selalu balas 200 OK agar pengiriman webhook dianggap berhasil.
http_response_code(200);
header('Content-Type: application/json');
echo '{"ok":true}';
Catatan
- Balas dengan
HTTP 200dalam waktu < 10 detik agar pengiriman dianggap berhasil. - Pesan grup dan status broadcast tidak diteruskan (hanya chat langsung).
- Balasan pesan dapat dikirim kembali melalui endpoint
POST /api/v1/messages. - Endpoint
https://pengantarpesan.my.id/api/webhookwajib menyertakan?secret=milik sistem dan bukan untuk dikonsumsi langsung oleh aplikasi Anda.
Batas Penggunaan
- 120 request API per menit per akun.
- 60 pesan terkirim per menit per akun.
- Pesan maksimal 4000 karakter.