Skip to main content
Interactive messages give the contact something to tap instead of something to type. They go through POST /v1/messages with type: "interactive" and an interactive object in WhatsApp’s own shape, so anything from Meta’s docs works unchanged. They are free-form messages, so they only land inside the 24-hour window. To start a conversation, send a template with buttons instead. LazyApp checks every limit below before sending. A mistake comes back as a 422 with a plain message on the exact field (for example interactive.action.buttons.1.reply.title), not as Meta’s bare (#131009) Parameter value is not valid after the fact.
In the console, open a chat in the Inbox, click the interactive button in the composer, and pick what you want to send. Every option below has a form there, with counters and the same checks.

Pick the right one

Reply buttons

When the contact taps, you get message.received with type: interactive and content.interactive.button_reply holding the id and title.

Lists

The choice arrives as content.interactive.list_reply with the row id, title and description. A tidy button instead of a long raw URL in the text.
header and footer work as for reply buttons. display_text is up to 20 characters; url must start with https:// or http://.

Location requests

The contact’s pin comes back as a normal location message: message.received with type: location and content.location (latitude, longitude, and name / address when they share them).

Media carousels

Two to ten cards the contact swipes through, each with a picture or video, short text and a button.
Meta’s docs set "type": "cta_url" on every card, including quick-reply cards. LazyApp’s console builder does the same. A tapped quick reply arrives as content.interactive.button_reply.

Address messages (India)

Ask an Indian customer for a delivery address in a WhatsApp form. Only for India-based businesses messaging customers in India: LazyApp refuses the send when either number is not +91 (or the customer’s username id does not start with IN.), because WhatsApp would drop it anyway.
  • country must be IN.
  • values pre-fills the form. saved_addresses lets the contact pick an address in one tap. validation_errors (field → message) sends the form back with an error under a field, for example a pin code you cannot deliver to.
  • Fields: name, phone_number, in_pin_code (6 digits), house_number, floor_number, tower_number, building_name, address, landmark_area, city, state.
When the contact submits, two things happen:
  1. message.received with content.interactive.nfm_reply (name: address_message).
  2. address.received with the parsed address:
LazyApp also keeps the latest address on the contact as attributes.whatsapp_address, and the inbox offers it as a saved address the next time an agent asks. If the contact’s WhatsApp app cannot show an address form, Meta reports the message as failed with code 1026.

Other interactive types

flow, catalog_message, product, product_list, order_details, order_status, call_permission_request and contact_information_request also go under interactive. LazyApp passes them to WhatsApp as you send them. See Flows, Catalog and Calling.

Groups

WhatsApp groups do not accept interactive messages. A send to a group with type: interactive is refused before it reaches Meta.