Crear plantilla
Crea plantillas de mensajes de WhatsApp.
Resumen para integración
- URL base:
https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services- Token: de administración, en el encabezado
Authorization: Bearer {{admin-token}}(cómo generarlo)- Endpoints en esta página:
POST /v1/template: Crear Template
Crear Template
Petición
Petición de Crear Template:
| URL | https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/template |
| Método | POST |
| Tipo | application/json |
Encabezados
Encabezados de Crear Template:
| Nombre | Descripción | Tipo | Requerimientos |
|---|---|---|---|
| Content-Type | application/json | String | Obligatorio |
| Authorization | Token de administración. Consulta Generar Token de Autenticación. | String | Obligatorio |
Cuerpo
Campos del cuerpo de Crear Template:
| Nombre | Descripción | Tipo | Requerimientos |
|---|---|---|---|
| wba_id | ID de la cuenta de WhatsApp Business (WABA). Debe ser la WABA asociada a tu token. Solo admite dígitos. | String | Obligatorio |
| name | Nombre del template. Solo admite letras, números y guion bajo (_). | String | Obligatorio |
| language | Código de idioma y configuración regional de la plantilla. Ejemplo: es, es_MX, en_US. Consulta los idiomas admitidos por Meta. | String | Obligatorio |
| category | Categoría de la plantilla:
| String | Obligatorio |
| allowCategoryChange | Si el valor es true, Meta puede asignar automáticamente la categoría que corresponda a la plantilla. El valor por defecto es true. Envía este campo como allowCategoryChange (camelCase). | Boolean | Opcional |
| message_send_ttl_seconds | Tiempo de vida (TTL) en segundos. Es el tiempo máximo durante el cual WhatsApp intentará entregar un mensaje enviado con esta plantilla. Rangos permitidos por categoría:
| Integer | Opcional |
| degrees_of_freedom_spec | Objeto de paso (pass-through) que se reenvía a Meta para controlar las opciones de flexibilidad de la plantilla. Opcional; se usa en configuraciones avanzadas de plantillas. | Objeto | Opcional |
| optimization_spec | Objeto de paso (pass-through) que se reenvía a Meta para controlar la optimización de la plantilla. Opcional; se usa en configuraciones avanzadas de plantillas. | Objeto | Opcional |
| structure | Estructura de la plantilla | Objeto structure | Obligatorio |
Objeto structure
| Nombre | Descripción | Tipo | Requerimientos |
|---|---|---|---|
| header | Encabezado de la plantilla | Objeto header | Opcional |
| body | Cuerpo de la plantilla | Objeto body | Obligatorio |
| footer | Pie de página de la plantilla. No se utiliza en plantillas AUTHENTICATION. | String | Opcional |
| footer_code_expiration_minutes | Minutos de vigencia del código que se muestran en el pie de página. Solo para plantillas AUTHENTICATION. Mínimo 1, máximo 90. | Integer | Opcional |
| buttons | Botones que puede contener la plantilla | Lista de objetos buttons | Opcional |
| limited_time_offer | Componente para mostrar oferta por tiempo limitado, permiten mostrar fechas de caducidad y temporizadores de cuenta regresiva para códigos de oferta en los mensajes de plantilla. | Objeto limited_time_offer | Opcional |
| carousel | Componente de secuencia que permite enviar un mensaje de texto único acompañado por un conjunto de hasta 10 tarjetas de secuencia en una vista desplazable horizontalmente | Objeto carousel | Opcional |
| call_permission_request | Si el valor es true, agrega a la plantilla un botón para que el usuario conceda permiso de llamada. Consulta Crear template con solicitud de permiso de llamada. El valor por defecto es false. | Boolean | Opcional |
Objeto header
| Nombre | Descripción | Tipo | Requerimientos |
|---|---|---|---|
| format | Formato del encabezado. Valores aceptados:
| String | Obligatorio |
| text | Texto del encabezado | String | Obligatorio si format es TEXT |
| example | Ejemplos de los posibles datos de las variables o del contenido multimedia del encabezado | Objeto header example | Obligatorio si format es IMAGE, DOCUMENT, VIDEO o GIF |
Objeto header example
| Nombre | Descripción | Tipo | Requerimientos |
|---|---|---|---|
| header_handle | Contenido multimedia de ejemplo del encabezado (imagen, video o documento). Puedes enviarlo de dos formas:
| Lista de strings | Condicional |
| header_text | Ejemplos de posibles datos de variables del texto del encabezado | Lista de strings | Opcional |
Objeto body
| Nombre | Descripción | Tipo | Requerimientos |
|---|---|---|---|
| text | Texto del cuerpo. No puede contener variables al inicio o al final del texto. En plantillas AUTHENTICATION no se utiliza, ya que Meta define el texto. | String | Obligatorio, excepto en plantillas AUTHENTICATION |
| add_security_recommendation | Si el valor es true, se agrega al cuerpo el texto de recomendación de seguridad. Solo para plantillas AUTHENTICATION. | Boolean | Opcional |
| example | Ejemplos de los posibles datos de las variables de la plantilla | Objeto body example | Opcional |
Objeto body example
| Nombre | Descripción | Tipo | Requerimientos |
|---|---|---|---|
| body_text | Ejemplos de posibles datos de variables. Incluye un valor por cada variable del texto del cuerpo. | Lista de listas de strings | Opcional |
Objeto supported_apps
| Nombre | Descripción | Tipo | Requerimientos |
|---|---|---|---|
| package_name | Nombre del paquete de tu aplicación Android. Debe tener al menos dos segmentos separados por puntos y cada segmento debe comenzar con una letra. Solo admite caracteres alfanuméricos y guion bajo (a-zA-Z0-9_). Máximo 224 caracteres. | String | Obligatorio |
| signature_hash | Hash de la clave de firma de tu aplicación. Solo admite caracteres alfanuméricos, +, / o = (a-zA-Z0-9+/=). Debe tener exactamente 11 caracteres. Consulta cómo obtenerlo en la documentación de Meta. | String | Obligatorio |
Objeto limited_time_offer
| Nombre | Descripción | Tipo | Requerimientos |
|---|---|---|---|
| text | Texto de detalles de la oferta. Máximo de 16 caracteres. | String | Obligatorio |
| has_expiration | Si el valor es true, los detalles de caducidad de la oferta aparecerán en el mensaje enviado. Si el valor es false, los detalles de caducidad de la oferta no aparecerán en el mensaje enviado y el componente de "botón copiar código" será opcional. Si se incluye el botón de copiar código, deberá aparecer primero en la matriz buttons. | Boolean | Obligatorio |
Objeto carousel
El componente de carrusel puede enviarse bajo la clave carousel o bajo la clave carousel_cards. Ambas se aceptan y corresponden al mismo componente.
| Nombre | Descripción | Tipo | Requerimientos |
|---|---|---|---|
| cards | Tarjetas del carrusel. Máximo 10 tarjetas. | Lista de objetos cards | Obligatorio |
Objeto cards
| Nombre | Descripción | Tipo | Requerimientos |
|---|---|---|---|
| header | Encabezado de la tarjeta. Solo acepta los formatos IMAGE y VIDEO, y todas las tarjetas deben tener el mismo formato. | Objeto header | Obligatorio |
| body | Cuerpo de la tarjeta. Máximo 160 caracteres. | Objeto body | Obligatorio |
| buttons | Botones de la tarjeta. Mínimo 1 y máximo 2 botones de tipo PHONE_NUMBER, URL o QUICK_REPLY. Todas las tarjetas deben tener la misma cantidad y el mismo tipo de botones. | Lista de objetos buttons | Obligatorio |
Ejemplo
Ejemplos completos de Crear Template. Cada body de abajo es un payload -d válido para la petición anterior; envía uno de ellos en lugar del Body general.
Body general
curl -X POST "https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/template" \-H 'Content-Type: application/json' \-H 'Authorization: Bearer {{admin-token}}' \-d '{"wba_id": "1234567899870","name": "notificacion_de_pedido","language": "es_MX","category": "AUTHENTICATION|MARKETING|UTILITY","structure":{"header":{"format": "TEXT|IMAGE|DOCUMENT|VIDEO|LOCATION|GIF","text": "PEDIDO: {{1}}","example":{"header_handle":["file-handle"],"header_text":["header-example"]}},"body":{"text": "Tu pedido {{1}} está por llegar","example":{"body_text":[[ "123"]]}},"footer": "Mi empresa","buttons":[{"type": "PHONE_NUMBER|URL|QUICK_REPLY|COPY_CODE|FLOW","text": "phone-button-text|url-button-text","url": "https://www.website.com/{{1}}","phone_number": "+52(1) 555-1111","example":["https://www.website.com/dynamic-url-example"]}]}}'
Body de encabezado de texto personalizado
Una plantilla MARKETING con encabezado TEXT, un cuerpo con parámetros, un pie de página y botones QUICK_REPLY + URL.
{"wba_id": "1234567899870","name": "marketing_custom_text","language": "es_MX","category": "MARKETING","structure": {"header": {"format": "TEXT","text": "Big sale, {{1}}!","example": {"header_text": ["Ana"]}},"body": {"text": "Hi {{1}}, enjoy {{2}} off your next order this weekend only.","example": {"body_text": [["Ana","20%"]]}},"footer": "My Company","buttons": [{"type": "QUICK_REPLY","text": "Stop promotions"},{"type": "URL","text": "Shop now","url": "https://www.website.com/{{1}}","example": ["https://www.website.com/sale"]}]}}
Body flows
{"name": "lead_cj_cm_dudas","language": "es_MX","category": "MARKETING","structure":{"body":{"text": "Conecta con tus clientes interactuando por el canal y momento correcto. SMS, RCS, WhatsApp, Messenger, Email, Voz, Chatbot y muchos más."},"buttons":[{"type": "FLOW","text": "Registrate","flow_id": "1636507303762565","navigate_screen": "CONTACT_INFO","flow_action": "navigate"}]},"wba_id": "1234567899870","allowCategoryChange": false}
Body carrusel con multimedia por URL
{"wba_id": "1234567899870","allowCategoryChange": false,"name": "ejemplo_plantilla_carrusel","language": "es_MX","category": "MARKETING","structure":{"body":{"text": "Proporciona la mejor experiencia a tus clientes a través de sus canales favoritos. Usa el código {{1}} para obtener un descuento del {{2}} al registrarte.","example":{"body_text":[["DESCUENTO2024","25%"]]}},"carousel":{"cards":[{"header":{"format": "IMAGE","example":{"header_handle":["https://iili.io/HDQOyc7.jpg"]}},"body":{"text": "Conecta con tus clientes interactuando por el canal y momento correcto. SMS, RCS..."},"buttons":[{"type": "URL","text": "Regístrate","url": "https://www.conceptomovil.com/producto_broadcastermobile.html"}]},{"header":{"format": "IMAGE","example":{"header_handle":["https://iili.io/HDQOyc7.jpg"]}},"body":{"text": "Atiende a tus clientes con Chatbots y Agentes mediante Conversaciones en WhatsApp"},"buttons":[{"type": "URL","text": "Regístrate","url": "https://www.conceptomovil.com/producto_broadcasterbot.html"}]}]}}}
Body carrusel con multimedia por ID
El valor de header_handle es el ID que obtienes con Cargar contenido multimedia del encabezado.
{"wba_id": "1234567899870","allowCategoryChange": false,"name": "coupon_code_fall2023_25off_02","language": "en_US","category": "MARKETING","structure":{"body":{"text": "Proporciona la mejor experiencia a tus clientes a través de sus canales favoritos. Use el código {{1}} para obtener un descuento del {{2}} al registrarte.","example":{"body_text":[["Juan Pablo","25OFF"]]}},"carousel":{"cards":[{"header":{"format": "IMAGE","example":{"header_handle":["4::aW1hZ2UvcG5n:ARZExampleHandle1:e:1771350704:1234567890:1234567890:ARZExample"]}},"body":{"text": "Conecta con tus clientes interactuando por el canal y momento correcto. SMS, RCS..."},"buttons":[{"type": "URL","text": "Registrate","url": "https://www.conceptomovil.com/producto_broadcastermobile.html","example":["https://www.conceptomovil.com/producto_broadcastermobile.html"]}]},{"header":{"format": "IMAGE","example":{"header_handle":["4::aW1hZ2UvcG5n:ARZExampleHandle2:e:1771350704:1234567890:1234567890:ARZExample"]}},"body":{"text": "Atiende a tus clientes con Chatbots y Agentes mediante Conversaciones en WhatsApp"},"buttons":[{"type": "URL","text": "Registrate","url": "https://www.conceptomovil.com/producto_broadcasterbot.html","example":["https://www.conceptomovil.com/producto_broadcasterbot.html"]}]},{"header":{"format": "IMAGE","example":{"header_handle":["4::aW1hZ2UvcG5n:ARZExampleHandle3:e:1771350704:1234567890:1234567890:ARZExample"]}},"body":{"text": "La plataforma inteligente para gestionar tus dinámicas promocionales"},"buttons":[{"type": "URL","text": "Registrate","url": "https://www.conceptomovil.com/producto_cmmkt.html","example":["https://www.conceptomovil.com/producto_cmmkt.html"]}]}]}}}
Body de carrusel con multimedia (carousel_cards)
Hasta 10 tarjetas. Todas las tarjetas deben usar el mismo formato de encabezado (IMAGE o VIDEO) y la misma lista de botones (cantidad, tipos y orden). Cada tarjeta admite un máximo de 2 botones de tipo PHONE_NUMBER, URL o QUICK_REPLY. Este ejemplo usa el alias carousel_cards del componente de carrusel.
{"wba_id": "1234567899870","name": "marketing_media_carousel","language": "es_MX","category": "MARKETING","structure": {"body": {"text": "Hi {{1}}, check out this week's featured deals!","example": {"body_text": [["Ana"]]}},"carousel_cards": {"cards": [{"header": {"format": "IMAGE","example": {"header_handle": ["https://www.website.com/card1.jpg"]}},"body": {"text": "Summer jacket, now {{1}} off.","example": {"body_text": [["30%"]]}},"buttons": [{"type": "QUICK_REPLY","text": "More info"},{"type": "URL","text": "Buy now","url": "https://www.website.com/jacket"}]},{"header": {"format": "IMAGE","example": {"header_handle": ["https://www.website.com/card2.jpg"]}},"body": {"text": "Running shoes, now {{1}} off.","example": {"body_text": [["25%"]]}},"buttons": [{"type": "QUICK_REPLY","text": "More info"},{"type": "URL","text": "Buy now","url": "https://www.website.com/shoes"}]}]}}}
Body oferta por tiempo limitado
{"wba_id": "1234567899870","allowCategoryChange": false,"name": "coupon_code_fall2023_25off_02","language": "en_US","category": "MARKETING","structure":{"header":{"format": "IMAGE","example":{"header_handle":["https://iili.io/HDQOyc7.jpg"]}},"limited_time_offer":{"text": "Fecha límite!","has_expiration": true},"body":{"text": "Solo hoy, {{1}}! usa el código {{2}} para obtener un gran descuento al registrarte!","example":{"body_text":[["Juan Pablo","25OFF"]]}},"buttons":[{"type": "COPY_CODE","example":["1234"]},{"type": "URL","text": "Registrate!","url": "https://www.conceptomovil.com/producto_broadcasterdata.html"}]}}
Body autenticación zero tap
Para implementar la autenticación sin toques en tu aplicación Android, consulta la documentación de Meta.
{"wba_id": "1234567899870","allowCategoryChange": true,"name": "zero_tap_example","language": "en_US","category": "AUTHENTICATION","structure":{"body":{"add_security_recommendation": true},"footer_code_expiration_minutes": 5,"buttons":[{"type": "OTP","otp_type": "zero_tap","text": "Copy Code","autofill_text": "Autofill","zero_tap_terms_accepted": true,"supported_apps":[{"package_name": "com.example.luckyshrub","signature_hash": "K8a/AINcGX7"}]}]}}
Body solicitud de información de contacto
Solicita el número de teléfono a los usuarios de WhatsApp que tienen activo un nombre de usuario.
{"wba_id": "1234567899870","name": "request_contact_template","language": "es_MX","category": "MARKETING","structure":{"body":{"text": "Nos gustaría tener tu contacto para mantenerte al tanto de las últimas novedades. Si deseas recibir actualizaciones y promociones, compártenos tus datos de contacto."},"buttons":[{"type": "REQUEST_CONTACT_INFO"}]}}
Body personalizado con encabezado multimedia (IMAGE)
El endpoint descarga la URL de header_handle y la carga a Meta, reemplazándola por el ID de medio devuelto. Los encabezados VIDEO, DOCUMENT y GIF funcionan de la misma forma (GIF se envía como VIDEO cuando MM Lite no es aplicable).
{"wba_id": "1234567899870","name": "marketing_custom_image","language": "es_MX","category": "MARKETING","structure": {"header": {"format": "IMAGE","example": {"header_handle": ["https://www.website.com/promo-banner.jpg"]}},"body": {"text": "Hi {{1}}, our new collection is here. Tap below to explore.","example": {"body_text": [["Ana"]]}},"footer": "My Company","buttons": [{"type": "URL","text": "View collection","url": "https://www.website.com/collection"}]}}
Body con código de cupón (COPY_CODE)
El botón COPY_CODE copia el código de example[0] al portapapeles del cliente cuando se toca.
{"wba_id": "1234567899870","name": "marketing_coupon_code","language": "es_MX","category": "MARKETING","structure": {"body": {"text": "Hi {{1}}, use the code below to get 25% off your next purchase.","example": {"body_text": [["Ana"]]}},"footer": "Offer valid until stock lasts","buttons": [{"type": "QUICK_REPLY","text": "Stop promotions"},{"type": "COPY_CODE","example": ["SAVE25"]}]}}
Body con encabezado de ubicación
Una plantilla UTILITY con encabezado LOCATION. El marcador de ubicación se completa al enviar el mensaje de plantilla.
{"wba_id": "1234567899870","name": "utility_order_delivery_update","language": "en_US","category": "UTILITY","structure": {"header": {"format": "LOCATION"},"body": {"text": "Good news {{1}}! Your order #{{2}} is on its way to the location above. Thank you for your order!","example": {"body_text": [["Mark","566701"]]}},"footer": "To stop receiving delivery updates, tap the button below.","buttons": [{"type": "QUICK_REPLY","text": "Stop Delivery Updates"}]}}
Body de autenticación con copiar código
{"wba_id": "1234567899870","name": "authentication_code_copy_code_button","language": "en_US","category": "AUTHENTICATION","structure": {"body": {"add_security_recommendation": true},"footer_code_expiration_minutes": 10,"buttons": [{"type": "OTP","otp_type": "copy_code","text": "Copy Code"}]}}
Body de autenticación con un toque
{"wba_id": "1234567899870","name": "authentication_code_autofill_button","language": "en_US","category": "AUTHENTICATION","structure": {"body": {"add_security_recommendation": true},"footer_code_expiration_minutes": 15,"buttons": [{"type": "OTP","otp_type": "one_tap","text": "Copy Code","autofill_text": "Autofill","supported_apps": [{"package_name": "com.example.luckyshrub","signature_hash": "K8a/AINcGX7"}]}]}}
Body con botón de catálogo
El botón CATALOG abre el catálogo del negocio vinculado a la WABA.
{"wba_id": "1234567899870","name": "marketing_catalog_button","language": "es_MX","category": "MARKETING","structure": {"body": {"text": "Hi {{1}}, explore our full product catalog and find your next favorite item.","example": {"body_text": [["Ana"]]}},"footer": "My Company","buttons": [{"type": "CATALOG","text": "View catalog"}]}}
Body con botón de enviar ubicación
El botón SEND_LOCATION solicita al usuario de WhatsApp que comparta su ubicación.
{"wba_id": "1234567899870","name": "marketing_send_location_button","language": "es_MX","category": "MARKETING","structure": {"body": {"text": "Hi {{1}}, share your location so we can find the nearest store for you.","example": {"body_text": [["Ana"]]}},"buttons": [{"type": "SEND_LOCATION"}]}}
Body con botón de detalles del pedido
El botón ORDER_DETAILS inicia un flujo de pedido y pago. Consulta Plantillas de Payments Brasil.
{"wba_id": "1234567899870","name": "order_details_template","language": "es_MX","category": "UTILITY","structure": {"body": {"text": "Review the details of your order and pay."},"buttons": [{"type": "ORDER_DETAILS","text": "Review and pay"}]}}
Respuesta
Respuesta de Crear Template:
Si la plantilla se crea correctamente, el servicio responde con el código HTTP 201 y los datos de la plantilla.
| Nombre | Descripción | Tipo |
|---|---|---|
| id | ID de la plantilla. | String |
| name | Nombre del template. | String |
| language | Código de idioma y configuración regional de la plantilla. | String |
| status | Estatus de la plantilla. Al crearse suele ser PENDING mientras Meta la revisa. | String |
| namespace | Espacio de nombres de las plantillas de la WABA. | String |
| wba_id | ID de la cuenta de WhatsApp Business (WABA). | String |
| category | Categoría asignada a la plantilla. | String |
| allowCategoryChange | Indica si Meta puede asignar automáticamente la categoría de la plantilla. | Boolean |
| message_send_ttl_seconds | TTL en segundos. Solo se incluye si se envió en la petición. | Integer |
Nota: la respuesta puede incluir otros campos opcionales (por ejemplo message_send_ttl_seconds) cuando se enviaron en la petición.
{"id": "572279198452421","name": "ejemplo_respuesta","language": "es_MX","status": "PENDING","namespace": "2d2354d2_54fd_123r_842f_2d5b215188fa","wba_id": "1234567899870","category": "MARKETING","allowCategoryChange": true}
