Whatsapp API (Baileys)

Mulai dari sini untuk menghubungkan nomor WhatsApp dan mendapatkan token.


Dokumentasi API

Format request/response API ini mengikuti gaya Fonnte: token dikirim lewat header Authorization (tanpa awalan "Bearer"), dan tiap nomor WhatsApp punya token sendiri.

1. Kirim Pesan

Kirim pesan teks ke satu atau beberapa nomor tujuan.

POSTsend
curl -X POST send \
  -H "Authorization: TOKEN_NOMOR_ANDA" \
  -H "Content-Type: application/json" \
  -d '{
        "target": "6285226061579,6281234567890",
        "message": "Halo, ini pesan tes"
      }'
Parameter:
Header Authorization Required Token milik nomor pengirim (didapat dari halaman /device setelah scan QR)
target Required Nomor tujuan, gunakan kode negara. Beberapa nomor dipisah koma. Contoh: 6281223xxxx,6281223yyyy
message Required Isi pesan teks
inboxid Optional Id pesan masuk yang sedang dibalas (field inboxid dari payload webhook, lihat bagian Webhook di bawah). Kalau dikirim dan masih dikenali gateway, balasan dikirim langsung ke chat asal pesan itu — lebih tahan terhadap migrasi identitas @lid WhatsApp dibanding hanya mengandalkan target. Tidak dikenali/kedaluwarsa? otomatis jatuh kembali ke target, tanpa error.

Contoh response sukses:

{
  "status": true,
  "detail": "success! message sent",
  "device": "6285640431181",
  "results": [
    { "target": "6285226061579", "status": true, "id": "3EB0XXXXXXXXXXXXXXXX" }
  ]
}

Contoh response gagal (token salah):

{
  "status": false,
  "reason": "invalid token"
}

2. Kirim Media

Kirim gambar/video/audio/dokumen ke satu atau beberapa nomor tujuan — dari URL publik, atau upload file langsung.

POSTsend-media

Cara 1 — dari URL:

curl -X POST send-media \
  -H "Authorization: TOKEN_NOMOR_ANDA" \
  -H "Content-Type: application/json" \
  -d '{
        "target": "6285226061579",
        "url": "https://situs-anda.com/gambar.jpg",
        "caption": "Ini fotonya",
        "type": "image"
      }'

Cara 2 — upload file langsung (multipart/form-data):

curl -X POST send-media \
  -H "Authorization: TOKEN_NOMOR_ANDA" \
  -F "target=6285226061579" \
  -F "caption=Ini fotonya" \
  -F "type=image" \
  -F "file=@/path/ke/gambar.jpg"
Parameter:
Header Authorization Required Token milik nomor pengirim
target Required Nomor tujuan, beberapa nomor dipisah koma
url Required jika file tidak dikirim Link media publik, akan diunduh dulu oleh server
file Required jika url tidak dikirim File media, dikirim langsung sebagai multipart/form-data (field name file). Kalau keduanya dikirim, file yang dipakai.
type Optional image, video, audio, atau document — kalau tidak diisi, dideteksi otomatis dari Content-Type
filename Optional Nama file, dipakai untuk dokumen (upload langsung memakai nama file asli kalau tidak diisi)
caption Optional Tidak berlaku untuk audio
inboxid Optional Sama seperti pada /send di atas — balas langsung ke chat asal pesan, tahan terhadap migrasi @lid.

Tidak ada batasan ukuran file secara default (bisa diatur lewat env MAX_MEDIA_MB di server kalau perlu).


3. Atur Webhook (terima pesan masuk)

Setiap kali nomor ini menerima pesan baru dari orang lain, aplikasi akan mem-forward (POST) data pesan tersebut ke URL webhook yang Anda daftarkan.

POSTwebhook
curl -X POST webhook \
  -H "Authorization: TOKEN_NOMOR_ANDA" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://situs-anda.com/endpoint-webhook" }'

Kirim "url": "" (string kosong) untuk menonaktifkan webhook.

Cek konfigurasi webhook saat ini:

GETwebhook
curl webhook \
  -H "Authorization: TOKEN_NOMOR_ANDA"
Payload yang dikirim ke webhook Anda saat ada pesan masuk (format sama dengan webhook Fonnte, lihat docs.fonnte.com/webhook-reply-message):
{
  "device": "6285640431181",
  "sender": "6281234567890",
  "message": "isi pesan dari lawan chat",
  "text": null,
  "member": null,
  "name": "Nama Pengirim",
  "location": null,
  "pollname": null,
  "choices": null,
  "timestamp": 1700000000,
  "inboxid": "3EB0XXXXXXXXXXXXXXXX",
  "url": null,
  "filename": null,
  "extension": null
}

Catatan field, sama seperti dokumentasi Fonnte:

  • sender — nomor lawan chat untuk chat pribadi, atau id grup untuk pesan grup (isi target dengan nilai ini kalau membalas lewat /send).
  • member — hanya terisi kalau pesan berasal dari grup: nomor pengirim di dalam grup tersebut.
  • text — teks tombol/list yang dipilih (kalau pesan adalah balasan tombol/list).
  • location"latitude,longitude" kalau pesan berupa share lokasi.
  • pollname / choices — nama polling dan pilihannya (dipisah koma) kalau pesan berupa polling.
  • inboxid — id pesan masuk ini. Kirim balik sebagai field opsional inboxid di /send atau /send-media untuk membalas langsung ke chat asal pesan ini, alih-alih membangun ulang alamat dari nomor telepon di target — lebih tahan terhadap migrasi identitas @lid WhatsApp. Kalau inboxid tidak dikirim, tidak dikenali, atau sudah kedaluwarsa dari log internal gateway, permintaan otomatis jatuh kembali memakai target seperti biasa — tidak ada error, tidak perlu retry manual.
  • url / filename / extension — attachment (gambar/video/audio/dokumen/stiker) pesan masuk. Hanya terisi kalau env PUBLIC_BASE_URL diset di server; kalau tidak, selalu null (attachment tidak diunduh sama sekali).

Pesan dari grup WhatsApp diabaikan secara default — tidak diteruskan ke webhook sama sekali (bisa diaktifkan lewat env IGNORE_GROUP_MESSAGES=false di server).