# Send an interactive list with WhatsApp API

As an outcome of this guide, you will be able to leverage Infobip WhatsApp API and send an interactive WhatsApp message delivered to your handset.

## Scenario overview [#scenario-overview]

The WhatsApp sender sends a message with an image and a list of options a user can select. Once the user clicks on an option, a reply is sent back to the WhatsApp sender. That, in turn, can trigger an appropriate series of actions and responses, but this is out of scope for this guide. We will, however, discuss briefly how to intercept an incoming message with a webhook to see a user's reply.

---

## Prerequisites [#prerequisites]

* [Infobip account](https://portal.infobip.com/login/?callback=https%3A%2F%2Fportal.infobip.com%2F). If you do not have one, create a [free trial account](https://www.infobip.com/signup).
* Infobip API key with the `whatsapp:message:send` scope. Find out more about scopes in [API Authorization](https://www.infobip.com/docs/essentials/api-essentials/api-authorization).
* Your favorite HTTP client. In this example, we use `cURL`. You can also choose an official [Infobip SDK](https://www.infobip.com/docs/sdk) in your preferred programming language.
* Sender. If in a free trial period, you can use Infobip test sender, `447860099299` and [activate it](https://www.infobip.com/docs/api/channels/whatsapp).
  If you want to configure a custom sender, request a new number or an alphanumeric sender through your [Infobip account](https://portal.infobip.com/channels-and-numbers/channels/sms/overview) or use the [Infobip Numbers API](https://www.infobip.com/docs/api/platform/numbers).
* Destination - a phone number to which the message will be sent. In a free trial period, you can only send messages to a [verified phone number](https://www.infobip.com/docs/essentials/getting-started/free-trial#free-trial-limitations).

## Limitations [#limitations]

With WhatsApp, you can only send a message to your customer if they have contacted you first. This opens a 24-hour window for
two-way communication. Otherwise, use a <apidocslink href="channels/whatsapp/whatsapp-outbound-messages/send-whatsapp-template-message">template message</apidocslink>.

## Difficulty level [#difficulty-level]

This guide assumes basic familiarity with APIs. It is important, however, that you are familiar with the webhook technology, if you wish to catch a user response. For ease of replicating the scenario, we have used a free online webhook tool, [HookRelay](https://www.hookrelay.dev/). You may replace HookRelay with your own hook server if you need to process your events programmatically.

## Summary of the steps [#steps-summary]

* Buy or configure an existing WhatsApp number capable of receiving incoming traffic.
* Set up a webhook.
* Add webhook details to the number you've purchased or configured.
* Send a WhatsApp message with an interactive list. The webhook will catch the response.

### Buy a number [#buy-number]

To buy a number, you'll need to log into your <portallink href="login/?callback=https%3A%2F%2Fportal.infobip.com%2F">Infobip account</portallink>.

Note
Skip this section, if using the Infobip test sender or an existing number.

1. Expand the __Channels and Numbers__ icon on the left-hand side menu, and select __Channels__.
2. Select __WhatsApp__ and click __Register Sender__.
3. From the __Register a WhatsApp sender__ screen, select the option you wish to choose for sender registration.
4. Set up your number preferences, like a country, number type, etc.

You're all set for now. Once a webhook is configured, you'll come back to the number config to add its URL.

## Set up a webhook [#set-up-webhook]

For the purpose of this guide, we will use a simple online webhook tool, [HookRelay](https://www.hookrelay.dev/). This section will show you how to create an account and configure the webhook with HookRelay.

### Step 1. Sign in with git credentials [#sign-in-with-git]

Sign into [HookRelay](https://www.hookrelay.dev/) with your GitHub or GitLab credentials.

### Step 2. Create a webhook [#create-webhook]

To create an inbound webhook, from your dashboard, click the __New Hook__ button on the top right. That will take you to the configuration screen where all you need providing is a descriptive name for your webhook, e.g. __Infobip WhatsApp List Response__.

Once you click the __Create hook__ button, you'll be able to view and copy its URL that you will need to add to your WhatsApp sender.

## Add webhook URL to a WhatsApp sender [#add-webhook-to-sender]

Head back to your <portallink href="login/?callback=https%3A%2F%2Fportal.infobip.com%2F">Infobip account</portallink> and access your WhatsApp sender configuration page (Channels and Numbers > WhatsApp).

1. Select __Senders__ and click the kebab (three-dot) menu on the WhatsApp sender's tile to select __Edit configuration__.
2. Under __Keywords__ add a new one or edit the existing default one.
3. Under the __Forwarding action__ section, select __Forward to HTTP__ and add the webhook's URL to the __URL__ field.
4. Click __Save__.

That's about it for the webhook configuration. Let's now move to creating a WhatsApp message with an interactive list.

## Send a WhatsApp message

We are going to send a message with an interactive list consisting of 4 options. We'll use the <apidocslink href="channels/whatsapp/whatsapp-outbound-messages/send-whatsapp-interactive-list-message">Send WhatsApp interactive list message</apidocslink> endpoint.

To make it easier to visualize, the image below indicates which parts of the WhatsApp interactive list are driven from which fields in our WhatsApp API.

__Key points:__

* The `to` field must include a number in the international format, e.g. `447415074332`.
* If using a free trial account, the phone number you use must be the same phone number you've registered on signup.

```bash
curl -L 'https://{baseUrl}/whatsapp/1/message/interactive/list' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
  "from": "447860099299",
  "to": "447415774332",
  "content": {
    "body": {
      "text": "Dear Developer, select a ticket for our annual Shift conference. Tickets include access to sessions, the event app, and talk recordings."
    },
    "action": {
      "title": "See Tickets",
      "sections": [
        {
          "title": "Choose one ticket.",
          "rows": [
            {
              "id": "1",
              "title": "Regular Student",
              "description": "32€ + VAT"
            },
            {
              "id": "2",
              "title": "Regular Standard",
              "description": "192€ + VAT"
            },
            {
              "id": "3",
              "title": "Regular All Access",
              "description": "216€ + VAT"
            },
            {
              "id": "4",
              "title": "Regular Virtual",
              "description": "56€ + VAT"
            }
          ]
        }
      ]
    },
    "header": {
      "type": "TEXT",
      "text": "Get Your Tickets!"
    },
    "footer": {
      "text": "Join us at Shift!"
    }
  }
}'
```

### Add multiple recipients and multiple messages

If you want to send multiple messages to multiple recipients in one request, use a <apidocslink href="channels/whatsapp/whatsapp-outbound-messages/send-whatsapp-template-message">WhatsApp template message</apidocslink>

## Track message delivery

Once you send the request, you should receive a WhatsApp message on the handset you've specified in  the `to` field and see a `200 OK` response.

```bash
{
  "to": "441134960001",
  "messageCount": 1,
  "messageId": "a28dd97c-1ffb-4fcf-99f1-0b557ed381da",
  "status": {
    "groupId": 1,
    "groupName": "PENDING",
    "id": 7,
    "name": "PENDING_ENROUTE",
    "description": "Message sent to next instance"
  }
}
```

The response informs you that the message has successfully been queued within the Infobip platform and will be then sent to Meta depending on the throughput.

If you want to know whether it's been delivered to the recipient, use the <apidocslink href="channels/whatsapp/receive-whatsapp-delivery-reports">Delivery Report</apidocslink> feature.

## Troubleshoot and analyze your message

For troubleshooting and analytics, use the auto-generated `messageId` to view the message and its details.

## Catch the answer

Once a user selects an option from the list, your webhook that's listening to that event will catch the reply. The `message` object will tell you which option has been selected and sent as an answer.

```bash
{
  "results": [
    {
      "from": "447415774332",
      "to": "447860099299",
      "integrationType": "WHATSAPP",
      "receivedAt": "2022-08-18T09:30:52.516+0000",
      "messageId": "ABEGRHQVd0QyAhCEOHQDx2_nQGlWh5eTJdht",
      "pairedMessageId": "e5ee7f2a-5d43-46e1-9e9c-08c83e1ae935",
      "callbackData": null,
      "message": {
        "id": "2",
        "title": "Regular Standard",
        "description": "192€ + VAT",
        "context": {
          "from": "447860099299",
          "id": "e5ee7f2a-5d43-46e1-9e9c-08c83e1ae935"
        },
        "type": "INTERACTIVE_LIST_REPLY"
      },
      "contact": {
        "name": "Joanna Suau"
      },
      "price": {
        "pricePerMessage": 0.0,
        "currency": "EUR"
      }
    }
  ],
  "messageCount": 1,
  "pendingMessageCount": 0
}
```