Saltar al contenido principal
POST /v1/messages/send-bulk-template envía una plantilla aprobada de WhatsApp a una lista de contactos de una sola vez. Por ser plantillas, estos envíos valen fuera de la ventana de 24 horas: esta es la forma de iniciar una conversación con quien no ha hablado con usted recientemente. Scope: messages:create.
La plantilla debe estar aprobada en Meta de antemano. Esta llamada dispara una plantilla existente; no crea ni envía plantillas para aprobación.

Campos de la solicitud

phone necesita el código del país, sin símbolos: 5511999999999. name no puede estar vacío.

Enviar a una lista de contactos

cURL
Para listas grandes, envíe un archivo en lugar del array: multipart/form-data con el CSV o XLSX en el campo file y los demás campos en el formulario. El archivo necesita las columnas name y phone:
Combinar archivo con components de parámetros dinámicos es un caso que vale la pena probar con pocos contactos antes de usarlo en producción. Si los parámetros no se aplican como usted espera, contacte al soporte.

Parámetros de la plantilla

Una plantilla aprobada tiene marcadores ({{1}}, {{2}}) y bloques: encabezado, cuerpo y botones. Esto se completa en components, y el número y el tipo de parámetros deben coincidir exactamente con la plantilla aprobada, de lo contrario Meta rechaza el envío. Tipos de parámetro:
Imagen, video y documento entran en el encabezado por URL pública HTTPS. No necesita subir ningún archivo ni preparar nada antes. Basta con que la URL sea accesible por Meta.

Ejemplos por tipo de plantilla

Plantilla: encabezado de imagen + ¡Hola {{1}}! Descubre nuestra promoción de {{2}}.
Plantilla: Su pedido #{{1}} ha sido confirmado. + botón que apunta a .../track/{{1}}.El index del botón es una string y comienza en "0":
Plantilla: encabezado de documento + Hola {{1}}, aquí está su factura.
Plantilla: Su factura de {{1}} por un valor de {{2}} vence el {{3}}.
El formato final (R$ 150,50, 31/01/2026) lo aplica WhatsApp, según el idioma del dispositivo de quien recibe el mensaje.
Las plantillas de carrusel no se aceptan en este endpoint. Use el envío individual de plantilla.

Quién atiende después del envío

La plantilla abre o reabre una conversación, y alguien tiene que responder cuando el contacto reaccione. Estos campos definen quién. Para la asignación, owner_user_id y attendant_user_id aceptan tres estados, y la diferencia entre dos de ellos es fácil de confundir:
  • un ID de usuario asigna la conversación a esa persona
  • null es la elección explícita de “Sin asignar”, y limpia a quien estaba ahí
  • omitir el campo significa que usted no opinó, y la asignación actual queda como está
Cuando los dos vienen completos, el propietario tiene precedencia: la conversación queda con owner_user_id.
keep_existing_assignment: true preserva la asignación actual e ignora el who_will_answer: la IA no asume la conversación aunque usted pida AGENT. Si su envío necesita activar el agente, no mande ese campo como true.Por defecto es false, así que las integraciones existentes por API key no cambian de comportamiento.

Contactos ya en conversación activa

Por defecto, un contacto que está en conversación activa no recibe la plantilla. Entra en errors con el motivo ACTIVE_CONVERSATION_BLOCKED, y los demás contactos siguen normalmente. La protección existe para que la plantilla no atropelle una atención en curso, con el contacto recibiendo un envío de campaña en medio de una conversación con una persona. Para enviar de todos modos, use send_to_active_conversations: true.

La respuesta es parcial

El procesamiento es síncrono y un contacto con error no interrumpe a los demás. La respuesta trae el resultado consolidado:
Un 200 no significa que todos lo recibieron. Lea siempre errorCount y errors. Si se ignora ese bloque, las fallas de envío pasan desapercibidas. row señala la línea del archivo o el índice en el array contacts.
Reenviar a quienes fallaron es responsabilidad de su integración: no hay retry automático.

Límites que vale la pena conocer

  • Tier de la cuenta en WhatsApp: Meta limita el número de conversaciones únicas iniciadas por día (1.000, 10.000 o 100.000, según el tier de su cuenta). El envío respeta ese tope: por encima de él, los envíos empiezan a fallar.
  • Tamaño de medios: imagen hasta 5 MB (JPG, PNG), video hasta 16 MB (MP4, 3GPP), documento hasta 100 MB (PDF, DOC/DOCX, XLS/XLSX, PPT/PPTX, TXT), audio hasta 16 MB.
  • Enlaces de medios: deben ser URLs HTTPS públicas, accesibles por Meta. Una URL detrás de un login o de una red interna falla.
  • Tamaño del lote: envíe en bloques de hasta 1.000 contactos por solicitud.

Buenas prácticas

1

Pruebe con un solo contacto

Envíe primero a su propio número y verifique el resultado en el dispositivo. Un parámetro fuera de orden solo aparece en el mensaje final.
2

Normalice los teléfonos antes

Use el formato internacional sin símbolos (5511999999999). Un número inválido se convierte en una línea en errors, no en una excepción.
3

Guarde los conversationId

sentContacts devuelve la conversación creada para cada contacto: es por ella que se hace seguimiento de la respuesta, vía webhooks o GET /v1/messages/conversation/{id}.
4

Trate los errores como cola de reprocesamiento

Reenvíe solo las líneas de errors, después de corregir el motivo.

Próximos pasos

Webhooks

Reciba las respuestas de quienes fueron impactados por el envío.

Referencia de la API

Contrato completo del endpoint y de los demás envíos.