← Blog

·

Mensajes interactivos en la API de WhatsApp: botones, listas, multimedia, ubicación y Flows

Actualizado el 29/10/2026

Los mensajes interactivos son envíos con type: "interactive" que le muestran al usuario botones de respuesta (hasta 3), una lista (hasta 10 opciones), un botón de enlace, una solicitud de ubicación, un carrusel o un WhatsApp Flow; cuando toca, el webhook devuelve el id que definiste. Son mensajes de servicio, por lo que solo se pueden enviar con la ventana de 24 horas abierta. Para iniciar una conversación con botones o Flow, usa una plantilla.

A continuación están los payloads de cada tipo, los límites de caracteres, el formato de la respuesta en el webhook y un enrutador en Node.js para manejarlo todo. Los ejemplos usan Vectalk (https://apis.vectalk.com.br/api/messages), que acepta el mismo cuerpo de la Cloud API de Meta.

Panorama de los tipos

Tipointeractive.typeLímites principalesQué vuelve en el webhook
Botones de respuestabuttonHasta 3 botones; etiqueta de 20 caracteres; cuerpo de 1.024interactive.button_reply con id y title
ListalistHasta 10 secciones y 10 filas en total; botón de 20 caracteresinteractive.list_reply con id, title y description
Botón de enlacecta_url1 botón; etiqueta de 20 caracteresNada (abre el navegador)
Solicitud de ubicaciónlocation_request_messageCuerpo de 1.024 caracteresMensaje type: "location"
Carrusel multimediacarouselDe 2 a 10 tarjetas con imagen o videoDepende del botón usado
Flowflowflow_message_version igual a "3"interactive.nfm_reply con response_json
Producto y multiproductoproduct, product_listLigados a un catálogoPedido (type: "order")

La multimedia simple (imagen, video, documento, audio) y la ubicación fija no son interactivas, pero suelen aparecer en los mismos flujos y también están en esta guía.

Botones de respuesta

El formato más usado para confirmar, elegir entre pocas opciones o derivar a un agente.

curl -X POST https://apis.vectalk.com.br/api/messages \
  -H "Authorization: Bearer TU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "messaging_product": "whatsapp",
    "to": "5584999999999",
    "type": "interactive",
    "interactive": {
      "type": "button",
      "header": { "type": "text", "text": "Cita de mañana" },
      "body": { "text": "Hola, Marina. Tu cita está programada para el 21/10 a las 9 h. ¿La confirmas?" },
      "footer": { "text": "Clínica Ejemplo" },
      "action": {
        "buttons": [
          { "type": "reply", "reply": { "id": "confirmar_8812", "title": "Confirmar" } },
          { "type": "reply", "reply": { "id": "reprogramar_8812", "title": "Reprogramar" } },
          { "type": "reply", "reply": { "id": "agente", "title": "Hablar con alguien" } }
        ]
      }
    }
  }'

Reglas de Meta para este tipo:

  • hasta 3 botones, con etiquetas únicas de hasta 20 caracteres;
  • id de hasta 256 caracteres;
  • cuerpo de hasta 1.024 caracteres y pie de hasta 60;
  • encabezado opcional de texto, imagen, video o documento.

Usa el id para llevar contexto. En el ejemplo, confirmar_8812 ya indica la acción y la cita, y el webhook no depende del texto del botón. Cuando el usuario toca, llega:

"interactive": {
  "type": "button_reply",
  "button_reply": { "id": "confirmar_8812", "title": "Confirmar" }
}

¿Quieres probar mientras lees? Crea tu cuenta en Vectalk y envía el primer mensaje por la API oficial. Crear cuenta gratis →

Lista interactiva

Para más de tres opciones: menú, horarios, departamentos, planes. El usuario toca el botón y se abre un panel con las filas.

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "interactive",
  "interactive": {
    "type": "list",
    "header": { "type": "text", "text": "Horarios disponibles" },
    "body": { "text": "Elige un horario para tu visita técnica." },
    "footer": { "text": "Hora de Brasilia" },
    "action": {
      "button": "Ver horarios",
      "sections": [
        {
          "title": "Miércoles, 22/10",
          "rows": [
            { "id": "slot_2210_09", "title": "09:00", "description": "Técnico disponible" },
            { "id": "slot_2210_14", "title": "14:00", "description": "Técnico disponible" }
          ]
        },
        {
          "title": "Jueves, 23/10",
          "rows": [
            { "id": "slot_2310_10", "title": "10:00" }
          ]
        }
      ]
    }
  }
}
CampoLímite
action.button20 caracteres, un botón
SeccionesHasta 10, título de hasta 24 caracteres
FilasHasta 10 sumando todas las secciones
rows[].title24 caracteres
rows[].description72 caracteres, opcional
rows[].id200 caracteres
Cuerpo4.096 caracteres
EncabezadoSolo texto, 60 caracteres
Pie60 caracteres, opcional

