Reaksi, Read Receipt & Indikator Mengetik
Kontrol status pesan: kirim reaksi emoji, tandai pesan dibaca (blue tick manual), dan tampilkan indikator mengetik.
Tiga endpoint untuk pengalaman chat yang lebih natural dan responsif: reaksi emoji, tanda pesan dibaca, dan indikator mengetik / merekam.
Base URL
https://dash.ngirimwa.com/api/v1Headers
x-api-key: API_KEY_ANDA
Content-Type: application/jsonKirim Reaksi Emoji
Kirim reaksi (π π β€οΈ dll) ke pesan tertentu β milik penerima atau milik Anda sendiri.
Endpoint
POST /messages/reactionRequest β Tambah Reaksi
{
"to": "628123456789",
"message": {
"remote_jid": "628123456789@s.whatsapp.net",
"message_id": "3EB0C12345ABCDEF",
"from_me": false
},
"emoji": "π"
}Request β Hapus Reaksi
Kirim dengan emoji kosong:
{
"to": "628123456789",
"message": {
"remote_jid": "628123456789@s.whatsapp.net",
"message_id": "3EB0C12345ABCDEF"
},
"emoji": ""
}Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
to | string | β | Nomor lawan bicara (untuk log) |
message.remote_jid | string | β | JID chat (biasanya <phone>@s.whatsapp.net atau <id>@g.us untuk grup) |
message.message_id | string | β | ID pesan yang ingin direaksi |
message.from_me | boolean | β | true jika pesan tersebut Anda yang kirim. Default false. |
emoji | string | β | Karakter emoji. Kosong ("") untuk hapus reaksi. |
Respon Sukses
{
"success": true,
"message": "Reaction sent successfully"
}Mendapatkan remote_jid & message_id
Keduanya datang dari payload webhook message.received yang dikirim NgirimWA ke webhook_url device Anda. Mapping field:
| Field di payload webhook | β dipakai sebagai |
|---|---|
message.id | message_id |
message.from + @s.whatsapp.net (chat pribadi) atau metadata.group_id (grup) | remote_jid |
metadata.is_group | menentukan apakah ini chat pribadi vs grup |
Contoh payload message.received yang masuk:
{
"event": "message.received",
"timestamp": "2026-05-15T10:00:00.000Z",
"device": { "id": "...", "name": "Toko Saya", "phone": "628111111111" },
"message": {
"id": "3EB0C12345ABCDEF",
"from": "628222222222",
"sender_name": "Budi",
"type": "text",
"content": "Halo, saya mau tanya",
"timestamp": 1747300800
},
"metadata": { "is_group": false, "group_id": null }
}Dari payload di atas, untuk membalas reaksi π, kirim:
{
"to": "628222222222",
"message": {
"remote_jid": "628222222222@s.whatsapp.net",
"message_id": "3EB0C12345ABCDEF",
"from_me": false
},
"emoji": "π"
}Lihat Jenis Event Webhook untuk daftar lengkap field.
Tandai Pesan Sebagai Dibaca
Picu blue tick secara manual β berguna bila Anda mematikan auto-read di pengaturan device, atau ingin menandai banyak pesan sekaligus.
Endpoint
POST /messages/mark-readRequest
{
"to": "628123456789",
"messages": [
{ "remote_jid": "628123456789@s.whatsapp.net", "message_id": "ABC123" },
{ "remote_jid": "628123456789@s.whatsapp.net", "message_id": "DEF456" }
]
}Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
to | string | β | Nomor lawan bicara (untuk log) |
messages | array | β | 1β50 key pesan |
messages[].remote_jid | string | β | JID chat |
messages[].message_id | string | β | ID pesan yang akan ditandai dibaca |
messages[].from_me | boolean | β | Default false |
messages[].participant | string | β | JID partisipan (untuk grup) |
Respon Sukses
{
"success": true,
"message": "Messages marked as read",
"data": { "count": 2 }
}Batasan WhatsApp: Pesan tertentu (terlalu lama, sudah dihapus, dsb) mungkin tidak bisa ditandai. API tetap return 200 β gunakan log webhook untuk konfirmasi.
Indikator Mengetik / Merekam
Tampilkan teks βsedang mengetikβ¦β atau βmerekam audioβ¦β di sisi penerima β efektif untuk membuat chatbot terasa lebih manusiawi.
Endpoint
POST /messages/presenceRequest β Mengetik 3 Detik
{
"to": "628123456789",
"state": "composing",
"duration_ms": 3000
}Request β Set Online Saja
{
"to": "628123456789",
"state": "available"
}State yang Didukung
state | Yang penerima lihat |
|---|---|
composing | "sedang mengetik..." |
recording | "merekam audio..." |
paused | menghentikan indikator mengetik |
available | status online |
unavailable | offline |
Parameter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
to | string | β | Nomor penerima |
state | string | β | Salah satu nilai di atas |
duration_ms | number | β | Berapa milidetik state aktif, lalu otomatis paused (composing/recording) atau unavailable. Maks 30000 ms. |
Respon Sukses
{
"success": true,
"message": "Presence update sent successfully",
"data": {}
}Pola Penggunaan: Mengetik Sebelum Membalas
# 1. Tampilkan "mengetik..." selama 2 detik
curl -X POST https://dash.ngirimwa.com/api/v1/messages/presence \
-H "x-api-key: API_KEY_ANDA" -H "Content-Type: application/json" \
-d '{ "to": "628123456789", "state": "composing", "duration_ms": 2000 }'
# 2. Kirim balasan
curl -X POST https://dash.ngirimwa.com/api/v1/messages/send \
-H "x-api-key: API_KEY_ANDA" -H "Content-Type: application/json" \
-d '{ "to": "628123456789", "message": "Halo, ada yang bisa saya bantu?" }'Atau, untuk efek serupa langsung dari
messages/send, pakai opsihumanlike: { enabled: true }di payload. Endpointpresenceini dipakai bila Anda ingin kontrol granular.
Tips
Gabungkan reaksi + mark-read untuk chatbot yang responsif: saat menerima pesan, tandai sebagai dibaca, lalu kirim reaksi π sebagai akknowledgement instan sebelum balasan asli siap.
Indikator mengetik membatasi diri sendiri di WhatsApp β setelah ~25 detik tanpa update, WhatsApp otomatis menyembunyikan indikator. Pakai duration_ms untuk timing yang konsisten.
Mark-read tidak konsumsi kuota pesan. Reaksi sangat ringan di sisi quota juga. Pakai sebebas mungkin untuk UX yang baik.