# Tombol balas WhatsApp

Tombol balas menempatkan hingga tiga pilihan yang dapat diketuk di bawah pesan WhatsApp, sehingga penerima menjawab dengan satu ketukan alih-alih teks bebas. Gunakan untuk keputusan cepat, seperti mengonfirmasi atau membatalkan pemesanan. Untuk lebih dari tiga pilihan, gunakan [menu daftar](/docs/guides/whatsapp/message-types/interactive/list-menus).

## Kirim tombol balas

Atur `interactive.type` ke `button`, dengan sebuah `body_text` dan satu hingga tiga `buttons`, masing-masing berupa `quick_reply`:

**TypeScript**

```typescript
const msg = await bird.whatsapp.send({
  to: "+16505551234",
  from: "+13124495648",
  interactive: {
    type: "button",
    body_text: "Your gardening workshop is scheduled for 9am tomorrow.",
    buttons: [{ type: "quick_reply", quick_reply: { slug: "change-booking", text: "Change" } }],
  },
});
console.log(msg.id, msg.status);
```

Examples: [TypeScript](/id-id/dokumentasi/guides/whatsapp/message-types/interactive/reply-buttons.ts.md) · [Python](/id-id/dokumentasi/guides/whatsapp/message-types/interactive/reply-buttons.py.md) · [Go](/id-id/dokumentasi/guides/whatsapp/message-types/interactive/reply-buttons.go.md) · [PHP](/id-id/dokumentasi/guides/whatsapp/message-types/interactive/reply-buttons.php.md) · [CLI](/id-id/dokumentasi/guides/whatsapp/message-types/interactive/reply-buttons.cli.md) · [MCP](/id-id/dokumentasi/guides/whatsapp/message-types/interactive/reply-buttons.mcp.md) · [cURL](/id-id/dokumentasi/guides/whatsapp/message-types/interactive/reply-buttons.curl.md)

`from` wajib ada di setiap pesan layanan: nomor yang dimiliki workspace Anda, bukan nomor yang dikelola Bird. Bentuk lengkapnya menambahkan header opsional, footer, kutipan pesan sebelumnya, dan tombol kedua:

```json
{
  "to": "+16505551234",
  "from": "+13124495648",
  "in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
  "interactive": {
    "type": "button",
    "header": {
      "type": "image",
      "url": "https://cdn.example.com/banners/workshop.png"
    },
    "body_text": "Your gardening workshop is scheduled for 9am tomorrow.",
    "footer_text": "Lucky Shrub, your gateway to succulents",
    "buttons": [
      { "type": "quick_reply", "quick_reply": { "slug": "change-booking", "text": "Change" } },
      { "type": "quick_reply", "quick_reply": { "slug": "cancel-booking", "text": "Cancel" } }
    ]
  },
  "tags": [{ "name": "category", "value": "booking" }],
  "metadata": { "order_id": "A-1" }
}
```