El límite de 10 filas es el total del mensaje, no por sección. Si tienes más opciones, divídelas en etapas (primero el día, después el horario). La elección vuelve como list_reply:

"interactive": {
  "type": "list_reply",
  "list_reply": { "id": "slot_2210_14", "title": "14:00", "description": "Técnico disponible" }
}

Botón de enlace (CTA URL)

Esconde una URL larga detrás de un botón. Útil para comprobantes de pago, seguimiento y portal del cliente. (En Brasil, un uso típico es el boleto, un comprobante bancario que se paga con código de barras.)

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "interactive",
  "interactive": {
    "type": "cta_url",
    "body": { "text": "Tu duplicado de factura está listo." },
    "action": {
      "name": "cta_url",
      "parameters": {
        "display_text": "Abrir factura",
        "url": "https://cliente.ejemplo.com/facturas/7731?origen=whatsapp"
      }
    }
  }
}

La etiqueta admite hasta 20 caracteres y el cuerpo hasta 1.024. El toque abre el navegador y no genera un mensaje del usuario, así que no renueva la ventana de 24 horas. Para medir clics, usa parámetros en la propia URL.

Ubicación: enviar y pedir

Para enviar una dirección fija (tienda, punto de retiro), usa type: "location". Latitud y longitud son obligatorias; nombre y dirección son opcionales.

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "location",
  "location": {
    "latitude": -5.7945,
    "longitude": -35.2110,
    "name": "Tienda Ejemplo Centro",
    "address": "Av. Exemplo, 100 - Natal, RN"
  }
}

Para pedir la ubicación del usuario (entrega, atención en terreno), usa el mensaje interactivo con el botón de enviar ubicación:

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "interactive",
  "interactive": {
    "type": "location_request_message",
    "body": { "text": "Para calcular el envío, toca el botón y comparte tu ubicación." },
    "action": { "name": "send_location" }
  }
}

La respuesta llega como un mensaje común de ubicación, con latitude, longitude y, si el usuario quiere compartirlos, name y address. El campo context.id apunta al mensaje de solicitud, lo que ayuda a relacionar la respuesta con el pedido correcto.

Carrusel multimedia

El carrusel muestra de 2 a 10 tarjetas con desplazamiento horizontal. Cada tarjeta necesita un encabezado de imagen o video, puede tener un cuerpo de hasta 160 caracteres (con hasta 2 saltos de línea) y debe tener un botón de enlace o botones de respuesta rápida, con el mismo tipo y la misma cantidad en todas las tarjetas. Funciona bien para mostrar variantes de un producto. La estructura completa está en la página de carrusel de la documentación de Meta; para iniciar la conversación con tarjetas, consulta la plantilla carrusel de WhatsApp.

WhatsApp Flows

Los Flows son formularios de varias pantallas dentro de WhatsApp: registro, agendamiento, encuestas, simulación de crédito. El contenido de las pantallas se define en un archivo JSON (Flow JSON), y el resultado te vuelve por el webhook. Para una introducción más amplia, lee WhatsApp Flows.

Meta indica dos requisitos previos: tener la empresa verificada y mantener alta la calidad de los mensajes.

1. Crear, subir el JSON y publicar

En Vectalk, el ciclo se hace por API con un token de instancia:

# Crea el Flow como borrador
curl -X POST https://apis.vectalk.com.br/api/flows \
  -H "Authorization: Bearer TU_TOKEN_DE_INSTANCIA" \
  -H "Content-Type: application/json" \
  -d '{ "name": "agendamiento_visita", "categories": ["APPOINTMENT_BOOKING"] }'

# Sube el flow.json (multipart)
curl -X POST https://apis.vectalk.com.br/api/flows/FLOW_ID/assets \
  -H "Authorization: Bearer TU_TOKEN_DE_INSTANCIA" \
  -F "file=@flow.json" -F "name=flow.json" -F "asset_type=FLOW_JSON"

