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.

Contoh di bawah memakai placeholder. Masuk atau daftar untuk melihat API Key dan session milik Anda, lalu kelola API Key dan Webhook URL pada halaman Profil.

Ringkasan

ItemNilai
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)

FieldTipeWajibKeterangan
sessionstringYa Nama session WhatsApp Anda (lihat GET /devices), contoh utama.
phonestringYa Nomor tujuan format internasional tanpa tanda +, contoh 6281234567890.
messagestringYa 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

HTTPerror.codeKeterangan
400invalid_payloadField tidak valid atau tidak lengkap (detail pada error.fields).
401unauthorizedAPI Key tidak dikirim atau tidak dikenali.
402subscription_expiredMasa uji coba/langganan berakhir. Perpanjang langganan melalui dashboard.
404device_not_foundSession tidak ditemukan pada akun Anda.
405method_not_allowedMetode HTTP tidak didukung endpoint.
409device_not_workingSession tidak terhubung (bukan status WORKING).
429rate_limitedMelebihi batas 60 pesan/menit (cek header Retry-After).
502send_failedWhatsApp 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

  1. WhatsApp server (WA) mengirim event ke endpoint aplikasi: https://pengantarpesan.my.id/api/webhook?secret=... (dikonfigurasi oleh admin).
  2. Aplikasi menyimpan pesan ke database, lalu meneruskan (forward) event tersebut sebagai POST JSON ke Webhook URL milik Anda.
  3. 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 200 dalam 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/webhook wajib 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.