`in_reply_to_message_id` mengutip pesan sebelumnya dalam percakapan yang sama. Lihat bagian hub [mengutip pesan untuk mencocokkan balasan](/docs/guides/whatsapp/message-types/interactive#quoting-a-message-to-correlate-a-reply) untuk cara resolusi bekerja dan apa yang bisa terlewat.

Tipe ini hanya mengirim tombol `quick_reply`. Tombol `cta_url` termasuk dalam `interactive.type` terpisah dan tidak dapat muncul bersama `buttons`; lihat bagian [tombol](/docs/guides/whatsapp/message-types/interactive#buttons) di hub untuk bentuk tombol yang digunakan bersama.

## Header dan footer

Header bersifat opsional, dan memiliki salah satu dari empat bentuk:

```text
"header": { "type": "text",     "text": "New workshop dates" }
"header": { "type": "image",    "url": "https://cdn.example.com/a.png" }
"header": { "type": "video",    "url": "https://cdn.example.com/a.mp4" }
"header": { "type": "document", "url": "https://cdn.example.com/a.pdf" }
```

Header media (`image`, `video`, atau `document`) membawa filenya sebagai URL `https` publik yang diambil WhatsApp saat pengiriman, bukan sebagai handle media yang diunggah. `footer_text` bersifat opsional dan menambahkan baris di bawah tombol.

## Batas

| Field                      | Batas                                               |
| -------------------------- | --------------------------------------------------- |
| `buttons`                  | 1 hingga 3 entri, setiap entri berupa `quick_reply` |
| `quick_reply.slug`         | wajib, 1 hingga 256 karakter                        |
| `quick_reply.text` (label) | wajib, 1 hingga 20 karakter, unik dalam satu pesan  |
| `body_text`                | wajib, 1 hingga 1.024 karakter                      |
| `footer_text`              | opsional, 1 hingga 60 karakter                      |
| `header.text`              | 1 hingga 60 karakter                                |

Bird memeriksa bahwa label tombol (`quick_reply.text`) bersifat unik, tetapi tidak memeriksa apakah nilai `slug` juga unik, meskipun setiap slug dimaksudkan untuk mengidentifikasi satu tombol. Dua tombol yang berbagi slug sama-sama terkirim dan tersampaikan, dan balasannya kembali tanpa bisa dibedakan.

## Membaca balasan

Ketukan tiba sebagai pesan masuk tersendiri, membawa `interactive_reply`:

```json
{
  "id": "wam_01kyb2m4xq7whs0d8n3prv6tez",
  "direction": "inbound",
  "from": { "phone_number": "+16505551234" },
  "to": { "phone_number": "+13124495648" },
  "status": "received",
  "in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
  "interactive_reply": {
    "type": "button",
    "button": {
      "slug": "cancel-booking",
      "text": "Cancel"
    }
  },
  "created_at": "2026-08-25T09:04:11Z"
}
```

`slug` yang Anda atur saat pengiriman dikembalikan persis sama, sehingga Anda dapat langsung melakukan percabangan tanpa tabel pencarian. Anda melihat balasan ini melalui daftar pesan atau `GET /v1/whatsapp/messages/{id}`; lihat bagian hub [membaca balasan](/docs/guides/whatsapp/message-types/interactive#reading-a-reply) untuk alur lengkapnya.

## Batas dan kasus khusus

- **Jendela layanan pelanggan harus terbuka.** Tombol balas adalah pesan layanan, hanya dapat dikirim di dalam jendela yang terbuka; lihat bagian hub [jendela layanan pelanggan](/docs/guides/whatsapp/message-types#the-customer-service-window). Pemeriksaan jendela bersifat fail-open, sehingga `202` bukan bukti bahwa jendela benar-benar terbuka saat pengiriman berlangsung.
- **`from` harus berupa nomor yang dimiliki workspace Anda.** Menghilangkannya, atau menyebut nomor yang bukan pengirim terhubung, akan ditolak sebelum pengiriman dibuat.
- **Label harus unik, atau pengiriman ditolak.** Dua tombol dengan `quick_reply.text` yang sama gagal dengan `422` [`E15056`](/docs/api/errors/E15056) `WhatsAppInteractiveDuplicateLabel`, karena Meta akan menolak duplikat tersebut setelah pengiriman sudah diterima dan dikenai biaya.
- **Label adalah yang dilihat penerima; slug tidak pernah ditampilkan.** Menaruh teks untuk pengguna di `slug` tidak memberikan efek apa pun, karena hanya `text` yang ditampilkan di chat.
- **URL header media yang tidak dapat diambil WhatsApp gagal setelah pengiriman diterima.** Bird tidak memvalidasi `url` header seperti memvalidasi URL pesan media, sehingga URL `http://` atau URL yang mengembalikan error lolos dari permintaan lalu gagal secara asinkron, dengan `media_rejected` pada `last_error` pesan.
- **Mengirim nama field milik Meta sendiri akan menggagalkan permintaan.** Tipe ini langsung menolak properti yang tidak dikenal, sehingga JSON yang disalin dari referensi Cloud API Meta, seperti objek `body` atau wrapper `action.buttons`, perlu diubah bentuknya menjadi field datar Bird terlebih dahulu.

Kutipan yang tidak dapat diresolusi menggagalkan permintaan sebelum apa pun dibuat atau dikenai biaya: `404` [`E15071`](/docs/api/errors/E15071) jika id menyebut pesan yang tidak dimiliki workspace ini, `422` [`E15072`](/docs/api/errors/E15072) jika id menyebut pesan yang tidak dapat dikutip. Untuk error yang dapat terjadi pada pengiriman WhatsApp mana pun, jendela tertutup, pengirim tidak ada atau tidak valid, atau penerima tidak valid, lihat bagian hub [error](/docs/guides/whatsapp/message-types/interactive#errors) dan [Mengirim pesan WhatsApp](/docs/guides/whatsapp/sending-whatsapp).

## Langkah selanjutnya

- [Pesan interaktif WhatsApp](/docs/guides/whatsapp/message-types/interactive): apa yang dimiliki bersama oleh keenam tipe interaktif
- [Menu daftar](/docs/guides/whatsapp/message-types/interactive/list-menus): untuk lebih dari tiga pilihan
- [Mengirim pesan WhatsApp](/docs/guides/whatsapp/sending-whatsapp): envelope permintaan, model `202`, dan percobaan ulang yang aman

## Related resources

- [Connecting WhatsApp to Bird: from buying a number to a live channel](/learn/whatsapp/connecting-whatsapp-to-bird) (video)
- [What is the 24-hour customer service window on WhatsApp?](/explained/whatsapp/what-is-the-24-hour-customer-service-window) (answer)
- [WhatsApp message builder](/tools/whatsapp-message-builder) (tool)
- [WhatsApp](/products/whatsapp) (product)

[Get an implementation brief](/learn/workspace?topic=whatsapp)