# Publica
curl -X POST https://apis.vectalk.com.br/api/flows/FLOW_ID/publish \
  -H "Authorization: Bearer TU_TOKEN_DE_INSTANCIA"

La respuesta de la subida trae validation_errors. Corrige todo antes de publicar: un Flow publicado no se puede eliminar, solo dejar obsoleto.

2. Enviar el Flow dentro de la ventana

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "interactive",
  "interactive": {
    "type": "flow",
    "header": { "type": "text", "text": "Agendar visita" },
    "body": { "text": "Elige fecha, horario y dirección en pocos pasos." },
    "footer": { "text": "Toma cerca de 1 minuto" },
    "action": {
      "name": "flow",
      "parameters": {
        "flow_message_version": "3",
        "flow_id": "FLOW_ID",
        "flow_token": "ag_5584999999999_20261020",
        "flow_cta": "Agendar",
        "flow_action": "navigate",
        "flow_action_payload": { "screen": "INICIO", "data": { "nombre": "Marina" } }
      }
    }
  }
}

El flow_token es tuyo: úsalo para identificar la sesión cuando vuelva la respuesta. Meta recomienda un CTA de hasta 30 caracteres, sin emojis. Para iniciar el contacto con un Flow fuera de la ventana, crea una plantilla con un botón de tipo FLOW, como explica la guía de plantillas de la API de WhatsApp.

3. Recibir la respuesta

Cuando el usuario termina, llega un mensaje interactivo de tipo nfm_reply. El response_json es una cadena con los datos definidos en la acción de cierre del Flow:

"interactive": {
  "type": "nfm_reply",
  "nfm_reply": {
    "name": "flow",
    "body": "Sent",
    "response_json": "{\"flow_token\":\"ag_5584999999999_20261020\",\"fecha\":\"2026-10-22\",\"horario\":\"14:00\"}"
  }
}

Vigila la salud del Flow. Si el endpoint del Flow se vuelve inestable, Meta cambia el estado a THROTTLED (envío limitado a 10 mensajes por hora) y, si empeora, a BLOCKED, cuando no se puede enviar ni abrir. Los cambios llegan por el webhook flows.

Multimedia: imagen, video, documento y audio

La multimedia va por link (URL pública) o por id (obtenido en la subida). En Vectalk, la subida se hace en /api/media y devuelve el media_id. Hay más ejemplos en cómo enviar multimedia por la API de WhatsApp.

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "document",
  "document": {
    "link": "https://archivos.ejemplo.com/contratos/7731.pdf",
    "filename": "contrato-7731.pdf",
    "caption": "Te enviamos el contrato para firmar."
  }
}

Los IDs de multimedia que devuelve la subida valen por 30 días, así que puedes reutilizar el mismo id en varios envíos en lugar de volver a subir el archivo. En encabezados de botones, Meta recomienda usar el id de la multimedia subida en lugar del link. Para manejar los archivos que te envían los clientes, consulta cómo descargar la multimedia del webhook de WhatsApp.

Cómo enrutar las respuestas en el webhook

Un enrutador simple para los tipos anteriores, aprovechando que Vectalk entrega el payload de Meta sin cambios:

function enrutar(msg) {
  if (msg.type === "location") {
    return calcularEnvio(msg.from, msg.location.latitude, msg.location.longitude, msg.context?.id);
  }
  if (msg.type !== "interactive") return manejarTextoLibre(msg);

  const i = msg.interactive;
  switch (i.type) {
    case "button_reply":
      if (i.button_reply.id === "agente") return transferirAHumano(msg.from);
      return ejecutarAccion(msg.from, i.button_reply.id);
    case "list_reply":
      return reservarHorario(msg.from, i.list_reply.id);
    case "nfm_reply": {
      const datos = JSON.parse(i.nfm_reply.response_json);
      return guardarAgendamiento(datos.flow_token, datos);
    }
    default:
      return registrarNoManejado(msg);
  }
}

Las respuestas a botones de plantilla (respuesta rápida) llegan con type: "button", un formato distinto de button_reply; maneja los dos. La guía de webhooks de la API de WhatsApp muestra el servidor completo con cola y deduplicación, el tutorial de bot de WhatsApp con Node.js arma uno desde cero, y el artículo sobre chatbot con IA en WhatsApp muestra cómo combinar botones y respuestas generadas por IA.

