{"id":695,"date":"2026-10-29T13:14:25","date_gmt":"2026-10-29T13:14:25","guid":{"rendered":"https:\/\/vectalk.com.br\/blog\/whatsapp-interactive-messages-api\/"},"modified":"2026-10-29T13:14:28","modified_gmt":"2026-10-29T13:14:28","slug":"whatsapp-interactive-messages-api","status":"publish","type":"post","link":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/","title":{"rendered":"WhatsApp API interactive messages: buttons, lists, media, location and Flows"},"content":{"rendered":"\n<p><em>Updated on October 29, 2026<\/em><\/p>\n\n\n\n<p>Interactive messages are sends with <code>type: \"interactive\"<\/code> that show the user reply buttons (up to 3), a list (up to 10 options), a link button, a location request, a carousel or a WhatsApp Flow; when the user taps, the webhook returns the <code>id<\/code> you defined. They are service messages, so they can only be sent while the 24-hour window is open. To start a conversation with buttons or a Flow, use a template.<\/p>\n\n\n\n<p>Below are the payloads for each type, the character limits, the webhook reply format and a Node.js router to handle them all. The examples use Vectalk (<code>https:\/\/apis.vectalk.com.br\/api\/messages<\/code>), which accepts the same body as Meta&#8217;s WhatsApp Cloud API.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Overview of the types<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Type<\/th><th><code>interactive.type<\/code><\/th><th>Main limits<\/th><th>What comes back in the webhook<\/th><\/tr><\/thead><tbody><tr><td>Reply buttons<\/td><td><code>button<\/code><\/td><td>Up to 3 buttons; 20-character label; 1,024-character body<\/td><td><code>interactive.button_reply<\/code> with <code>id<\/code> and <code>title<\/code><\/td><\/tr><tr><td>List<\/td><td><code>list<\/code><\/td><td>Up to 10 sections and 10 rows in total; 20-character button<\/td><td><code>interactive.list_reply<\/code> with <code>id<\/code>, <code>title<\/code> and <code>description<\/code><\/td><\/tr><tr><td>Link button<\/td><td><code>cta_url<\/code><\/td><td>1 button; 20-character label<\/td><td>Nothing (opens the browser)<\/td><\/tr><tr><td>Location request<\/td><td><code>location_request_message<\/code><\/td><td>1,024-character body<\/td><td>A <code>type: \"location\"<\/code> message<\/td><\/tr><tr><td>Media carousel<\/td><td><code>carousel<\/code><\/td><td>2 to 10 cards with image or video<\/td><td>Depends on the button used<\/td><\/tr><tr><td>Flow<\/td><td><code>flow<\/code><\/td><td><code>flow_message_version<\/code> equal to <code>\"3\"<\/code><\/td><td><code>interactive.nfm_reply<\/code> with <code>response_json<\/code><\/td><\/tr><tr><td>Product and multi-product<\/td><td><code>product<\/code>, <code>product_list<\/code><\/td><td>Tied to a catalog<\/td><td>An order (<code>type: \"order\"<\/code>)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Plain media (image, video, document, audio) and fixed locations aren&#8217;t interactive, but they usually show up in the same flows and are covered in this guide too.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Reply buttons<\/h2>\n\n\n\n<p>The most common format for confirming, choosing among a few options or routing to an agent.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">curl -X POST https:\/\/apis.vectalk.com.br\/api\/messages \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\n    \"messaging_product\": \"whatsapp\",\n    \"to\": \"5584999999999\",\n    \"type\": \"interactive\",\n    \"interactive\": {\n      \"type\": \"button\",\n      \"header\": { \"type\": \"text\", \"text\": \"Tomorrow's appointment\" },\n      \"body\": { \"text\": \"Hi Marina. Your appointment is booked for Oct 21 at 9 a.m. Can you confirm?\" },\n      \"footer\": { \"text\": \"Example Clinic\" },\n      \"action\": {\n        \"buttons\": [\n          { \"type\": \"reply\", \"reply\": { \"id\": \"confirm_8812\", \"title\": \"Confirm\" } },\n          { \"type\": \"reply\", \"reply\": { \"id\": \"reschedule_8812\", \"title\": \"Reschedule\" } },\n          { \"type\": \"reply\", \"reply\": { \"id\": \"agent\", \"title\": \"Talk to someone\" } }\n        ]\n      }\n    }\n  }'<\/code><\/pre>\n\n\n\n<p>Meta&#8217;s rules for this type:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>up to 3 buttons, with unique labels of up to 20 characters;<\/li>\n\n\n<li><code>id<\/code> of up to 256 characters;<\/li>\n\n\n<li>body of up to 1,024 characters and footer of up to 60;<\/li>\n\n\n<li>optional header of text, image, video or document.<\/li>\n\n<\/ul>\n\n\n\n<p>Use the <code>id<\/code> to carry context. In the example, <code>confirm_8812<\/code> already says the action and the appointment, so the webhook doesn&#8217;t depend on the button text. When the user taps, you get:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">\"interactive\": {\n  \"type\": \"button_reply\",\n  \"button_reply\": { \"id\": \"confirm_8812\", \"title\": \"Confirm\" }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Interactive list<\/h2>\n\n\n\n<p>For more than three options: menus, time slots, departments, plans. The user taps the button and a panel with the rows opens.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"messaging_product\": \"whatsapp\",\n  \"to\": \"5584999999999\",\n  \"type\": \"interactive\",\n  \"interactive\": {\n    \"type\": \"list\",\n    \"header\": { \"type\": \"text\", \"text\": \"Available times\" },\n    \"body\": { \"text\": \"Pick a time for your technical visit.\" },\n    \"footer\": { \"text\": \"Bras\u00edlia time\" },\n    \"action\": {\n      \"button\": \"See times\",\n      \"sections\": [\n        {\n          \"title\": \"Wednesday, Oct 22\",\n          \"rows\": [\n            { \"id\": \"slot_2210_09\", \"title\": \"09:00\", \"description\": \"Technician available\" },\n            { \"id\": \"slot_2210_14\", \"title\": \"14:00\", \"description\": \"Technician available\" }\n          ]\n        },\n        {\n          \"title\": \"Thursday, Oct 23\",\n          \"rows\": [\n            { \"id\": \"slot_2310_10\", \"title\": \"10:00\" }\n          ]\n        }\n      ]\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Field<\/th><th>Limit<\/th><\/tr><\/thead><tbody><tr><td><code>action.button<\/code><\/td><td>20 characters, one button<\/td><\/tr><tr><td>Sections<\/td><td>Up to 10, title up to 24 characters<\/td><\/tr><tr><td>Rows<\/td><td>Up to 10 across all sections<\/td><\/tr><tr><td><code>rows[].title<\/code><\/td><td>24 characters<\/td><\/tr><tr><td><code>rows[].description<\/code><\/td><td>72 characters, optional<\/td><\/tr><tr><td><code>rows[].id<\/code><\/td><td>200 characters<\/td><\/tr><tr><td>Body<\/td><td>4,096 characters<\/td><\/tr><tr><td>Header<\/td><td>Text only, 60 characters<\/td><\/tr><tr><td>Footer<\/td><td>60 characters, optional<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>The 10-row limit is the total for the message, not per section. If you have more options, split them into steps (first the day, then the time). The choice comes back as <code>list_reply<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">\"interactive\": {\n  \"type\": \"list_reply\",\n  \"list_reply\": { \"id\": \"slot_2210_14\", \"title\": \"14:00\", \"description\": \"Technician available\" }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Link button (CTA URL)<\/h2>\n\n\n\n<p>Hides a long URL behind a button. Useful for payment slips, tracking and customer portals. (In Brazil, a common use is the <em>boleto<\/em>, a bank payment slip customers pay by barcode.)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"messaging_product\": \"whatsapp\",\n  \"to\": \"5584999999999\",\n  \"type\": \"interactive\",\n  \"interactive\": {\n    \"type\": \"cta_url\",\n    \"body\": { \"text\": \"Your duplicate invoice is ready.\" },\n    \"action\": {\n      \"name\": \"cta_url\",\n      \"parameters\": {\n        \"display_text\": \"Open invoice\",\n        \"url\": \"https:\/\/customer.example.com\/invoices\/7731?source=whatsapp\"\n      }\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p>The label can be up to 20 characters and the body up to 1,024. The tap opens the browser and doesn&#8217;t generate a user message, so it doesn&#8217;t renew the <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-24-hour-customer-service-window\/\">24-hour window<\/a>. To measure clicks, use parameters in the URL itself.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Location: sending and requesting<\/h2>\n\n\n\n<p>To send a fixed address (store, pickup point), use <code>type: \"location\"<\/code>. Latitude and longitude are required; name and address are optional.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"messaging_product\": \"whatsapp\",\n  \"to\": \"5584999999999\",\n  \"type\": \"location\",\n  \"location\": {\n    \"latitude\": -5.7945,\n    \"longitude\": -35.2110,\n    \"name\": \"Example Store Downtown\",\n    \"address\": \"Av. Exemplo, 100 - Natal, RN\"\n  }\n}<\/code><\/pre>\n\n\n\n<p>To ask for the user&#8217;s location (delivery, field service), use the interactive message with the send location button:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"messaging_product\": \"whatsapp\",\n  \"to\": \"5584999999999\",\n  \"type\": \"interactive\",\n  \"interactive\": {\n    \"type\": \"location_request_message\",\n    \"body\": { \"text\": \"To calculate shipping, tap the button and send your location.\" },\n    \"action\": { \"name\": \"send_location\" }\n  }\n}<\/code><\/pre>\n\n\n\n<p>The reply arrives as a regular location message, with <code>latitude<\/code>, <code>longitude<\/code> and, if the user chooses to share them, <code>name<\/code> and <code>address<\/code>. The <code>context.id<\/code> field points to the request message, which helps tie the reply to the right request.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Media carousel<\/h2>\n\n\n\n<p>The carousel shows 2 to 10 horizontally scrolling cards. Each card needs an image or video header, can have a body of up to 160 characters (with up to 2 line breaks) and must have either a link button or quick reply buttons, with the same button type and count on every card. It works well for showing product variations. The full structure is on the carousel page of Meta&#8217;s documentation; to start a conversation with cards, see the <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-carousel-template\/\">WhatsApp carousel template<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">WhatsApp Flows<\/h2>\n\n\n\n<p>Flows are multi-screen forms inside WhatsApp: sign-ups, bookings, surveys, credit simulations. The screen content is defined in a JSON file (Flow JSON), and the result comes back to you in the webhook. For a broader introduction, see <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-flows-en\/\">WhatsApp Flows<\/a>.<\/p>\n\n\n\n<p>Meta lists two prerequisites: a verified business and consistently high message quality.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Create, upload the JSON and publish<\/h3>\n\n\n\n<p>With Vectalk, the cycle runs via API with an instance token:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\"># Create the Flow as a draft\ncurl -X POST https:\/\/apis.vectalk.com.br\/api\/flows \\\n  -H \"Authorization: Bearer YOUR_INSTANCE_TOKEN\" \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{ \"name\": \"visit_booking\", \"categories\": [\"APPOINTMENT_BOOKING\"] }'\n\n# Upload flow.json (multipart)\ncurl -X POST https:\/\/apis.vectalk.com.br\/api\/flows\/FLOW_ID\/assets \\\n  -H \"Authorization: Bearer YOUR_INSTANCE_TOKEN\" \\\n  -F \"file=@flow.json\" -F \"name=flow.json\" -F \"asset_type=FLOW_JSON\"\n\n# Publish\ncurl -X POST https:\/\/apis.vectalk.com.br\/api\/flows\/FLOW_ID\/publish \\\n  -H \"Authorization: Bearer YOUR_INSTANCE_TOKEN\"<\/code><\/pre>\n\n\n\n<p>The upload response includes <code>validation_errors<\/code>. Fix everything before publishing: a published Flow can&#8217;t be deleted, only deprecated.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Send the Flow inside the window<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"messaging_product\": \"whatsapp\",\n  \"to\": \"5584999999999\",\n  \"type\": \"interactive\",\n  \"interactive\": {\n    \"type\": \"flow\",\n    \"header\": { \"type\": \"text\", \"text\": \"Book a visit\" },\n    \"body\": { \"text\": \"Pick a date, time and address in a few steps.\" },\n    \"footer\": { \"text\": \"Takes about 1 minute\" },\n    \"action\": {\n      \"name\": \"flow\",\n      \"parameters\": {\n        \"flow_message_version\": \"3\",\n        \"flow_id\": \"FLOW_ID\",\n        \"flow_token\": \"bk_5584999999999_20261020\",\n        \"flow_cta\": \"Book\",\n        \"flow_action\": \"navigate\",\n        \"flow_action_payload\": { \"screen\": \"START\", \"data\": { \"name\": \"Marina\" } }\n      }\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p>The <code>flow_token<\/code> is yours: use it to identify the session when the reply comes back. Meta recommends a CTA of 30 characters or less, with no emoji. To start a conversation with a Flow outside the window, create a template with a <code>FLOW<\/code> button, as explained in the guide to <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-api-message-templates\/\">WhatsApp API message templates<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Receive the reply<\/h3>\n\n\n\n<p>When the user finishes, you get an interactive message of type <code>nfm_reply<\/code>. The <code>response_json<\/code> is a string with the data defined in the Flow&#8217;s completion action:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">\"interactive\": {\n  \"type\": \"nfm_reply\",\n  \"nfm_reply\": {\n    \"name\": \"flow\",\n    \"body\": \"Sent\",\n    \"response_json\": \"{\\\"flow_token\\\":\\\"bk_5584999999999_20261020\\\",\\\"date\\\":\\\"2026-10-22\\\",\\\"time\\\":\\\"14:00\\\"}\"\n  }\n}<\/code><\/pre>\n\n\n\n<p>Keep an eye on the Flow&#8217;s health. If the Flow&#8217;s endpoint becomes unstable, Meta changes the status to <code>THROTTLED<\/code> (sending limited to 10 messages per hour) and, if it gets worse, to <code>BLOCKED<\/code>, when it can be neither sent nor opened. The changes arrive through the <code>flows<\/code> webhook.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Media: image, video, document and audio<\/h2>\n\n\n\n<p>Media goes by <code>link<\/code> (a public URL) or by <code>id<\/code> (obtained on upload). With Vectalk, the upload is done at <code>\/api\/media<\/code> and returns the <code>media_id<\/code>. More examples are in <a href=\"https:\/\/vectalk.com.br\/blog\/en\/send-media-whatsapp-api\/\">how to send media with the WhatsApp API<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"messaging_product\": \"whatsapp\",\n  \"to\": \"5584999999999\",\n  \"type\": \"document\",\n  \"document\": {\n    \"link\": \"https:\/\/files.example.com\/contracts\/7731.pdf\",\n    \"filename\": \"contract-7731.pdf\",\n    \"caption\": \"Here is the contract for signature.\"\n  }\n}<\/code><\/pre>\n\n\n\n<p>Media IDs returned by the upload are valid for 30 days, so you can reuse the same <code>id<\/code> across sends instead of uploading the file again. For media headers on buttons, Meta advises using the uploaded media <code>id<\/code> instead of a <code>link<\/code>. To handle the files customers send you, see <a href=\"https:\/\/vectalk.com.br\/blog\/en\/download-media-whatsapp-webhook\/\">how to download media from the WhatsApp webhook<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Routing replies in the webhook<\/h2>\n\n\n\n<p>A simple router for the types above, taking advantage of the fact that Vectalk delivers Meta&#8217;s payload unchanged:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-javascript\">function route(msg) {\n  if (msg.type === \"location\") {\n    return calculateShipping(msg.from, msg.location.latitude, msg.location.longitude, msg.context?.id);\n  }\n  if (msg.type !== \"interactive\") return handleFreeText(msg);\n\n  const i = msg.interactive;\n  switch (i.type) {\n    case \"button_reply\":\n      if (i.button_reply.id === \"agent\") return handOffToHuman(msg.from);\n      return runAction(msg.from, i.button_reply.id);\n    case \"list_reply\":\n      return bookSlot(msg.from, i.list_reply.id);\n    case \"nfm_reply\": {\n      const data = JSON.parse(i.nfm_reply.response_json);\n      return saveBooking(data.flow_token, data);\n    }\n    default:\n      return logUnhandled(msg);\n  }\n}<\/code><\/pre>\n\n\n\n<p>Replies to template buttons (quick reply) arrive with <code>type: \"button\"<\/code>, a different format from <code>button_reply<\/code>; handle both. The guide to <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-api-webhooks\/\">WhatsApp API webhooks<\/a> shows the full server with a queue and deduplication, the <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-bot-nodejs-express\/\">Node.js WhatsApp bot<\/a> tutorial builds one from scratch, and the article on an <a href=\"https:\/\/vectalk.com.br\/blog\/en\/ai-chatbot-whatsapp-api\/\">AI chatbot with the WhatsApp API<\/a> shows how to combine buttons with AI-generated replies.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to choose the right type<\/h2>\n\n\n\n<p>The choice depends on what you need back:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Need<\/th><th>Recommended type<\/th><th>Why<\/th><\/tr><\/thead><tbody><tr><td>Yes or no, confirm or reschedule<\/td><td>Reply buttons<\/td><td>One tap, a structured reply and a renewed window<\/td><\/tr><tr><td>Choose among 4 to 10 options<\/td><td>List<\/td><td>Fits in a single message, with a description per row<\/td><\/tr><tr><td>Send to payment, tracking or a portal<\/td><td>Link button<\/td><td>Hides the URL and keeps the text clean<\/td><\/tr><tr><td>Delivery or visit address<\/td><td>Location request<\/td><td>Exact coordinates, no typing<\/td><\/tr><tr><td>Collect several fields (name, date, address, preferences)<\/td><td>Flow<\/td><td>Screens with validation, no back-and-forth in the chat<\/td><\/tr><tr><td>Show product variations<\/td><td>Carousel or <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-api-catalog\/\">catalog messages<\/a><\/td><td>Side-by-side visual comparison<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>If the conversation needs more than two questions in a row, a Flow is usually shorter for the user than several buttons in sequence.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Short labels with a verb.<\/strong> &#8220;Confirm&#8221; and &#8220;Reschedule&#8221; work better than sentences. The 20-character limit cuts off the rest.<\/li>\n\n\n<li><strong>Always a way out to a person.<\/strong> The WhatsApp Business Messaging Policy requires prompt, clear and direct escalation paths in automated experiences, such as handing off to a human agent. A &#8220;Talk to someone&#8221; button solves it.<\/li>\n\n\n<li><strong>Stable IDs.<\/strong> Treat the <code>id<\/code> as a contract with your backend. Changing the button text shouldn&#8217;t break routing.<\/li>\n\n\n<li><strong>Accept free text.<\/strong> Users may ignore the buttons and type. The router needs to understand &#8220;yes&#8221;, &#8220;2 p.m. works&#8221; or a voice note.<\/li>\n\n\n<li><strong>Don&#8217;t count on delivery order.<\/strong> Meta warns that the delivery order of a sequence of messages isn&#8217;t guaranteed. If order matters, wait for the previous message&#8217;s <code>delivered<\/code> status before sending the next.<\/li>\n\n\n<li><strong>One question per message.<\/strong> Three interactive messages in a row confuse people and lead to replies to the wrong message. The webhook&#8217;s <code>context.id<\/code> shows which message the user replied to.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Can I send buttons to a customer who hasn&#8217;t talked to me today?<\/h3>\n\n\n\n<p>Not as an interactive message. Outside the 24-hour window, use a template with quick reply, link or Flow buttons.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I add more than 3 reply buttons?<\/h3>\n\n\n\n<p>Not in an interactive message. Use a list (up to 10 options). In templates, the limit is up to 10 buttons, with rules per type.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Are interactive messages charged?<\/h3>\n\n\n\n<p>They are service messages. Since October 1, 2026, Meta gives each number 1,000 free delivered service messages per month and charges after that, except inside the free entry point window opened by an ad. Rates vary by the recipient&#8217;s country; see <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-api-pricing-by-country\/\">WhatsApp API pricing by country<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Do I need my own endpoint to use Flows?<\/h3>\n\n\n\n<p>Not for simple Flows, where the data lives in the Flow JSON itself and comes back in <code>nfm_reply<\/code>. Flows that fetch real-time data (available times, prices) use the <code>data_exchange<\/code> action and require an endpoint of your own.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Build interactive conversations with Vectalk<\/h2>\n\n\n\n<p>With Vectalk, buttons, lists, location, media and Flows use the same payload as the Cloud API, and replies arrive in the webhook in the format of Meta&#8217;s documentation. One token covers all your accounts, coexistence with the WhatsApp Business app is available, and billing works with a monthly fee plus a prepaid balance: Vectalk puts its own line of credit on your number and each delivered message is deducted from the balance, with no card registered with Meta. Create your account at <a href=\"https:\/\/apps.vectalk.com.br\/register\">apps.vectalk.com.br\/register<\/a>, see the examples at <a href=\"https:\/\/docs.vectalk.com.br\/\">docs.vectalk.com.br<\/a> or talk to the team in the <a href=\"https:\/\/vectalk.com.br\/ajuda.html\">Help Center<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Sources checked on October 29, 2026:<\/strong> <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/messages\/interactive-reply-buttons-messages\" target=\"_blank\" rel=\"noreferrer noopener\">Reply button messages<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/messages\/interactive-list-messages\" target=\"_blank\" rel=\"noreferrer noopener\">List messages<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/messages\/interactive-cta-url-messages\" target=\"_blank\" rel=\"noreferrer noopener\">CTA URL messages<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/messages\/location-request-messages\" target=\"_blank\" rel=\"noreferrer noopener\">Location request messages<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/messages\/interactive-media-carousel-messages\" target=\"_blank\" rel=\"noreferrer noopener\">Media carousel messages<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/flows\/guides\/sendingaflow\" target=\"_blank\" rel=\"noreferrer noopener\">Sending a Flow<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/flows\/guides\/healthmonitoring\" target=\"_blank\" rel=\"noreferrer noopener\">Flow health and monitoring<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/business-phone-numbers\/media\" target=\"_blank\" rel=\"noreferrer noopener\">Media<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Payloads, character limits and webhook replies for every WhatsApp Cloud API interactive message type, plus a Node.js router to handle them all.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-695","post","type-post","status-publish","format-standard","hentry","category-blog"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>WhatsApp Interactive Messages API: Buttons, Lists and Flows<\/title>\n<meta name=\"description\" content=\"WhatsApp API interactive messages: reply buttons, lists, CTA URL, media, location and Flows, with payloads, limits for each type and webhook replies.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WhatsApp Interactive Messages API: Buttons, Lists and Flows\" \/>\n<meta property=\"og:description\" content=\"WhatsApp API interactive messages: reply buttons, lists, CTA URL, media, location and Flows, with payloads, limits for each type and webhook replies.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Vectalk\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-29T13:14:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-29T13:14:28+00:00\" \/>\n<meta name=\"author\" content=\"wanderleyfcunha\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"wanderleyfcunha\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-interactive-messages-api\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-interactive-messages-api\\\/\"},\"author\":{\"name\":\"wanderleyfcunha\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"headline\":\"WhatsApp API interactive messages: buttons, lists, media, location and Flows\",\"datePublished\":\"2026-10-29T13:14:25+00:00\",\"dateModified\":\"2026-10-29T13:14:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-interactive-messages-api\\\/\"},\"wordCount\":1608,\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-interactive-messages-api\\\/\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-interactive-messages-api\\\/\",\"name\":\"WhatsApp Interactive Messages API: Buttons, Lists and Flows\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\"},\"datePublished\":\"2026-10-29T13:14:25+00:00\",\"dateModified\":\"2026-10-29T13:14:28+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"description\":\"WhatsApp API interactive messages: reply buttons, lists, CTA URL, media, location and Flows, with payloads, limits for each type and webhook replies.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-interactive-messages-api\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-interactive-messages-api\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-interactive-messages-api\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WhatsApp API interactive messages: buttons, lists, media, location and Flows\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\",\"name\":\"Blog Vectalk\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\",\"name\":\"wanderleyfcunha\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"caption\":\"wanderleyfcunha\"},\"sameAs\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WhatsApp Interactive Messages API: Buttons, Lists and Flows","description":"WhatsApp API interactive messages: reply buttons, lists, CTA URL, media, location and Flows, with payloads, limits for each type and webhook replies.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/","og_locale":"en_US","og_type":"article","og_title":"WhatsApp Interactive Messages API: Buttons, Lists and Flows","og_description":"WhatsApp API interactive messages: reply buttons, lists, CTA URL, media, location and Flows, with payloads, limits for each type and webhook replies.","og_url":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/","og_site_name":"Blog Vectalk","article_published_time":"2026-10-29T13:14:25+00:00","article_modified_time":"2026-10-29T13:14:28+00:00","author":"wanderleyfcunha","twitter_card":"summary_large_image","twitter_misc":{"Written by":"wanderleyfcunha","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/#article","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/"},"author":{"name":"wanderleyfcunha","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"headline":"WhatsApp API interactive messages: buttons, lists, media, location and Flows","datePublished":"2026-10-29T13:14:25+00:00","dateModified":"2026-10-29T13:14:28+00:00","mainEntityOfPage":{"@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/"},"wordCount":1608,"articleSection":["Blog"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/","url":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/","name":"WhatsApp Interactive Messages API: Buttons, Lists and Flows","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/#website"},"datePublished":"2026-10-29T13:14:25+00:00","dateModified":"2026-10-29T13:14:28+00:00","author":{"@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"description":"WhatsApp API interactive messages: reply buttons, lists, CTA URL, media, location and Flows, with payloads, limits for each type and webhook replies.","breadcrumb":{"@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vectalk.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"WhatsApp API interactive messages: buttons, lists, media, location and Flows"}]},{"@type":"WebSite","@id":"https:\/\/vectalk.com.br\/blog\/#website","url":"https:\/\/vectalk.com.br\/blog\/","name":"Blog Vectalk","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vectalk.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b","name":"wanderleyfcunha","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","caption":"wanderleyfcunha"},"sameAs":["https:\/\/vectalk.com.br\/blog"]}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/695","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/comments?post=695"}],"version-history":[{"count":1,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/695\/revisions"}],"predecessor-version":[{"id":697,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/695\/revisions\/697"}],"wp:attachment":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/media?parent=695"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/categories?post=695"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/tags?post=695"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}