NgirimWA Docs
API

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/v1

Headers

x-api-key: API_KEY_ANDA
Content-Type: application/json

Kirim Reaksi Emoji

Kirim reaksi (πŸ˜„ πŸ‘ ❀️ dll) ke pesan tertentu β€” milik penerima atau milik Anda sendiri.

Endpoint

POST /messages/reaction

Request β€” 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

ParameterTipeWajibDeskripsi
tostringβœ…Nomor lawan bicara (untuk log)
message.remote_jidstringβœ…JID chat (biasanya <phone>@s.whatsapp.net atau <id>@g.us untuk grup)
message.message_idstringβœ…ID pesan yang ingin direaksi
message.from_meboolean❌true jika pesan tersebut Anda yang kirim. Default false.
emojistringβœ…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.idmessage_id
message.from + @s.whatsapp.net (chat pribadi) atau metadata.group_id (grup)remote_jid
metadata.is_groupmenentukan 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-read

Request

{
  "to": "628123456789",
  "messages": [
    { "remote_jid": "628123456789@s.whatsapp.net", "message_id": "ABC123" },
    { "remote_jid": "628123456789@s.whatsapp.net", "message_id": "DEF456" }
  ]
}

Parameter

ParameterTipeWajibDeskripsi
tostringβœ…Nomor lawan bicara (untuk log)
messagesarrayβœ…1–50 key pesan
messages[].remote_jidstringβœ…JID chat
messages[].message_idstringβœ…ID pesan yang akan ditandai dibaca
messages[].from_meboolean❌Default false
messages[].participantstring❌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/presence

Request β€” Mengetik 3 Detik

{
  "to": "628123456789",
  "state": "composing",
  "duration_ms": 3000
}

Request β€” Set Online Saja

{
  "to": "628123456789",
  "state": "available"
}

State yang Didukung

stateYang penerima lihat
composing"sedang mengetik..."
recording"merekam audio..."
pausedmenghentikan indikator mengetik
availablestatus online
unavailableoffline

Parameter

ParameterTipeWajibDeskripsi
tostringβœ…Nomor penerima
statestringβœ…Salah satu nilai di atas
duration_msnumber❌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 opsi humanlike: { enabled: true } di payload. Endpoint presence ini 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.

On this page