Cómo elegir el tipo correcto

La elección depende de lo que necesitas recibir de vuelta:

NecesidadTipo indicadoMotivo
Sí o no, confirmar o reprogramarBotones de respuestaUn toque, respuesta estructurada y renovación de la ventana
Elegir entre 4 y 10 opcionesListaCabe en un solo mensaje, con descripción por fila
Llevar a pago, seguimiento o portalBotón de enlaceEsconde la URL y deja el texto limpio
Dirección de entrega o visitaSolicitud de ubicaciónCoordenadas exactas, sin escribir
Recoger varios campos (nombre, fecha, dirección, preferencias)FlowPantallas con validación, sin idas y vueltas en el chat
Mostrar variantes de productoCarrusel o mensajes de catálogoComparación visual lado a lado

Si la conversación necesita más de dos preguntas seguidas, un Flow suele ser más corto para el usuario que varios botones en secuencia.

Buenas prácticas

  • Etiquetas cortas y con verbo. «Confirmar» y «Reprogramar» funcionan mejor que frases. El límite de 20 caracteres corta el resto.
  • Siempre una salida hacia una persona. La Política de Mensajería de WhatsApp Business exige vías de escalamiento rápidas, claras y directas en las experiencias automatizadas, como la transferencia a un agente humano. Un botón «Hablar con alguien» lo resuelve.
  • IDs estables. Trata el id como un contrato con tu backend. Cambiar el texto del botón no debería romper el enrutamiento.
  • Acepta texto libre. El usuario puede ignorar los botones y escribir. El enrutador tiene que entender «sí», «puede ser a las 14 h» o un audio.
  • No cuentes con el orden de entrega. Meta advierte que el orden de entrega de una secuencia de mensajes no está garantizado. Si el orden importa, espera el estado delivered del anterior antes de enviar el siguiente.
  • Una pregunta por mensaje. Tres mensajes interactivos seguidos confunden y generan respuestas al mensaje equivocado. El context.id del webhook muestra a qué mensaje respondió el usuario.

Preguntas frecuentes

¿Puedo enviar botones a un cliente que no habló conmigo hoy?

No como mensaje interactivo. Fuera de la ventana de 24 horas, usa una plantilla con botones de respuesta rápida, de enlace o de Flow.

¿Se pueden poner más de 3 botones de respuesta?

En el mensaje interactivo, no. Usa una lista (hasta 10 opciones). En plantillas, el límite es de hasta 10 botones, con reglas por tipo.

¿Se cobran los mensajes interactivos?

Son mensajes de servicio. Desde el 1/10/2026, Meta da 1.000 mensajes de servicio entregados gratis por número al mes y cobra a partir de ahí, salvo dentro de la ventana de punto de entrada gratuito abierta por un anuncio. Las tarifas varían según el país del destinatario; consulta precio de la API de WhatsApp por país.

¿Necesito un endpoint propio para usar Flows?

No para Flows simples, en los que los datos están en el propio Flow JSON y vuelven en el nfm_reply. Los Flows que buscan datos en tiempo real (horarios disponibles, precios) usan la acción data_exchange y exigen un endpoint propio.

Crea conversaciones interactivas con Vectalk

En Vectalk, botones, listas, ubicación, multimedia y Flows usan el mismo payload de la Cloud API, y las respuestas llegan al webhook en el formato de la documentación de Meta. Un token sirve para todas tus cuentas, la coexistencia con la app WhatsApp Business está disponible y el cobro funciona con una mensualidad más saldo prepago: Vectalk coloca su propia línea de crédito en tu número y cada mensaje entregado se descuenta del saldo, sin tarjeta registrada en Meta. Crea tu cuenta en apps.vectalk.com.br/register, consulta los ejemplos en docs.vectalk.com.br o habla con el equipo en el Centro de Ayuda.


Fuentes oficiales consultadas el 29/10/2026: Mensajes con botones de respuesta, Mensajes de lista, Mensajes CTA URL, Mensajes de solicitud de ubicación, Mensajes de carrusel multimedia, Envío de Flows, Salud y monitoreo de Flows, Multimedia.

Prueba hoy la API oficial de WhatsApp

Crea tu cuenta, genera el token y envía el primer mensaje con la guía de la documentación. Los mismos payloads y webhooks de la Cloud API de Meta.